Skip to content

Commit cf9e678

Browse files
committed
remove dependency on vercel api in tests
1 parent 1868c99 commit cf9e678

File tree

12 files changed

+209
-35
lines changed

12 files changed

+209
-35
lines changed

examples/next-partial-prerendering/components/pricing.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Suspense } from 'react';
1010
import { AddToCart } from '#/components/add-to-cart';
1111
import { delayShippingEstimate, withDelay } from '#/lib/delay';
1212
import { cookies } from 'next/headers';
13+
import { getProduct } from '#/lib/products';
1314

1415
async function AddToCartFromCookies() {
1516
// Get the cart count from the users cookies and pass it to the client
@@ -38,14 +39,7 @@ function LoadingDots() {
3839

3940
async function UserSpecificDetails({ productId }: { productId: string }) {
4041
const data = await withDelay(
41-
fetch(
42-
`https://app-router-api.vercel.app/api/products?id=${productId}&filter=price,usedPrice,leadTime,stock`,
43-
{
44-
// We intentionally disable Next.js Cache to better demo
45-
// streaming
46-
cache: 'no-store',
47-
},
48-
),
42+
getProduct({ id: productId }),
4943
delayShippingEstimate,
5044
);
5145

examples/next-partial-prerendering/components/recommended-products.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
11
import { Product } from '#/types/product';
22
import { ProductCard } from '#/components/product-card';
33
import { delayRecommendedProducts, withDelay } from '#/lib/delay';
4+
import { getProducts } from '#/lib/products';
45

56
export async function RecommendedProducts() {
67
let products: Product[] = await withDelay(
7-
fetch(
8-
// We intentionally delay the response to simulate a slow data
9-
// request that would benefit from streaming
10-
`https://app-router-api.vercel.app/api/products?filter=1`,
11-
{
12-
// We intentionally disable Next.js Cache to better demo
13-
// streaming
14-
cache: 'no-store',
15-
},
16-
).then((res) => res.json()),
8+
getProducts({ exclude: ['1'] }).then((res) => res.json()),
179
delayRecommendedProducts,
1810
);
1911

examples/next-partial-prerendering/components/reviews.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
11
import type { Review } from '#/types/review';
22
import { ProductReviewCard } from '#/components/product-review-card';
33
import { delayReviews, withDelay } from '#/lib/delay';
4+
import { getReviews } from '#/lib/reviews';
45

56
export async function Reviews() {
67
let reviews: Review[] = await withDelay(
7-
fetch(
8-
// We intentionally delay the response to simulate a slow data
9-
// request that would benefit from streaming
10-
`https://app-router-api.vercel.app/api/reviews`,
11-
{
12-
// We intentionally disable Next.js Cache to better demo
13-
// streaming
14-
cache: 'no-store',
15-
},
16-
).then((res) => res.json()),
8+
getReviews().then((res) => res.json()),
179
delayReviews,
1810
);
1911

examples/next-partial-prerendering/components/single-product.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import { Pricing } from '#/components/pricing';
22
import type { Product } from '#/types/product';
33
import { ProductRating } from '#/components/product-rating';
44
import Image from 'next/image';
5+
import { getProduct } from '#/lib/products';
56

67
export async function SingleProduct() {
7-
const product: Product = await fetch(
8-
`https://app-router-api.vercel.app/api/products?id=1`,
9-
).then((res) => res.json());
8+
const product: Product = await getProduct({ id: '1' }).then((res) =>
9+
res.json(),
10+
);
1011

1112
return (
1213
<div className="grid grid-cols-4 gap-6">
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
const products = [
2+
{
3+
id: '1',
4+
stock: 2,
5+
rating: 5,
6+
name: 'Donec sit elit',
7+
description:
8+
'Morbi eu ullamcorper urna, a condimentum massa. In fermentum ante non turpis cursus fringilla. Praesent neque eros, gravida vel ante sed, vehicula elementum orci. Sed eu ipsum eget enim mattis mollis.',
9+
price: {
10+
amount: 4200,
11+
currency: { code: 'USD', base: 10, exponent: 2 },
12+
scale: 2,
13+
},
14+
isBestSeller: false,
15+
leadTime: 2,
16+
discount: { percent: 90, expires: 2 },
17+
image: 'eniko-kis-KsLPTsYaqIQ-unsplash.jpg',
18+
imageBlur:
19+
'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAAqgAwAEAAAAAQAAAAoAAAAA/8AAEQgACgAKAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAAgICAgICAwICAwUDAwMFBgUFBQUGCAYGBgYGCAoICAgICAgKCgoKCgoKCgwMDAwMDA4ODg4ODw8PDw8PDw8PD//bAEMBAgICBAQEBwQEBxALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/dAAQAAf/aAAwDAQACEQMRAD8A+3/HPx10jQPE0+k6ZrPh6TTtKsbi41R7nVUiu7WeMkQxi2H3lk2su4sCrjBHFd54c+InhvxJ4e0vxFa3aRw6pawXSKxG5VnQOAfcA81474z8G+ENU1OeXU9Dsbt/N8zdNbRSHfn72WU/N79a9U03TtPj061jjtYkRIkAARQAAowAMV2Sa7GsIH//2Q==',
20+
},
21+
{
22+
id: '2',
23+
stock: 5,
24+
rating: 4,
25+
name: 'Fusce commodo porta posuere',
26+
description:
27+
'Morbi eu ullamcorper urna, a condimentum massa. In fermentum ante non turpis cursus fringilla. Praesent neque eros, gravida vel ante sed, vehicula elementum orci. Sed eu ipsum eget enim mattis mollis.',
28+
price: {
29+
amount: 4600,
30+
currency: { code: 'USD', base: 10, exponent: 2 },
31+
scale: 2,
32+
},
33+
isBestSeller: false,
34+
leadTime: 1,
35+
image: 'patrick-OIFgeLnjwrM-unsplash.jpg',
36+
imageBlur:
37+
'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAAqgAwAEAAAAAQAAAAoAAAAA/8AAEQgACgAKAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAAgICAgICAwICAwUDAwMFBgUFBQUGCAYGBgYGCAoICAgICAgKCgoKCgoKCgwMDAwMDA4ODg4ODw8PDw8PDw8PD//bAEMBAgICBAQEBwQEBxALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/dAAQAAf/aAAwDAQACEQMRAD8AwNV+KvwHs7vSNLi8faJoy2VtcQatFLaSz3X2shBGyuUKjy23kgKwY4HStq5j0O4uZZ9Lfz7KR2aCQArviJyjYIyMrg4NXY7Cxddz20bE9SUU/wBKfsQcBQAPav6Gyrh+vQq1pyxMpKTuk+mr0Wr7/gf568TeI2DxlDDUqWXwpumrNpr3tIq7tFa6X67n/9k=',
38+
},
39+
{
40+
id: '3',
41+
stock: 3,
42+
rating: 3,
43+
name: 'Praesent tincidunt lectus',
44+
description:
45+
'Morbi eu ullamcorper urna, a condimentum massa. In fermentum ante non turpis cursus fringilla. Praesent neque eros, gravida vel ante sed, vehicula elementum orci. Sed eu ipsum eget enim mattis mollis.',
46+
price: {
47+
amount: 29200,
48+
currency: { code: 'USD', base: 10, exponent: 2 },
49+
scale: 2,
50+
},
51+
discount: { percent: 70, expires: 7 },
52+
isBestSeller: true,
53+
leadTime: 2,
54+
image: 'yoann-siloine-_T4w3JDm6ug-unsplash.jpg',
55+
imageBlur:
56+
'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAAqgAwAEAAAAAQAAAAoAAAAA/8AAEQgACgAKAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAAgICAgICAwICAwUDAwMFBgUFBQUGCAYGBgYGCAoICAgICAgKCgoKCgoKCgwMDAwMDA4ODg4ODw8PDw8PDw8PD//bAEMBAgICBAQEBwQEBxALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/dAAQAAf/aAAwDAQACEQMRAD8A+6vG/wC1t4J+GniLxP4L1Wynub7RrqWOQBJ1DvLbG9AVxC6ECHPO4DdhM7yBX2XpP2iTSrOROFaGMgegKivPPEGnafLrEckttE7yOu4siktgdzjmvTE4RQOAAKDSx//Z',
57+
},
58+
{
59+
id: '4',
60+
stock: 2,
61+
rating: 5,
62+
name: 'Morbi at viverra turpis',
63+
description:
64+
'Morbi eu ullamcorper urna, a condimentum massa. In fermentum ante non turpis cursus fringilla. Praesent neque eros, gravida vel ante sed, vehicula elementum orci. Sed eu ipsum eget enim mattis mollis.',
65+
price: {
66+
amount: 21200,
67+
currency: { code: 'USD', base: 10, exponent: 2 },
68+
scale: 2,
69+
},
70+
isBestSeller: false,
71+
leadTime: 2,
72+
image: 'alexander-andrews-brAkTCdnhW8-unsplash.jpg',
73+
imageBlur:
74+
'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAAqgAwAEAAAAAQAAAAoAAAAA/8AAEQgACgAKAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAAgICAgICAwICAwUDAwMFBgUFBQUGCAYGBgYGCAoICAgICAgKCgoKCgoKCgwMDAwMDA4ODg4ODw8PDw8PDw8PD//bAEMBAgICBAQEBwQEBxALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/dAAQAAf/aAAwDAQACEQMRAD8Ay59W0U20sUGmapJf2hZZVR7TyWVbd5hKgd1k2yOohVeu4jHGTXBwa9PcQR3BhaAyqG8uQ/Om4Z2tjjI6HHGa2dVtrad3aeJJCOhZQf51TjACKAMAAV0u99z8bni6E4RUaVmt3fc//9k=',
75+
},
76+
{
77+
id: '5',
78+
stock: 1,
79+
rating: 4,
80+
name: 'Maecenas interdum',
81+
description:
82+
'Morbi eu ullamcorper urna, a condimentum massa. In fermentum ante non turpis cursus fringilla. Praesent neque eros, gravida vel ante sed, vehicula elementum orci. Sed eu ipsum eget enim mattis mollis.',
83+
price: {
84+
amount: 28700,
85+
currency: { code: 'USD', base: 10, exponent: 2 },
86+
scale: 2,
87+
},
88+
isBestSeller: false,
89+
leadTime: 4,
90+
image: 'guillaume-coupy-6HuoHgK7FN8-unsplash.jpg',
91+
imageBlur:
92+
'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAAqgAwAEAAAAAQAAAAoAAAAA/8AAEQgACgAKAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAAgICAgICAwICAwUDAwMFBgUFBQUGCAYGBgYGCAoICAgICAgKCgoKCgoKCgwMDAwMDA4ODg4ODw8PDw8PDw8PD//bAEMBAgICBAQEBwQEBxALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/dAAQAAf/aAAwDAQACEQMRAD8A9P8Aj/qni3w58aNel0PV9UENm3lraDUfLtpJJLeOMKlqwXYELGRX3/M3zD3/AE5tPDB+yQ7pFc7FySeTx1NeX+PfhF8J/FPjI+IfE3grRNX1UPC4u7zTba4uN0f3D5skbPlf4TnjtXvcdrbLGoEKAADjaKpQa3Z1Od9j/9k=',
93+
},
94+
];
95+
96+
export const getProduct = (opts: { id: string }) =>
97+
Promise.resolve(
98+
new Response(JSON.stringify(products.find((p) => p.id === opts.id))),
99+
);
100+
101+
export const getProducts = (opts: { exclude: string[] }) =>
102+
Promise.resolve(
103+
new Response(
104+
JSON.stringify(products.filter((p) => !opts.exclude.includes(p.id))),
105+
),
106+
);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const reviews = [
2+
{
3+
id: '1',
4+
name: 'Nullam Duis',
5+
rating: 4,
6+
text: 'Phasellus efficitur, nisi ut varius ultricies, tortor arcu ullamcorper nisi, eu auctor enim est ut enim. Sed fringilla, nulla ut tincidunt hendrerit, risus tortor laoreet tortor, non mattis arcu elit vel ante.',
7+
},
8+
{
9+
id: '2',
10+
name: 'Donec Nulla Velit',
11+
rating: 1,
12+
text: 'Nullam fermentum nisl non mattis fringilla!!!!',
13+
},
14+
{
15+
id: '3',
16+
name: 'J Tempus',
17+
rating: 3,
18+
text: 'Pellentesque faucibus quam eu vehicula pulvinar. Integer cursus fringilla metus.',
19+
},
20+
];
21+
22+
export const getReviews = () =>
23+
Promise.resolve(new Response(JSON.stringify(reviews)));

examples/playground14/app/isr/[id]/dynamic/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { getPost } from "../../../../lib/posts";
2+
13
// Imported from https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration
24
interface Post {
35
id: string;
@@ -20,7 +22,7 @@ export async function generateStaticParams() {
2022

2123
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
2224
const id = (await params).id;
23-
const post: Post = await fetch(`https://api.vercel.app/blog/${id}`).then((res) => res.json());
25+
const post: Post = await getPost({ id }).then((res) => res.json());
2426
return (
2527
<main>
2628
<h1>{post.title}</h1>

examples/playground14/app/isr/[id]/no-dynamic/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { getPost } from "../../../../lib/posts";
2+
13
// Imported from https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration
24
interface Post {
35
id: string;
@@ -19,7 +21,7 @@ export async function generateStaticParams() {
1921

2022
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
2123
const id = (await params).id;
22-
const post: Post = await fetch(`https://api.vercel.app/blog/${id}`).then((res) => res.json());
24+
const post: Post = await getPost({ id }).then((res) => res.json());
2325
return (
2426
<main>
2527
<h1>{post.title}</h1>

examples/playground14/lib/posts.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const posts = [
2+
{
3+
id: 1,
4+
title: "Lorem Ipsum - What Is It and How to Use It?",
5+
content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...",
6+
author: "John Doe",
7+
date: "2023-08-01",
8+
category: "Technology",
9+
},
10+
{
11+
id: 2,
12+
title: "The Benefits of Regular Exercise",
13+
content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...",
14+
author: "Jane Smith",
15+
date: "2023-07-25",
16+
category: "Health & Fitness",
17+
},
18+
{
19+
id: 3,
20+
title: "Mastering the Art of Cooking",
21+
content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ...",
22+
author: "Michael Johnson",
23+
date: "2023-07-18",
24+
category: "Food & Cooking",
25+
},
26+
];
27+
28+
export const getPost = (opts: { id: string }) =>
29+
Promise.resolve(new Response(JSON.stringify(posts.find((p) => p.id === Number(opts.id)))));

examples/playground15/app/isr/[id]/dynamic/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { getPost } from "../../../lib/posts";
2+
13
// Imported from https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration
24
interface Post {
35
id: string;
@@ -20,7 +22,7 @@ export async function generateStaticParams() {
2022

2123
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
2224
const id = (await params).id;
23-
const post: Post = await fetch(`https://api.vercel.app/blog/${id}`).then((res) => res.json());
25+
const post: Post = await getPost({ id }).then((res) => res.json());
2426
return (
2527
<main>
2628
<h1>{post.title}</h1>

0 commit comments

Comments
 (0)