From 308dc54c90d19c687a116678def664989a38d41d Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Wed, 15 Oct 2025 11:22:10 +0200 Subject: [PATCH 01/15] Upgraded nextjs in example project --- examples/redis-minimal/package-lock.json | 637 ++++++++++++++++++++--- examples/redis-minimal/package.json | 20 +- examples/redis-minimal/tsconfig.json | 24 +- 3 files changed, 588 insertions(+), 93 deletions(-) diff --git a/examples/redis-minimal/package-lock.json b/examples/redis-minimal/package-lock.json index 4b0f523..db92525 100644 --- a/examples/redis-minimal/package-lock.json +++ b/examples/redis-minimal/package-lock.json @@ -9,19 +9,19 @@ "version": "0.1.0", "dependencies": { "@fortedigital/nextjs-cache-handler": "^2.1.0-canary.14", - "next": "^15.5.4", - "react": "^19.1.1", - "react-dom": "^19.1.1", + "next": "16.0.0-beta.0", + "react": "19.2.0", + "react-dom": "19.2.0", "redis": "^5.8.2" }, "devDependencies": { "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", "@types/node": "^24", - "@types/react": "^19", - "@types/react-dom": "^19", + "@types/react": "19.2.2", + "@types/react-dom": "19.2.2", "eslint": "^9", - "eslint-config-next": "15.5.4", + "eslint-config-next": "16.0.0-beta.0", "tailwindcss": "^4", "typescript": "^5" } @@ -53,6 +53,296 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@emnapi/core": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", @@ -778,6 +1068,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -820,15 +1121,15 @@ } }, "node_modules/@next/env": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.4.tgz", - "integrity": "sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.0-beta.0.tgz", + "integrity": "sha512-OWeEhUmIxA9zuQansxKXHWTszsPcvSvar8ym1BOElhU6Lgnb4yLXGshKSoPXoHOHRFcxuYmhI86OA+5Z9TvSSQ==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.4.tgz", - "integrity": "sha512-SR1vhXNNg16T4zffhJ4TS7Xn7eq4NfKfcOsRwea7RIAHrjRpI9ALYbamqIJqkAhowLlERffiwk0FMvTLNdnVtw==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.0-beta.0.tgz", + "integrity": "sha512-ppCg1EB+2qk6QFofaXT9/1CPPU/b2rePkidScJgTOxU6V1DjCB5fOfWc894+9RPX+gy7aH5Sgn+/uSo4MkCgKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -836,9 +1137,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.4.tgz", - "integrity": "sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.0-beta.0.tgz", + "integrity": "sha512-8IdA5j+xOGQNP+4yBqG5pvNhrDrVp/IMyJSn38t2h3XOhw+BZ63j+m0SyJuj2OKgIBgJLvkHUXEWiSD9u5nfBw==", "cpu": [ "arm64" ], @@ -852,9 +1153,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.4.tgz", - "integrity": "sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.0-beta.0.tgz", + "integrity": "sha512-SEAPWkMPHnLMTmDw/b0XnIgMsdUZvAGLYzAz9VZxtie1x5dnus3t/n2DP0nmg8O8LkfKJcicnm6fMrNeHJQs9w==", "cpu": [ "x64" ], @@ -868,9 +1169,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.4.tgz", - "integrity": "sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.0-beta.0.tgz", + "integrity": "sha512-qeccINBs3eWt5EbiaABNUZBWyMRToZfgzSD5tRED1UuZpfxt3asebkanV1GFS/ZQ+z3+pVEzMwhaGwCBbfCa5w==", "cpu": [ "arm64" ], @@ -884,9 +1185,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.4.tgz", - "integrity": "sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.0-beta.0.tgz", + "integrity": "sha512-vhhfBp7CNTVHq0tuY+enPKvE91QgjhiWs539EQ0VXCbQMoAuxWr1uOgS3kjfah78oI89icQin4HAO7ePu3KUtw==", "cpu": [ "arm64" ], @@ -900,9 +1201,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.4.tgz", - "integrity": "sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.0-beta.0.tgz", + "integrity": "sha512-2+aMU293kgg0UJLEyhgXy3KwyI0RcSfKHrWT8SnzW8FqcrUcOWYw7qWCP+JcRT5SwQCcjByEOwH+cw+1nBTeIA==", "cpu": [ "x64" ], @@ -916,9 +1217,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.4.tgz", - "integrity": "sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.0-beta.0.tgz", + "integrity": "sha512-Jgu9BvRLG82DhkeSF+3OTOkZXf6azXlOlQ3TOWHRzh+Cap+fhlO8yp+cYI5jDsopDIfaBW+3ToAL1YLE1n+dGg==", "cpu": [ "x64" ], @@ -932,9 +1233,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.4.tgz", - "integrity": "sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.0-beta.0.tgz", + "integrity": "sha512-5cGucadLwCWUl9v1aOJLzDpyiYpdrFBiApvGVy4GKAFo6uK34mtgCSZcVUQ+DeLjAx0G5B3AgNxVnzMfXKsv5g==", "cpu": [ "arm64" ], @@ -948,9 +1249,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.4.tgz", - "integrity": "sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.0-beta.0.tgz", + "integrity": "sha512-gq0WvicjqmoiakDtW7TeabgT58i+5mQ+wy+qYuwCHBbWbed9PMh/wl4ZomsOe2IzlinRPylRGA01jXLPOrX/Nw==", "cpu": [ "x64" ], @@ -1426,9 +1727,9 @@ } }, "node_modules/@types/react": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", - "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "dev": true, "license": "MIT", "dependencies": { @@ -1436,13 +1737,13 @@ } }, "node_modules/@types/react-dom": { - "version": "19.1.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", - "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", + "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^19.0.0" + "@types/react": "^19.2.0" } }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -2294,6 +2595,16 @@ "dev": true, "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz", + "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -2318,6 +2629,40 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -2379,9 +2724,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001745", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz", - "integrity": "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==", + "version": "1.0.30001750", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz", + "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==", "funding": [ { "type": "opencollective", @@ -2467,6 +2812,13 @@ "dev": true, "license": "MIT" }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2649,6 +3001,13 @@ "node": ">= 0.4" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.237", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", + "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==", + "dev": true, + "license": "ISC" + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -2847,6 +3206,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2922,13 +3291,13 @@ } }, "node_modules/eslint-config-next": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.4.tgz", - "integrity": "sha512-BzgVVuT3kfJes8i2GHenC1SRJ+W3BTML11lAOYFOOPzrk2xp66jBOAGEFRw+3LkYCln5UzvFsLhojrshb5Zfaw==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.0-beta.0.tgz", + "integrity": "sha512-pX+9OAO1zqCj7II09hc+f2F4ruWAMrO4/GMQS2gWwaB/RX80fHXIVV8YAthkxOi22dzdNvQCdi559joXL+hKjw==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "15.5.4", + "@next/eslint-plugin-next": "16.0.0-beta.0", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", @@ -2937,7 +3306,7 @@ "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^5.0.0" + "eslint-plugin-react-hooks": "^7.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", @@ -3152,13 +3521,20 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.0.tgz", + "integrity": "sha512-fNXaOwvKwq2+pXiRpXc825Vd63+KM4DLL40Rtlycb8m7fYpp6efrTp1sa6ZbP/Ap58K2bEKFXRmhURE+CJAQWw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.22.4 || ^4.0.0", + "zod-validation-error": "^3.0.3 || ^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" @@ -3468,6 +3844,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -3702,6 +4088,23 @@ "node": ">= 0.4" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4217,6 +4620,19 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -4750,12 +5166,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.4.tgz", - "integrity": "sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==", + "version": "16.0.0-beta.0", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.0-beta.0.tgz", + "integrity": "sha512-RrpQl/FkN4v+hwcfsgj+ukTDyf3uQ1mcbNs229M9H0POMc8P0LhgrNDAWEiQHviYicLZorWJ47RoQYCzVddkww==", "license": "MIT", "dependencies": { - "@next/env": "15.5.4", + "@next/env": "16.0.0-beta.0", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -4765,18 +5181,18 @@ "next": "dist/bin/next" }, "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.4", - "@next/swc-darwin-x64": "15.5.4", - "@next/swc-linux-arm64-gnu": "15.5.4", - "@next/swc-linux-arm64-musl": "15.5.4", - "@next/swc-linux-x64-gnu": "15.5.4", - "@next/swc-linux-x64-musl": "15.5.4", - "@next/swc-win32-arm64-msvc": "15.5.4", - "@next/swc-win32-x64-msvc": "15.5.4", - "sharp": "^0.34.3" + "@next/swc-darwin-arm64": "16.0.0-beta.0", + "@next/swc-darwin-x64": "16.0.0-beta.0", + "@next/swc-linux-arm64-gnu": "16.0.0-beta.0", + "@next/swc-linux-arm64-musl": "16.0.0-beta.0", + "@next/swc-linux-x64-gnu": "16.0.0-beta.0", + "@next/swc-linux-x64-musl": "16.0.0-beta.0", + "@next/swc-win32-arm64-msvc": "16.0.0-beta.0", + "@next/swc-win32-x64-msvc": "16.0.0-beta.0", + "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -4829,6 +5245,13 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-releases": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "dev": true, + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5172,24 +5595,24 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", - "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", - "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", "dependencies": { - "scheduler": "^0.26.0" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.1.1" + "react": "^19.2.0" } }, "node_modules/react-is": { @@ -5391,9 +5814,9 @@ } }, "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, "node_modules/semver": { @@ -6106,6 +6529,37 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.9.2" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6253,6 +6707,29 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } } } } diff --git a/examples/redis-minimal/package.json b/examples/redis-minimal/package.json index fd595e8..86ef305 100644 --- a/examples/redis-minimal/package.json +++ b/examples/redis-minimal/package.json @@ -13,21 +13,25 @@ "lint": "next lint" }, "dependencies": { - "@fortedigital/nextjs-cache-handler": "^2.1.0-canary.14", - "next": "^15.5.4", - "react": "^19.1.1", - "react-dom": "^19.1.1", - "redis": "^5.8.2" + "@fortedigital/nextjs-cache-handler": "^2.1.0", + "next": "16.0.0-beta.0", + "react": "19.2.0", + "react-dom": "19.2.0", + "redis": "^5.8.3" }, "devDependencies": { "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", "@types/node": "^24", - "@types/react": "^19", - "@types/react-dom": "^19", + "@types/react": "19.2.2", + "@types/react-dom": "19.2.2", "eslint": "^9", - "eslint-config-next": "15.5.4", + "eslint-config-next": "16.0.0-beta.0", "tailwindcss": "^4", "typescript": "^5" + }, + "overrides": { + "@types/react": "19.2.2", + "@types/react-dom": "19.2.2" } } diff --git a/examples/redis-minimal/tsconfig.json b/examples/redis-minimal/tsconfig.json index c133409..75ae305 100644 --- a/examples/redis-minimal/tsconfig.json +++ b/examples/redis-minimal/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -11,7 +15,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "plugins": [ { @@ -19,9 +23,19 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": [ + "./src/*" + ] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next\\dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } From d26680043b092aca39d123e5a59941da73a5eb6e Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Wed, 15 Oct 2025 11:25:29 +0200 Subject: [PATCH 02/15] Updated package dependencies --- .../nextjs-cache-handler/package-lock.json | 525 ++++++++---------- packages/nextjs-cache-handler/package.json | 14 +- 2 files changed, 252 insertions(+), 287 deletions(-) diff --git a/packages/nextjs-cache-handler/package-lock.json b/packages/nextjs-cache-handler/package-lock.json index 344edcd..19044bd 100644 --- a/packages/nextjs-cache-handler/package-lock.json +++ b/packages/nextjs-cache-handler/package-lock.json @@ -1,19 +1,19 @@ { "name": "@fortedigital/nextjs-cache-handler", - "version": "2.1.0", + "version": "3.0.0-alpha.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@fortedigital/nextjs-cache-handler", - "version": "2.1.0", + "version": "3.0.0-alpha.0", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.2", "lru-cache": "11.2.2" }, "devDependencies": { - "@eslint/js": "^9.36.0", + "@eslint/js": "^9.37.0", "@types/jest": "^30.0.0", "@types/node": "22.16.5", "eslint": "^8.57.1", @@ -23,21 +23,21 @@ "prettier": "^3.6.2", "prettier-plugin-packagejson": "2.5.19", "rimraf": "6.0.1", - "ts-jest": "^29.4.4", + "ts-jest": "^29.4.5", "tsup": "^8.5.0", "tsx": "4.20.6", "typescript": "^5.9.3", - "typescript-eslint": "^8.45.0" + "typescript-eslint": "^8.46.1" }, "engines": { "node": ">=22.0.0" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.52.3" + "@rollup/rollup-linux-x64-gnu": "^4.52.4" }, "peerDependencies": { - "@redis/client": ">= 5.5.6", - "next": ">=15.2.4" + "@redis/client": ">= 5.8.3", + "next": ">=16.0.0-beta.0" } }, "node_modules/@ampproject/remapping": { @@ -1105,9 +1105,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", - "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", "dev": true, "license": "MIT", "engines": { @@ -1152,10 +1152,21 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", - "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz", + "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==", "cpu": [ "arm64" ], @@ -1172,13 +1183,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.0" + "@img/sharp-libvips-darwin-arm64": "1.2.3" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", - "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz", + "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==", "cpu": [ "x64" ], @@ -1195,13 +1206,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.0" + "@img/sharp-libvips-darwin-x64": "1.2.3" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", - "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==", "cpu": [ "arm64" ], @@ -1216,9 +1227,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", - "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==", "cpu": [ "x64" ], @@ -1233,9 +1244,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", - "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz", + "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==", "cpu": [ "arm" ], @@ -1250,9 +1261,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", - "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz", + "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==", "cpu": [ "arm64" ], @@ -1267,9 +1278,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", - "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz", + "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==", "cpu": [ "ppc64" ], @@ -1284,9 +1295,9 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", - "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz", + "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==", "cpu": [ "s390x" ], @@ -1301,9 +1312,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", - "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz", + "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==", "cpu": [ "x64" ], @@ -1318,9 +1329,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", - "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz", + "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==", "cpu": [ "arm64" ], @@ -1335,9 +1346,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", - "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz", + "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==", "cpu": [ "x64" ], @@ -1352,9 +1363,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", - "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz", + "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==", "cpu": [ "arm" ], @@ -1371,13 +1382,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.0" + "@img/sharp-libvips-linux-arm": "1.2.3" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", - "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz", + "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==", "cpu": [ "arm64" ], @@ -1394,13 +1405,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.0" + "@img/sharp-libvips-linux-arm64": "1.2.3" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", - "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz", + "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==", "cpu": [ "ppc64" ], @@ -1417,13 +1428,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.0" + "@img/sharp-libvips-linux-ppc64": "1.2.3" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", - "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz", + "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==", "cpu": [ "s390x" ], @@ -1440,13 +1451,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.0" + "@img/sharp-libvips-linux-s390x": "1.2.3" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", - "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz", + "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==", "cpu": [ "x64" ], @@ -1463,13 +1474,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.0" + "@img/sharp-libvips-linux-x64": "1.2.3" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", - "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz", + "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==", "cpu": [ "arm64" ], @@ -1486,13 +1497,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.3" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", - "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz", + "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==", "cpu": [ "x64" ], @@ -1509,13 +1520,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.0" + "@img/sharp-libvips-linuxmusl-x64": "1.2.3" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", - "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz", + "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==", "cpu": [ "wasm32" ], @@ -1523,7 +1534,7 @@ "optional": true, "peer": true, "dependencies": { - "@emnapi/runtime": "^1.4.4" + "@emnapi/runtime": "^1.5.0" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -1533,9 +1544,9 @@ } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", - "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz", + "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==", "cpu": [ "arm64" ], @@ -1553,9 +1564,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", - "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz", + "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==", "cpu": [ "ia32" ], @@ -1573,9 +1584,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", - "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz", + "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==", "cpu": [ "x64" ], @@ -2198,16 +2209,16 @@ } }, "node_modules/@next/env": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.2.tgz", - "integrity": "sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==", + "version": "16.0.0-canary.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.0-canary.5.tgz", + "integrity": "sha512-zDeecUJEBoBikkpvoeHrBVT9s0AP1967lCP9EzvSmleopaygEWlDGFogVxy3Xal0qiwagjA3+S29rHrIRU6kow==", "license": "MIT", "peer": true }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz", - "integrity": "sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==", + "version": "16.0.0-canary.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.0-canary.5.tgz", + "integrity": "sha512-2n6S1Yg8qF5zM3h+LIFTjI1GT4DD7JYHKVaDalC9phZYHca98WbqRxOblvSzoBT401qY71MgXndsKkvLVUYDjQ==", "cpu": [ "arm64" ], @@ -2222,9 +2233,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz", - "integrity": "sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==", + "version": "16.0.0-canary.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.0-canary.5.tgz", + "integrity": "sha512-5I48zNXPnK6kxI2n1wRVZErDyPwBIsOZ3rVudJ41F4CUplx99R5oeBX4mevGVkYZ+KvThTE322o6D10dvAF8iA==", "cpu": [ "x64" ], @@ -2239,9 +2250,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz", - "integrity": "sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==", + "version": "16.0.0-canary.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.0-canary.5.tgz", + "integrity": "sha512-JpuCsn3AaDUuKWek7S+fnBKbHl944Gt80UGaYbwDGHRx/RF/pLh/8AqIRooWfMlHHXcacb4cBrqypvqQlohBQQ==", "cpu": [ "arm64" ], @@ -2256,9 +2267,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz", - "integrity": "sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==", + "version": "16.0.0-canary.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.0-canary.5.tgz", + "integrity": "sha512-ILKhmPlO0dUyejvDO3wvF3n/ZGq+VYQmH+4G+LWvW0zCnv2QFAx5nfSX0ELBecymC9WJ6kwHMjzCHiRwLA/2sg==", "cpu": [ "arm64" ], @@ -2273,9 +2284,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz", - "integrity": "sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==", + "version": "16.0.0-canary.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.0-canary.5.tgz", + "integrity": "sha512-ZQFFi28NTgBrcfeo7LVxWT9EzoVSZ3I5CCB/xxUiQtOr2ITOxX7smVJqeRFixM2WqTseg96KcMNVTMQAYk+lMQ==", "cpu": [ "x64" ], @@ -2290,9 +2301,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz", - "integrity": "sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==", + "version": "16.0.0-canary.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.0-canary.5.tgz", + "integrity": "sha512-1jTZ9gbchcuF056lrtXbU2PZ47Aizm+jgd2OWRb14jVCx8JuQDaj78C96G2XbHYCME5DKBTBW4Di65SZCSmOBQ==", "cpu": [ "x64" ], @@ -2307,9 +2318,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz", - "integrity": "sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==", + "version": "16.0.0-canary.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.0-canary.5.tgz", + "integrity": "sha512-g19AfLJlUa1PDRFlulKFpStqgRexWf2JERuP8QCrAs4lqgocyZuwDq6cD6oarc5684jOTqy4iQ1T8RCukEeLHA==", "cpu": [ "arm64" ], @@ -2324,9 +2335,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz", - "integrity": "sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==", + "version": "16.0.0-canary.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.0-canary.5.tgz", + "integrity": "sha512-ybxHcHudmkdgPSS8XHO3yCuAE9NsUSQ73rqLpusEV2lE5p9fjv8XTIB9pjaPm5IFv/aF2Jd1zOpmJsA4nTrwbQ==", "cpu": [ "x64" ], @@ -2399,9 +2410,9 @@ } }, "node_modules/@redis/client": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.0.tgz", - "integrity": "sha512-ywZjKGoSSAECGYOd9bJpws6d4867SN686obUWT/sRmo1c/Q8V+jWyInvlqwKa0BOvTHHwYeB2WFUEvd6PADeOQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.3.tgz", + "integrity": "sha512-MZVUE+l7LmMIYlIjubPosruJ9ltSLGFmJqsXApTqPLyHLjsJUSAbAJb/A3N34fEqean4ddiDkdWzNu4ZKPvRUg==", "license": "MIT", "peer": true, "dependencies": { @@ -2622,9 +2633,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", - "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", "cpu": [ "x64" ], @@ -2863,17 +2874,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", - "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", + "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/type-utils": "8.45.0", - "@typescript-eslint/utils": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/type-utils": "8.46.1", + "@typescript-eslint/utils": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -2887,7 +2898,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.45.0", + "@typescript-eslint/parser": "^8.46.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -2903,16 +2914,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", - "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", + "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", "debug": "^4.3.4" }, "engines": { @@ -2928,14 +2939,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", - "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", + "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.45.0", - "@typescript-eslint/types": "^8.45.0", + "@typescript-eslint/tsconfig-utils": "^8.46.1", + "@typescript-eslint/types": "^8.46.1", "debug": "^4.3.4" }, "engines": { @@ -2950,14 +2961,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", - "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", + "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0" + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2968,9 +2979,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", - "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", + "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", "dev": true, "license": "MIT", "engines": { @@ -2985,15 +2996,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", - "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", + "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/utils": "8.46.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3010,9 +3021,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", - "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", + "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", "dev": true, "license": "MIT", "engines": { @@ -3024,16 +3035,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", - "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", + "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.45.0", - "@typescript-eslint/tsconfig-utils": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/project-service": "8.46.1", + "@typescript-eslint/tsconfig-utils": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3079,16 +3090,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", - "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", + "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0" + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3103,13 +3114,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", - "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", + "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/types": "8.46.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3947,26 +3958,11 @@ "dev": true, "license": "MIT" }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3978,19 +3974,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "dev": true }, "node_modules/commander": { "version": "4.1.1", @@ -4106,9 +4090,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, "peer": true, @@ -5011,14 +4995,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6185,13 +6161,13 @@ "license": "MIT" }, "node_modules/next": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.2.tgz", - "integrity": "sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==", + "version": "16.0.0-canary.5", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.0-canary.5.tgz", + "integrity": "sha512-/rjXOMkUk9Y6DadLmddKhjhi+6tbjvAmza+DhoNQrnBM+drjFw/RhFTutdRPXGKjHHklTodg4ti4fW71ZKvSkQ==", "license": "MIT", "peer": true, "dependencies": { - "@next/env": "15.5.2", + "@next/env": "16.0.0-canary.5", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -6201,18 +6177,18 @@ "next": "dist/bin/next" }, "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.2", - "@next/swc-darwin-x64": "15.5.2", - "@next/swc-linux-arm64-gnu": "15.5.2", - "@next/swc-linux-arm64-musl": "15.5.2", - "@next/swc-linux-x64-gnu": "15.5.2", - "@next/swc-linux-x64-musl": "15.5.2", - "@next/swc-win32-arm64-msvc": "15.5.2", - "@next/swc-win32-x64-msvc": "15.5.2", - "sharp": "^0.34.3" + "@next/swc-darwin-arm64": "16.0.0-canary.5", + "@next/swc-darwin-x64": "16.0.0-canary.5", + "@next/swc-linux-arm64-gnu": "16.0.0-canary.5", + "@next/swc-linux-arm64-musl": "16.0.0-canary.5", + "@next/swc-linux-x64-gnu": "16.0.0-canary.5", + "@next/swc-linux-x64-musl": "16.0.0-canary.5", + "@next/swc-win32-arm64-msvc": "16.0.0-canary.5", + "@next/swc-win32-x64-msvc": "16.0.0-canary.5", + "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -7049,9 +7025,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "devOptional": true, "license": "ISC", "bin": { @@ -7062,16 +7038,16 @@ } }, "node_modules/sharp": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", - "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz", + "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==", "hasInstallScript": true, "license": "Apache-2.0", "optional": true, "peer": true, "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.4", + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.0", "semver": "^7.7.2" }, "engines": { @@ -7081,28 +7057,28 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.3", - "@img/sharp-darwin-x64": "0.34.3", - "@img/sharp-libvips-darwin-arm64": "1.2.0", - "@img/sharp-libvips-darwin-x64": "1.2.0", - "@img/sharp-libvips-linux-arm": "1.2.0", - "@img/sharp-libvips-linux-arm64": "1.2.0", - "@img/sharp-libvips-linux-ppc64": "1.2.0", - "@img/sharp-libvips-linux-s390x": "1.2.0", - "@img/sharp-libvips-linux-x64": "1.2.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", - "@img/sharp-libvips-linuxmusl-x64": "1.2.0", - "@img/sharp-linux-arm": "0.34.3", - "@img/sharp-linux-arm64": "0.34.3", - "@img/sharp-linux-ppc64": "0.34.3", - "@img/sharp-linux-s390x": "0.34.3", - "@img/sharp-linux-x64": "0.34.3", - "@img/sharp-linuxmusl-arm64": "0.34.3", - "@img/sharp-linuxmusl-x64": "0.34.3", - "@img/sharp-wasm32": "0.34.3", - "@img/sharp-win32-arm64": "0.34.3", - "@img/sharp-win32-ia32": "0.34.3", - "@img/sharp-win32-x64": "0.34.3" + "@img/sharp-darwin-arm64": "0.34.4", + "@img/sharp-darwin-x64": "0.34.4", + "@img/sharp-libvips-darwin-arm64": "1.2.3", + "@img/sharp-libvips-darwin-x64": "1.2.3", + "@img/sharp-libvips-linux-arm": "1.2.3", + "@img/sharp-libvips-linux-arm64": "1.2.3", + "@img/sharp-libvips-linux-ppc64": "1.2.3", + "@img/sharp-libvips-linux-s390x": "1.2.3", + "@img/sharp-libvips-linux-x64": "1.2.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", + "@img/sharp-libvips-linuxmusl-x64": "1.2.3", + "@img/sharp-linux-arm": "0.34.4", + "@img/sharp-linux-arm64": "0.34.4", + "@img/sharp-linux-ppc64": "0.34.4", + "@img/sharp-linux-s390x": "0.34.4", + "@img/sharp-linux-x64": "0.34.4", + "@img/sharp-linuxmusl-arm64": "0.34.4", + "@img/sharp-linuxmusl-x64": "0.34.4", + "@img/sharp-wasm32": "0.34.4", + "@img/sharp-win32-arm64": "0.34.4", + "@img/sharp-win32-ia32": "0.34.4", + "@img/sharp-win32-x64": "0.34.4" } }, "node_modules/shebang-command": { @@ -7138,17 +7114,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -7615,9 +7580,9 @@ "dev": true }, "node_modules/ts-jest": { - "version": "29.4.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.4.tgz", - "integrity": "sha512-ccVcRABct5ZELCT5U0+DZwkXMCcOCLi2doHRrKy1nK/s7J7bch6TzJMsrY09WxgUUIP/ITfmcDS8D2yl63rnXw==", + "version": "29.4.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.5.tgz", + "integrity": "sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7627,7 +7592,7 @@ "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.2", + "semver": "^7.7.3", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, @@ -7817,16 +7782,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", - "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.1.tgz", + "integrity": "sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.45.0", - "@typescript-eslint/parser": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0" + "@typescript-eslint/eslint-plugin": "8.46.1", + "@typescript-eslint/parser": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/utils": "8.46.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/packages/nextjs-cache-handler/package.json b/packages/nextjs-cache-handler/package.json index 4f727ff..5445d28 100644 --- a/packages/nextjs-cache-handler/package.json +++ b/packages/nextjs-cache-handler/package.json @@ -18,7 +18,7 @@ "next", "redis" ], - "version": "2.1.0", + "version": "3.0.0-alpha.0", "type": "module", "license": "MIT", "description": "Next.js cache handlers", @@ -92,7 +92,7 @@ "lru-cache": "11.2.2" }, "devDependencies": { - "@eslint/js": "^9.36.0", + "@eslint/js": "^9.37.0", "@types/jest": "^30.0.0", "@types/node": "22.16.5", "eslint": "^8.57.1", @@ -102,21 +102,21 @@ "prettier": "^3.6.2", "prettier-plugin-packagejson": "2.5.19", "rimraf": "6.0.1", - "ts-jest": "^29.4.4", + "ts-jest": "^29.4.5", "tsup": "^8.5.0", "tsx": "4.20.6", "typescript": "^5.9.3", - "typescript-eslint": "^8.45.0" + "typescript-eslint": "^8.46.1" }, "peerDependencies": { - "@redis/client": ">= 5.5.6", - "next": ">=15.2.4" + "@redis/client": ">= 5.8.3", + "next": ">=16.0.0-beta.0" }, "distTags": [ "next15" ], "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.52.3" + "@rollup/rollup-linux-x64-gnu": "^4.52.4" }, "engines": { "node": ">=22.0.0" From 3c3d1bf78ab35411d18491f940d2f417867a309c Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Wed, 15 Oct 2025 12:07:16 +0200 Subject: [PATCH 03/15] Ensure cache handler is used in dev mode --- examples/redis-minimal/cache-handler.mjs | 8 -------- examples/redis-minimal/next.config.ts | 5 +---- examples/redis-minimal/tsconfig.json | 2 +- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/examples/redis-minimal/cache-handler.mjs b/examples/redis-minimal/cache-handler.mjs index 35858fb..e561b55 100644 --- a/examples/redis-minimal/cache-handler.mjs +++ b/examples/redis-minimal/cache-handler.mjs @@ -97,14 +97,6 @@ CacheHandler.onCreation(() => { } } - if (process.env.NODE_ENV === "development") { - const config = { handlers: [createLruHandler()] }; - if (isSingleConnectionModeEnabled) { - global.cacheHandlerConfig = config; - } - return config; - } - const promise = createCacheConfig(); if (isSingleConnectionModeEnabled) { global.cacheHandlerConfigPromise = promise; diff --git a/examples/redis-minimal/next.config.ts b/examples/redis-minimal/next.config.ts index 4cb4ab0..3840355 100644 --- a/examples/redis-minimal/next.config.ts +++ b/examples/redis-minimal/next.config.ts @@ -1,10 +1,7 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - cacheHandler: - process.env.NODE_ENV === "production" - ? require.resolve("./cache-handler.mjs") - : undefined, + cacheHandler: require.resolve("./cache-handler.mjs"), cacheMaxMemorySize: 0, // disable default in-memory caching experimental: { //ppr: "incremental", diff --git a/examples/redis-minimal/tsconfig.json b/examples/redis-minimal/tsconfig.json index 75ae305..d4e5a30 100644 --- a/examples/redis-minimal/tsconfig.json +++ b/examples/redis-minimal/tsconfig.json @@ -15,7 +15,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "react-jsx", + "jsx": "preserve", "incremental": true, "plugins": [ { From 18782871d4cb0a4741aad6e4d372001927242913 Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Fri, 7 Nov 2025 09:33:53 +0100 Subject: [PATCH 04/15] Merge branch 'master' into next16 --- .github/dependabot.yml | 3 +- examples/redis-minimal/package-lock.json | 653 ++++++++++-------- examples/redis-minimal/package.json | 8 +- .../nextjs-cache-handler/package-lock.json | 240 ++++--- packages/nextjs-cache-handler/package.json | 12 +- .../src/handlers/cache-handler.ts | 33 +- .../src/helpers/resolveRevalidateValue.ts | 7 +- .../instrumentation/register-initial-cache.ts | 43 +- 8 files changed, 561 insertions(+), 438 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e32a87e..9be3dd8 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,11 +5,12 @@ updates: - package-ecosystem: "npm" directories: - "/packages/nextjs-cache-handler" + - "/examples/redis-minimal" schedule: interval: "weekly" ignore: - dependency-name: "*" - update-types: ["version-update:semver-major"] + update-types: ["version-update:semver-minor"] groups: all-updates: patterns: diff --git a/examples/redis-minimal/package-lock.json b/examples/redis-minimal/package-lock.json index db92525..1793277 100644 --- a/examples/redis-minimal/package-lock.json +++ b/examples/redis-minimal/package-lock.json @@ -8,11 +8,11 @@ "name": "redis-minimal", "version": "0.1.0", "dependencies": { - "@fortedigital/nextjs-cache-handler": "^2.1.0-canary.14", - "next": "16.0.0-beta.0", + "@fortedigital/nextjs-cache-handler": "^2.1.7", + "next": "16.0.1", "react": "19.2.0", "react-dom": "19.2.0", - "redis": "^5.8.2" + "redis": "^5.9.0" }, "devDependencies": { "@eslint/eslintrc": "^3", @@ -21,7 +21,7 @@ "@types/react": "19.2.2", "@types/react-dom": "19.2.2", "eslint": "^9", - "eslint-config-next": "16.0.0-beta.0", + "eslint-config-next": "16.0.1", "tailwindcss": "^4", "typescript": "^5" } @@ -39,20 +39,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -531,9 +517,9 @@ } }, "node_modules/@fortedigital/nextjs-cache-handler": { - "version": "2.1.0-canary.14", - "resolved": "https://registry.npmjs.org/@fortedigital/nextjs-cache-handler/-/nextjs-cache-handler-2.1.0-canary.14.tgz", - "integrity": "sha512-tkxxdYXUjWMtltleqscSO+XbyrinI4iEL2hIrabxigEw2OIcb7uNiz9G73PaPUPYmHlXoeFfKDnHF8cWqQUSTw==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@fortedigital/nextjs-cache-handler/-/nextjs-cache-handler-2.1.7.tgz", + "integrity": "sha512-ePidUBlQvY4onpu0YsQS1PUWjqdSMLdJL/BmykgKdmdSZ0Kvbz1lPh0rGzR0kaFilfTnywdxNPUySDCUJxXrzA==", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.2", @@ -543,7 +529,7 @@ "node": ">=22.0.0" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.52.3" + "@rollup/rollup-linux-x64-gnu": "^4.52.5" }, "peerDependencies": { "@redis/client": ">= 5.5.6", @@ -1058,9 +1044,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -1090,16 +1076,16 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1121,15 +1107,15 @@ } }, "node_modules/@next/env": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.0-beta.0.tgz", - "integrity": "sha512-OWeEhUmIxA9zuQansxKXHWTszsPcvSvar8ym1BOElhU6Lgnb4yLXGshKSoPXoHOHRFcxuYmhI86OA+5Z9TvSSQ==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.1.tgz", + "integrity": "sha512-LFvlK0TG2L3fEOX77OC35KowL8D7DlFF45C0OvKMC4hy8c/md1RC4UMNDlUGJqfCoCS2VWrZ4dSE6OjaX5+8mw==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.0-beta.0.tgz", - "integrity": "sha512-ppCg1EB+2qk6QFofaXT9/1CPPU/b2rePkidScJgTOxU6V1DjCB5fOfWc894+9RPX+gy7aH5Sgn+/uSo4MkCgKQ==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.1.tgz", + "integrity": "sha512-g4Cqmv/gyFEXNeVB2HkqDlYKfy+YrlM2k8AVIO/YQVEPfhVruH1VA99uT1zELLnPLIeOnx8IZ6Ddso0asfTIdw==", "dev": true, "license": "MIT", "dependencies": { @@ -1137,9 +1123,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.0-beta.0.tgz", - "integrity": "sha512-8IdA5j+xOGQNP+4yBqG5pvNhrDrVp/IMyJSn38t2h3XOhw+BZ63j+m0SyJuj2OKgIBgJLvkHUXEWiSD9u5nfBw==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.1.tgz", + "integrity": "sha512-R0YxRp6/4W7yG1nKbfu41bp3d96a0EalonQXiMe+1H9GTHfKxGNCGFNWUho18avRBPsO8T3RmdWuzmfurlQPbg==", "cpu": [ "arm64" ], @@ -1153,9 +1139,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.0-beta.0.tgz", - "integrity": "sha512-SEAPWkMPHnLMTmDw/b0XnIgMsdUZvAGLYzAz9VZxtie1x5dnus3t/n2DP0nmg8O8LkfKJcicnm6fMrNeHJQs9w==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.1.tgz", + "integrity": "sha512-kETZBocRux3xITiZtOtVoVvXyQLB7VBxN7L6EPqgI5paZiUlnsgYv4q8diTNYeHmF9EiehydOBo20lTttCbHAg==", "cpu": [ "x64" ], @@ -1169,9 +1155,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.0-beta.0.tgz", - "integrity": "sha512-qeccINBs3eWt5EbiaABNUZBWyMRToZfgzSD5tRED1UuZpfxt3asebkanV1GFS/ZQ+z3+pVEzMwhaGwCBbfCa5w==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.1.tgz", + "integrity": "sha512-hWg3BtsxQuSKhfe0LunJoqxjO4NEpBmKkE+P2Sroos7yB//OOX3jD5ISP2wv8QdUwtRehMdwYz6VB50mY6hqAg==", "cpu": [ "arm64" ], @@ -1185,9 +1171,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.0-beta.0.tgz", - "integrity": "sha512-vhhfBp7CNTVHq0tuY+enPKvE91QgjhiWs539EQ0VXCbQMoAuxWr1uOgS3kjfah78oI89icQin4HAO7ePu3KUtw==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.1.tgz", + "integrity": "sha512-UPnOvYg+fjAhP3b1iQStcYPWeBFRLrugEyK/lDKGk7kLNua8t5/DvDbAEFotfV1YfcOY6bru76qN9qnjLoyHCQ==", "cpu": [ "arm64" ], @@ -1201,9 +1187,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.0-beta.0.tgz", - "integrity": "sha512-2+aMU293kgg0UJLEyhgXy3KwyI0RcSfKHrWT8SnzW8FqcrUcOWYw7qWCP+JcRT5SwQCcjByEOwH+cw+1nBTeIA==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.1.tgz", + "integrity": "sha512-Et81SdWkcRqAJziIgFtsFyJizHoWne4fzJkvjd6V4wEkWTB4MX6J0uByUb0peiJQ4WeAt6GGmMszE5KrXK6WKg==", "cpu": [ "x64" ], @@ -1217,9 +1203,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.0-beta.0.tgz", - "integrity": "sha512-Jgu9BvRLG82DhkeSF+3OTOkZXf6azXlOlQ3TOWHRzh+Cap+fhlO8yp+cYI5jDsopDIfaBW+3ToAL1YLE1n+dGg==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.1.tgz", + "integrity": "sha512-qBbgYEBRrC1egcG03FZaVfVxrJm8wBl7vr8UFKplnxNRprctdP26xEv9nJ07Ggq4y1adwa0nz2mz83CELY7N6Q==", "cpu": [ "x64" ], @@ -1233,9 +1219,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.0-beta.0.tgz", - "integrity": "sha512-5cGucadLwCWUl9v1aOJLzDpyiYpdrFBiApvGVy4GKAFo6uK34mtgCSZcVUQ+DeLjAx0G5B3AgNxVnzMfXKsv5g==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.1.tgz", + "integrity": "sha512-cPuBjYP6I699/RdbHJonb3BiRNEDm5CKEBuJ6SD8k3oLam2fDRMKAvmrli4QMDgT2ixyRJ0+DTkiODbIQhRkeQ==", "cpu": [ "arm64" ], @@ -1249,9 +1235,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.0-beta.0.tgz", - "integrity": "sha512-gq0WvicjqmoiakDtW7TeabgT58i+5mQ+wy+qYuwCHBbWbed9PMh/wl4ZomsOe2IzlinRPylRGA01jXLPOrX/Nw==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.1.tgz", + "integrity": "sha512-XeEUJsE4JYtfrXe/LaJn3z1pD19fK0Q6Er8Qoufi+HqvdO4LEPyCxLUt4rxA+4RfYo6S9gMlmzCMU2F+AatFqQ==", "cpu": [ "x64" ], @@ -1313,21 +1299,21 @@ } }, "node_modules/@redis/bloom": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.8.2.tgz", - "integrity": "sha512-855DR0ChetZLarblio5eM0yLwxA9Dqq50t8StXKp5bAtLT0G+rZ+eRzzqxl37sPqQKjUudSYypz55o6nNhbz0A==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.9.0.tgz", + "integrity": "sha512-W9D8yfKTWl4tP8lkC3MRYkMz4OfbuzE/W8iObe0jFgoRmgMfkBV+Vj38gvIqZPImtY0WB34YZkX3amYuQebvRQ==", "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.2" + "@redis/client": "^5.9.0" } }, "node_modules/@redis/client": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.2.tgz", - "integrity": "sha512-WtMScno3+eBpTac1Uav2zugXEoXqaU23YznwvFgkPwBQVwEHTDgOG7uEAObtZ/Nyn8SmAMbqkEubJaMOvnqdsQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.9.0.tgz", + "integrity": "sha512-EI0Ti5pojD2p7TmcS7RRa+AJVahdQvP/urpcSbK/K9Rlk6+dwMJTQ354pCNGCwfke8x4yKr5+iH85wcERSkwLQ==", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.2" @@ -1337,45 +1323,45 @@ } }, "node_modules/@redis/json": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.8.2.tgz", - "integrity": "sha512-uxpVfas3I0LccBX9rIfDgJ0dBrUa3+0Gc8sEwmQQH0vHi7C1Rx1Qn8Nv1QWz5bohoeIXMICFZRcyDONvum2l/w==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.9.0.tgz", + "integrity": "sha512-Bm2jjLYaXdUWPb9RaEywxnjmzw7dWKDZI4MS79mTWPV16R982jVWBj6lY2ZGelJbwxHtEVg4/FSVgYDkuO/MxA==", "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.2" + "@redis/client": "^5.9.0" } }, "node_modules/@redis/search": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.8.2.tgz", - "integrity": "sha512-cNv7HlgayavCBXqPXgaS97DRPVWFznuzsAmmuemi2TMCx5scwLiP50TeZvUS06h/MG96YNPe6A0Zt57yayfxwA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.9.0.tgz", + "integrity": "sha512-jdk2csmJ29DlpvCIb2ySjix2co14/0iwIT3C0I+7ZaToXgPbgBMB+zfEilSuncI2F9JcVxHki0YtLA0xX3VdpA==", "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.2" + "@redis/client": "^5.9.0" } }, "node_modules/@redis/time-series": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.8.2.tgz", - "integrity": "sha512-g2NlHM07fK8H4k+613NBsk3y70R2JIM2dPMSkhIjl2Z17SYvaYKdusz85d7VYOrZBWtDrHV/WD2E3vGu+zni8A==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.9.0.tgz", + "integrity": "sha512-W6ILxcyOqhnI7ELKjJXOktIg3w4+aBHugDbVpgVLPZ+YDjObis1M0v7ZzwlpXhlpwsfePfipeSK+KWNuymk52w==", "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.2" + "@redis/client": "^5.9.0" } }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", - "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", "cpu": [ "x64" ], @@ -1392,13 +1378,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz", - "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==", - "dev": true, - "license": "MIT" - }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -1409,54 +1388,54 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", - "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", + "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", "lightningcss": "1.30.1", - "magic-string": "^0.30.17", + "magic-string": "^0.30.19", "source-map-js": "^1.2.1", - "tailwindcss": "4.1.11" + "tailwindcss": "4.1.14" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", - "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", + "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { "detect-libc": "^2.0.4", - "tar": "^7.4.3" + "tar": "^7.5.1" }, "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.11", - "@tailwindcss/oxide-darwin-arm64": "4.1.11", - "@tailwindcss/oxide-darwin-x64": "4.1.11", - "@tailwindcss/oxide-freebsd-x64": "4.1.11", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", - "@tailwindcss/oxide-linux-x64-musl": "4.1.11", - "@tailwindcss/oxide-wasm32-wasi": "4.1.11", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" + "@tailwindcss/oxide-android-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-x64": "4.1.14", + "@tailwindcss/oxide-freebsd-x64": "4.1.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-x64-musl": "4.1.14", + "@tailwindcss/oxide-wasm32-wasi": "4.1.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.14" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", - "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", + "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", "cpu": [ "arm64" ], @@ -1471,9 +1450,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", - "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", + "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", "cpu": [ "arm64" ], @@ -1488,9 +1467,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", - "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", + "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", "cpu": [ "x64" ], @@ -1505,9 +1484,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", - "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", + "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", "cpu": [ "x64" ], @@ -1522,9 +1501,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", - "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", + "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", "cpu": [ "arm" ], @@ -1539,9 +1518,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", - "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", + "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", "cpu": [ "arm64" ], @@ -1556,9 +1535,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", - "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", + "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", "cpu": [ "arm64" ], @@ -1573,9 +1552,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", - "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", + "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", "cpu": [ "x64" ], @@ -1590,9 +1569,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", - "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", + "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", "cpu": [ "x64" ], @@ -1607,9 +1586,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", - "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", + "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -1625,21 +1604,81 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.11", - "@tybys/wasm-util": "^0.9.0", - "tslib": "^2.8.0" + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.5", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" }, "engines": { "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", - "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", + "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", "cpu": [ "arm64" ], @@ -1654,9 +1693,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", - "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", + "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", "cpu": [ "x64" ], @@ -1671,17 +1710,17 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz", - "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.14.tgz", + "integrity": "sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==", "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.11", - "@tailwindcss/oxide": "4.1.11", + "@tailwindcss/node": "4.1.14", + "@tailwindcss/oxide": "4.1.14", "postcss": "^8.4.41", - "tailwindcss": "4.1.11" + "tailwindcss": "4.1.14" } }, "node_modules/@tybys/wasm-util": { @@ -1717,9 +1756,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz", - "integrity": "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==", + "version": "24.0.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz", + "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==", "dev": true, "license": "MIT", "dependencies": { @@ -1747,17 +1786,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", - "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz", + "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/type-utils": "8.35.1", - "@typescript-eslint/utils": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/type-utils": "8.46.3", + "@typescript-eslint/utils": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -1771,9 +1810,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.35.1", + "@typescript-eslint/parser": "^8.46.3", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -1787,16 +1826,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", - "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz", + "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/typescript-estree": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4" }, "engines": { @@ -1808,18 +1847,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", - "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", + "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.35.1", - "@typescript-eslint/types": "^8.35.1", + "@typescript-eslint/tsconfig-utils": "^8.46.3", + "@typescript-eslint/types": "^8.46.3", "debug": "^4.3.4" }, "engines": { @@ -1830,18 +1869,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", - "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", + "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1" + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1852,9 +1891,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", - "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", + "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", "dev": true, "license": "MIT", "engines": { @@ -1865,18 +1904,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", - "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz", + "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.35.1", - "@typescript-eslint/utils": "8.35.1", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -1889,13 +1929,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", - "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", + "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", "dev": true, "license": "MIT", "engines": { @@ -1907,16 +1947,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", - "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", + "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.35.1", - "@typescript-eslint/tsconfig-utils": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/visitor-keys": "8.35.1", + "@typescript-eslint/project-service": "8.46.3", + "@typescript-eslint/tsconfig-utils": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1932,7 +1972,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -1992,16 +2032,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", - "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", + "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.35.1", - "@typescript-eslint/types": "8.35.1", - "@typescript-eslint/typescript-estree": "8.35.1" + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2012,17 +2052,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.35.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", - "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", + "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/types": "8.46.3", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3016,9 +3056,9 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, "license": "MIT", "dependencies": { @@ -3291,25 +3331,24 @@ } }, "node_modules/eslint-config-next": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.0-beta.0.tgz", - "integrity": "sha512-pX+9OAO1zqCj7II09hc+f2F4ruWAMrO4/GMQS2gWwaB/RX80fHXIVV8YAthkxOi22dzdNvQCdi559joXL+hKjw==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.1.tgz", + "integrity": "sha512-wNuHw5gNOxwLUvpg0cu6IL0crrVC9hAwdS/7UwleNkwyaMiWIOAwf8yzXVqBBzL3c9A7jVRngJxjoSpPP1aEhg==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "16.0.0-beta.0", - "@rushstack/eslint-patch": "^1.10.3", - "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@next/eslint-plugin-next": "16.0.1", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.31.0", + "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^7.0.0" + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" }, "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", + "eslint": ">=9.0.0", "typescript": ">=3.3.1" }, "peerDependenciesMeta": { @@ -3318,6 +3357,19 @@ } } }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4591,9 +4643,9 @@ } }, "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", "bin": { @@ -5012,13 +5064,13 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/math-intrinsics": { @@ -5089,9 +5141,9 @@ } }, "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { @@ -5101,22 +5153,6 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5166,12 +5202,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.0.0-beta.0", - "resolved": "https://registry.npmjs.org/next/-/next-16.0.0-beta.0.tgz", - "integrity": "sha512-RrpQl/FkN4v+hwcfsgj+ukTDyf3uQ1mcbNs229M9H0POMc8P0LhgrNDAWEiQHviYicLZorWJ47RoQYCzVddkww==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.1.tgz", + "integrity": "sha512-e9RLSssZwd35p7/vOa+hoDFggUZIUbZhIUSLZuETCwrCVvxOs87NamoUzT+vbcNAL8Ld9GobBnWOA6SbV/arOw==", "license": "MIT", "dependencies": { - "@next/env": "16.0.0-beta.0", + "@next/env": "16.0.1", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -5184,14 +5220,14 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.0.0-beta.0", - "@next/swc-darwin-x64": "16.0.0-beta.0", - "@next/swc-linux-arm64-gnu": "16.0.0-beta.0", - "@next/swc-linux-arm64-musl": "16.0.0-beta.0", - "@next/swc-linux-x64-gnu": "16.0.0-beta.0", - "@next/swc-linux-x64-musl": "16.0.0-beta.0", - "@next/swc-win32-arm64-msvc": "16.0.0-beta.0", - "@next/swc-win32-x64-msvc": "16.0.0-beta.0", + "@next/swc-darwin-arm64": "16.0.1", + "@next/swc-darwin-x64": "16.0.1", + "@next/swc-linux-arm64-gnu": "16.0.1", + "@next/swc-linux-arm64-musl": "16.0.1", + "@next/swc-linux-x64-gnu": "16.0.1", + "@next/swc-linux-x64-musl": "16.0.1", + "@next/swc-win32-arm64-msvc": "16.0.1", + "@next/swc-win32-x64-msvc": "16.0.1", "sharp": "^0.34.4" }, "peerDependencies": { @@ -5623,16 +5659,16 @@ "license": "MIT" }, "node_modules/redis": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-5.8.2.tgz", - "integrity": "sha512-31vunZj07++Y1vcFGcnNWEf5jPoTkGARgfWI4+Tk55vdwHxhAvug8VEtW7Cx+/h47NuJTEg/JL77zAwC6E0OeA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-5.9.0.tgz", + "integrity": "sha512-E8dQVLSyH6UE/C9darFuwq4usOPrqfZ1864kI4RFbr5Oj9ioB9qPF0oJMwX7s8mf6sPYrz84x/Dx1PGF3/0EaQ==", "license": "MIT", "dependencies": { - "@redis/bloom": "5.8.2", - "@redis/client": "5.8.2", - "@redis/json": "5.8.2", - "@redis/search": "5.8.2", - "@redis/time-series": "5.8.2" + "@redis/bloom": "5.9.0", + "@redis/client": "5.9.0", + "@redis/json": "5.9.0", + "@redis/search": "5.9.0", + "@redis/time-series": "5.9.0" }, "engines": { "node": ">= 18" @@ -6239,34 +6275,37 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", - "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", + "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", "dev": true, "license": "MIT" }, "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", "dev": true, "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -6468,6 +6507,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz", + "integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.3", + "@typescript-eslint/parser": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", diff --git a/examples/redis-minimal/package.json b/examples/redis-minimal/package.json index 86ef305..8bd0e82 100644 --- a/examples/redis-minimal/package.json +++ b/examples/redis-minimal/package.json @@ -13,11 +13,11 @@ "lint": "next lint" }, "dependencies": { - "@fortedigital/nextjs-cache-handler": "^2.1.0", - "next": "16.0.0-beta.0", + "@fortedigital/nextjs-cache-handler": "^2.1.7", + "next": "16.0.1", "react": "19.2.0", "react-dom": "19.2.0", - "redis": "^5.8.3" + "redis": "^5.9.0" }, "devDependencies": { "@eslint/eslintrc": "^3", @@ -26,7 +26,7 @@ "@types/react": "19.2.2", "@types/react-dom": "19.2.2", "eslint": "^9", - "eslint-config-next": "16.0.0-beta.0", + "eslint-config-next": "16.0.1", "tailwindcss": "^4", "typescript": "^5" }, diff --git a/packages/nextjs-cache-handler/package-lock.json b/packages/nextjs-cache-handler/package-lock.json index 19044bd..6a05f2c 100644 --- a/packages/nextjs-cache-handler/package-lock.json +++ b/packages/nextjs-cache-handler/package-lock.json @@ -1,39 +1,39 @@ { "name": "@fortedigital/nextjs-cache-handler", - "version": "3.0.0-alpha.0", + "version": "3.0.0-next16-alpha.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@fortedigital/nextjs-cache-handler", - "version": "3.0.0-alpha.0", + "version": "3.0.0-next16-alpha.0", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.2", "lru-cache": "11.2.2" }, "devDependencies": { - "@eslint/js": "^9.37.0", + "@eslint/js": "^9.39.1", "@types/jest": "^30.0.0", "@types/node": "22.16.5", "eslint": "^8.57.1", "eslint-config-prettier": "^9.1.2", - "globals": "^16.4.0", + "globals": "^16.5.0", "jest": "^30.2.0", "prettier": "^3.6.2", "prettier-plugin-packagejson": "2.5.19", - "rimraf": "6.0.1", + "rimraf": "6.1.0", "ts-jest": "^29.4.5", "tsup": "^8.5.0", "tsx": "4.20.6", "typescript": "^5.9.3", - "typescript-eslint": "^8.46.1" + "typescript-eslint": "^8.46.3" }, "engines": { "node": ">=22.0.0" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.52.4" + "@rollup/rollup-linux-x64-gnu": "^4.52.5" }, "peerDependencies": { "@redis/client": ">= 5.8.3", @@ -1105,9 +1105,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", - "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "dev": true, "license": "MIT", "engines": { @@ -1603,6 +1603,29 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -2633,9 +2656,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", - "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", "cpu": [ "x64" ], @@ -2874,17 +2897,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", - "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz", + "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/type-utils": "8.46.1", - "@typescript-eslint/utils": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/type-utils": "8.46.3", + "@typescript-eslint/utils": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -2898,7 +2921,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.1", + "@typescript-eslint/parser": "^8.46.3", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -2914,16 +2937,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", - "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz", + "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4" }, "engines": { @@ -2939,14 +2962,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", - "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", + "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.1", - "@typescript-eslint/types": "^8.46.1", + "@typescript-eslint/tsconfig-utils": "^8.46.3", + "@typescript-eslint/types": "^8.46.3", "debug": "^4.3.4" }, "engines": { @@ -2961,14 +2984,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", - "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", + "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1" + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2979,9 +3002,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", - "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", + "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", "dev": true, "license": "MIT", "engines": { @@ -2996,15 +3019,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", - "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz", + "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/utils": "8.46.1", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3021,9 +3044,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", - "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", + "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", "dev": true, "license": "MIT", "engines": { @@ -3035,16 +3058,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", - "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", + "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.1", - "@typescript-eslint/tsconfig-utils": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", + "@typescript-eslint/project-service": "8.46.3", + "@typescript-eslint/tsconfig-utils": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3090,16 +3113,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", - "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", + "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1" + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3114,13 +3137,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", - "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", + "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/types": "8.46.3", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -4681,12 +4704,13 @@ "dev": true }, "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -4841,9 +4865,9 @@ } }, "node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { @@ -6345,7 +6369,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/parent-module": { "version": "1.0.1", @@ -6841,13 +6866,14 @@ } }, "node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.0.tgz", + "integrity": "sha512-DxdlA1bdNzkZK7JiNWH+BAx1x4tEJWoTofIopFo6qWUU94jYrFZ0ubY05TqH3nWPJ1nKa1JWVFDINZ3fnrle/A==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" + "glob": "^11.0.3", + "package-json-from-dist": "^1.0.1" }, "bin": { "rimraf": "dist/esm/bin.mjs" @@ -6859,25 +6885,16 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/rimraf/node_modules/glob": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "dev": true, + "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" @@ -6893,10 +6910,11 @@ } }, "node_modules/rimraf/node_modules/jackspeak": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", - "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -6908,12 +6926,13 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { "node": "20 || >=22" @@ -6927,6 +6946,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -7782,16 +7802,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.1.tgz", - "integrity": "sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz", + "integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.1", - "@typescript-eslint/parser": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/utils": "8.46.1" + "@typescript-eslint/eslint-plugin": "8.46.3", + "@typescript-eslint/parser": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/packages/nextjs-cache-handler/package.json b/packages/nextjs-cache-handler/package.json index 5445d28..f4807cf 100644 --- a/packages/nextjs-cache-handler/package.json +++ b/packages/nextjs-cache-handler/package.json @@ -18,7 +18,7 @@ "next", "redis" ], - "version": "3.0.0-alpha.0", + "version": "3.0.0-next16-alpha.0", "type": "module", "license": "MIT", "description": "Next.js cache handlers", @@ -92,21 +92,21 @@ "lru-cache": "11.2.2" }, "devDependencies": { - "@eslint/js": "^9.37.0", + "@eslint/js": "^9.39.1", "@types/jest": "^30.0.0", "@types/node": "22.16.5", "eslint": "^8.57.1", "eslint-config-prettier": "^9.1.2", - "globals": "^16.4.0", + "globals": "^16.5.0", "jest": "^30.2.0", "prettier": "^3.6.2", "prettier-plugin-packagejson": "2.5.19", - "rimraf": "6.0.1", + "rimraf": "6.1.0", "ts-jest": "^29.4.5", "tsup": "^8.5.0", "tsx": "4.20.6", "typescript": "^5.9.3", - "typescript-eslint": "^8.46.1" + "typescript-eslint": "^8.46.3" }, "peerDependencies": { "@redis/client": ">= 5.8.3", @@ -116,7 +116,7 @@ "next15" ], "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.52.4" + "@rollup/rollup-linux-x64-gnu": "^4.52.5" }, "engines": { "node": ">=22.0.0" diff --git a/packages/nextjs-cache-handler/src/handlers/cache-handler.ts b/packages/nextjs-cache-handler/src/handlers/cache-handler.ts index 113071a..8c9b189 100644 --- a/packages/nextjs-cache-handler/src/handlers/cache-handler.ts +++ b/packages/nextjs-cache-handler/src/handlers/cache-handler.ts @@ -24,6 +24,7 @@ import { SetIncrementalFetchCacheContext, } from "next/dist/server/response-cache/types"; import { resolveRevalidateValue } from "../helpers/resolveRevalidateValue"; +import { PHASE_PRODUCTION_BUILD } from "next/constants.js"; const PRERENDER_MANIFEST_VERSION = 4; @@ -143,6 +144,10 @@ export class CacheHandler implements NextCacheHandler { static async #readPagesRouterPage( cacheKey: string, ): Promise { + if (cacheKey === "/") { + cacheKey = "/index"; + } + let cacheHandlerValue: CacheHandlerValue | null = null; let pageHtmlHandle: fsPromises.FileHandle | null = null; @@ -277,6 +282,10 @@ export class CacheHandler implements NextCacheHandler { cacheKey: string, pageData: IncrementalCachedPageValue, ): Promise { + if (cacheKey === "/") { + cacheKey = "/index"; + } + try { const pageHtmlPath = path.join( CacheHandler.#serverDistDir, @@ -660,7 +669,11 @@ export class CacheHandler implements NextCacheHandler { implicitTags: softTags ?? [], }); - if (!cachedData && CacheHandler.#fallbackFalseRoutes.has(cacheKey)) { + if ( + !cachedData && + process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD && + CacheHandler.#fallbackFalseRoutes.has(cacheKey) + ) { cachedData = await CacheHandler.#readPagesRouterPage(cacheKey); // if we have a value from the file system, we should set it to the cache store @@ -709,9 +722,10 @@ export class CacheHandler implements NextCacheHandler { const hasFallbackFalse = CacheHandler.#fallbackFalseRoutes.has(cacheKey); - const lifespan = hasFallbackFalse - ? null - : CacheHandler.#getLifespanParameters(lastModified, revalidate); + const lifespan = CacheHandler.#getLifespanParameters( + lastModified, + revalidate, + ); // If expireAt is in the past, do not cache if (lifespan !== null && Date.now() > lifespan.expireAt * 1000) { @@ -741,14 +755,21 @@ export class CacheHandler implements NextCacheHandler { await CacheHandler.#mergedHandler.set(cacheKey, cacheHandlerValue); - if (hasFallbackFalse && cacheHandlerValue.value?.kind === "APP_PAGE") { + if ( + process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD && + hasFallbackFalse && + cacheHandlerValue.value?.kind === "APP_PAGE" + ) { await CacheHandler.#writePagesRouterPage( cacheKey, cacheHandlerValue.value as unknown as IncrementalCachedPageValue, ); } - if (cacheHandlerValue.value?.kind === "FETCH") { + if ( + process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD && + cacheHandlerValue.value?.kind === "FETCH" + ) { await CacheHandler.#writeFetch( cacheKey, cacheHandlerValue.value as unknown as CachedFetchValue, diff --git a/packages/nextjs-cache-handler/src/helpers/resolveRevalidateValue.ts b/packages/nextjs-cache-handler/src/helpers/resolveRevalidateValue.ts index 8a6e89d..9e3520e 100644 --- a/packages/nextjs-cache-handler/src/helpers/resolveRevalidateValue.ts +++ b/packages/nextjs-cache-handler/src/helpers/resolveRevalidateValue.ts @@ -29,9 +29,12 @@ export function resolveRevalidateValue( let revalidate; - if (cachedFetchValue.kind === "FETCH") { + if (cachedFetchValue?.kind === "FETCH") { revalidate = cachedFetchValue.revalidate; - } else if (cachedPageValue.kind === "APP_PAGE") { + } else if ( + cachedPageValue?.kind === "APP_PAGE" || + cachedPageValue?.kind === "PAGES" + ) { revalidate = responseCacheCtx.cacheControl?.revalidate; } diff --git a/packages/nextjs-cache-handler/src/instrumentation/register-initial-cache.ts b/packages/nextjs-cache-handler/src/instrumentation/register-initial-cache.ts index 4cb41b5..da2b6c4 100644 --- a/packages/nextjs-cache-handler/src/instrumentation/register-initial-cache.ts +++ b/packages/nextjs-cache-handler/src/instrumentation/register-initial-cache.ts @@ -25,6 +25,8 @@ type Router = "pages" | "app"; const PRERENDER_MANIFEST_VERSION = 4; +const DEFAULT_BUILD_DIR = ".next"; + /** * Options for the `registerInitialCache` instrumentation. */ @@ -47,6 +49,12 @@ export type RegisterInitialCacheOptions = { * @default true */ routes?: boolean; + /** + * Override the default build directory. + * + * @default .next + */ + buildDir?: string; }; /** @@ -89,7 +97,10 @@ export async function registerInitialCache( options: RegisterInitialCacheOptions = {}, ) { const debug = typeof process.env.NEXT_PRIVATE_DEBUG_CACHE !== "undefined"; - const nextJsPath = path.join(process.cwd(), ".next"); + const nextJsPath = path.join( + process.cwd(), + options.buildDir ?? DEFAULT_BUILD_DIR, + ); const prerenderManifestPath = path.join(nextJsPath, PRERENDER_MANIFEST); const serverDistDir = path.join(nextJsPath, SERVER_DIRECTORY); const fetchCacheDir = path.join(nextJsPath, "cache", "fetch-cache"); @@ -234,7 +245,7 @@ export async function registerInitialCache( ) { const isAppRouter = router === "app"; - if (isAppRouter && cachePath === "/") { + if (cachePath === "/") { cachePath = "/index"; } @@ -280,12 +291,14 @@ export async function registerInitialCache( ) .then((data) => (isAppRouter ? data : (JSON.parse(data) as object))) .catch((error) => { - console.warn( - "[CacheHandler] [%s] %s %s", - "registerInitialCache", - "Failed to read page data, assuming it does not exist", - `Error: ${error}`, - ); + if (debug) { + console.warn( + "[CacheHandler] [%s] %s %s", + "registerInitialCache", + "Failed to read page data, assuming it does not exist", + `Error: ${error}`, + ); + } return undefined; }), @@ -294,12 +307,14 @@ export async function registerInitialCache( .readFile(`${pathToRouteFiles}.prefetch.rsc`, "utf-8") .then((data) => data) .catch((error) => { - console.warn( - "[CacheHandler] [%s] %s %s", - "registerInitialCache", - "Failed to read page prefetch data, assuming it does not exist", - `Error: ${error}`, - ); + if (debug) { + console.warn( + "[CacheHandler] [%s] %s %s", + "registerInitialCache", + "Failed to read page prefetch data, assuming it does not exist", + `Error: ${error}`, + ); + } return undefined; }) From e117ae9d4e8412a7b379758767ace001ac447636 Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Fri, 7 Nov 2025 09:44:13 +0100 Subject: [PATCH 05/15] Bump --- examples/redis-minimal/package-lock.json | 34 ++++++++++++------------ examples/redis-minimal/package.json | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/redis-minimal/package-lock.json b/examples/redis-minimal/package-lock.json index 1793277..28a0cb5 100644 --- a/examples/redis-minimal/package-lock.json +++ b/examples/redis-minimal/package-lock.json @@ -8,7 +8,7 @@ "name": "redis-minimal", "version": "0.1.0", "dependencies": { - "@fortedigital/nextjs-cache-handler": "^2.1.7", + "@fortedigital/nextjs-cache-handler": "^3.0.0-next16-alpha.0", "next": "16.0.1", "react": "19.2.0", "react-dom": "19.2.0", @@ -490,13 +490,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", - "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -504,9 +504,9 @@ } }, "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -517,9 +517,9 @@ } }, "node_modules/@fortedigital/nextjs-cache-handler": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@fortedigital/nextjs-cache-handler/-/nextjs-cache-handler-2.1.7.tgz", - "integrity": "sha512-ePidUBlQvY4onpu0YsQS1PUWjqdSMLdJL/BmykgKdmdSZ0Kvbz1lPh0rGzR0kaFilfTnywdxNPUySDCUJxXrzA==", + "version": "3.0.0-next16-alpha.0", + "resolved": "https://registry.npmjs.org/@fortedigital/nextjs-cache-handler/-/nextjs-cache-handler-3.0.0-next16-alpha.0.tgz", + "integrity": "sha512-9A+4fVJPSVh7h0XLuE3xUrEhVQF5CbCQuFYNwLaNl7wBMhCv8iPGW1HjSYt0NwQdGzg/BfSWStpMtiCMotVTmQ==", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.2", @@ -532,8 +532,8 @@ "@rollup/rollup-linux-x64-gnu": "^4.52.5" }, "peerDependencies": { - "@redis/client": ">= 5.5.6", - "next": ">=15.2.4" + "@redis/client": ">= 5.8.3", + "next": ">=16.0.0-beta.0" } }, "node_modules/@humanfs/core": { @@ -6296,11 +6296,11 @@ } }, "node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", diff --git a/examples/redis-minimal/package.json b/examples/redis-minimal/package.json index 8bd0e82..c6dc7e2 100644 --- a/examples/redis-minimal/package.json +++ b/examples/redis-minimal/package.json @@ -13,7 +13,7 @@ "lint": "next lint" }, "dependencies": { - "@fortedigital/nextjs-cache-handler": "^2.1.7", + "@fortedigital/nextjs-cache-handler": "^3.0.0-next16-alpha.0", "next": "16.0.1", "react": "19.2.0", "react-dom": "19.2.0", From 52538711b88409114a59a0c0bf1942f033a8630d Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Wed, 19 Nov 2025 17:34:33 +0100 Subject: [PATCH 06/15] Merge dev and version bump --- examples/redis-minimal/package.json | 14 +- examples/redis-minimal/tsconfig.json | 5 +- packages/nextjs-cache-handler/package.json | 6 +- pnpm-lock.yaml | 485 +++++++++------------ 4 files changed, 225 insertions(+), 285 deletions(-) diff --git a/examples/redis-minimal/package.json b/examples/redis-minimal/package.json index 0fffe0b..008a311 100644 --- a/examples/redis-minimal/package.json +++ b/examples/redis-minimal/package.json @@ -14,24 +14,24 @@ }, "dependencies": { "@fortedigital/nextjs-cache-handler": "workspace:*", - "next": "^15.5.6", + "next": "^16.0.3", "react": "^19.2.0", "react-dom": "^19.2.0", - "redis": "^5.9.0" + "redis": "^5.10.0" }, "devDependencies": { "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", "@types/node": "^24", - "@types/react": "19.2.2", - "@types/react-dom": "19.2.2", + "@types/react": "19.2.6", + "@types/react-dom": "19.2.3", "eslint": "^9", - "eslint-config-next": "16.0.1", + "eslint-config-next": "16.0.3", "tailwindcss": "^4", "typescript": "^5" }, "overrides": { - "@types/react": "19.2.2", - "@types/react-dom": "19.2.2" + "@types/react": "19.2.6", + "@types/react-dom": "19.2.3" } } diff --git a/examples/redis-minimal/tsconfig.json b/examples/redis-minimal/tsconfig.json index d4e5a30..33e6a38 100644 --- a/examples/redis-minimal/tsconfig.json +++ b/examples/redis-minimal/tsconfig.json @@ -15,7 +15,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "plugins": [ { @@ -33,7 +33,8 @@ "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", - ".next\\dev/types/**/*.ts" + ".next\\dev/types/**/*.ts", + ".next/dev/types/**/*.ts" ], "exclude": [ "node_modules" diff --git a/packages/nextjs-cache-handler/package.json b/packages/nextjs-cache-handler/package.json index 0a28456..546e434 100644 --- a/packages/nextjs-cache-handler/package.json +++ b/packages/nextjs-cache-handler/package.json @@ -18,7 +18,7 @@ "next", "redis" ], - "version": "3.0.0-next16-alpha.0", + "version": "3.0.0-next16-alpha.1", "type": "module", "license": "MIT", "description": "Next.js cache handlers", @@ -109,7 +109,7 @@ "jest": "^30.2.0", "prettier": "^3.6.2", "prettier-plugin-packagejson": "2.5.19", - "rimraf": "6.1.1", + "rimraf": "6.1.2", "ts-jest": "^29.4.5", "tsup": "^8.5.1", "tsx": "4.20.6", @@ -121,7 +121,7 @@ "next": ">=16.0.0-beta.0" }, "distTags": [ - "next15" + "next16" ], "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "^4.53.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cacfccd..b0166b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: workspace:* version: link:../../packages/nextjs-cache-handler next: - specifier: ^15.5.6 - version: 15.5.6(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^16.0.3 + version: 16.0.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: specifier: ^19.2.0 version: 19.2.0 @@ -27,8 +27,8 @@ importers: specifier: ^19.2.0 version: 19.2.0(react@19.2.0) redis: - specifier: ^5.9.0 - version: 5.9.0 + specifier: ^5.10.0 + version: 5.10.0 devDependencies: '@eslint/eslintrc': specifier: ^3 @@ -40,17 +40,17 @@ importers: specifier: ^24 version: 24.10.1 '@types/react': - specifier: ^19 - version: 19.2.5 + specifier: 19.2.6 + version: 19.2.6 '@types/react-dom': - specifier: ^19 - version: 19.2.3(@types/react@19.2.5) + specifier: 19.2.3 + version: 19.2.3(@types/react@19.2.6) eslint: specifier: ^9 version: 9.39.1(jiti@2.6.1) eslint-config-next: - specifier: 15.5.6 - version: 15.5.6(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: 16.0.3 + version: 16.0.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) tailwindcss: specifier: ^4 version: 4.1.17 @@ -61,7 +61,7 @@ importers: packages/nextjs-cache-handler: dependencies: '@redis/client': - specifier: '>= 5.5.6' + specifier: '>= 5.8.3' version: 5.9.0 cluster-key-slot: specifier: 1.1.2 @@ -70,8 +70,8 @@ importers: specifier: 11.2.2 version: 11.2.2 next: - specifier: '>=15.2.4' - version: 15.5.6(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: '>=16.0.0-beta.0' + version: 16.0.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) p-limit: specifier: ^7.2.0 version: 7.2.0 @@ -104,8 +104,8 @@ importers: specifier: 2.5.19 version: 2.5.19(prettier@3.6.2) rimraf: - specifier: 6.1.1 - version: 6.1.1 + specifier: 6.1.2 + version: 6.1.2 ts-jest: specifier: ^29.4.5 version: 29.4.5(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(esbuild@0.27.0)(jest-util@30.2.0)(jest@30.2.0(@types/node@22.16.5))(typescript@5.9.3) @@ -945,56 +945,56 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@next/env@15.5.6': - resolution: {integrity: sha512-3qBGRW+sCGzgbpc5TS1a0p7eNxnOarGVQhZxfvTdnV0gFI61lX7QNtQ4V1TSREctXzYn5NetbUsLvyqwLFJM6Q==} + '@next/env@16.0.3': + resolution: {integrity: sha512-IqgtY5Vwsm14mm/nmQaRMmywCU+yyMIYfk3/MHZ2ZTJvwVbBn3usZnjMi1GacrMVzVcAxJShTCpZlPs26EdEjQ==} - '@next/eslint-plugin-next@15.5.6': - resolution: {integrity: sha512-YxDvsT2fwy1j5gMqk3ppXlsgDopHnkM4BoxSVASbvvgh5zgsK8lvWerDzPip8k3WVzsTZ1O7A7si1KNfN4OZfQ==} + '@next/eslint-plugin-next@16.0.3': + resolution: {integrity: sha512-6sPWmZetzFWMsz7Dhuxsdmbu3fK+/AxKRtj7OB0/3OZAI2MHB/v2FeYh271LZ9abvnM1WIwWc/5umYjx0jo5sQ==} - '@next/swc-darwin-arm64@15.5.6': - resolution: {integrity: sha512-ES3nRz7N+L5Umz4KoGfZ4XX6gwHplwPhioVRc25+QNsDa7RtUF/z8wJcbuQ2Tffm5RZwuN2A063eapoJ1u4nPg==} + '@next/swc-darwin-arm64@16.0.3': + resolution: {integrity: sha512-MOnbd92+OByu0p6QBAzq1ahVWzF6nyfiH07dQDez4/Nku7G249NjxDVyEfVhz8WkLiOEU+KFVnqtgcsfP2nLXg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.6': - resolution: {integrity: sha512-JIGcytAyk9LQp2/nuVZPAtj8uaJ/zZhsKOASTjxDug0SPU9LAM3wy6nPU735M1OqacR4U20LHVF5v5Wnl9ptTA==} + '@next/swc-darwin-x64@16.0.3': + resolution: {integrity: sha512-i70C4O1VmbTivYdRlk+5lj9xRc2BlK3oUikt3yJeHT1unL4LsNtN7UiOhVanFdc7vDAgZn1tV/9mQwMkWOJvHg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.6': - resolution: {integrity: sha512-qvz4SVKQ0P3/Im9zcS2RmfFL/UCQnsJKJwQSkissbngnB/12c6bZTCB0gHTexz1s6d/mD0+egPKXAIRFVS7hQg==} + '@next/swc-linux-arm64-gnu@16.0.3': + resolution: {integrity: sha512-O88gCZ95sScwD00mn/AtalyCoykhhlokxH/wi1huFK+rmiP5LAYVs/i2ruk7xST6SuXN4NI5y4Xf5vepb2jf6A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.6': - resolution: {integrity: sha512-FsbGVw3SJz1hZlvnWD+T6GFgV9/NYDeLTNQB2MXoPN5u9VA9OEDy6fJEfePfsUKAhJufFbZLgp0cPxMuV6SV0w==} + '@next/swc-linux-arm64-musl@16.0.3': + resolution: {integrity: sha512-CEErFt78S/zYXzFIiv18iQCbRbLgBluS8z1TNDQoyPi8/Jr5qhR3e8XHAIxVxPBjDbEMITprqELVc5KTfFj0gg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.6': - resolution: {integrity: sha512-3QnHGFWlnvAgyxFxt2Ny8PTpXtQD7kVEeaFat5oPAHHI192WKYB+VIKZijtHLGdBBvc16tiAkPTDmQNOQ0dyrA==} + '@next/swc-linux-x64-gnu@16.0.3': + resolution: {integrity: sha512-Tc3i+nwt6mQ+Dwzcri/WNDj56iWdycGVh5YwwklleClzPzz7UpfaMw1ci7bLl6GRYMXhWDBfe707EXNjKtiswQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.6': - resolution: {integrity: sha512-OsGX148sL+TqMK9YFaPFPoIaJKbFJJxFzkXZljIgA9hjMjdruKht6xDCEv1HLtlLNfkx3c5w2GLKhj7veBQizQ==} + '@next/swc-linux-x64-musl@16.0.3': + resolution: {integrity: sha512-zTh03Z/5PBBPdTurgEtr6nY0vI9KR9Ifp/jZCcHlODzwVOEKcKRBtQIGrkc7izFgOMuXDEJBmirwpGqdM/ZixA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.6': - resolution: {integrity: sha512-ONOMrqWxdzXDJNh2n60H6gGyKed42Ieu6UTVPZteXpuKbLZTH4G4eBMsr5qWgOBA+s7F+uB4OJbZnrkEDnZ5Fg==} + '@next/swc-win32-arm64-msvc@16.0.3': + resolution: {integrity: sha512-Jc1EHxtZovcJcg5zU43X3tuqzl/sS+CmLgjRP28ZT4vk869Ncm2NoF8qSTaL99gh6uOzgM99Shct06pSO6kA6g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.6': - resolution: {integrity: sha512-pxK4VIjFRx1MY92UycLOOw7dTdvccWsNETQ0kDHkBlcFH1GrTLUjSiHU1ohrznnux6TqRHgv5oflhfIWZwVROQ==} + '@next/swc-win32-x64-msvc@16.0.3': + resolution: {integrity: sha512-N7EJ6zbxgIYpI/sWNzpVKRMbfEGgsWuOIvzkML7wxAAZhPk1Msxuo/JDu1PKjWGrAoOLaZcIX5s+/pF5LIbBBg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1023,33 +1023,37 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@redis/bloom@5.9.0': - resolution: {integrity: sha512-W9D8yfKTWl4tP8lkC3MRYkMz4OfbuzE/W8iObe0jFgoRmgMfkBV+Vj38gvIqZPImtY0WB34YZkX3amYuQebvRQ==} + '@redis/bloom@5.10.0': + resolution: {integrity: sha512-doIF37ob+l47n0rkpRNgU8n4iacBlKM9xLiP1LtTZTvz8TloJB8qx/MgvhMhKdYG+CvCY2aPBnN2706izFn/4A==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.9.0 + '@redis/client': ^5.10.0 + + '@redis/client@5.10.0': + resolution: {integrity: sha512-JXmM4XCoso6C75Mr3lhKA3eNxSzkYi3nCzxDIKY+YOszYsJjuKbFgVtguVPbLMOttN4iu2fXoc2BGhdnYhIOxA==} + engines: {node: '>= 18'} '@redis/client@5.9.0': resolution: {integrity: sha512-EI0Ti5pojD2p7TmcS7RRa+AJVahdQvP/urpcSbK/K9Rlk6+dwMJTQ354pCNGCwfke8x4yKr5+iH85wcERSkwLQ==} engines: {node: '>= 18'} - '@redis/json@5.9.0': - resolution: {integrity: sha512-Bm2jjLYaXdUWPb9RaEywxnjmzw7dWKDZI4MS79mTWPV16R982jVWBj6lY2ZGelJbwxHtEVg4/FSVgYDkuO/MxA==} + '@redis/json@5.10.0': + resolution: {integrity: sha512-B2G8XlOmTPUuZtD44EMGbtoepQG34RCDXLZbjrtON1Djet0t5Ri7/YPXvL9aomXqP8lLTreaprtyLKF4tmXEEA==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.9.0 + '@redis/client': ^5.10.0 - '@redis/search@5.9.0': - resolution: {integrity: sha512-jdk2csmJ29DlpvCIb2ySjix2co14/0iwIT3C0I+7ZaToXgPbgBMB+zfEilSuncI2F9JcVxHki0YtLA0xX3VdpA==} + '@redis/search@5.10.0': + resolution: {integrity: sha512-3SVcPswoSfp2HnmWbAGUzlbUPn7fOohVu2weUQ0S+EMiQi8jwjL+aN2p6V3TI65eNfVsJ8vyPvqWklm6H6esmg==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.9.0 + '@redis/client': ^5.10.0 - '@redis/time-series@5.9.0': - resolution: {integrity: sha512-W6ILxcyOqhnI7ELKjJXOktIg3w4+aBHugDbVpgVLPZ+YDjObis1M0v7ZzwlpXhlpwsfePfipeSK+KWNuymk52w==} + '@redis/time-series@5.10.0': + resolution: {integrity: sha512-cPkpddXH5kc/SdRhF0YG0qtjL+noqFT0AcHbQ6axhsPsO7iqPi1cjxgdkE9TNeKiBUUdCaU1DbqkR/LzbzPBhg==} engines: {node: '>= 18'} peerDependencies: - '@redis/client': ^5.9.0 + '@redis/client': ^5.10.0 '@rollup/rollup-android-arm-eabi@4.53.2': resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} @@ -1169,9 +1173,6 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.15.0': - resolution: {integrity: sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==} - '@sinclair/typebox@0.34.41': resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} @@ -1319,8 +1320,8 @@ packages: peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.5': - resolution: {integrity: sha512-keKxkZMqnDicuvFoJbzrhbtdLSPhj/rZThDlKWCDbgXmUg0rEUFtRssDXKYmtXluZlIqiC5VqkCgRwzuyLHKHw==} + '@types/react@19.2.6': + resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -1331,14 +1332,6 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.46.4': - resolution: {integrity: sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.46.4 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/eslint-plugin@8.47.0': resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1347,13 +1340,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.4': - resolution: {integrity: sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.47.0': resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1361,45 +1347,22 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.4': - resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.47.0': resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.46.4': - resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.47.0': resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.4': - resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.47.0': resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.4': - resolution: {integrity: sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.47.0': resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1407,33 +1370,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.46.4': - resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.47.0': resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.46.4': - resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.47.0': resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.4': - resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.47.0': resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1441,10 +1387,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.46.4': - resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.47.0': resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1811,8 +1753,8 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - csstype@3.2.0: - resolution: {integrity: sha512-si++xzRAY9iPp60roQiFta7OFbhrgvcthrhlNAGeQptSY25uJjkfUV8OArC3KLocB8JT8ohz+qgxWCmz8RhjIg==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -1974,10 +1916,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.5.6: - resolution: {integrity: sha512-cGr3VQlPsZBEv8rtYp4BpG1KNXDqGvPo9VC1iaCgIA11OfziC/vczng+TnAS3WpRIR3Q5ye/6yl+CRUuZ1fPGg==} + eslint-config-next@16.0.3: + resolution: {integrity: sha512-5F6qDjcZldf0Y0ZbqvWvap9xzYUxyDf7/of37aeyhvkrQokj/4bT1JYWZdlWUr283aeVa+s52mPq9ogmGg+5dw==} peerDependencies: - eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + eslint: '>=9.0.0' typescript: '>=3.3.1' peerDependenciesMeta: typescript: @@ -2042,9 +1984,9 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -2268,10 +2210,9 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@12.0.0: - resolution: {integrity: sha512-5Qcll1z7IKgHr5g485ePDdHcNQY0k2dtv/bjYy0iuyGxQw2qSOiiXUXJ+AYQpg3HNoUMHqAruX478Jeev7UULw==} + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} engines: {node: 20 || >=22} - hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -2285,6 +2226,10 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + engines: {node: '>=18'} + globals@16.5.0: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} @@ -2335,6 +2280,12 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -2532,10 +2483,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - jest-changed-files@30.2.0: resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2915,9 +2862,9 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@15.5.6: - resolution: {integrity: sha512-zTxsnI3LQo3c9HSdSf91O1jMNsEzIXDShXd4wVdg9y5shwLqBXi4ZtUUJyB86KGVSJLZx0PFONvO54aheGX8QQ==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + next@16.0.3: + resolution: {integrity: sha512-Ka0/iNBblPFcIubTA1Jjh6gvwqfjrGq1Y2MTI5lbjeLIAfmC+p5bQmojpRZqgHHVu5cG4+qdIiwXiBSm/8lZ3w==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -3163,8 +3110,8 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - redis@5.9.0: - resolution: {integrity: sha512-E8dQVLSyH6UE/C9darFuwq4usOPrqfZ1864kI4RFbr5Oj9ioB9qPF0oJMwX7s8mf6sPYrz84x/Dx1PGF3/0EaQ==} + redis@5.10.0: + resolution: {integrity: sha512-0/Y+7IEiTgVGPrLFKy8oAEArSyEJkU0zvgV5xyi9NzNQ+SLZmyFbUsWIbgPcd4UdUh00opXGKlXJwMmsis5Byw==} engines: {node: '>= 18'} reflect.getprototypeof@1.0.10: @@ -3212,8 +3159,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@6.1.1: - resolution: {integrity: sha512-aSeDGyL93+CQ/Mn5p8/+dIPSADLLUVxDE2pcrTqEEKMRdwfneUqOcsAOlJmL9OpSUCerImb56WiYE/xbPhyueA==} + rimraf@6.1.2: + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} engines: {node: 20 || >=22} hasBin: true @@ -3720,6 +3667,15 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + snapshots: '@alloc/quick-lru@5.2.0': {} @@ -4500,34 +4456,34 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@15.5.6': {} + '@next/env@16.0.3': {} - '@next/eslint-plugin-next@15.5.6': + '@next/eslint-plugin-next@16.0.3': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.6': + '@next/swc-darwin-arm64@16.0.3': optional: true - '@next/swc-darwin-x64@15.5.6': + '@next/swc-darwin-x64@16.0.3': optional: true - '@next/swc-linux-arm64-gnu@15.5.6': + '@next/swc-linux-arm64-gnu@16.0.3': optional: true - '@next/swc-linux-arm64-musl@15.5.6': + '@next/swc-linux-arm64-musl@16.0.3': optional: true - '@next/swc-linux-x64-gnu@15.5.6': + '@next/swc-linux-x64-gnu@16.0.3': optional: true - '@next/swc-linux-x64-musl@15.5.6': + '@next/swc-linux-x64-musl@16.0.3': optional: true - '@next/swc-win32-arm64-msvc@15.5.6': + '@next/swc-win32-arm64-msvc@16.0.3': optional: true - '@next/swc-win32-x64-msvc@15.5.6': + '@next/swc-win32-x64-msvc@16.0.3': optional: true '@nodelib/fs.scandir@2.1.5': @@ -4549,25 +4505,29 @@ snapshots: '@pkgr/core@0.2.9': {} - '@redis/bloom@5.9.0(@redis/client@5.9.0)': + '@redis/bloom@5.10.0(@redis/client@5.10.0)': dependencies: - '@redis/client': 5.9.0 + '@redis/client': 5.10.0 + + '@redis/client@5.10.0': + dependencies: + cluster-key-slot: 1.1.2 '@redis/client@5.9.0': dependencies: cluster-key-slot: 1.1.2 - '@redis/json@5.9.0(@redis/client@5.9.0)': + '@redis/json@5.10.0(@redis/client@5.10.0)': dependencies: - '@redis/client': 5.9.0 + '@redis/client': 5.10.0 - '@redis/search@5.9.0(@redis/client@5.9.0)': + '@redis/search@5.10.0(@redis/client@5.10.0)': dependencies: - '@redis/client': 5.9.0 + '@redis/client': 5.10.0 - '@redis/time-series@5.9.0(@redis/client@5.9.0)': + '@redis/time-series@5.10.0(@redis/client@5.10.0)': dependencies: - '@redis/client': 5.9.0 + '@redis/client': 5.10.0 '@rollup/rollup-android-arm-eabi@4.53.2': optional: true @@ -4640,8 +4600,6 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.15.0': {} - '@sinclair/typebox@0.34.41': {} '@sinonjs/commons@3.0.1': @@ -4780,13 +4738,13 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/react-dom@19.2.3(@types/react@19.2.5)': + '@types/react-dom@19.2.3(@types/react@19.2.6)': dependencies: - '@types/react': 19.2.5 + '@types/react': 19.2.6 - '@types/react@19.2.5': + '@types/react@19.2.6': dependencies: - csstype: 3.2.0 + csstype: 3.2.3 '@types/stack-utils@2.0.3': {} @@ -4796,23 +4754,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.4 - '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.4 - eslint: 9.39.1(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -4830,14 +4771,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.46.4 - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.4 - debug: 4.4.3 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.47.0 eslint: 9.39.1(jiti@2.6.1) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4854,11 +4800,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.4(typescript@5.9.3)': + '@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) - '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.47.0 debug: 4.4.3 + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4872,36 +4821,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.46.4': - dependencies: - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/visitor-keys': 8.46.4 - '@typescript-eslint/scope-manager@8.47.0': dependencies: '@typescript-eslint/types': 8.47.0 '@typescript-eslint/visitor-keys': 8.47.0 - '@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.47.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.47.0 @@ -4914,26 +4842,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.4': {} - - '@typescript-eslint/types@8.47.0': {} - - '@typescript-eslint/typescript-estree@8.46.4(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.4(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/visitor-keys': 8.46.4 + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 + eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/types@8.47.0': {} + '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.47.0(typescript@5.9.3) @@ -4950,17 +4872,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.46.4 - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.47.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) @@ -4972,10 +4883,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.46.4': + '@typescript-eslint/utils@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.46.4 - eslint-visitor-keys: 4.2.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.47.0 + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/visitor-keys@8.47.0': dependencies: @@ -5336,7 +5253,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - csstype@3.2.0: {} + csstype@3.2.3: {} damerau-levenshtein@1.0.8: {} @@ -5590,22 +5507,22 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.5.6(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-config-next@16.0.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@next/eslint-plugin-next': 15.5.6 - '@rushstack/eslint-patch': 1.15.0 - '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@next/eslint-plugin-next': 16.0.3 eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-react-hooks: 7.0.1(eslint@9.39.1(jiti@2.6.1)) + globals: 16.4.0 + typescript-eslint: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: + - '@typescript-eslint/parser' - eslint-import-resolver-webpack - eslint-plugin-import-x - supports-color @@ -5633,22 +5550,21 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -5659,7 +5575,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -5670,8 +5586,6 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -5696,9 +5610,16 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)): dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 eslint: 9.39.1(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 4.1.12 + zod-validation-error: 4.0.2(zod@4.1.12) + transitivePeerDependencies: + - supports-color eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.1)): dependencies: @@ -6028,13 +5949,10 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@12.0.0: + glob@13.0.0: dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 minimatch: 10.1.1 minipass: 7.1.2 - package-json-from-dist: 1.0.1 path-scurry: 2.0.1 glob@7.2.3: @@ -6052,6 +5970,8 @@ snapshots: globals@14.0.0: {} + globals@16.4.0: {} + globals@16.5.0: {} globalthis@1.0.4: @@ -6096,6 +6016,12 @@ snapshots: dependencies: function-bind: 1.1.2 + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + html-escaper@2.0.2: {} human-signals@2.1.0: {} @@ -6303,10 +6229,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - jest-changed-files@30.2.0: dependencies: execa: 5.1.1 @@ -6850,9 +6772,9 @@ snapshots: neo-async@2.6.2: {} - next@15.5.6(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@16.0.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@next/env': 15.5.6 + '@next/env': 16.0.3 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001754 postcss: 8.4.31 @@ -6860,14 +6782,14 @@ snapshots: react-dom: 19.2.0(react@19.2.0) styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.6 - '@next/swc-darwin-x64': 15.5.6 - '@next/swc-linux-arm64-gnu': 15.5.6 - '@next/swc-linux-arm64-musl': 15.5.6 - '@next/swc-linux-x64-gnu': 15.5.6 - '@next/swc-linux-x64-musl': 15.5.6 - '@next/swc-win32-arm64-msvc': 15.5.6 - '@next/swc-win32-x64-msvc': 15.5.6 + '@next/swc-darwin-arm64': 16.0.3 + '@next/swc-darwin-x64': 16.0.3 + '@next/swc-linux-arm64-gnu': 16.0.3 + '@next/swc-linux-arm64-musl': 16.0.3 + '@next/swc-linux-x64-gnu': 16.0.3 + '@next/swc-linux-x64-musl': 16.0.3 + '@next/swc-win32-arm64-msvc': 16.0.3 + '@next/swc-win32-x64-msvc': 16.0.3 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -7085,13 +7007,13 @@ snapshots: readdirp@4.1.2: {} - redis@5.9.0: + redis@5.10.0: dependencies: - '@redis/bloom': 5.9.0(@redis/client@5.9.0) - '@redis/client': 5.9.0 - '@redis/json': 5.9.0(@redis/client@5.9.0) - '@redis/search': 5.9.0(@redis/client@5.9.0) - '@redis/time-series': 5.9.0(@redis/client@5.9.0) + '@redis/bloom': 5.10.0(@redis/client@5.10.0) + '@redis/client': 5.10.0 + '@redis/json': 5.10.0(@redis/client@5.10.0) + '@redis/search': 5.10.0(@redis/client@5.10.0) + '@redis/time-series': 5.10.0(@redis/client@5.10.0) reflect.getprototypeof@1.0.10: dependencies: @@ -7143,9 +7065,9 @@ snapshots: dependencies: glob: 7.2.3 - rimraf@6.1.1: + rimraf@6.1.2: dependencies: - glob: 12.0.0 + glob: 13.0.0 package-json-from-dist: 1.0.1 rollup@4.53.2: @@ -7638,6 +7560,17 @@ snapshots: transitivePeerDependencies: - supports-color + typescript-eslint@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + typescript@5.9.3: {} ufo@1.6.1: {} @@ -7787,3 +7720,9 @@ snapshots: yocto-queue@0.1.0: {} yocto-queue@1.2.2: {} + + zod-validation-error@4.0.2(zod@4.1.12): + dependencies: + zod: 4.1.12 + + zod@4.1.12: {} From 4fc0263ec00edd5a2a3c4243158de2b387aeb363 Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Mon, 24 Nov 2025 09:04:53 +0100 Subject: [PATCH 07/15] Ran migrations from next 16 docs --- examples/redis-minimal/package.json | 12 +++++-- .../redis-minimal/src/app/api/cache/route.ts | 2 +- .../src/app/ppr-example/page.tsx | 2 -- pnpm-lock.yaml | 36 +++++++++---------- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/examples/redis-minimal/package.json b/examples/redis-minimal/package.json index 008a311..a4a2b3e 100644 --- a/examples/redis-minimal/package.json +++ b/examples/redis-minimal/package.json @@ -14,9 +14,9 @@ }, "dependencies": { "@fortedigital/nextjs-cache-handler": "workspace:*", - "next": "^16.0.3", - "react": "^19.2.0", - "react-dom": "^19.2.0", + "next": "16.0.3", + "react": "19.2.0", + "react-dom": "19.2.0", "redis": "^5.10.0" }, "devDependencies": { @@ -33,5 +33,11 @@ "overrides": { "@types/react": "19.2.6", "@types/react-dom": "19.2.3" + }, + "pnpm": { + "overrides": { + "@types/react": "19.2.6", + "@types/react-dom": "19.2.3" + } } } diff --git a/examples/redis-minimal/src/app/api/cache/route.ts b/examples/redis-minimal/src/app/api/cache/route.ts index b44e171..7283a53 100644 --- a/examples/redis-minimal/src/app/api/cache/route.ts +++ b/examples/redis-minimal/src/app/api/cache/route.ts @@ -1,6 +1,6 @@ import { revalidateTag } from "next/cache"; export async function GET() { - revalidateTag("futurama"); + revalidateTag("futurama", "max"); return new Response("Cache cleared for futurama tag"); } diff --git a/examples/redis-minimal/src/app/ppr-example/page.tsx b/examples/redis-minimal/src/app/ppr-example/page.tsx index 25388dc..391a001 100644 --- a/examples/redis-minimal/src/app/ppr-example/page.tsx +++ b/examples/redis-minimal/src/app/ppr-example/page.tsx @@ -18,6 +18,4 @@ export default function Page({ ); } -export const experimental_ppr = true; - export const revalidate = 3600; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b0166b8..86fa9c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,13 +18,13 @@ importers: specifier: workspace:* version: link:../../packages/nextjs-cache-handler next: - specifier: ^16.0.3 + specifier: 16.0.3 version: 16.0.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: - specifier: ^19.2.0 + specifier: 19.2.0 version: 19.2.0 react-dom: - specifier: ^19.2.0 + specifier: 19.2.0 version: 19.2.0(react@19.2.0) redis: specifier: ^5.10.0 @@ -3673,8 +3673,8 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - zod@4.1.12: - resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + zod@4.1.13: + resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} snapshots: @@ -5512,8 +5512,8 @@ snapshots: '@next/eslint-plugin-next': 16.0.3 eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: 7.0.1(eslint@9.39.1(jiti@2.6.1)) @@ -5539,7 +5539,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -5550,21 +5550,21 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -5575,7 +5575,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -5616,8 +5616,8 @@ snapshots: '@babel/parser': 7.28.5 eslint: 9.39.1(jiti@2.6.1) hermes-parser: 0.25.1 - zod: 4.1.12 - zod-validation-error: 4.0.2(zod@4.1.12) + zod: 4.1.13 + zod-validation-error: 4.0.2(zod@4.1.13) transitivePeerDependencies: - supports-color @@ -7721,8 +7721,8 @@ snapshots: yocto-queue@1.2.2: {} - zod-validation-error@4.0.2(zod@4.1.12): + zod-validation-error@4.0.2(zod@4.1.13): dependencies: - zod: 4.1.12 + zod: 4.1.13 - zod@4.1.12: {} + zod@4.1.13: {} From 8e7f413095a8b6b11d0b5d22952ceda7f594f6e7 Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Mon, 24 Nov 2025 09:06:36 +0100 Subject: [PATCH 08/15] Fixed new lint issues --- examples/redis-minimal/eslint.config.mjs | 24 ++++++++++--------- examples/redis-minimal/package.json | 3 +-- .../src/app/fetch-example/page.tsx | 16 +++++++------ .../src/app/ppr-example/Example.tsx | 16 +++++++------ 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/examples/redis-minimal/eslint.config.mjs b/examples/redis-minimal/eslint.config.mjs index c85fb67..6d22b8e 100644 --- a/examples/redis-minimal/eslint.config.mjs +++ b/examples/redis-minimal/eslint.config.mjs @@ -1,16 +1,18 @@ -import { dirname } from "path"; -import { fileURLToPath } from "url"; -import { FlatCompat } from "@eslint/eslintrc"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - -const compat = new FlatCompat({ - baseDirectory: __dirname, -}); +import nextCoreWebVitals from "eslint-config-next/core-web-vitals"; +import nextTypescript from "eslint-config-next/typescript"; const eslintConfig = [ - ...compat.extends("next/core-web-vitals", "next/typescript"), + ...nextCoreWebVitals, + ...nextTypescript, + { + ignores: [ + "node_modules/**", + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ], + }, ]; export default eslintConfig; diff --git a/examples/redis-minimal/package.json b/examples/redis-minimal/package.json index a4a2b3e..f96f3c8 100644 --- a/examples/redis-minimal/package.json +++ b/examples/redis-minimal/package.json @@ -10,7 +10,7 @@ "dev": "next dev --turbopack", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "eslint ." }, "dependencies": { "@fortedigital/nextjs-cache-handler": "workspace:*", @@ -20,7 +20,6 @@ "redis": "^5.10.0" }, "devDependencies": { - "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", "@types/node": "^24", "@types/react": "19.2.6", diff --git a/examples/redis-minimal/src/app/fetch-example/page.tsx b/examples/redis-minimal/src/app/fetch-example/page.tsx index 4a30941..67c19fe 100644 --- a/examples/redis-minimal/src/app/fetch-example/page.tsx +++ b/examples/redis-minimal/src/app/fetch-example/page.tsx @@ -1,4 +1,5 @@ export default async function Home() { + let name: string; try { const characterResponse = await fetch( "https://api.sampleapis.com/futurama/characters/1", @@ -10,13 +11,7 @@ export default async function Home() { } ); const character = await characterResponse.json(); - const name = character.name.first; - return ( -
-

Name: {name}

- {new Date().toISOString()} -
- ); + name = character.name.first; } catch (error) { console.error("Error fetching character data:", error); return ( @@ -25,4 +20,11 @@ export default async function Home() { ); } + + return ( +
+

Name: {name}

+ {new Date().toISOString()} +
+ ); } diff --git a/examples/redis-minimal/src/app/ppr-example/Example.tsx b/examples/redis-minimal/src/app/ppr-example/Example.tsx index 3bbce83..748d2dd 100644 --- a/examples/redis-minimal/src/app/ppr-example/Example.tsx +++ b/examples/redis-minimal/src/app/ppr-example/Example.tsx @@ -4,6 +4,7 @@ export async function Example({ searchParams: Promise<{ characterId: string }>; }) { const characterId = (await searchParams).characterId; + let name: string; try { const characterResponse = await fetch( `https://api.sampleapis.com/futurama/characters/${characterId}`, @@ -15,13 +16,7 @@ export async function Example({ } ); const character = await characterResponse.json(); - const name = character.name.first; - return ( -
-

Name: {name}

- {new Date().toISOString()} -
- ); + name = character.name.first; } catch (error) { console.error("Error fetching character data:", error); return ( @@ -30,6 +25,13 @@ export async function Example({ ); } + + return ( +
+

Name: {name}

+ {new Date().toISOString()} +
+ ); } export async function Skeleton() { From 506466c0bdf70ff2c350caa2ddea2878fd9572c6 Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Mon, 24 Nov 2025 09:08:57 +0100 Subject: [PATCH 09/15] Fixed package json --- examples/redis-minimal/package.json | 6 ------ package.json | 4 ++++ pnpm-lock.yaml | 19 ++++++++----------- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/examples/redis-minimal/package.json b/examples/redis-minimal/package.json index f96f3c8..c08ce34 100644 --- a/examples/redis-minimal/package.json +++ b/examples/redis-minimal/package.json @@ -32,11 +32,5 @@ "overrides": { "@types/react": "19.2.6", "@types/react-dom": "19.2.3" - }, - "pnpm": { - "overrides": { - "@types/react": "19.2.6", - "@types/react-dom": "19.2.3" - } } } diff --git a/package.json b/package.json index 5c4a00a..31af4e2 100644 --- a/package.json +++ b/package.json @@ -16,5 +16,9 @@ "engines": { "node": ">=22.0.0", "pnpm": ">=9.0.0" + }, + "overrides": { + "@types/react": "19.2.6", + "@types/react-dom": "19.2.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86fa9c0..e64f80f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,9 +30,6 @@ importers: specifier: ^5.10.0 version: 5.10.0 devDependencies: - '@eslint/eslintrc': - specifier: ^3 - version: 3.3.1 '@tailwindcss/postcss': specifier: ^4 version: 4.1.17 @@ -5512,8 +5509,8 @@ snapshots: '@next/eslint-plugin-next': 16.0.3 eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: 7.0.1(eslint@9.39.1(jiti@2.6.1)) @@ -5539,7 +5536,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -5550,21 +5547,21 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -5575,7 +5572,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 From 6ca1d0b6e827940bf8fad0b17c2d7161b3d3eb44 Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Mon, 24 Nov 2025 09:57:22 +0100 Subject: [PATCH 10/15] Adjusted .env and added readme comment --- examples/redis-minimal/.env | 2 +- examples/redis-minimal/README.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/redis-minimal/.env b/examples/redis-minimal/.env index 6d77175..c2cfccc 100644 --- a/examples/redis-minimal/.env +++ b/examples/redis-minimal/.env @@ -1,3 +1,3 @@ NEXT_PRIVATE_DEBUG_CACHE="1" REDIS_URL="redis://localhost:6379" -REDIS_SINGLE_CONNECTION=true \ No newline at end of file +REDIS_SINGLE_CONNECTION=false \ No newline at end of file diff --git a/examples/redis-minimal/README.md b/examples/redis-minimal/README.md index eae937b..82c0dc9 100644 --- a/examples/redis-minimal/README.md +++ b/examples/redis-minimal/README.md @@ -6,6 +6,7 @@ First, run the development server: ```bash npm i +npm run build # important to run once to create cacheHandler dist file npm run dev ``` From 31eb08fc8ebee8d931daa2084e1b6c105b028128 Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki <26150059+AyronK@users.noreply.github.com> Date: Mon, 24 Nov 2025 10:24:11 +0100 Subject: [PATCH 11/15] Reworked example project (#160) * Reworked examples * Updated readme * F --- examples/redis-minimal/README.md | 121 +++++++++++-- .../redis-minimal/src/app/api/cache/route.ts | 18 +- .../src/app/examples/fetch-tags/page.tsx | 168 ++++++++++++++++++ .../src/app/examples/isr/blog/[id]/page.tsx | 165 +++++++++++++++++ .../static-params/[testName]/page.tsx | 135 ++++++++++++++ .../src/app/fetch-example/page.tsx | 30 ---- .../src/app/isr-example/blog/[id]/page.tsx | 33 ---- examples/redis-minimal/src/app/layout.tsx | 7 +- examples/redis-minimal/src/app/page.tsx | 85 ++++++++- .../src/app/ppr-example/Example.tsx | 39 ---- .../src/app/ppr-example/page.tsx | 21 --- .../[testName]/page copy.tsx | 18 -- .../static-params-test/[testName]/page.tsx | 18 -- .../src/components/ClearCacheButton.tsx | 49 +++++ .../src/components/CodeBlock.tsx | 8 + .../src/components/ExampleLayout.tsx | 33 ++++ .../redis-minimal/src/components/InfoCard.tsx | 17 ++ .../src/components/Navigation.tsx | 92 ++++++++++ examples/redis-minimal/src/types/futurama.ts | 22 +++ 19 files changed, 898 insertions(+), 181 deletions(-) create mode 100644 examples/redis-minimal/src/app/examples/fetch-tags/page.tsx create mode 100644 examples/redis-minimal/src/app/examples/isr/blog/[id]/page.tsx create mode 100644 examples/redis-minimal/src/app/examples/static-params/[testName]/page.tsx delete mode 100644 examples/redis-minimal/src/app/fetch-example/page.tsx delete mode 100644 examples/redis-minimal/src/app/isr-example/blog/[id]/page.tsx delete mode 100644 examples/redis-minimal/src/app/ppr-example/Example.tsx delete mode 100644 examples/redis-minimal/src/app/ppr-example/page.tsx delete mode 100644 examples/redis-minimal/src/app/static-params-test/[testName]/page copy.tsx delete mode 100644 examples/redis-minimal/src/app/static-params-test/[testName]/page.tsx create mode 100644 examples/redis-minimal/src/components/ClearCacheButton.tsx create mode 100644 examples/redis-minimal/src/components/CodeBlock.tsx create mode 100644 examples/redis-minimal/src/components/ExampleLayout.tsx create mode 100644 examples/redis-minimal/src/components/InfoCard.tsx create mode 100644 examples/redis-minimal/src/components/Navigation.tsx create mode 100644 examples/redis-minimal/src/types/futurama.ts diff --git a/examples/redis-minimal/README.md b/examples/redis-minimal/README.md index 82c0dc9..5665113 100644 --- a/examples/redis-minimal/README.md +++ b/examples/redis-minimal/README.md @@ -1,33 +1,130 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +# Next.js Cache Handler Examples + +This example application demonstrates various Next.js caching functionalities using the Redis cache handler. It provides a comprehensive UI to explore and test different caching strategies. ## Getting Started -First, run the development server: +First, install dependencies: ```bash npm i -npm run build # important to run once to create cacheHandler dist file -npm run dev ``` -Or run build and run production server: +### Important: Development vs Production Mode + +**Next.js does not use the cache handler in development mode.** This is a Next.js limitation - caching is intentionally disabled in dev mode for faster hot reloading and to ensure developers always see fresh data. + +To test caching functionality, you must use **production mode**: ```bash -npm i npm run build npm run start ``` +For development (without caching): + +```bash +npm run dev +``` + Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. -Modify `.env` file if you need to. +## Configuration + +Modify the `.env` file if you need to configure Redis connection settings. The default Redis URL is used if not specified. ## Examples -- http://localhost:3000 -- http://localhost:3000/fetch-example -- http://localhost:3000/static-params-test/cache +The application includes several examples demonstrating different Next.js caching features: + +### 1. Home Page (`/`) + +Overview page listing all available examples with descriptions and features. + +### 2. Fetch with Tags (`/examples/fetch-tags`) + +Demonstrates fetch caching with tags and time-based revalidation. + +**Features:** + +- Time-based revalidation (24 hours) +- Cache tags for selective invalidation +- Clear cache button to test tag revalidation +- Shows character data from Futurama API +- Displays cache information and rendered timestamp + +**Try it:** + +- Visit `/examples/fetch-tags` to see cached data +- Click "Clear Cache" to invalidate the cache +- Reload the page to see fresh data + +### 3. ISR with Static Params (`/examples/isr/blog/[id]`) + +Incremental Static Regeneration with `generateStaticParams`. + +**Features:** + +- Static generation at build time +- On-demand regeneration +- Time-based revalidation (1 hour) +- Multiple blog post routes + +**Try it:** + +- Visit `/examples/isr/blog/1` for the first post +- Try different IDs like `/examples/isr/blog/2`, `/examples/isr/blog/3` +- Check the rendered timestamp to see caching in action + +### 5. Static Params Test (`/examples/static-params/[testName]`) + +Tests static params generation with dynamic routes. + +**Features:** + +- Static params generation +- Dynamic params support +- Short revalidation period (5 seconds) for testing +- Shows generation type (static vs dynamic) + +**Try it:** + +- Visit `/examples/static-params/cache` (pre-generated) +- Try `/examples/static-params/test1` or `/examples/static-params/test2` (on-demand) + +## API Routes + +### Clear Cache (`/api/cache`) + +Clears cache for a specific tag. + +**Usage:** + +- `GET /api/cache?tag=futurama` - Clears cache for the "futurama" tag +- Default tag is "futurama" if not specified + +**Example:** + +```bash +curl http://localhost:3000/api/cache?tag=futurama +``` + +## Cache Handler + +This example uses a custom Redis cache handler configured in `cache-handler.mjs`. The handler supports: + +- Redis string-based caching +- Local LRU fallback +- Composite caching strategy +- Tag-based cache invalidation + +**Note:** The cache handler only works in production mode. In development mode, Next.js bypasses the cache handler entirely. You'll see a warning message in the console: `"Next.js does not use the cache in development mode. Use production mode to enable caching."` -## Clear fetch example cache +## Technologies -- http://localhost:3000/api/cache +- Next.js 16 +- React 19 +- TypeScript +- Tailwind CSS +- Redis +- @fortedigital/nextjs-cache-handler diff --git a/examples/redis-minimal/src/app/api/cache/route.ts b/examples/redis-minimal/src/app/api/cache/route.ts index 7283a53..68f3bdb 100644 --- a/examples/redis-minimal/src/app/api/cache/route.ts +++ b/examples/redis-minimal/src/app/api/cache/route.ts @@ -1,6 +1,18 @@ import { revalidateTag } from "next/cache"; +import { NextRequest } from "next/server"; -export async function GET() { - revalidateTag("futurama", "max"); - return new Response("Cache cleared for futurama tag"); +export async function GET(request: NextRequest) { + const searchParams = request.nextUrl.searchParams; + const tag = searchParams.get("tag") || "futurama"; + + try { + revalidateTag(tag, "max"); + return new Response(`Cache cleared for tag: ${tag}`, { + status: 200, + }); + } catch (error) { + return new Response(`Error clearing cache for tag: ${tag}`, { + status: 500, + }); + } } diff --git a/examples/redis-minimal/src/app/examples/fetch-tags/page.tsx b/examples/redis-minimal/src/app/examples/fetch-tags/page.tsx new file mode 100644 index 0000000..4d351a7 --- /dev/null +++ b/examples/redis-minimal/src/app/examples/fetch-tags/page.tsx @@ -0,0 +1,168 @@ +import { ExampleLayout } from "@/components/ExampleLayout"; +import { ClearCacheButton } from "@/components/ClearCacheButton"; +import { InfoCard } from "@/components/InfoCard"; +import { CodeBlock } from "@/components/CodeBlock"; +import { FuturamaCharacter } from "@/types/futurama"; + +export default async function FetchTagsExample() { + let name: string; + let character: FuturamaCharacter; + const timestamp = new Date().toISOString(); + + try { + const characterResponse = await fetch( + "https://api.sampleapis.com/futurama/characters/1", + { + next: { + revalidate: 86400, + tags: ["futurama"], + }, + } + ); + character = await characterResponse.json(); + name = character.name.first; + } catch (error) { + console.error("Error fetching character data:", error); + return ( + +
+ An error occurred during fetch. Please check your network connection. +
+
+ ); + } + + return ( + } + > +
+ +
    +
  • + Data is fetched with a 24-hour revalidation period ( + + revalidate: 86400 + + ) +
  • +
  • + Cache is tagged with{" "} + + "futurama" + {" "} + for selective invalidation +
  • +
  • + Click "Clear Cache" to invalidate the cache and see + fresh data on reload +
  • +
  • + The timestamp shows when this page was rendered (cached pages will + show the same timestamp) +
  • +
+
+ +
+
+

+ Character Data +

+
+
+ + Name: + {" "} + {name} +
+ {character.name.middle && ( +
+ + Middle Name: + {" "} + + {character.name.middle} + +
+ )} +
+ + Last Name: + {" "} + + {character.name.last} + +
+ {character.occupation && ( +
+ + Occupation: + {" "} + + {character.occupation} + +
+ )} +
+
+ +
+

+ Cache Information +

+
+
+ + Rendered at: + {" "} + + {timestamp} + +
+
+ + Cache Tag: + {" "} + + futurama + +
+
+ + Revalidation: + {" "} + + 24 hours + +
+
+
+
+ +
+

+ Code Example +

+ + {`const response = await fetch( + "https://api.sampleapis.com/futurama/characters/1", + { + next: { + revalidate: 86400, + tags: ["futurama"], + }, + } +);`} + +
+
+
+ ); +} + diff --git a/examples/redis-minimal/src/app/examples/isr/blog/[id]/page.tsx b/examples/redis-minimal/src/app/examples/isr/blog/[id]/page.tsx new file mode 100644 index 0000000..86c6c7b --- /dev/null +++ b/examples/redis-minimal/src/app/examples/isr/blog/[id]/page.tsx @@ -0,0 +1,165 @@ +import { ExampleLayout } from "@/components/ExampleLayout"; +import { InfoCard } from "@/components/InfoCard"; +import { CodeBlock } from "@/components/CodeBlock"; + +interface Post { + id: string; + title: string; + content: string; +} + +export const revalidate = 3600; + +export async function generateStaticParams() { + try { + const posts: Post[] = await fetch("https://api.vercel.app/blog").then( + (res) => res.json() + ); + return posts.map((post) => ({ + id: String(post.id), + })); + } catch (error) { + console.error("Error generating static params:", error); + return []; + } +} + +export default async function Page({ + params, +}: { + params: Promise<{ id: string }>; +}) { + const { id } = await params; + const timestamp = new Date().toISOString(); + + let post: Post; + try { + post = await fetch(`https://api.vercel.app/blog/${id}`).then((res) => + res.json() + ); + } catch (error) { + return ( + +
+ An error occurred fetching the post. Please check your network + connection. +
+
+ ); + } + + return ( + +
+ +
    +
  • + + generateStaticParams + {" "} + generates static paths at build time +
  • +
  • + Pages are statically generated and cached for 1 hour ( + + revalidate: 3600 + + ) +
  • +
  • + After the revalidation period, pages are regenerated on the next + request +
  • +
  • + Try visiting different blog IDs (1, 2, 3, etc.) to see different + posts +
  • +
+
+ +
+
+

+ Blog Post +

+
+
+ + Post ID: + {" "} + {id} +
+

+ {post.title} +

+

+ {post.content} +

+
+
+ +
+

+ Cache Information +

+
+
+ + Rendered at: + {" "} + + {timestamp} + +
+
+ + Revalidation: + {" "} + 1 hour +
+
+ + Generation: + {" "} + + Static (ISR) + +
+
+
+
+ +
+

+ Code Example +

+ +{`export async function generateStaticParams() { + const posts = await fetch("https://api.vercel.app/blog") + .then((res) => res.json()); + return posts.map((post) => ({ + id: String(post.id), + })); +} + +export const revalidate = 3600; + +export default async function Page({ params }) { + const { id } = await params; + const post = await fetch(\`https://api.vercel.app/blog/\${id}\`) + .then((res) => res.json()); + return
{post.title}
; +}`} +
+
+
+
+ ); +} + diff --git a/examples/redis-minimal/src/app/examples/static-params/[testName]/page.tsx b/examples/redis-minimal/src/app/examples/static-params/[testName]/page.tsx new file mode 100644 index 0000000..ddd4fca --- /dev/null +++ b/examples/redis-minimal/src/app/examples/static-params/[testName]/page.tsx @@ -0,0 +1,135 @@ +import { ExampleLayout } from "@/components/ExampleLayout"; +import { InfoCard } from "@/components/InfoCard"; +import { CodeBlock } from "@/components/CodeBlock"; + +export const dynamicParams = true; + +export const revalidate = 5; + +export default async function TestPage({ + params, +}: { + params: Promise<{ testName: string }>; +}) { + const { testName } = await params; + const timestamp = new Date().toISOString(); + + return ( + +
+ +
    +
  • + + generateStaticParams + {" "} + generates the "cache" route at build time +
  • +
  • + + dynamicParams: true + {" "} + allows other dynamic routes to be generated on demand +
  • +
  • + Very short revalidation period (5 seconds) for testing purposes +
  • +
  • + Try visiting different routes like{" "} + + /examples/static-params/test1 + {" "} + or{" "} + + /examples/static-params/test2 + +
  • +
+
+ +
+
+

+ Route Information +

+
+
+ + Route Parameter: + {" "} + + {testName} + +
+
+ + Rendered at: + {" "} + + {timestamp} + +
+
+
+ +
+

+ Cache Information +

+
+
+ + Revalidation: + {" "} + 5 seconds +
+
+ + Dynamic Params: + {" "} + Enabled +
+
+ + Generation: + {" "} + + {testName === "cache" + ? "Static (pre-generated)" + : "On-demand (dynamic)"} + +
+
+
+
+ +
+

+ Code Example +

+ +{`export const dynamicParams = true; +export const revalidate = 5; + +export async function generateStaticParams() { + return [{ testName: "cache" }]; +} + +export default async function TestPage({ params }) { + const { testName } = await params; + return
{testName}
; +}`} +
+
+
+
+ ); +} + +export async function generateStaticParams() { + return [{ testName: "cache" }]; +} + diff --git a/examples/redis-minimal/src/app/fetch-example/page.tsx b/examples/redis-minimal/src/app/fetch-example/page.tsx deleted file mode 100644 index 67c19fe..0000000 --- a/examples/redis-minimal/src/app/fetch-example/page.tsx +++ /dev/null @@ -1,30 +0,0 @@ -export default async function Home() { - let name: string; - try { - const characterResponse = await fetch( - "https://api.sampleapis.com/futurama/characters/1", - { - next: { - revalidate: 86400, // 24 hours in seconds - tags: ["futurama"], - }, - } - ); - const character = await characterResponse.json(); - name = character.name.first; - } catch (error) { - console.error("Error fetching character data:", error); - return ( -
- An error occurred during fetch -
- ); - } - - return ( -
-

Name: {name}

- {new Date().toISOString()} -
- ); -} diff --git a/examples/redis-minimal/src/app/isr-example/blog/[id]/page.tsx b/examples/redis-minimal/src/app/isr-example/blog/[id]/page.tsx deleted file mode 100644 index 983a54c..0000000 --- a/examples/redis-minimal/src/app/isr-example/blog/[id]/page.tsx +++ /dev/null @@ -1,33 +0,0 @@ -interface Post { - id: string; - title: string; - content: string; -} - -export const revalidate = 3600; - -export async function generateStaticParams() { - const posts: Post[] = await fetch("https://api.vercel.app/blog").then((res) => - res.json() - ); - return posts.map((post) => ({ - id: String(post.id), - })); -} - -export default async function Page({ - params, -}: { - params: Promise<{ id: string }>; -}) { - const { id } = await params; - const post: Post = await fetch(`https://api.vercel.app/blog/${id}`).then( - (res) => res.json() - ); - return ( -
-

{post.title}

-

{post.content}

-
- ); -} diff --git a/examples/redis-minimal/src/app/layout.tsx b/examples/redis-minimal/src/app/layout.tsx index f7fa87e..4119e0c 100644 --- a/examples/redis-minimal/src/app/layout.tsx +++ b/examples/redis-minimal/src/app/layout.tsx @@ -1,6 +1,7 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; +import { Navigation } from "@/components/Navigation"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -13,8 +14,9 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Next.js Cache Handler Examples", + description: + "Examples demonstrating Next.js caching functionalities with Redis cache handler", }; export default function RootLayout({ @@ -27,6 +29,7 @@ export default function RootLayout({ + {children} diff --git a/examples/redis-minimal/src/app/page.tsx b/examples/redis-minimal/src/app/page.tsx index 695eb59..f7c0edf 100644 --- a/examples/redis-minimal/src/app/page.tsx +++ b/examples/redis-minimal/src/app/page.tsx @@ -1,9 +1,84 @@ +import Link from "next/link"; +import { ExampleLayout } from "@/components/ExampleLayout"; + +const examples = [ + { + href: "/examples/fetch-tags", + title: "Fetch with Tags", + description: + "Demonstrates fetch caching with tags and time-based revalidation. Shows how to use cache tags for selective cache invalidation.", + features: [ + "Time-based revalidation (24 hours)", + "Cache tags for selective invalidation", + "Clear cache button to test tag revalidation", + ], + }, + { + href: "/examples/isr/blog/1", + title: "ISR with Static Params", + description: + "Incremental Static Regeneration with generateStaticParams. Pages are statically generated at build time and regenerated on demand.", + features: [ + "Static generation at build time", + "On-demand regeneration", + "Time-based revalidation (1 hour)", + ], + }, + { + href: "/examples/static-params/cache", + title: "Static Params Test", + description: + "Tests static params generation with dynamic routes. Shows how static params work with revalidation.", + features: [ + "Static params generation", + "Dynamic params support", + "Short revalidation period (5 seconds)", + ], + }, +]; + export default async function Home() { return ( -
- {new Date().toISOString()} -
+ +
+
+ {examples.map((example) => ( + +

+ {example.title} +

+

+ {example.description} +

+
    + {example.features.map((feature, idx) => ( +
  • + + {feature} +
  • + ))} +
+ + ))} +
+
+

+ Note: All examples use Redis as the cache handler. + Make sure Redis is running and configured in your environment + variables. +

+
+
+
); } - -export const revalidate = 3600; diff --git a/examples/redis-minimal/src/app/ppr-example/Example.tsx b/examples/redis-minimal/src/app/ppr-example/Example.tsx deleted file mode 100644 index 748d2dd..0000000 --- a/examples/redis-minimal/src/app/ppr-example/Example.tsx +++ /dev/null @@ -1,39 +0,0 @@ -export async function Example({ - searchParams, -}: { - searchParams: Promise<{ characterId: string }>; -}) { - const characterId = (await searchParams).characterId; - let name: string; - try { - const characterResponse = await fetch( - `https://api.sampleapis.com/futurama/characters/${characterId}`, - { - next: { - revalidate: 86400, // 24 hours in seconds - tags: ["futurama"], - }, - } - ); - const character = await characterResponse.json(); - name = character.name.first; - } catch (error) { - console.error("Error fetching character data:", error); - return ( -
- An error occurred during fetch -
- ); - } - - return ( -
-

Name: {name}

- {new Date().toISOString()} -
- ); -} - -export async function Skeleton() { - return
Loading...
; -} diff --git a/examples/redis-minimal/src/app/ppr-example/page.tsx b/examples/redis-minimal/src/app/ppr-example/page.tsx deleted file mode 100644 index 391a001..0000000 --- a/examples/redis-minimal/src/app/ppr-example/page.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Suspense } from "react"; -import { Example, Skeleton } from "./Example"; - -export default function Page({ - searchParams, -}: { - searchParams: Promise<{ characterId: string }>; -}) { - return ( -
-

This will be prerendered

-
-

This will be dynamic

- }> - - -
- ); -} - -export const revalidate = 3600; diff --git a/examples/redis-minimal/src/app/static-params-test/[testName]/page copy.tsx b/examples/redis-minimal/src/app/static-params-test/[testName]/page copy.tsx deleted file mode 100644 index 938e4a4..0000000 --- a/examples/redis-minimal/src/app/static-params-test/[testName]/page copy.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from "react"; - -export const dynamicParams = true; - -export const revalidate = 5; - -export default async function TestPage({ - params, -}: { - params: Promise<{ testName: string }>; -}) { - const { testName } = await params; - return
{testName}
; -} - -export async function generateStaticParams() { - return [{ testName: "cache" }]; -} diff --git a/examples/redis-minimal/src/app/static-params-test/[testName]/page.tsx b/examples/redis-minimal/src/app/static-params-test/[testName]/page.tsx deleted file mode 100644 index 938e4a4..0000000 --- a/examples/redis-minimal/src/app/static-params-test/[testName]/page.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from "react"; - -export const dynamicParams = true; - -export const revalidate = 5; - -export default async function TestPage({ - params, -}: { - params: Promise<{ testName: string }>; -}) { - const { testName } = await params; - return
{testName}
; -} - -export async function generateStaticParams() { - return [{ testName: "cache" }]; -} diff --git a/examples/redis-minimal/src/components/ClearCacheButton.tsx b/examples/redis-minimal/src/components/ClearCacheButton.tsx new file mode 100644 index 0000000..95c0b4f --- /dev/null +++ b/examples/redis-minimal/src/components/ClearCacheButton.tsx @@ -0,0 +1,49 @@ +"use client"; + +import { useState } from "react"; + +export function ClearCacheButton({ + tag, + label = "Clear Cache", +}: { + tag: string; + label?: string; +}) { + const [loading, setLoading] = useState(false); + const [message, setMessage] = useState(null); + + const handleClear = async () => { + setLoading(true); + setMessage(null); + try { + const response = await fetch(`/api/cache?tag=${tag}`); + const text = await response.text(); + setMessage(text); + setTimeout(() => { + window.location.reload(); + }, 500); + } catch (error) { + setMessage("Error clearing cache"); + } finally { + setLoading(false); + } + }; + + return ( +
+ + {message && ( + + {message} + + )} +
+ ); +} + diff --git a/examples/redis-minimal/src/components/CodeBlock.tsx b/examples/redis-minimal/src/components/CodeBlock.tsx new file mode 100644 index 0000000..8968a40 --- /dev/null +++ b/examples/redis-minimal/src/components/CodeBlock.tsx @@ -0,0 +1,8 @@ +export function CodeBlock({ children }: { children: React.ReactNode }) { + return ( +
+      {children}
+    
+ ); +} + diff --git a/examples/redis-minimal/src/components/ExampleLayout.tsx b/examples/redis-minimal/src/components/ExampleLayout.tsx new file mode 100644 index 0000000..769697d --- /dev/null +++ b/examples/redis-minimal/src/components/ExampleLayout.tsx @@ -0,0 +1,33 @@ +export function ExampleLayout({ + children, + title, + description, + actions, +}: { + children: React.ReactNode; + title: string; + description: string; + actions?: React.ReactNode; +}) { + return ( +
+
+
+
+
+

+ {title} +

+ {actions &&
{actions}
} +
+

{description}

+
+
+ {children} +
+
+
+
+ ); +} + diff --git a/examples/redis-minimal/src/components/InfoCard.tsx b/examples/redis-minimal/src/components/InfoCard.tsx new file mode 100644 index 0000000..84aff50 --- /dev/null +++ b/examples/redis-minimal/src/components/InfoCard.tsx @@ -0,0 +1,17 @@ +export function InfoCard({ + title, + children, +}: { + title: string; + children: React.ReactNode; +}) { + return ( +
+

+ {title} +

+
{children}
+
+ ); +} + diff --git a/examples/redis-minimal/src/components/Navigation.tsx b/examples/redis-minimal/src/components/Navigation.tsx new file mode 100644 index 0000000..68f522d --- /dev/null +++ b/examples/redis-minimal/src/components/Navigation.tsx @@ -0,0 +1,92 @@ +"use client"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; + +const examples = [ + { href: "/", label: "Home", description: "Overview of all examples" }, + { + href: "/examples/fetch-tags", + label: "Fetch with Tags", + description: "Demonstrates fetch caching with tags and revalidation", + }, + { + href: "/examples/isr/blog/1", + label: "ISR with Static Params", + description: "Incremental Static Regeneration example", + }, + { + href: "/examples/static-params/cache", + label: "Static Params Test", + description: "Testing static params generation", + }, +]; + +export function Navigation() { + const pathname = usePathname(); + + const isActive = (href: string) => { + if (!pathname) return false; + if (href === "/") { + return pathname === "/"; + } + return pathname.startsWith(href); + }; + + return ( + + ); +} diff --git a/examples/redis-minimal/src/types/futurama.ts b/examples/redis-minimal/src/types/futurama.ts new file mode 100644 index 0000000..d753446 --- /dev/null +++ b/examples/redis-minimal/src/types/futurama.ts @@ -0,0 +1,22 @@ +export interface FuturamaCharacter { + id: number; + name: { + first: string; + middle?: string; + last: string; + full: string; + }; + age?: string; + images: { + headShot?: string; + main?: string; + }; + gender?: string; + species?: string; + homePlanet?: string; + occupation?: string; + sayings?: string[]; + createdAt?: string; + updatedAt?: string; +} + From db1408a1142ddb8eed196c5cd97d53431608c2d4 Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki <26150059+AyronK@users.noreply.github.com> Date: Mon, 24 Nov 2025 11:42:22 +0100 Subject: [PATCH 12/15] Added new examples (#161) * Extra examples * Layout changes * Added unstable cache example --- examples/redis-minimal/README.md | 106 +++++- .../redis-minimal/src/app/api/cache/route.ts | 18 -- .../src/app/api/revalidate/route.ts | 60 ++++ .../src/app/examples/default-cache/page.tsx | 167 ++++++++++ .../src/app/examples/isr/blog/[id]/page.tsx | 11 +- .../src/app/examples/no-store/page.tsx | 164 ++++++++++ .../examples/time-based-revalidation/page.tsx | 181 +++++++++++ .../src/app/examples/unstable-cache/page.tsx | 304 ++++++++++++++++++ examples/redis-minimal/src/app/layout.tsx | 8 +- examples/redis-minimal/src/app/page.tsx | 45 +++ .../src/components/ClearCacheButton.tsx | 2 +- .../src/components/Navigation.tsx | 190 ++++++++--- .../src/components/RevalidatePathButton.tsx | 55 ++++ 13 files changed, 1235 insertions(+), 76 deletions(-) delete mode 100644 examples/redis-minimal/src/app/api/cache/route.ts create mode 100644 examples/redis-minimal/src/app/api/revalidate/route.ts create mode 100644 examples/redis-minimal/src/app/examples/default-cache/page.tsx create mode 100644 examples/redis-minimal/src/app/examples/no-store/page.tsx create mode 100644 examples/redis-minimal/src/app/examples/time-based-revalidation/page.tsx create mode 100644 examples/redis-minimal/src/app/examples/unstable-cache/page.tsx create mode 100644 examples/redis-minimal/src/components/RevalidatePathButton.tsx diff --git a/examples/redis-minimal/README.md b/examples/redis-minimal/README.md index 5665113..2a746e2 100644 --- a/examples/redis-minimal/README.md +++ b/examples/redis-minimal/README.md @@ -41,7 +41,56 @@ The application includes several examples demonstrating different Next.js cachin Overview page listing all available examples with descriptions and features. -### 2. Fetch with Tags (`/examples/fetch-tags`) +### 2. Default Cache (`/examples/default-cache`) + +Demonstrates the default fetch caching behavior with `force-cache`. + +**Features:** + +- Default caching behavior (indefinite cache duration) +- Perfect for static or rarely-changing data +- Shows how Next.js caches by default + +**Try it:** + +- Visit `/examples/default-cache` to see cached data +- The timestamp will remain the same on subsequent requests +- Data is cached until manually cleared or build is redeployed + +### 3. No Store (`/examples/no-store`) + +Shows fetch with `no-store` option, which always fetches fresh data. + +**Features:** + +- Never caches responses +- Always fetches fresh data from API +- Perfect for real-time or user-specific data +- Timestamp changes on every request + +**Try it:** + +- Visit `/examples/no-store` to see fresh data on every load +- Refresh the page multiple times - timestamp changes each time +- Compare with other caching strategies + +### 4. Time-based Revalidation (`/examples/time-based-revalidation`) + +Shows fetch with time-based revalidation (standalone, without tags). + +**Features:** + +- Automatic revalidation after specified time (30 seconds) +- Balances freshness with performance +- Standalone example of `next.revalidate` + +**Try it:** + +- Visit `/examples/time-based-revalidation` to see cached data +- Refresh within 30 seconds - timestamp stays the same +- Wait 30+ seconds and refresh - timestamp updates + +### 5. Fetch with Tags (`/examples/fetch-tags`) Demonstrates fetch caching with tags and time-based revalidation. @@ -59,7 +108,26 @@ Demonstrates fetch caching with tags and time-based revalidation. - Click "Clear Cache" to invalidate the cache - Reload the page to see fresh data -### 3. ISR with Static Params (`/examples/isr/blog/[id]`) +### 6. unstable_cache (`/examples/unstable-cache`) + +Demonstrates persistent caching with `unstable_cache` for function results. + +**Features:** + +- Cache any function, not just fetch requests +- Tags and revalidation support +- Side-by-side comparison with fetch caching +- Perfect for database queries and computations +- Shows when to use unstable_cache vs fetch + +**Try it:** + +- Visit `/examples/unstable-cache` to see both caching methods +- Compare the timestamps and behavior +- Click "Clear Tag Cache" to invalidate both caches +- Understand when to use unstable_cache vs fetch + +### 7. ISR with Static Params (`/examples/isr/blog/[id]`) Incremental Static Regeneration with `generateStaticParams`. @@ -76,7 +144,7 @@ Incremental Static Regeneration with `generateStaticParams`. - Try different IDs like `/examples/isr/blog/2`, `/examples/isr/blog/3` - Check the rendered timestamp to see caching in action -### 5. Static Params Test (`/examples/static-params/[testName]`) +### 8. Static Params Test (`/examples/static-params/[testName]`) Tests static params generation with dynamic routes. @@ -94,19 +162,39 @@ Tests static params generation with dynamic routes. ## API Routes -### Clear Cache (`/api/cache`) +### Cache Revalidation (`/api/revalidate`) -Clears cache for a specific tag. +Unified endpoint for revalidating cache by tag or path. **Usage:** -- `GET /api/cache?tag=futurama` - Clears cache for the "futurama" tag -- Default tag is "futurama" if not specified +**Tag-based revalidation (GET):** + +- `GET /api/revalidate?tag=futurama` - Revalidates cache for the "futurama" tag + +**Tag-based revalidation (POST):** + +- `POST /api/revalidate` with body `{ "tag": "futurama" }` - Revalidates cache for a tag + +**Path-based revalidation (POST):** + +- `POST /api/revalidate` with body `{ "path": "/examples/default-cache" }` - Revalidates cache for a specific path -**Example:** +**Examples:** ```bash -curl http://localhost:3000/api/cache?tag=futurama +# Revalidate by tag (GET) +curl http://localhost:3000/api/revalidate?tag=futurama + +# Revalidate by tag (POST) +curl -X POST http://localhost:3000/api/revalidate \ + -H "Content-Type: application/json" \ + -d '{"tag": "futurama"}' + +# Revalidate by path (POST) +curl -X POST http://localhost:3000/api/revalidate \ + -H "Content-Type: application/json" \ + -d '{"path": "/examples/default-cache"}' ``` ## Cache Handler diff --git a/examples/redis-minimal/src/app/api/cache/route.ts b/examples/redis-minimal/src/app/api/cache/route.ts deleted file mode 100644 index 68f3bdb..0000000 --- a/examples/redis-minimal/src/app/api/cache/route.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { revalidateTag } from "next/cache"; -import { NextRequest } from "next/server"; - -export async function GET(request: NextRequest) { - const searchParams = request.nextUrl.searchParams; - const tag = searchParams.get("tag") || "futurama"; - - try { - revalidateTag(tag, "max"); - return new Response(`Cache cleared for tag: ${tag}`, { - status: 200, - }); - } catch (error) { - return new Response(`Error clearing cache for tag: ${tag}`, { - status: 500, - }); - } -} diff --git a/examples/redis-minimal/src/app/api/revalidate/route.ts b/examples/redis-minimal/src/app/api/revalidate/route.ts new file mode 100644 index 0000000..f29dcb3 --- /dev/null +++ b/examples/redis-minimal/src/app/api/revalidate/route.ts @@ -0,0 +1,60 @@ +import { revalidateTag, revalidatePath } from "next/cache"; +import { NextRequest } from "next/server"; + +export async function GET(request: NextRequest) { + const searchParams = request.nextUrl.searchParams; + const tag = searchParams.get("tag"); + + if (tag) { + try { + revalidateTag(tag, "max"); + return new Response(`Cache cleared for tag: ${tag}`, { + status: 200, + }); + } catch (error) { + return new Response(`Error clearing cache for tag: ${tag}`, { + status: 500, + }); + } + } + + return new Response("Tag parameter is required for GET requests", { + status: 400, + }); +} + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const { tag, path } = body; + + if (tag) { + revalidateTag(tag, "max"); + return new Response(`Cache cleared for tag: ${tag}`, { + status: 200, + }); + } + + if (path) { + const type = body.type as "page" | "layout" | undefined; + if (type) { + revalidatePath(path, type); + return new Response(`Cache revalidated for ${type}: ${path}`, { + status: 200, + }); + } + revalidatePath(path); + return new Response(`Cache revalidated for path: ${path}`, { + status: 200, + }); + } + + return new Response("Either 'tag' or 'path' is required", { + status: 400, + }); + } catch (error) { + return new Response(`Error revalidating cache: ${error}`, { + status: 500, + }); + } +} diff --git a/examples/redis-minimal/src/app/examples/default-cache/page.tsx b/examples/redis-minimal/src/app/examples/default-cache/page.tsx new file mode 100644 index 0000000..de42b62 --- /dev/null +++ b/examples/redis-minimal/src/app/examples/default-cache/page.tsx @@ -0,0 +1,167 @@ +import { ExampleLayout } from "@/components/ExampleLayout"; +import { InfoCard } from "@/components/InfoCard"; +import { CodeBlock } from "@/components/CodeBlock"; +import { RevalidatePathButton } from "@/components/RevalidatePathButton"; +import { FuturamaCharacter } from "@/types/futurama"; + +export default async function DefaultCacheExample() { + let name: string; + let character: FuturamaCharacter; + const timestamp = new Date().toISOString(); + + try { + const characterResponse = await fetch( + "https://api.sampleapis.com/futurama/characters/2", + { + cache: "force-cache", + } + ); + character = await characterResponse.json(); + name = character.name.first; + } catch (error) { + console.error("Error fetching character data:", error); + return ( + +
+ An error occurred during fetch. Please check your network connection. +
+
+ ); + } + + return ( + } + > +
+ +
    +
  • + By default, Next.js uses{" "} + + cache: "force-cache" + {" "} + for fetch requests +
  • +
  • + Data is cached indefinitely until the cache is manually cleared or + the build is redeployed +
  • +
  • + This is the most aggressive caching strategy - perfect for static + or rarely-changing data +
  • +
  • + The timestamp shows when this page was first rendered (it will + remain the same on subsequent requests) +
  • +
  • + Click "Refresh Cache" to manually revalidate the page + cache and see fresh data +
  • +
+
+ +
+
+

+ Character Data +

+
+
+ + Name: + {" "} + {name} +
+ {character.name.middle && ( +
+ + Middle Name: + {" "} + + {character.name.middle} + +
+ )} +
+ + Last Name: + {" "} + + {character.name.last} + +
+ {character.occupation && ( +
+ + Occupation: + {" "} + + {character.occupation} + +
+ )} +
+
+ +
+

+ Cache Information +

+
+
+ + Rendered at: + {" "} + + {timestamp} + +
+
+ + Cache Strategy: + {" "} + + force-cache + +
+
+ + Revalidation: + {" "} + + Never (indefinite) + +
+
+
+
+ +
+

+ Code Example +

+ + {`const response = await fetch( + "https://api.sampleapis.com/futurama/characters/2", + { + cache: "force-cache", + } +); + +// Or simply omit cache option (default behavior): +const response = await fetch( + "https://api.sampleapis.com/futurama/characters/2" +);`} + +
+
+
+ ); +} diff --git a/examples/redis-minimal/src/app/examples/isr/blog/[id]/page.tsx b/examples/redis-minimal/src/app/examples/isr/blog/[id]/page.tsx index 86c6c7b..bd9a28c 100644 --- a/examples/redis-minimal/src/app/examples/isr/blog/[id]/page.tsx +++ b/examples/redis-minimal/src/app/examples/isr/blog/[id]/page.tsx @@ -1,6 +1,7 @@ import { ExampleLayout } from "@/components/ExampleLayout"; import { InfoCard } from "@/components/InfoCard"; import { CodeBlock } from "@/components/CodeBlock"; +import { RevalidatePathButton } from "@/components/RevalidatePathButton"; interface Post { id: string; @@ -37,7 +38,7 @@ export default async function Page({ post = await fetch(`https://api.vercel.app/blog/${id}`).then((res) => res.json() ); - } catch (error) { + } catch { return ( } >
@@ -80,6 +82,10 @@ export default async function Page({ Try visiting different blog IDs (1, 2, 3, etc.) to see different posts +
  • + Click "Refresh Cache" to manually revalidate this page + before the 1-hour period expires +
  • @@ -140,7 +146,7 @@ export default async function Page({ Code Example -{`export async function generateStaticParams() { + {`export async function generateStaticParams() { const posts = await fetch("https://api.vercel.app/blog") .then((res) => res.json()); return posts.map((post) => ({ @@ -162,4 +168,3 @@ export default async function Page({ params }) { ); } - diff --git a/examples/redis-minimal/src/app/examples/no-store/page.tsx b/examples/redis-minimal/src/app/examples/no-store/page.tsx new file mode 100644 index 0000000..b9ce822 --- /dev/null +++ b/examples/redis-minimal/src/app/examples/no-store/page.tsx @@ -0,0 +1,164 @@ +import { ExampleLayout } from "@/components/ExampleLayout"; +import { InfoCard } from "@/components/InfoCard"; +import { CodeBlock } from "@/components/CodeBlock"; +import { RevalidatePathButton } from "@/components/RevalidatePathButton"; +import { FuturamaCharacter } from "@/types/futurama"; + +export default async function NoStoreExample() { + let name: string; + let character: FuturamaCharacter; + const timestamp = new Date().toISOString(); + + try { + const characterResponse = await fetch( + "https://api.sampleapis.com/futurama/characters/3", + { + cache: "no-store", + } + ); + character = await characterResponse.json(); + name = character.name.first; + } catch (error) { + console.error("Error fetching character data:", error); + return ( + +
    + An error occurred during fetch. Please check your network connection. +
    +
    + ); + } + + return ( + +
    + +
      +
    • + Using{" "} + + cache: "no-store" + {" "} + tells Next.js to never cache the response +
    • +
    • + Every request will fetch fresh data from the API, ensuring you + always get the latest information +
    • +
    • + The timestamp will change on every page load, showing that data is + fetched fresh each time +
    • +
    • + Use this for: real-time data, user-specific content, frequently + changing data, or when you need guaranteed freshness +
    • +
    • + Trade-off: No caching means every request hits the API, which can + increase latency and API usage +
    • +
    +
    + +
    +
    +

    + Character Data +

    +
    +
    + + Name: + {" "} + {name} +
    + {character.name.middle && ( +
    + + Middle Name: + {" "} + + {character.name.middle} + +
    + )} +
    + + Last Name: + {" "} + + {character.name.last} + +
    + {character.occupation && ( +
    + + Occupation: + {" "} + + {character.occupation} + +
    + )} +
    +
    + +
    +

    + Cache Information +

    +
    +
    + + Rendered at: + {" "} + + {timestamp} + + + (changes on every request) + +
    +
    + + Cache Strategy: + {" "} + + no-store + +
    +
    + + Caching: + {" "} + + Disabled (always fresh) + +
    +
    +
    +
    + +
    +

    + Code Example +

    + + {`const response = await fetch( + "https://api.sampleapis.com/futurama/characters/3", + { + cache: "no-store", + } +);`} + +
    +
    +
    + ); +} diff --git a/examples/redis-minimal/src/app/examples/time-based-revalidation/page.tsx b/examples/redis-minimal/src/app/examples/time-based-revalidation/page.tsx new file mode 100644 index 0000000..c22a717 --- /dev/null +++ b/examples/redis-minimal/src/app/examples/time-based-revalidation/page.tsx @@ -0,0 +1,181 @@ +import { ExampleLayout } from "@/components/ExampleLayout"; +import { InfoCard } from "@/components/InfoCard"; +import { CodeBlock } from "@/components/CodeBlock"; +import { RevalidatePathButton } from "@/components/RevalidatePathButton"; +import { FuturamaCharacter } from "@/types/futurama"; + +export default async function TimeBasedRevalidationExample() { + let name: string; + let character: FuturamaCharacter; + const timestamp = new Date().toISOString(); + + try { + const characterResponse = await fetch( + "https://api.sampleapis.com/futurama/characters/4", + { + next: { + revalidate: 30, + }, + } + ); + character = await characterResponse.json(); + name = character.name.first; + } catch (error) { + console.error("Error fetching character data:", error); + return ( + +
    + An error occurred during fetch. Please check your network connection. +
    +
    + ); + } + + return ( + } + > +
    + +
      +
    • + Using{" "} + + next: { revalidate: 30 } + {" "} + caches data for 30 seconds +
    • +
    • + During the revalidation period, cached data is served instantly + (the timestamp stays the same) +
    • +
    • + After 30 seconds, the next request will trigger a background + revalidation to fetch fresh data +
    • +
    • + This provides a good balance: fast responses with automatic + freshness updates +
    • +
    • + Perfect for data that changes periodically but doesn't need + to be real-time +
    • +
    • + Try refreshing the page - if less than 30 seconds have passed, + you'll see the same timestamp +
    • +
    • + Click "Refresh Cache" to manually revalidate before the + 30-second period expires +
    • +
    +
    + +
    +
    +

    + Character Data +

    +
    +
    + + Name: + {" "} + {name} +
    + {character.name.middle && ( +
    + + Middle Name: + {" "} + + {character.name.middle} + +
    + )} +
    + + Last Name: + {" "} + + {character.name.last} + +
    + {character.occupation && ( +
    + + Occupation: + {" "} + + {character.occupation} + +
    + )} +
    +
    + +
    +

    + Cache Information +

    +
    +
    + + Rendered at: + {" "} + + {timestamp} + +
    +
    + + Revalidation Period: + {" "} + + 30 seconds + +
    +
    + + Cache Strategy: + {" "} + + Time-based ISR + +
    +
    +

    + The timestamp will remain the same for 30 seconds. After that, + the next request will fetch fresh data. +

    +
    +
    +
    +
    + +
    +

    + Code Example +

    + + {`const response = await fetch( + "https://api.sampleapis.com/futurama/characters/4", + { + next: { + revalidate: 30, // Revalidate every 30 seconds + }, + } +);`} + +
    +
    +
    + ); +} + diff --git a/examples/redis-minimal/src/app/examples/unstable-cache/page.tsx b/examples/redis-minimal/src/app/examples/unstable-cache/page.tsx new file mode 100644 index 0000000..ce4659d --- /dev/null +++ b/examples/redis-minimal/src/app/examples/unstable-cache/page.tsx @@ -0,0 +1,304 @@ +import { ExampleLayout } from "@/components/ExampleLayout"; +import { ClearCacheButton } from "@/components/ClearCacheButton"; +import { RevalidatePathButton } from "@/components/RevalidatePathButton"; +import { InfoCard } from "@/components/InfoCard"; +import { CodeBlock } from "@/components/CodeBlock"; +import { unstable_cache } from "next/cache"; +import { FuturamaCharacter } from "@/types/futurama"; + +async function fetchCharacter(id: string): Promise { + const response = await fetch( + `https://api.sampleapis.com/futurama/characters/${id}`, + { + cache: "no-store", + } + ); + return response.json(); +} + +const getCachedCharacter = unstable_cache( + async (id: string) => { + return fetchCharacter(id); + }, + ["futurama-character"], + { + tags: ["futurama", "characters"], + revalidate: 60, + } +); + +export default async function UnstableCacheExample() { + const timestamp = new Date().toISOString(); + const characterId = "6"; + + let character: FuturamaCharacter; + let fetchCharacterData: FuturamaCharacter; + let fetchTimestamp: string; + + try { + character = await getCachedCharacter(characterId); + fetchTimestamp = new Date().toISOString(); + + const fetchResponse = await fetch( + `https://api.sampleapis.com/futurama/characters/${characterId}`, + { + next: { + revalidate: 60, + tags: ["futurama", "characters"], + }, + } + ); + fetchCharacterData = await fetchResponse.json(); + } catch (error) { + console.error("Error fetching character data:", error); + return ( + +
    + An error occurred during fetch. Please check your network connection. +
    +
    + ); + } + + return ( + + + +
    + } + > +
    + +
      +
    • + + unstable_cache + {" "} + caches the result of function calls across requests +
    • +
    • + Unlike fetch caching, this works for any function, not just API + calls +
    • +
    • Supports tags and revalidation just like fetch caching
    • +
    • + Cache key is based on the function arguments and the key array +
    • +
    • + Perfect for caching database queries, computed values, or any + expensive operations +
    • +
    • + Both examples below use the same revalidation (60 seconds) and + tags for comparison +
    • +
    +
    + +
    +
    +
    +

    + unstable_cache Result +

    +
    +
    + + Name: + {" "} + + {character.name.first} {character.name.last} + +
    + {character.occupation && ( +
    + + Occupation: + {" "} + + {character.occupation} + +
    + )} +
    + + Rendered at: + {" "} + + {timestamp} + +
    +
    +
    +
    + +
    +
    +

    + fetch Result (for comparison) +

    +
    +
    + + Name: + {" "} + + {fetchCharacterData.name.first}{" "} + {fetchCharacterData.name.last} + +
    + {fetchCharacterData.occupation && ( +
    + + Occupation: + {" "} + + {fetchCharacterData.occupation} + +
    + )} +
    + + Rendered at: + {" "} + + {fetchTimestamp} + +
    +
    +
    +
    +
    + +
    +

    + Cache Information +

    +
    +
    + + Revalidation: + {" "} + + 60 seconds + +
    +
    + + Cache Tags: + {" "} + + futurama + + + characters + +
    +
    + + Character ID: + {" "} + + {characterId} + +
    +
    +
    + +
    +
    +

    + unstable_cache Code Example +

    + + {`import { unstable_cache } from "next/cache"; + +async function fetchCharacter(id: string) { + const response = await fetch( + \`https://api.sampleapis.com/futurama/characters/\${id}\`, + { cache: "no-store" } + ); + return response.json(); +} + +const getCachedCharacter = unstable_cache( + async (id: string) => { + return fetchCharacter(id); + }, + ["futurama-character"], + { + tags: ["futurama", "characters"], + revalidate: 60, + } +); + +export default async function Page() { + const character = await getCachedCharacter("6"); + return
    {character.name.first}
    ; +}`} +
    +
    + +
    +

    + fetch Code Example (for comparison) +

    + + {`export default async function Page() { + const response = await fetch( + "https://api.sampleapis.com/futurama/characters/6", + { + next: { + revalidate: 60, + tags: ["futurama", "characters"], + }, + } + ); + const character = await response.json(); + return
    {character.name.first}
    ; +}`} +
    +
    +
    + +
    +

    + Key Differences: unstable_cache vs fetch +

    +
    +
    + unstable_cache: +
      +
    • Works with any function, not just fetch
    • +
    • Cache key includes function arguments
    • +
    • Perfect for database queries, computations, etc.
    • +
    • More flexible for complex caching scenarios
    • +
    +
    +
    + fetch: +
      +
    • Built-in caching for HTTP requests
    • +
    • Simpler API for API calls
    • +
    • Automatic request deduplication
    • +
    • Best for external API calls
    • +
    +
    +

    + When to use unstable_cache: When you need to + cache the result of database queries, complex computations, or any + non-fetch operations. When you need more control over cache keys. +

    +
    +
    +
    +
    + ); +} diff --git a/examples/redis-minimal/src/app/layout.tsx b/examples/redis-minimal/src/app/layout.tsx index 4119e0c..7f0b38f 100644 --- a/examples/redis-minimal/src/app/layout.tsx +++ b/examples/redis-minimal/src/app/layout.tsx @@ -29,8 +29,12 @@ export default function RootLayout({ - - {children} +
    + +
    + {children} +
    +
    ); diff --git a/examples/redis-minimal/src/app/page.tsx b/examples/redis-minimal/src/app/page.tsx index f7c0edf..6946bb3 100644 --- a/examples/redis-minimal/src/app/page.tsx +++ b/examples/redis-minimal/src/app/page.tsx @@ -2,6 +2,39 @@ import Link from "next/link"; import { ExampleLayout } from "@/components/ExampleLayout"; const examples = [ + { + href: "/examples/default-cache", + title: "Default Cache (force-cache)", + description: + "Demonstrates the default fetch caching behavior. Next.js uses 'force-cache' by default, which caches data indefinitely until manually invalidated.", + features: [ + "Default caching behavior", + "Indefinite cache duration", + "Perfect for static data", + ], + }, + { + href: "/examples/no-store", + title: "No Store (Always Fresh)", + description: + "Shows fetch with 'no-store' option, which always fetches fresh data and never caches the response. Perfect for real-time or user-specific data.", + features: [ + "Never caches responses", + "Always fetches fresh data", + "Real-time data updates", + ], + }, + { + href: "/examples/time-based-revalidation", + title: "Time-based Revalidation", + description: + "Shows fetch with time-based revalidation. Data is cached and automatically revalidated after a specified time period, balancing freshness with performance.", + features: [ + "Automatic revalidation", + "Configurable time period (30 seconds)", + "Balances freshness and performance", + ], + }, { href: "/examples/fetch-tags", title: "Fetch with Tags", @@ -13,6 +46,18 @@ const examples = [ "Clear cache button to test tag revalidation", ], }, + { + href: "/examples/unstable-cache", + title: "unstable_cache", + description: + "Demonstrates persistent caching with unstable_cache. Cache function results across requests with tags and revalidation. Compare with fetch caching.", + features: [ + "Cache any function, not just fetch", + "Tags and revalidation support", + "Side-by-side comparison with fetch", + "Perfect for database queries and computations", + ], + }, { href: "/examples/isr/blog/1", title: "ISR with Static Params", diff --git a/examples/redis-minimal/src/components/ClearCacheButton.tsx b/examples/redis-minimal/src/components/ClearCacheButton.tsx index 95c0b4f..1401bb0 100644 --- a/examples/redis-minimal/src/components/ClearCacheButton.tsx +++ b/examples/redis-minimal/src/components/ClearCacheButton.tsx @@ -16,7 +16,7 @@ export function ClearCacheButton({ setLoading(true); setMessage(null); try { - const response = await fetch(`/api/cache?tag=${tag}`); + const response = await fetch(`/api/revalidate?tag=${tag}`); const text = await response.text(); setMessage(text); setTimeout(() => { diff --git a/examples/redis-minimal/src/components/Navigation.tsx b/examples/redis-minimal/src/components/Navigation.tsx index 68f522d..1c2d9d2 100644 --- a/examples/redis-minimal/src/components/Navigation.tsx +++ b/examples/redis-minimal/src/components/Navigation.tsx @@ -2,28 +2,51 @@ import Link from "next/link"; import { usePathname } from "next/navigation"; +import { useState } from "react"; const examples = [ { href: "/", label: "Home", description: "Overview of all examples" }, + { + href: "/examples/default-cache", + label: "Default Cache", + description: "Default force-cache behavior", + }, + { + href: "/examples/no-store", + label: "No Store", + description: "Always fetch fresh data", + }, + { + href: "/examples/time-based-revalidation", + label: "Time Revalidation", + description: "Time-based revalidation", + }, { href: "/examples/fetch-tags", label: "Fetch with Tags", - description: "Demonstrates fetch caching with tags and revalidation", + description: "Cache tags and revalidation", + }, + { + href: "/examples/unstable-cache", + label: "unstable_cache", + description: "Persistent function caching", }, { href: "/examples/isr/blog/1", - label: "ISR with Static Params", - description: "Incremental Static Regeneration example", + label: "ISR", + description: "Incremental Static Regeneration", }, { href: "/examples/static-params/cache", - label: "Static Params Test", - description: "Testing static params generation", + label: "Static Params", + description: "Static params generation", }, ]; export function Navigation() { const pathname = usePathname(); + const [loading, setLoading] = useState(false); + const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const isActive = (href: string) => { if (!pathname) return false; @@ -33,60 +56,141 @@ export function Navigation() { return pathname.startsWith(href); }; + const handleRevalidateLayout = async () => { + setLoading(true); + try { + const response = await fetch("/api/revalidate", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ path: pathname || "/", type: "layout" }), + }); + const text = await response.text(); + console.log(text); + setTimeout(() => { + window.location.reload(); + }, 500); + } catch (error) { + console.error("Error revalidating layout:", error); + } finally { + setLoading(false); + } + }; + return ( - + + )} - + ); } diff --git a/examples/redis-minimal/src/components/RevalidatePathButton.tsx b/examples/redis-minimal/src/components/RevalidatePathButton.tsx new file mode 100644 index 0000000..cfdc233 --- /dev/null +++ b/examples/redis-minimal/src/components/RevalidatePathButton.tsx @@ -0,0 +1,55 @@ +"use client"; + +import { useState } from "react"; + +export function RevalidatePathButton({ + path, + label = "Refresh Cache", +}: { + path: string; + label?: string; +}) { + const [loading, setLoading] = useState(false); + const [message, setMessage] = useState(null); + + const handleRevalidate = async () => { + setLoading(true); + setMessage(null); + try { + const response = await fetch("/api/revalidate", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ path }), + }); + const text = await response.text(); + setMessage(text); + setTimeout(() => { + window.location.reload(); + }, 500); + } catch (error) { + setMessage("Error revalidating cache"); + } finally { + setLoading(false); + } + }; + + return ( +
    + + {message && ( + + {message} + + )} +
    + ); +} + From aab6a85c72aed65b146ea8e612d679dbae4bcf62 Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki Date: Mon, 24 Nov 2025 11:49:54 +0100 Subject: [PATCH 13/15] Version bump --- packages/nextjs-cache-handler/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nextjs-cache-handler/package.json b/packages/nextjs-cache-handler/package.json index 546e434..ccc688d 100644 --- a/packages/nextjs-cache-handler/package.json +++ b/packages/nextjs-cache-handler/package.json @@ -18,7 +18,7 @@ "next", "redis" ], - "version": "3.0.0-next16-alpha.1", + "version": "3.0.0-next16-alpha.2", "type": "module", "license": "MIT", "description": "Next.js cache handlers", From f4c886fab6547fcb23f70720cbc4b5baa8ceab7e Mon Sep 17 00:00:00 2001 From: Marcin Kotlicki <26150059+AyronK@users.noreply.github.com> Date: Mon, 24 Nov 2025 13:13:31 +0100 Subject: [PATCH 14/15] Next 16 updateTag and cache profiles examples (incremental cache handler) (#162) * Added revalidate profile example * Added updateTag example --- examples/redis-minimal/README.md | 42 +- .../src/app/api/revalidate/route.ts | 31 +- .../src/app/examples/no-store/page.tsx | 3 + .../revalidate-tag-cachelife/page.tsx | 406 ++++++++++++++++++ .../app/examples/update-tag/SettingsForm.tsx | 74 ++++ .../app/examples/update-tag/UpdateTagForm.tsx | 74 ++++ .../src/app/examples/update-tag/actions.ts | 25 ++ .../src/app/examples/update-tag/page.tsx | 365 ++++++++++++++++ examples/redis-minimal/src/app/page.tsx | 24 ++ .../src/components/ClearCacheButton.tsx | 4 +- .../src/components/Navigation.tsx | 10 + .../src/components/RevalidatePathButton.tsx | 2 +- .../src/components/RevalidateTagButton.tsx | 57 +++ 13 files changed, 1098 insertions(+), 19 deletions(-) create mode 100644 examples/redis-minimal/src/app/examples/revalidate-tag-cachelife/page.tsx create mode 100644 examples/redis-minimal/src/app/examples/update-tag/SettingsForm.tsx create mode 100644 examples/redis-minimal/src/app/examples/update-tag/UpdateTagForm.tsx create mode 100644 examples/redis-minimal/src/app/examples/update-tag/actions.ts create mode 100644 examples/redis-minimal/src/app/examples/update-tag/page.tsx create mode 100644 examples/redis-minimal/src/components/RevalidateTagButton.tsx diff --git a/examples/redis-minimal/README.md b/examples/redis-minimal/README.md index 2a746e2..480e467 100644 --- a/examples/redis-minimal/README.md +++ b/examples/redis-minimal/README.md @@ -127,7 +127,26 @@ Demonstrates persistent caching with `unstable_cache` for function results. - Click "Clear Tag Cache" to invalidate both caches - Understand when to use unstable_cache vs fetch -### 7. ISR with Static Params (`/examples/isr/blog/[id]`) +### 7. revalidateTag() with cacheLife (`/examples/revalidate-tag-cachelife`) + +Demonstrates the updated `revalidateTag()` API in Next.js 16 with cacheLife profiles. + +**Features:** + +- Breaking change from Next.js 15 (cacheLife now required) +- Different cacheLife profiles: 'max', 'hours', 'days' +- Stale-while-revalidate behavior +- Examples for each profile type +- Code examples showing migration from Next.js 15 + +**Try it:** + +- Visit `/examples/revalidate-tag-cachelife` to see all three profiles +- Click "Revalidate" buttons to test each profile +- Compare the behavior of different cacheLife profiles +- See code examples for Next.js 15 vs Next.js 16 + +### 8. ISR with Static Params (`/examples/isr/blog/[id]`) Incremental Static Regeneration with `generateStaticParams`. @@ -144,7 +163,7 @@ Incremental Static Regeneration with `generateStaticParams`. - Try different IDs like `/examples/isr/blog/2`, `/examples/isr/blog/3` - Check the rendered timestamp to see caching in action -### 8. Static Params Test (`/examples/static-params/[testName]`) +### 9. Static Params Test (`/examples/static-params/[testName]`) Tests static params generation with dynamic routes. @@ -170,11 +189,14 @@ Unified endpoint for revalidating cache by tag or path. **Tag-based revalidation (GET):** -- `GET /api/revalidate?tag=futurama` - Revalidates cache for the "futurama" tag +- `GET /api/revalidate?tag=futurama` - Revalidates cache for the "futurama" tag with 'max' profile +- `GET /api/revalidate?tag=futurama&cacheLife=hours` - Revalidates with 'hours' profile +- `GET /api/revalidate?tag=futurama&cacheLife=days` - Revalidates with 'days' profile **Tag-based revalidation (POST):** -- `POST /api/revalidate` with body `{ "tag": "futurama" }` - Revalidates cache for a tag +- `POST /api/revalidate` with body `{ "tag": "futurama" }` - Revalidates cache for a tag (defaults to 'max') +- `POST /api/revalidate` with body `{ "tag": "futurama", "cacheLife": "hours" }` - Revalidates with specific profile **Path-based revalidation (POST):** @@ -183,14 +205,22 @@ Unified endpoint for revalidating cache by tag or path. **Examples:** ```bash -# Revalidate by tag (GET) +# Revalidate by tag (GET) - defaults to 'max' profile curl http://localhost:3000/api/revalidate?tag=futurama -# Revalidate by tag (POST) +# Revalidate by tag with specific profile (GET) +curl http://localhost:3000/api/revalidate?tag=futurama&cacheLife=hours + +# Revalidate by tag (POST) - defaults to 'max' profile curl -X POST http://localhost:3000/api/revalidate \ -H "Content-Type: application/json" \ -d '{"tag": "futurama"}' +# Revalidate by tag with specific profile (POST) +curl -X POST http://localhost:3000/api/revalidate \ + -H "Content-Type: application/json" \ + -d '{"tag": "futurama", "cacheLife": "days"}' + # Revalidate by path (POST) curl -X POST http://localhost:3000/api/revalidate \ -H "Content-Type: application/json" \ diff --git a/examples/redis-minimal/src/app/api/revalidate/route.ts b/examples/redis-minimal/src/app/api/revalidate/route.ts index f29dcb3..a0b7f6a 100644 --- a/examples/redis-minimal/src/app/api/revalidate/route.ts +++ b/examples/redis-minimal/src/app/api/revalidate/route.ts @@ -4,15 +4,22 @@ import { NextRequest } from "next/server"; export async function GET(request: NextRequest) { const searchParams = request.nextUrl.searchParams; const tag = searchParams.get("tag"); + const cacheLife = (searchParams.get("cacheLife") || "max") as + | "max" + | "hours" + | "days"; if (tag) { try { - revalidateTag(tag, "max"); - return new Response(`Cache cleared for tag: ${tag}`, { - status: 200, - }); - } catch (error) { - return new Response(`Error clearing cache for tag: ${tag}`, { + revalidateTag(tag, cacheLife); + return new Response( + `Cache revalidated for tag: ${tag} with profile: ${cacheLife}`, + { + status: 200, + } + ); + } catch { + return new Response(`Error revalidating cache for tag: ${tag}`, { status: 500, }); } @@ -29,10 +36,14 @@ export async function POST(request: NextRequest) { const { tag, path } = body; if (tag) { - revalidateTag(tag, "max"); - return new Response(`Cache cleared for tag: ${tag}`, { - status: 200, - }); + const cacheLife = (body.cacheLife || "max") as "max" | "hours" | "days"; + revalidateTag(tag, cacheLife); + return new Response( + `Cache revalidated for tag: ${tag} with profile: ${cacheLife}`, + { + status: 200, + } + ); } if (path) { diff --git a/examples/redis-minimal/src/app/examples/no-store/page.tsx b/examples/redis-minimal/src/app/examples/no-store/page.tsx index b9ce822..5c5d593 100644 --- a/examples/redis-minimal/src/app/examples/no-store/page.tsx +++ b/examples/redis-minimal/src/app/examples/no-store/page.tsx @@ -36,6 +36,9 @@ export default async function NoStoreExample() { + } >
    diff --git a/examples/redis-minimal/src/app/examples/revalidate-tag-cachelife/page.tsx b/examples/redis-minimal/src/app/examples/revalidate-tag-cachelife/page.tsx new file mode 100644 index 0000000..9ed88e2 --- /dev/null +++ b/examples/redis-minimal/src/app/examples/revalidate-tag-cachelife/page.tsx @@ -0,0 +1,406 @@ +import { ExampleLayout } from "@/components/ExampleLayout"; +import { InfoCard } from "@/components/InfoCard"; +import { CodeBlock } from "@/components/CodeBlock"; +import { RevalidateTagButton } from "@/components/RevalidateTagButton"; +import { FuturamaCharacter } from "@/types/futurama"; + +async function fetchCharacter( + id: string, + tag: string +): Promise { + const response = await fetch( + `https://api.sampleapis.com/futurama/characters/${id}`, + { + next: { + revalidate: 3600, + tags: [tag], + }, + } + ); + return response.json(); +} + +export default async function RevalidateTagCacheLifeExample() { + const timestamp = new Date().toISOString(); + + let maxProfile: FuturamaCharacter; + let hoursProfile: FuturamaCharacter; + let daysProfile: FuturamaCharacter; + + try { + maxProfile = await fetchCharacter("7", "cachelife-max"); + hoursProfile = await fetchCharacter("8", "cachelife-hours"); + daysProfile = await fetchCharacter("9", "cachelife-days"); + } catch (error) { + console.error("Error fetching character data:", error); + return ( + +
    + An error occurred during fetch. Please check your network connection. +
    +
    + ); + } + + return ( + +
    + +
      +
    • + Next.js 15:{" "} + + revalidateTag(tag) + +
    • +
    • + Next.js 16:{" "} + + revalidateTag(tag, cacheLife) + {" "} + - cacheLife is now required +
    • +
    • + The{" "} + + cacheLife + {" "} + parameter enables stale-while-revalidate behavior +
    • +
    • + Built-in profiles:{" "} + + 'max' + + ,{" "} + + 'hours' + + ,{" "} + + 'days' + +
    • +
    • + You can also create custom cacheLife profiles for specific use + cases +
    • +
    +
    + +
    +

    + ⚠️ Important: Custom Cache Handler Limitation +

    +
    +

    + Note: The{" "} + + cacheLife + {" "} + parameter is handled by Next.js internally and is not directly + exposed to custom cache handlers. +

    +

    + There are two different cache handler APIs in + Next.js 16: +

    +
      +
    • + Incremental Cache Handler (used by this + package): Used for{" "} + + fetch + + ,{" "} + + revalidateTag + + , ISR, etc. Implements{" "} + + revalidateTag(tag: string) + {" "} + - does not receive{" "} + + cacheLife + + . +
    • +
    • + New Cache Handlers API (for{" "} + + 'use cache' + {" "} + directive): Implements{" "} + + updateTags(tags, durations) + {" "} + with{" "} + + durations.expire + + , but this is a different mechanism and not the same as{" "} + + cacheLife + {" "} + profiles. +
    • +
    +

    + The{" "} + + cacheLife + {" "} + parameter for{" "} + + revalidateTag() + {" "} + is processed by Next.js core and primarily affects + stale-while-revalidate behavior on Vercel's infrastructure. + Custom handlers may not fully differentiate between different{" "} + + cacheLife + {" "} + profiles. +

    +

    + Reference:{" "} + + Next.js cacheHandlers documentation + +

    +
    +
    + +
    +
    +
    +

    + 'max' Profile +

    + +
    +

    + Maximum cache life - serves stale content while revalidating in + the background +

    +
    +
    + + Character: + {" "} + + {maxProfile.name.first} {maxProfile.name.last} + +
    +
    + + Rendered: + {" "} + + {timestamp} + +
    +
    +
    + +
    +
    +

    + 'hours' Profile +

    + +
    +

    + Hourly cache life - good balance for frequently updated content +

    +
    +
    + + Character: + {" "} + + {hoursProfile.name.first} {hoursProfile.name.last} + +
    +
    + + Rendered: + {" "} + + {timestamp} + +
    +
    +
    + +
    +
    +

    + 'days' Profile +

    + +
    +

    + Daily cache life - for content that changes infrequently +

    +
    +
    + + Character: + {" "} + + {daysProfile.name.first} {daysProfile.name.last} + +
    +
    + + Rendered: + {" "} + + {timestamp} + +
    +
    +
    +
    + +
    +
    +

    + Code Examples +

    +
    +
    +

    + Next.js 15 (Old API - No longer works) +

    + + {`import { revalidateTag } from "next/cache"; + +// ❌ This no longer works in Next.js 16 +revalidateTag("my-tag");`} + +
    + +
    +

    + Next.js 16 (New API - Required) +

    + + {`import { revalidateTag } from "next/cache"; + +// ✅ 'max' profile - maximum cache life +revalidateTag("my-tag", "max"); + +// ✅ 'hours' profile - hourly cache life +revalidateTag("my-tag", "hours"); + +// ✅ 'days' profile - daily cache life +revalidateTag("my-tag", "days"); + +// ✅ Custom profile (if configured) +revalidateTag("my-tag", "custom-profile");`} + +
    + +
    +

    + Using in API Routes +

    + + {`import { revalidateTag } from "next/cache"; +import { NextRequest } from "next/server"; + +export async function POST(request: NextRequest) { + const { tag, cacheLife } = await request.json(); + + revalidateTag(tag, cacheLife || "max"); + + return Response.json({ + message: \`Revalidated \${tag} with \${cacheLife} profile\` + }); +}`} + +
    + +
    +

    + Using in Server Actions +

    + + {`"use server"; + +import { revalidateTag } from "next/cache"; + +export async function updateProduct(productId: string) { + await updateProductInDatabase(productId); + + revalidateTag(\`product-\${productId}\`, "max"); + + return { success: true }; +}`} + +
    +
    +
    +
    + +
    +

    + Understanding cacheLife Profiles +

    +
    +

    + 'max': Maximum cache life. Serves stale + content while revalidating in the background. Best for content + that can tolerate being slightly stale. +

    +

    + 'hours': Hourly cache life. Good for + content that updates frequently but doesn't need to be + real-time. +

    +

    + 'days': Daily cache life. Perfect for + content that changes infrequently, like blog posts or product + catalogs. +

    +

    + Stale-while-revalidate: When you call{" "} + + revalidateTag() + + , Next.js serves the stale cached content immediately while + revalidating in the background. This ensures fast responses while + keeping content fresh. +

    +
    +
    +
    +
    + ); +} diff --git a/examples/redis-minimal/src/app/examples/update-tag/SettingsForm.tsx b/examples/redis-minimal/src/app/examples/update-tag/SettingsForm.tsx new file mode 100644 index 0000000..74df6bc --- /dev/null +++ b/examples/redis-minimal/src/app/examples/update-tag/SettingsForm.tsx @@ -0,0 +1,74 @@ +"use client"; + +import { useState, useTransition } from "react"; +import { updateUserSettings } from "./actions"; + +export function SettingsForm() { + const [isPending, startTransition] = useTransition(); + const [message, setMessage] = useState(null); + + const handleSubmit = async (formData: FormData) => { + setMessage(null); + startTransition(async () => { + try { + const result = await updateUserSettings(formData); + setMessage(result.message); + // Reload after a short delay to show the updated cache + setTimeout(() => { + window.location.reload(); + }, 500); + } catch { + setMessage("Error updating settings"); + } + }); + }; + + return ( +
    +
    + + +
    +
    + + +
    + + {message && ( +
    + {message} +
    + )} +
    + ); +} diff --git a/examples/redis-minimal/src/app/examples/update-tag/UpdateTagForm.tsx b/examples/redis-minimal/src/app/examples/update-tag/UpdateTagForm.tsx new file mode 100644 index 0000000..4a9944f --- /dev/null +++ b/examples/redis-minimal/src/app/examples/update-tag/UpdateTagForm.tsx @@ -0,0 +1,74 @@ +"use client"; + +import { useState, useTransition } from "react"; +import { createPostWithUpdateTag } from "./actions"; + +export function UpdateTagForm() { + const [isPending, startTransition] = useTransition(); + const [message, setMessage] = useState(null); + + const handleSubmit = async (formData: FormData) => { + setMessage(null); + startTransition(async () => { + try { + const result = await createPostWithUpdateTag(formData); + setMessage(result.message); + // Reload after a short delay to show the updated cache + setTimeout(() => { + window.location.reload(); + }, 500); + } catch { + setMessage("Error creating post"); + } + }); + }; + + return ( +
    +
    + + +
    +
    + +