@trieb.work/nextjs-turbo-redis-cache 1.14.1 → 1.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/.cursor/skills/testing/SKILL.md +121 -0
  2. package/.github/workflows/ci.yml +155 -70
  3. package/.github/workflows/pages.yml +38 -0
  4. package/ARCHITECTURE.md +431 -0
  5. package/CHANGELOG.md +19 -0
  6. package/README.md +220 -48
  7. package/dist/index.d.mts +77 -2
  8. package/dist/index.d.ts +77 -2
  9. package/dist/index.js +109 -23
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.mjs +106 -23
  12. package/dist/index.mjs.map +1 -1
  13. package/docs/index.html +139 -0
  14. package/docs/robots.txt +4 -0
  15. package/docs/sitemap.xml +8 -0
  16. package/docs/styles.css +141 -0
  17. package/eslint.config.mjs +1 -1
  18. package/package.json +16 -18
  19. package/playwright.config.ts +5 -3
  20. package/src/CacheComponentsHandler.ts +57 -2
  21. package/src/RedisStringsHandler.ts +48 -11
  22. package/src/SyncedMap.ts +62 -13
  23. package/src/index.ts +4 -0
  24. package/src/serializer.ts +59 -0
  25. package/test/README.md +179 -0
  26. package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/package.json +6 -6
  27. package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-15-4-11}/pnpm-lock.yaml +89 -105
  28. package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-0-11}/package.json +3 -3
  29. package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-0-11}/pnpm-lock.yaml +53 -53
  30. package/test/nextjs-test-projects/next-app-16-0-11-cache-components/package.json +28 -0
  31. package/test/nextjs-test-projects/next-app-16-0-11-cache-components/pnpm-lock.yaml +4206 -0
  32. package/test/nextjs-test-projects/next-app-16-0-11-cache-components/src/app/api/cached-with-cachelife/route.ts +24 -0
  33. package/test/nextjs-test-projects/next-app-16-2-6/eslint.config.mjs +18 -0
  34. package/test/{integration/next-app-16-2-3 → nextjs-test-projects/next-app-16-2-6}/package.json +3 -3
  35. package/test/{integration/next-app-16-2-3 → nextjs-test-projects/next-app-16-2-6}/pnpm-lock.yaml +54 -60
  36. package/test/nextjs-test-projects/next-app-16-2-6/postcss.config.mjs +7 -0
  37. package/test/nextjs-test-projects/next-app-16-2-6/src/app/favicon.ico +0 -0
  38. package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-2-6}/tsconfig.json +9 -2
  39. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/cache-handler.js +3 -0
  40. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/next.config.ts +13 -0
  41. package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-2-6-cache-components}/package.json +3 -3
  42. package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-2-6-cache-components}/pnpm-lock.yaml +54 -60
  43. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/api/cached-static-fetch/route.ts +19 -0
  44. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/api/cached-with-cachelife/route.ts +24 -0
  45. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/api/cached-with-tag/route.ts +21 -0
  46. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/api/revalidate-tag/route.ts +19 -0
  47. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/api/revalidated-fetch/route.ts +19 -0
  48. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/cache-lab/cachelife-short/page.tsx +110 -0
  49. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/cache-lab/page.tsx +90 -0
  50. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/cache-lab/runtime-data-suspense/page.tsx +127 -0
  51. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/cache-lab/stale-while-revalidate/page.tsx +130 -0
  52. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/cache-lab/tag-invalidation/page.tsx +127 -0
  53. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/cache-lab/use-cache-nondeterministic/page.tsx +110 -0
  54. package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-2-6-cache-components}/src/app/layout.tsx +0 -2
  55. package/test/nextjs-test-projects/next-app-16-2-6-cache-components/src/app/update-tag-test/page.tsx +22 -0
  56. package/{tests → test/playwright}/update-tag.spec.ts +1 -1
  57. package/test/{integration → vitest/integration}/build-id-prefix.integration.test.ts +2 -2
  58. package/test/{cache-components/cache-components.integration.spec.ts → vitest/integration/cache-components/cache-components.integration.test.ts} +46 -3
  59. package/test/{cache-components/redis-kill-reconnect.spec.ts → vitest/integration/cache-components/redis-kill-reconnect.test.ts} +28 -7
  60. package/test/vitest/integration/cache-components/redis-quit-vs-disconnect.test.ts +59 -0
  61. package/test/vitest/integration/cache-components/redis-subscriber-outage.test.ts +100 -0
  62. package/test/{cache-components → vitest/integration/cache-components}/scripts/redis-kill-reconnect.ts +31 -8
  63. package/test/vitest/integration/cache-components/scripts/redis-quit-vs-disconnect.ts +113 -0
  64. package/test/vitest/integration/cache-components/scripts/redis-subscriber-outage.ts +379 -0
  65. package/test/vitest/integration/cache-components/scripts/redis-test-helpers.ts +155 -0
  66. package/test/{integration → vitest/integration}/nextjs-cache-handler.integration.test.ts +17 -10
  67. package/test/vitest/unit/SyncedMap-reconnect-repro.test.ts +154 -0
  68. package/{src → test/vitest/unit}/index.test.ts +3 -3
  69. package/test/{cache-components/reconnect-socket-already-opened.spec.ts → vitest/unit/reconnect-socket-already-opened.test.ts} +1 -1
  70. package/test/vitest/unit/serializer.test.ts +182 -0
  71. package/{src → test/vitest/unit}/utils/prefix.test.ts +1 -1
  72. package/vite.config.ts +4 -3
  73. package/vitest.cache-components.config.ts +1 -1
  74. package/test/browser/update-tag.browser.test.ts +0 -41
  75. package/test/integration/next-app-15-0-3/next.config.js +0 -6
  76. package/test/integration/next-app-15-0-3/package-lock.json +0 -5833
  77. package/test/integration/next-app-15-0-3/pnpm-lock.yaml +0 -3710
  78. package/test/integration/next-app-15-3-2/next.config.js +0 -6
  79. package/test/integration/next-app-15-3-2/package.json +0 -33
  80. package/test/integration/next-app-15-3-2/pnpm-lock.yaml +0 -3720
  81. package/test/integration/next-app-15-3-2/postcss.config.mjs +0 -5
  82. package/test/integration/next-app-15-3-2/src/app/api/revalidateTag/route.ts +0 -15
  83. package/test/integration/next-app-15-4-7/eslint.config.mjs +0 -16
  84. package/test/integration/next-app-15-4-7/package-lock.json +0 -5969
  85. package/test/integration/next-app-15-4-7/package.json +0 -33
  86. package/test/integration/next-app-15-4-7/postcss.config.mjs +0 -5
  87. package/test/integration/next-app-15-4-7/src/app/api/revalidateTag/route.ts +0 -15
  88. package/test/integration/next-app-15-4-7/tsconfig.json +0 -27
  89. package/test/integration/next-app-16-0-3/src/app/api/cached-static-fetch/route.ts +0 -18
  90. package/test/integration/next-app-16-0-3/src/app/api/nested-fetch-in-api-route/revalidated-fetch/route.ts +0 -27
  91. package/test/integration/next-app-16-0-3/src/app/api/revalidatePath/route.ts +0 -15
  92. package/test/integration/next-app-16-0-3/src/app/api/revalidated-fetch/route.ts +0 -17
  93. package/test/integration/next-app-16-0-3/src/app/api/uncached-fetch/route.ts +0 -15
  94. package/test/integration/next-app-16-0-3/src/app/pages/cached-static-fetch/default--force-dynamic-page/page.tsx +0 -19
  95. package/test/integration/next-app-16-0-3/src/app/pages/cached-static-fetch/revalidate15--default-page/page.tsx +0 -34
  96. package/test/integration/next-app-16-0-3/src/app/pages/cached-static-fetch/revalidate15--force-dynamic-page/page.tsx +0 -25
  97. package/test/integration/next-app-16-0-3/src/app/pages/no-fetch/default-page/page.tsx +0 -55
  98. package/test/integration/next-app-16-0-3/src/app/pages/revalidated-fetch/default--force-dynamic-page/page.tsx +0 -19
  99. package/test/integration/next-app-16-0-3/src/app/pages/revalidated-fetch/revalidate15--default-page/page.tsx +0 -35
  100. package/test/integration/next-app-16-0-3/src/app/pages/revalidated-fetch/revalidate15--force-dynamic-page/page.tsx +0 -25
  101. package/test/integration/next-app-16-0-3/src/app/pages/uncached-fetch/default--force-dynamic-page/page.tsx +0 -19
  102. package/test/integration/next-app-16-0-3/src/app/pages/uncached-fetch/revalidate15--default-page/page.tsx +0 -32
  103. package/test/integration/next-app-16-0-3/src/app/pages/uncached-fetch/revalidate15--force-dynamic-page/page.tsx +0 -25
  104. package/test/integration/next-app-16-2-3/src/app/api/cached-static-fetch/route.ts +0 -18
  105. package/test/integration/next-app-16-2-3/src/app/api/nested-fetch-in-api-route/revalidated-fetch/route.ts +0 -27
  106. package/test/integration/next-app-16-2-3/src/app/api/revalidatePath/route.ts +0 -15
  107. package/test/integration/next-app-16-2-3/src/app/api/revalidated-fetch/route.ts +0 -17
  108. package/test/integration/next-app-16-2-3/src/app/api/uncached-fetch/route.ts +0 -15
  109. package/test/integration/next-app-16-2-3/src/app/globals.css +0 -26
  110. package/test/integration/next-app-16-2-3/src/app/layout.tsx +0 -59
  111. package/test/integration/next-app-16-2-3/src/app/page.tsx +0 -755
  112. package/test/integration/next-app-16-2-3/src/app/pages/cached-static-fetch/default--force-dynamic-page/page.tsx +0 -19
  113. package/test/integration/next-app-16-2-3/src/app/pages/cached-static-fetch/revalidate15--default-page/page.tsx +0 -34
  114. package/test/integration/next-app-16-2-3/src/app/pages/cached-static-fetch/revalidate15--force-dynamic-page/page.tsx +0 -25
  115. package/test/integration/next-app-16-2-3/src/app/pages/no-fetch/default-page/page.tsx +0 -55
  116. package/test/integration/next-app-16-2-3/src/app/pages/revalidated-fetch/default--force-dynamic-page/page.tsx +0 -19
  117. package/test/integration/next-app-16-2-3/src/app/pages/revalidated-fetch/revalidate15--default-page/page.tsx +0 -35
  118. package/test/integration/next-app-16-2-3/src/app/pages/revalidated-fetch/revalidate15--force-dynamic-page/page.tsx +0 -25
  119. package/test/integration/next-app-16-2-3/src/app/pages/uncached-fetch/default--force-dynamic-page/page.tsx +0 -19
  120. package/test/integration/next-app-16-2-3/src/app/pages/uncached-fetch/revalidate15--default-page/page.tsx +0 -32
  121. package/test/integration/next-app-16-2-3/src/app/pages/uncached-fetch/revalidate15--force-dynamic-page/page.tsx +0 -25
  122. package/test/integration/next-app-16-2-3/src/app/revalidation-interface.tsx +0 -267
  123. package/test/integration/next-app-16-2-3-cache-components/public/file.svg +0 -1
  124. package/test/integration/next-app-16-2-3-cache-components/public/globe.svg +0 -1
  125. package/test/integration/next-app-16-2-3-cache-components/public/next.svg +0 -1
  126. package/test/integration/next-app-16-2-3-cache-components/public/vercel.svg +0 -1
  127. package/test/integration/next-app-16-2-3-cache-components/public/window.svg +0 -1
  128. package/test/integration/next-app-customized/README.md +0 -36
  129. package/test/integration/next-app-customized/eslint.config.mjs +0 -16
  130. package/vitest.browser.config.ts +0 -10
  131. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/README.md +0 -0
  132. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/eslint.config.mjs +0 -0
  133. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-15-4-11}/next.config.js +0 -0
  134. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-15-4-11}/package-lock.json +0 -0
  135. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/postcss.config.mjs +0 -0
  136. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/public/file.svg +0 -0
  137. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/public/globe.svg +0 -0
  138. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/public/next.svg +0 -0
  139. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/public/vercel.svg +0 -0
  140. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/public/window.svg +0 -0
  141. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/api/cached-static-fetch/route.ts +0 -0
  142. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/api/nested-fetch-in-api-route/revalidated-fetch/route.ts +0 -0
  143. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/api/revalidatePath/route.ts +0 -0
  144. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/api/revalidateTag/route.ts +0 -0
  145. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/api/revalidated-fetch/route.ts +0 -0
  146. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/api/uncached-fetch/route.ts +0 -0
  147. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/globals.css +0 -0
  148. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/layout.tsx +0 -0
  149. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/page.tsx +0 -0
  150. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/pages/cached-static-fetch/default--force-dynamic-page/page.tsx +0 -0
  151. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/pages/cached-static-fetch/revalidate15--default-page/page.tsx +0 -0
  152. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/pages/cached-static-fetch/revalidate15--force-dynamic-page/page.tsx +0 -0
  153. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/pages/no-fetch/default-page/page.tsx +0 -0
  154. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/pages/revalidated-fetch/default--force-dynamic-page/page.tsx +0 -0
  155. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/pages/revalidated-fetch/revalidate15--default-page/page.tsx +0 -0
  156. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/pages/revalidated-fetch/revalidate15--force-dynamic-page/page.tsx +0 -0
  157. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/pages/uncached-fetch/default--force-dynamic-page/page.tsx +0 -0
  158. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/pages/uncached-fetch/revalidate15--default-page/page.tsx +0 -0
  159. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/pages/uncached-fetch/revalidate15--force-dynamic-page/page.tsx +0 -0
  160. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/src/app/revalidation-interface.tsx +0 -0
  161. /package/test/{integration/next-app-15-0-3 → nextjs-test-projects/next-app-15-4-11}/tsconfig.json +0 -0
  162. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-0-11}/README.md +0 -0
  163. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11}/eslint.config.mjs +0 -0
  164. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-0-11}/next.config.ts +0 -0
  165. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11}/postcss.config.mjs +0 -0
  166. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/api/cached-static-fetch/route.ts +0 -0
  167. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/api/nested-fetch-in-api-route/revalidated-fetch/route.ts +0 -0
  168. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/api/revalidatePath/route.ts +0 -0
  169. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-0-11}/src/app/api/revalidateTag/route.ts +0 -0
  170. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/api/revalidated-fetch/route.ts +0 -0
  171. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/api/uncached-fetch/route.ts +0 -0
  172. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11}/src/app/favicon.ico +0 -0
  173. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-0-11}/src/app/globals.css +0 -0
  174. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/layout.tsx +0 -0
  175. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-0-11}/src/app/page.tsx +0 -0
  176. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/pages/cached-static-fetch/default--force-dynamic-page/page.tsx +0 -0
  177. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/pages/cached-static-fetch/revalidate15--default-page/page.tsx +0 -0
  178. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/pages/cached-static-fetch/revalidate15--force-dynamic-page/page.tsx +0 -0
  179. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/pages/no-fetch/default-page/page.tsx +0 -0
  180. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/pages/revalidated-fetch/default--force-dynamic-page/page.tsx +0 -0
  181. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/pages/revalidated-fetch/revalidate15--default-page/page.tsx +0 -0
  182. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/pages/revalidated-fetch/revalidate15--force-dynamic-page/page.tsx +0 -0
  183. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/pages/uncached-fetch/default--force-dynamic-page/page.tsx +0 -0
  184. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/pages/uncached-fetch/revalidate15--default-page/page.tsx +0 -0
  185. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11}/src/app/pages/uncached-fetch/revalidate15--force-dynamic-page/page.tsx +0 -0
  186. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-0-11}/src/app/revalidation-interface.tsx +0 -0
  187. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-0-11}/src/app/update-tag-test/page.tsx +0 -0
  188. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11}/tsconfig.json +0 -0
  189. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11-cache-components}/README.md +0 -0
  190. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/cache-handler.js +0 -0
  191. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-0-11-cache-components}/eslint.config.mjs +0 -0
  192. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/next.config.ts +0 -0
  193. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-0-11-cache-components}/postcss.config.mjs +0 -0
  194. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11-cache-components}/public/file.svg +0 -0
  195. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11-cache-components}/public/globe.svg +0 -0
  196. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11-cache-components}/public/next.svg +0 -0
  197. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11-cache-components}/public/vercel.svg +0 -0
  198. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11-cache-components}/public/window.svg +0 -0
  199. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/api/cached-static-fetch/route.ts +0 -0
  200. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/api/cached-with-tag/route.ts +0 -0
  201. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/api/revalidate-tag/route.ts +0 -0
  202. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/api/revalidated-fetch/route.ts +0 -0
  203. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/cache-lab/cachelife-short/page.tsx +0 -0
  204. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/cache-lab/page.tsx +0 -0
  205. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/cache-lab/runtime-data-suspense/page.tsx +0 -0
  206. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/cache-lab/stale-while-revalidate/page.tsx +0 -0
  207. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/cache-lab/tag-invalidation/page.tsx +0 -0
  208. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/cache-lab/use-cache-nondeterministic/page.tsx +0 -0
  209. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/favicon.ico +0 -0
  210. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/globals.css +0 -0
  211. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/layout.tsx +0 -0
  212. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/page.tsx +0 -0
  213. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/revalidation-interface.tsx +0 -0
  214. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-0-11-cache-components}/src/app/update-tag-test/page.tsx +0 -0
  215. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-0-11-cache-components}/tsconfig.json +0 -0
  216. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-2-6}/README.md +0 -0
  217. /package/test/{integration/next-app-16-2-3 → nextjs-test-projects/next-app-16-2-6}/next.config.ts +0 -0
  218. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/api/cached-static-fetch/route.ts +0 -0
  219. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/api/nested-fetch-in-api-route/revalidated-fetch/route.ts +0 -0
  220. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/api/revalidatePath/route.ts +0 -0
  221. /package/test/{integration/next-app-16-2-3 → nextjs-test-projects/next-app-16-2-6}/src/app/api/revalidateTag/route.ts +0 -0
  222. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/api/revalidated-fetch/route.ts +0 -0
  223. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/api/uncached-fetch/route.ts +0 -0
  224. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-2-6}/src/app/globals.css +0 -0
  225. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/layout.tsx +0 -0
  226. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-2-6}/src/app/page.tsx +0 -0
  227. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/pages/cached-static-fetch/default--force-dynamic-page/page.tsx +0 -0
  228. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/pages/cached-static-fetch/revalidate15--default-page/page.tsx +0 -0
  229. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/pages/cached-static-fetch/revalidate15--force-dynamic-page/page.tsx +0 -0
  230. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/pages/no-fetch/default-page/page.tsx +0 -0
  231. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/pages/revalidated-fetch/default--force-dynamic-page/page.tsx +0 -0
  232. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/pages/revalidated-fetch/revalidate15--default-page/page.tsx +0 -0
  233. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/pages/revalidated-fetch/revalidate15--force-dynamic-page/page.tsx +0 -0
  234. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/pages/uncached-fetch/default--force-dynamic-page/page.tsx +0 -0
  235. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/pages/uncached-fetch/revalidate15--default-page/page.tsx +0 -0
  236. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6}/src/app/pages/uncached-fetch/revalidate15--force-dynamic-page/page.tsx +0 -0
  237. /package/test/{integration/next-app-16-2-3-cache-components → nextjs-test-projects/next-app-16-2-6}/src/app/revalidation-interface.tsx +0 -0
  238. /package/test/{integration/next-app-16-2-3 → nextjs-test-projects/next-app-16-2-6}/src/app/update-tag-test/page.tsx +0 -0
  239. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-2-6-cache-components}/README.md +0 -0
  240. /package/test/{integration/next-app-16-2-3 → nextjs-test-projects/next-app-16-2-6-cache-components}/eslint.config.mjs +0 -0
  241. /package/test/{integration/next-app-16-2-3 → nextjs-test-projects/next-app-16-2-6-cache-components}/postcss.config.mjs +0 -0
  242. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6-cache-components}/public/file.svg +0 -0
  243. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6-cache-components}/public/globe.svg +0 -0
  244. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6-cache-components}/public/next.svg +0 -0
  245. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6-cache-components}/public/vercel.svg +0 -0
  246. /package/test/{integration/next-app-15-4-7 → nextjs-test-projects/next-app-16-2-6-cache-components}/public/window.svg +0 -0
  247. /package/test/{integration/next-app-16-2-3 → nextjs-test-projects/next-app-16-2-6-cache-components}/src/app/favicon.ico +0 -0
  248. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-2-6-cache-components}/src/app/globals.css +0 -0
  249. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-2-6-cache-components}/src/app/page.tsx +0 -0
  250. /package/test/{integration/next-app-16-0-3 → nextjs-test-projects/next-app-16-2-6-cache-components}/src/app/revalidation-interface.tsx +0 -0
  251. /package/test/{integration/next-app-16-2-3 → nextjs-test-projects/next-app-16-2-6-cache-components}/tsconfig.json +0 -0
  252. /package/test/{integration/next-app-16-2-3 → nextjs-test-projects/next-app-customized}/README.md +0 -0
  253. /package/test/{integration → nextjs-test-projects}/next-app-customized/customized-cache-handler.js +0 -0
  254. /package/test/{integration/next-app-15-3-2 → nextjs-test-projects/next-app-customized}/eslint.config.mjs +0 -0
  255. /package/test/{integration → nextjs-test-projects}/next-app-customized/next.config.js +0 -0
  256. /package/{tests → test/playwright}/cache-lab.spec.ts +0 -0
