@trieb.work/nextjs-turbo-redis-cache 1.8.1 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +9 -2
- package/CHANGELOG.md +14 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -3
- package/src/RedisStringsHandler.ts +2 -2
- package/test/integration/next-app-15-0-3/pnpm-lock.yaml +1 -1
- package/test/integration/next-app-15-3-2/pnpm-lock.yaml +1 -1
- package/test/integration/next-app-15-4-7/README.md +36 -0
- package/test/integration/next-app-15-4-7/eslint.config.mjs +16 -0
- package/test/integration/next-app-15-4-7/next.config.js +6 -0
- package/test/integration/next-app-15-4-7/package-lock.json +5969 -0
- package/test/integration/next-app-15-4-7/package.json +33 -0
- package/test/integration/next-app-15-4-7/pnpm-lock.yaml +3707 -0
- package/test/integration/next-app-15-4-7/postcss.config.mjs +5 -0
- package/test/integration/next-app-15-4-7/public/file.svg +1 -0
- package/test/integration/next-app-15-4-7/public/globe.svg +1 -0
- package/test/integration/next-app-15-4-7/public/next.svg +1 -0
- package/test/integration/next-app-15-4-7/public/vercel.svg +1 -0
- package/test/integration/next-app-15-4-7/public/window.svg +1 -0
- package/test/integration/next-app-15-4-7/src/app/api/cached-static-fetch/route.ts +18 -0
- package/test/integration/next-app-15-4-7/src/app/api/nested-fetch-in-api-route/revalidated-fetch/route.ts +27 -0
- package/test/integration/next-app-15-4-7/src/app/api/revalidatePath/route.ts +15 -0
- package/test/integration/next-app-15-4-7/src/app/api/revalidateTag/route.ts +15 -0
- package/test/integration/next-app-15-4-7/src/app/api/revalidated-fetch/route.ts +17 -0
- package/test/integration/next-app-15-4-7/src/app/api/uncached-fetch/route.ts +15 -0
- package/test/integration/next-app-15-4-7/src/app/globals.css +26 -0
- package/test/integration/next-app-15-4-7/src/app/layout.tsx +59 -0
- package/test/integration/next-app-15-4-7/src/app/page.tsx +755 -0
- package/test/integration/next-app-15-4-7/src/app/pages/cached-static-fetch/default--force-dynamic-page/page.tsx +19 -0
- package/test/integration/next-app-15-4-7/src/app/pages/cached-static-fetch/revalidate15--default-page/page.tsx +34 -0
- package/test/integration/next-app-15-4-7/src/app/pages/cached-static-fetch/revalidate15--force-dynamic-page/page.tsx +25 -0
- package/test/integration/next-app-15-4-7/src/app/pages/no-fetch/default-page/page.tsx +55 -0
- package/test/integration/next-app-15-4-7/src/app/pages/revalidated-fetch/default--force-dynamic-page/page.tsx +19 -0
- package/test/integration/next-app-15-4-7/src/app/pages/revalidated-fetch/revalidate15--default-page/page.tsx +35 -0
- package/test/integration/next-app-15-4-7/src/app/pages/revalidated-fetch/revalidate15--force-dynamic-page/page.tsx +25 -0
- package/test/integration/next-app-15-4-7/src/app/pages/uncached-fetch/default--force-dynamic-page/page.tsx +19 -0
- package/test/integration/next-app-15-4-7/src/app/pages/uncached-fetch/revalidate15--default-page/page.tsx +32 -0
- package/test/integration/next-app-15-4-7/src/app/pages/uncached-fetch/revalidate15--force-dynamic-page/page.tsx +25 -0
- package/test/integration/next-app-15-4-7/src/app/revalidation-interface.tsx +267 -0
- package/test/integration/next-app-15-4-7/tsconfig.json +27 -0
- package/test/integration/nextjs-cache-handler.integration.test.ts +7 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
let counter = 0;
|
|
4
|
+
|
|
5
|
+
export const dynamic = 'force-static';
|
|
6
|
+
export const revalidate = false;
|
|
7
|
+
|
|
8
|
+
export async function GET() {
|
|
9
|
+
counter++;
|
|
10
|
+
return NextResponse.json(
|
|
11
|
+
{ counter },
|
|
12
|
+
{
|
|
13
|
+
headers: {
|
|
14
|
+
'Cache-Control': 'public, max-age=1',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
);
|
|
18
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
let counter = 0;
|
|
4
|
+
|
|
5
|
+
export const dynamic = 'force-dynamic';
|
|
6
|
+
|
|
7
|
+
export async function GET() {
|
|
8
|
+
counter++;
|
|
9
|
+
const res = await fetch(
|
|
10
|
+
`http://localhost:${process.env.NEXT_START_PORT || 3000}/api/uncached-fetch`,
|
|
11
|
+
{
|
|
12
|
+
next: {
|
|
13
|
+
revalidate: 3,
|
|
14
|
+
tags: ['revalidated-fetch-revalidate3-nested-fetch-in-api-route'],
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
);
|
|
18
|
+
const data = await res.json();
|
|
19
|
+
return NextResponse.json(
|
|
20
|
+
{ counter, subFetchData: data },
|
|
21
|
+
{
|
|
22
|
+
headers: {
|
|
23
|
+
'Cache-Control': 'public, max-age=1',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { revalidatePath } from 'next/cache';
|
|
2
|
+
import { NextResponse } from 'next/server';
|
|
3
|
+
|
|
4
|
+
export async function GET(request: Request) {
|
|
5
|
+
const { searchParams } = new URL(request.url);
|
|
6
|
+
const path = searchParams.get('path');
|
|
7
|
+
if (!path) {
|
|
8
|
+
return NextResponse.json(
|
|
9
|
+
{ error: 'Missing path parameter' },
|
|
10
|
+
{ status: 400 },
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
revalidatePath(path);
|
|
14
|
+
return NextResponse.json({ success: true });
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { revalidateTag } from 'next/cache';
|
|
2
|
+
import { NextResponse } from 'next/server';
|
|
3
|
+
|
|
4
|
+
export async function GET(request: Request) {
|
|
5
|
+
const { searchParams } = new URL(request.url);
|
|
6
|
+
const tag = searchParams.get('tag');
|
|
7
|
+
if (!tag) {
|
|
8
|
+
return NextResponse.json(
|
|
9
|
+
{ error: 'Missing tag parameter' },
|
|
10
|
+
{ status: 400 },
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
revalidateTag(tag);
|
|
14
|
+
return NextResponse.json({ success: true });
|
|
15
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
let counter = 0;
|
|
4
|
+
|
|
5
|
+
export const revalidate = 5;
|
|
6
|
+
|
|
7
|
+
export async function GET() {
|
|
8
|
+
counter++;
|
|
9
|
+
return NextResponse.json(
|
|
10
|
+
{ counter },
|
|
11
|
+
{
|
|
12
|
+
headers: {
|
|
13
|
+
'Cache-Control': 'public, max-age=1',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
--background: #ffffff;
|
|
5
|
+
--foreground: #171717;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
@theme inline {
|
|
9
|
+
--color-background: var(--background);
|
|
10
|
+
--color-foreground: var(--foreground);
|
|
11
|
+
--font-sans: var(--font-geist-sans);
|
|
12
|
+
--font-mono: var(--font-geist-mono);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@media (prefers-color-scheme: dark) {
|
|
16
|
+
:root {
|
|
17
|
+
--background: #0a0a0a;
|
|
18
|
+
--foreground: #ededed;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
body {
|
|
23
|
+
background: var(--background);
|
|
24
|
+
color: var(--foreground);
|
|
25
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
26
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// This layout is used to test the revalidation logic
|
|
2
|
+
// The layout itself will not create any cache entries
|
|
3
|
+
// It will just be used to render a page
|
|
4
|
+
// If the layout itself uses a fetch request, it will be handled the same way as if the page itself would use a fetch request
|
|
5
|
+
// The layout can be revalidated as well by using revalidatePath with the path of the layout file. However, this will not revalidate the subsequent fetch requests
|
|
6
|
+
|
|
7
|
+
import type { Metadata } from 'next';
|
|
8
|
+
import { Geist, Geist_Mono } from 'next/font/google';
|
|
9
|
+
import './globals.css';
|
|
10
|
+
|
|
11
|
+
const geistSans = Geist({
|
|
12
|
+
variable: '--font-geist-sans',
|
|
13
|
+
subsets: ['latin'],
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const geistMono = Geist_Mono({
|
|
17
|
+
variable: '--font-geist-mono',
|
|
18
|
+
subsets: ['latin'],
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export const metadata: Metadata = {
|
|
22
|
+
title: 'Create Next App',
|
|
23
|
+
description: 'Generated by create next app',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export default async function RootLayout({
|
|
27
|
+
children,
|
|
28
|
+
}: Readonly<{
|
|
29
|
+
children: React.ReactNode;
|
|
30
|
+
}>) {
|
|
31
|
+
// let res;
|
|
32
|
+
// try {
|
|
33
|
+
// res = await fetch(`https://httpbin.org/get`, {
|
|
34
|
+
// next: {
|
|
35
|
+
// revalidate: 15,
|
|
36
|
+
// tags: ['httpbin-layout-revalidate15'],
|
|
37
|
+
// },
|
|
38
|
+
// });
|
|
39
|
+
// } catch (e) {
|
|
40
|
+
// // ECONNREFUSED is expected during build
|
|
41
|
+
// // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
42
|
+
// if (((e as Error).cause as any)?.code !== 'ECONNREFUSED') {
|
|
43
|
+
// throw e;
|
|
44
|
+
// }
|
|
45
|
+
// }
|
|
46
|
+
|
|
47
|
+
// const data = res?.ok ? await res.json() : { origin: -1 };
|
|
48
|
+
return (
|
|
49
|
+
<html lang="en">
|
|
50
|
+
<body
|
|
51
|
+
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
|
|
52
|
+
>
|
|
53
|
+
Layout TS: {Date.now()}
|
|
54
|
+
{/* Layout counter: {data.origin} */}
|
|
55
|
+
{children}
|
|
56
|
+
</body>
|
|
57
|
+
</html>
|
|
58
|
+
);
|
|
59
|
+
}
|