@@ -10,10 +10,10 @@ importers:
10
10
  dependencies:
11
11
  '@trieb.work/nextjs-turbo-redis-cache':
12
12
  specifier: file:../../../
13
- version: file:../../..(next@16.2.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(redis@4.7.0)
13
+ version: file:../../..(next@16.2.6(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(redis@4.7.0)
14
14
  next:
15
- specifier: 16.2.3
16
- version: 16.2.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
15
+ specifier: 16.2.6
16
+ version: 16.2.6(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
17
17
  react:
18
18
  specifier: 19.2.0
19
19
  version: 19.2.0
@@ -40,8 +40,8 @@ importers:
40
40
  specifier: ^9
41
41
  version: 9.39.1(jiti@2.6.1)
42
42
  eslint-config-next:
43
- specifier: 16.2.3
44
- version: 16.2.3(@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)
43
+ specifier: 16.2.6
44
+ version: 16.2.6(@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)
45
45
  tailwindcss:
46
46
  specifier: ^4
47
47
  version: 4.1.17
@@ -357,60 +357,60 @@ packages:
357
357
  '@napi-rs/wasm-runtime@0.2.12':
358
358
  resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
359
359
 
360
- '@next/env@16.2.3':
361
- resolution: {integrity: sha512-ZWXyj4uNu4GCWQw9cjRxWlbD+33mcDszIo9iQxFnBX3Wmgq9ulaSJcl6VhuWx5pCWqqD+9W6Wfz7N0lM5lYPMA==}
360
+ '@next/env@16.2.6':
361
+ resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==}
362
362
 
363
- '@next/eslint-plugin-next@16.2.3':
364
- resolution: {integrity: sha512-nE/b9mht28XJxjTwKs/yk7w4XTaU3t40UHVAky6cjiijdP/SEy3hGsnQMPxmXPTpC7W4/97okm6fngKnvCqVaA==}
363
+ '@next/eslint-plugin-next@16.2.6':
364
+ resolution: {integrity: sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==}
365
365
 
366
- '@next/swc-darwin-arm64@16.2.3':
367
- resolution: {integrity: sha512-u37KDKTKQ+OQLvY+z7SNXixwo4Q2/IAJFDzU1fYe66IbCE51aDSAzkNDkWmLN0yjTUh4BKBd+hb69jYn6qqqSg==}
366
+ '@next/swc-darwin-arm64@16.2.6':
367
+ resolution: {integrity: sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==}
368
368
  engines: {node: '>= 10'}
369
369
  cpu: [arm64]
370
370
  os: [darwin]
371
371
 
372
- '@next/swc-darwin-x64@16.2.3':
373
- resolution: {integrity: sha512-gHjL/qy6Q6CG3176FWbAKyKh9IfntKZTB3RY/YOJdDFpHGsUDXVH38U4mMNpHVGXmeYW4wj22dMp1lTfmu/bTQ==}
372
+ '@next/swc-darwin-x64@16.2.6':
373
+ resolution: {integrity: sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==}
374
374
  engines: {node: '>= 10'}
375
375
  cpu: [x64]
376
376
  os: [darwin]
377
377
 
378
- '@next/swc-linux-arm64-gnu@16.2.3':
379
- resolution: {integrity: sha512-U6vtblPtU/P14Y/b/n9ZY0GOxbbIhTFuaFR7F4/uMBidCi2nSdaOFhA0Go81L61Zd6527+yvuX44T4ksnf8T+Q==}
378
+ '@next/swc-linux-arm64-gnu@16.2.6':
379
+ resolution: {integrity: sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==}
380
380
  engines: {node: '>= 10'}
381
381
  cpu: [arm64]
382
382
  os: [linux]
383
383
  libc: [glibc]
384
384
 
385
- '@next/swc-linux-arm64-musl@16.2.3':
386
- resolution: {integrity: sha512-/YV0LgjHUmfhQpn9bVoGc4x4nan64pkhWR5wyEV8yCOfwwrH630KpvRg86olQHTwHIn1z59uh6JwKvHq1h4QEw==}
385
+ '@next/swc-linux-arm64-musl@16.2.6':
386
+ resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==}
387
387
  engines: {node: '>= 10'}
388
388
  cpu: [arm64]
389
389
  os: [linux]
390
390
  libc: [musl]
391
391
 
392
- '@next/swc-linux-x64-gnu@16.2.3':
393
- resolution: {integrity: sha512-/HiWEcp+WMZ7VajuiMEFGZ6cg0+aYZPqCJD3YJEfpVWQsKYSjXQG06vJP6F1rdA03COD9Fef4aODs3YxKx+RDQ==}
392
+ '@next/swc-linux-x64-gnu@16.2.6':
393
+ resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==}
394
394
  engines: {node: '>= 10'}
395
395
  cpu: [x64]
396
396
  os: [linux]
397
397
  libc: [glibc]
398
398
 
399
- '@next/swc-linux-x64-musl@16.2.3':
400
- resolution: {integrity: sha512-Kt44hGJfZSefebhk/7nIdivoDr3Ugp5+oNz9VvF3GUtfxutucUIHfIO0ZYO8QlOPDQloUVQn4NVC/9JvHRk9hw==}
399
+ '@next/swc-linux-x64-musl@16.2.6':
400
+ resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==}
401
401
  engines: {node: '>= 10'}
402
402
  cpu: [x64]
403
403
  os: [linux]
404
404
  libc: [musl]
405
405
 
406
- '@next/swc-win32-arm64-msvc@16.2.3':
407
- resolution: {integrity: sha512-O2NZ9ie3Tq6xj5Z5CSwBT3+aWAMW2PIZ4egUi9MaWLkwaehgtB7YZjPm+UpcNpKOme0IQuqDcor7BsW6QBiQBw==}
406
+ '@next/swc-win32-arm64-msvc@16.2.6':
407
+ resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==}
408
408
  engines: {node: '>= 10'}
409
409
  cpu: [arm64]
410
410
  os: [win32]
411
411
 
412
- '@next/swc-win32-x64-msvc@16.2.3':
413
- resolution: {integrity: sha512-Ibm29/GgB/ab5n7XKqlStkm54qqZE8v2FnijUPBgrd67FWrac45o/RsNlaOWjme/B5UqeWt/8KM4aWBwA1D2Kw==}
412
+ '@next/swc-win32-x64-msvc@16.2.6':
413
+ resolution: {integrity: sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==}
414
414
  engines: {node: '>= 10'}
415
415
  cpu: [x64]
416
416
  os: [win32]
@@ -832,10 +832,6 @@ packages:
832
832
  engines: {node: '>=6.0.0'}
833
833
  hasBin: true
834
834
 
835
- baseline-browser-mapping@2.8.31:
836
- resolution: {integrity: sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==}
837
- hasBin: true
838
-
839
835
  brace-expansion@1.1.12:
840
836
  resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
841
837
 
@@ -1006,8 +1002,8 @@ packages:
1006
1002
  resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
1007
1003
  engines: {node: '>=10'}
1008
1004
 
1009
- eslint-config-next@16.2.3:
1010
- resolution: {integrity: sha512-Dnkrylzjof/Az7iNoIQJqD18zTxQZcngir19KJaiRsMnnjpQSVoa6aEg/1Q4hQC+cW90uTlgQYadwL1CYNwFWA==}
1005
+ eslint-config-next@16.2.6:
1006
+ resolution: {integrity: sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==}
1011
1007
  peerDependencies:
1012
1008
  eslint: '>=9.0.0'
1013
1009
  typescript: '>=3.3.1'
@@ -1588,8 +1584,8 @@ packages:
1588
1584
  natural-compare@1.4.0:
1589
1585
  resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1590
1586
 
1591
- next@16.2.3:
1592
- resolution: {integrity: sha512-9V3zV4oZFza3PVev5/poB9g0dEafVcgNyQ8eTRop8GvxZjV2G15FC5ARuG1eFD42QgeYkzJBJzHghNP8Ad9xtA==}
1587
+ next@16.2.6:
1588
+ resolution: {integrity: sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==}
1593
1589
  engines: {node: '>=20.9.0'}
1594
1590
  hasBin: true
1595
1591
  peerDependencies:
@@ -2307,34 +2303,34 @@ snapshots:
2307
2303
  '@tybys/wasm-util': 0.10.1
2308
2304
  optional: true
2309
2305
 
2310
- '@next/env@16.2.3': {}
2306
+ '@next/env@16.2.6': {}
2311
2307
 
2312
- '@next/eslint-plugin-next@16.2.3':
2308
+ '@next/eslint-plugin-next@16.2.6':
2313
2309
  dependencies:
2314
2310
  fast-glob: 3.3.1
2315
2311
 
2316
- '@next/swc-darwin-arm64@16.2.3':
2312
+ '@next/swc-darwin-arm64@16.2.6':
2317
2313
  optional: true
2318
2314
 
2319
- '@next/swc-darwin-x64@16.2.3':
2315
+ '@next/swc-darwin-x64@16.2.6':
2320
2316
  optional: true
2321
2317
 
2322
- '@next/swc-linux-arm64-gnu@16.2.3':
2318
+ '@next/swc-linux-arm64-gnu@16.2.6':
2323
2319
  optional: true
2324
2320
 
2325
- '@next/swc-linux-arm64-musl@16.2.3':
2321
+ '@next/swc-linux-arm64-musl@16.2.6':
2326
2322
  optional: true
2327
2323
 
2328
- '@next/swc-linux-x64-gnu@16.2.3':
2324
+ '@next/swc-linux-x64-gnu@16.2.6':
2329
2325
  optional: true
2330
2326
 
2331
- '@next/swc-linux-x64-musl@16.2.3':
2327
+ '@next/swc-linux-x64-musl@16.2.6':
2332
2328
  optional: true
2333
2329
 
2334
- '@next/swc-win32-arm64-msvc@16.2.3':
2330
+ '@next/swc-win32-arm64-msvc@16.2.6':
2335
2331
  optional: true
2336
2332
 
2337
- '@next/swc-win32-x64-msvc@16.2.3':
2333
+ '@next/swc-win32-x64-msvc@16.2.6':
2338
2334
  optional: true
2339
2335
 
2340
2336
  '@nodelib/fs.scandir@2.1.5':
@@ -2452,9 +2448,9 @@ snapshots:
2452
2448
  postcss: 8.5.6
2453
2449
  tailwindcss: 4.1.17
2454
2450
 
2455
- '@trieb.work/nextjs-turbo-redis-cache@file:../../..(next@16.2.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(redis@4.7.0)':
2451
+ '@trieb.work/nextjs-turbo-redis-cache@file:../../..(next@16.2.6(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(redis@4.7.0)':
2456
2452
  dependencies:
2457
- next: 16.2.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2453
+ next: 16.2.6(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
2458
2454
  redis: 4.7.0
2459
2455
 
2460
2456
  '@tybys/wasm-util@0.10.1':
@@ -2736,8 +2732,6 @@ snapshots:
2736
2732
 
2737
2733
  baseline-browser-mapping@2.10.27: {}
2738
2734
 
2739
- baseline-browser-mapping@2.8.31: {}
2740
-
2741
2735
  brace-expansion@1.1.12:
2742
2736
  dependencies:
2743
2737
  balanced-match: 1.0.2
@@ -2753,7 +2747,7 @@ snapshots:
2753
2747
 
2754
2748
  browserslist@4.28.0:
2755
2749
  dependencies:
2756
- baseline-browser-mapping: 2.8.31
2750
+ baseline-browser-mapping: 2.10.27
2757
2751
  caniuse-lite: 1.0.30001756
2758
2752
  electron-to-chromium: 1.5.259
2759
2753
  node-releases: 2.0.27
@@ -2975,9 +2969,9 @@ snapshots:
2975
2969
 
2976
2970
  escape-string-regexp@4.0.0: {}
2977
2971
 
2978
- eslint-config-next@16.2.3(@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):
2972
+ eslint-config-next@16.2.6(@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):
2979
2973
  dependencies:
2980
- '@next/eslint-plugin-next': 16.2.3
2974
+ '@next/eslint-plugin-next': 16.2.6
2981
2975
  eslint: 9.39.1(jiti@2.6.1)
2982
2976
  eslint-import-resolver-node: 0.3.9
2983
2977
  eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1))
@@ -3610,9 +3604,9 @@ snapshots:
3610
3604
 
3611
3605
  natural-compare@1.4.0: {}
3612
3606
 
3613
- next@16.2.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0):
3607
+ next@16.2.6(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0):
3614
3608
  dependencies:
3615
- '@next/env': 16.2.3
3609
+ '@next/env': 16.2.6
3616
3610
  '@swc/helpers': 0.5.15
3617
3611
  baseline-browser-mapping: 2.10.27
3618
3612
  caniuse-lite: 1.0.30001756
@@ -3621,14 +3615,14 @@ snapshots:
3621
3615
  react-dom: 19.2.0(react@19.2.0)
3622
3616
  styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.0)
3623
3617
  optionalDependencies:
3624
- '@next/swc-darwin-arm64': 16.2.3
3625
- '@next/swc-darwin-x64': 16.2.3
3626
- '@next/swc-linux-arm64-gnu': 16.2.3
3627
- '@next/swc-linux-arm64-musl': 16.2.3
3628
- '@next/swc-linux-x64-gnu': 16.2.3
3629
- '@next/swc-linux-x64-musl': 16.2.3
3630
- '@next/swc-win32-arm64-msvc': 16.2.3
3631
- '@next/swc-win32-x64-msvc': 16.2.3
3618
+ '@next/swc-darwin-arm64': 16.2.6
3619
+ '@next/swc-darwin-x64': 16.2.6
3620
+ '@next/swc-linux-arm64-gnu': 16.2.6
3621
+ '@next/swc-linux-arm64-musl': 16.2.6
3622
+ '@next/swc-linux-x64-gnu': 16.2.6
3623
+ '@next/swc-linux-x64-musl': 16.2.6
3624
+ '@next/swc-win32-arm64-msvc': 16.2.6
3625
+ '@next/swc-win32-x64-msvc': 16.2.6
3632
3626
  sharp: 0.34.5
3633
3627
  transitivePeerDependencies:
3634
3628
  - '@babel/core'
@@ -0,0 +1,19 @@
1
+ import { NextResponse } from 'next/server';
2
+
3
+ let counter = 0;
4
+
5
+ export async function GET() {
6
+ const data = await getSimpleCachedData();
7
+ return NextResponse.json(data);
8
+ }
9
+
10
+ async function getSimpleCachedData() {
11
+ 'use cache';
12
+
13
+ counter++;
14
+ return {
15
+ counter,
16
+ timestamp: Date.now(),
17
+ message: 'Simple cached data without tags',
18
+ };
19
+ }
@@ -0,0 +1,24 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { cacheLife, cacheTag } from 'next/cache';
3
+
4
+ let counter = 0;
5
+
6
+ export async function GET() {
7
+ const data = await getCachedDataWithLife();
8
+ return NextResponse.json(data);
9
+ }
10
+
11
+ async function getCachedDataWithLife() {
12
+ 'use cache';
13
+
14
+ cacheLife({ stale: 1, revalidate: 2, expire: 5 });
15
+ cacheTag('cache-life-test');
16
+
17
+ counter++;
18
+
19
+ return {
20
+ counter,
21
+ timestamp: Date.now(),
22
+ profile: { stale: 1, revalidate: 2, expire: 5 },
23
+ };
24
+ }
@@ -0,0 +1,21 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { cacheTag } from 'next/cache';
3
+
4
+ let counter = 0;
5
+
6
+ export async function GET() {
7
+ const data = await getCachedData();
8
+ return NextResponse.json(data);
9
+ }
10
+
11
+ async function getCachedData() {
12
+ 'use cache';
13
+ cacheTag('test-tag');
14
+
15
+ counter++;
16
+ return {
17
+ counter,
18
+ timestamp: Date.now(),
19
+ message: 'This data should be cached',
20
+ };
21
+ }
@@ -0,0 +1,19 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { revalidateTag } from 'next/cache';
3
+
4
+ export async function POST(request: Request) {
5
+ const body = await request.json();
6
+ const { tag } = body;
7
+
8
+ if (!tag) {
9
+ return NextResponse.json({ error: 'Tag is required' }, { status: 400 });
10
+ }
11
+
12
+ revalidateTag(tag, { expire: 1 });
13
+
14
+ return NextResponse.json({
15
+ revalidated: true,
16
+ tag,
17
+ timestamp: Date.now(),
18
+ });
19
+ }
@@ -0,0 +1,19 @@
1
+ import { NextResponse } from 'next/server';
2
+
3
+ let counter = 0;
4
+
5
+ export async function GET() {
6
+ const data = await getCachedData();
7
+ return NextResponse.json(data);
8
+ }
9
+
10
+ async function getCachedData() {
11
+ 'use cache';
12
+
13
+ counter++;
14
+ return {
15
+ counter,
16
+ timestamp: Date.now(),
17
+ message: 'Revalidated cached data',
18
+ };
19
+ }
@@ -0,0 +1,110 @@
1
+ import Link from 'next/link';
2
+ import { cacheLife, cacheTag, revalidateTag } from 'next/cache';
3
+ import { Suspense } from 'react';
4
+
5
+ async function getCacheLifeSample() {
6
+ 'use cache';
7
+
8
+ // Very short timings for manual testing.
9
+ cacheLife({
10
+ stale: 2,
11
+ revalidate: 4,
12
+ expire: 10,
13
+ });
14
+
15
+ cacheTag('cache-lab:cachelife-short');
16
+
17
+ return {
18
+ createdAt: Date.now(),
19
+ random: Math.random(),
20
+ };
21
+ }
22
+
23
+ async function triggerRevalidateTag() {
24
+ 'use server';
25
+ revalidateTag('cache-lab:cachelife-short', { expire: 1 });
26
+ }
27
+
28
+ async function CachedDataPanel() {
29
+ const data = await getCacheLifeSample();
30
+ return (
31
+ <div className="rounded-lg border p-5">
32
+ <dl className="grid grid-cols-1 gap-3 text-sm">
33
+ <div>
34
+ <dt className="font-medium">createdAt</dt>
35
+ <dd data-testid="createdAt" className="font-mono text-slate-700">
36
+ {data.createdAt}
37
+ </dd>
38
+ </div>
39
+ <div>
40
+ <dt className="font-medium">random</dt>
41
+ <dd data-testid="random" className="font-mono text-slate-700">
42
+ {data.random}
43
+ </dd>
44
+ </div>
45
+ <div>
46
+ <dt className="font-medium">cacheLife config</dt>
47
+ <dd className="font-mono text-slate-700">
48
+ {'{ stale: 2, revalidate: 4, expire: 10 }'}
49
+ </dd>
50
+ </div>
51
+ </dl>
52
+ </div>
53
+ );
54
+ }
55
+
56
+ export default function CacheLifeShortPage() {
57
+ return (
58
+ <main className="mx-auto max-w-3xl p-10">
59
+ <div className="mb-6">
60
+ <Link
61
+ className="text-sm text-blue-600 hover:underline"
62
+ href="/cache-lab"
63
+ >
64
+ ← Back to Cache Lab
65
+ </Link>
66
+ </div>
67
+
68
+ <header className="mb-6">
69
+ <h1 className="text-2xl font-semibold">cacheLife: short timings</h1>
70
+ <p className="mt-2 text-sm text-slate-600">
71
+ This uses <code>cacheLife</code> with short durations so you can
72
+ observe stale / revalidate / expire behavior quickly.
73
+ </p>
74
+ </header>
75
+
76
+ <Suspense
77
+ fallback={
78
+ <div className="rounded-lg border bg-slate-50 p-5 text-sm text-slate-700">
79
+ Loading cached content…
80
+ </div>
81
+ }
82
+ >
83
+ <CachedDataPanel />
84
+ </Suspense>
85
+
86
+ <form action={triggerRevalidateTag} className="mt-6">
87
+ <button
88
+ className="rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700"
89
+ type="submit"
90
+ >
91
+ revalidateTag('cache-lab:cachelife-short')
92
+ </button>
93
+ </form>
94
+
95
+ <div className="mt-6 rounded-lg border bg-slate-50 p-5 text-sm text-slate-700">
96
+ <div className="space-y-2">
97
+ <p>
98
+ Expected: reload a few times. Within a couple seconds, the cached
99
+ value may become stale; after revalidate, a fresh value should
100
+ appear.
101
+ </p>
102
+ <p>
103
+ This page deliberately puts the async work behind{' '}
104
+ <code>{'<Suspense>'}</code> to avoid the "Blocking Route" warning.
105
+ </p>
106
+ </div>
107
+ </div>
108
+ </main>
109
+ );
110
+ }
@@ -0,0 +1,90 @@
1
+ import Link from 'next/link';
2
+
3
+ export default function CacheLabIndexPage() {
4
+ return (
5
+ <main className="mx-auto max-w-5xl p-10">
6
+ <header className="mb-10">
7
+ <h1 className="text-3xl font-semibold">Cache Lab</h1>
8
+ <p className="mt-2 text-slate-600">
9
+ Manual test pages for Next.js Cache Components (use cache, cacheLife,
10
+ tags, updateTag/revalidateTag, and Suspense boundaries).
11
+ </p>
12
+ </header>
13
+
14
+ <section className="grid grid-cols-1 gap-4 md:grid-cols-2">
15
+ <Link
16
+ className="rounded-lg border p-5 hover:bg-slate-50"
17
+ href="/cache-lab/use-cache-nondeterministic"
18
+ >
19
+ <h2 className="text-lg font-medium">use cache: non-deterministic</h2>
20
+ <p className="mt-1 text-sm text-slate-600">
21
+ Random/Date/UUID should stay identical across reloads until you
22
+ invalidate.
23
+ </p>
24
+ </Link>
25
+
26
+ <Link
27
+ className="rounded-lg border p-5 hover:bg-slate-50"
28
+ href="/cache-lab/cachelife-short"
29
+ >
30
+ <h2 className="text-lg font-medium">cacheLife: short timings</h2>
31
+ <p className="mt-1 text-sm text-slate-600">
32
+ Uses very small stale/revalidate/expire values so you can observe
33
+ SWR + expiry quickly.
34
+ </p>
35
+ </Link>
36
+
37
+ <Link
38
+ className="rounded-lg border p-5 hover:bg-slate-50"
39
+ href="/cache-lab/tag-invalidation"
40
+ >
41
+ <h2 className="text-lg font-medium">
42
+ Tags: updateTag vs revalidateTag
43
+ </h2>
44
+ <p className="mt-1 text-sm text-slate-600">
45
+ Cached component tagged via cacheTag. Trigger updateTag (immediate)
46
+ or revalidateTag (SWR).
47
+ </p>
48
+ </Link>
49
+
50
+ <Link
51
+ className="rounded-lg border p-5 hover:bg-slate-50"
52
+ href="/cache-lab/stale-while-revalidate"
53
+ >
54
+ <h2 className="text-lg font-medium">
55
+ SWR: stale-while-revalidate (slow)
56
+ </h2>
57
+ <p className="mt-1 text-sm text-slate-600">
58
+ Forces slow recomputation so you can see whether stale is served
59
+ immediately while refresh happens in the background.
60
+ </p>
61
+ </Link>
62
+
63
+ <Link
64
+ className="rounded-lg border p-5 hover:bg-slate-50"
65
+ href="/cache-lab/runtime-data-suspense"
66
+ >
67
+ <h2 className="text-lg font-medium">Runtime data + Suspense</h2>
68
+ <p className="mt-1 text-sm text-slate-600">
69
+ Reads cookies() at request time in a non-cached component and passes
70
+ it into a cached component to show correct boundaries.
71
+ </p>
72
+ </Link>
73
+ </section>
74
+
75
+ <section className="mt-12 rounded-lg border bg-slate-50 p-5">
76
+ <h3 className="font-medium">How to use</h3>
77
+ <div className="mt-2 space-y-2 text-sm text-slate-700">
78
+ <p>
79
+ Open each page in 2 tabs and compare behavior while reloading.
80
+ Observe which values stay stable, and which update.
81
+ </p>
82
+ <p>
83
+ Use the buttons on each page to trigger tag invalidation and observe
84
+ how quickly new content becomes visible.
85
+ </p>
86
+ </div>
87
+ </section>
88
+ </main>
89
+ );
90
+ }