Skip to content
This repository was archived by the owner on May 10, 2021. It is now read-only.

Commit 7ad6d32

Browse files
strip file extension when checking if route is dynamic in setupRedirects (#156)
1 parent 5ddb83d commit 7ad6d32

File tree

10 files changed

+146
-39
lines changed

10 files changed

+146
-39
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import Error from "next/error";
2+
import Link from "next/link";
3+
4+
const Show = (props) => {
5+
const { errorCode, show } = props;
6+
// If show item was not found, render 404 page
7+
if (errorCode) {
8+
return <Error statusCode={errorCode} />;
9+
}
10+
11+
// Otherwise, render show
12+
return (
13+
<div>
14+
<h1>Show #{show.id}</h1>
15+
<p>{show.name}</p>
16+
17+
<hr />
18+
19+
<Link href="/home">
20+
<a>Go back home to base page</a>
21+
</Link>
22+
</div>
23+
);
24+
};
25+
26+
export const getServerSideProps = async ({ params }) => {
27+
// The ID to render
28+
const { bar } = params;
29+
30+
const res = await fetch(`https://api.tvmaze.com/shows/${bar}`);
31+
const data = await res.json();
32+
33+
// Set error code if show item could not be found
34+
const errorCode = res.status > 200 ? res.status : false;
35+
36+
return {
37+
props: {
38+
errorCode,
39+
show: data,
40+
},
41+
};
42+
};
43+
44+
export default Show;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import Link from "next/link";
2+
3+
const Home = () => (
4+
<div>
5+
<h1>NextJS on Netlify</h1>
6+
7+
<ul>
8+
<li>
9+
<Link href="/[bar]/ssr" as="/1337/ssr">
10+
<a>1337/ssr</a>
11+
</Link>
12+
</li>
13+
<li>
14+
<Link href="/[bar]/ssr" as="/1338/ssr">
15+
<a>1338/ssr</a>
16+
</Link>
17+
</li>
18+
</ul>
19+
</div>
20+
);
21+
22+
export default Home;

cypress/integration/optionalCatchAll_at_root_spec.js

+36
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,42 @@ describe("pre-rendered page: /static.js", () => {
9292
});
9393
});
9494

95+
describe("SSR'd page: /[bar]/ssr.js", () => {
96+
it("loads TV show", () => {
97+
cy.visit("/1337/ssr");
98+
99+
cy.get("h1").should("contain", "Show #1337");
100+
cy.get("p").should("contain", "Whodunnit?");
101+
});
102+
103+
it("loads TV show when SSR-ing", () => {
104+
cy.ssr("/1337/ssr");
105+
106+
cy.get("h1").should("contain", "Show #1337");
107+
cy.get("p").should("contain", "Whodunnit?");
108+
});
109+
110+
it("loads page props from data .json file when navigating to it", () => {
111+
cy.visit("/home");
112+
cy.window().then((w) => (w.noReload = true));
113+
114+
// Navigate to page and test that no reload is performed
115+
// See: https://glebbahmutov.com/blog/detect-page-reload/
116+
cy.contains("1337/ssr").click();
117+
118+
cy.get("h1").should("contain", "Show #1337");
119+
cy.get("p").should("contain", "Whodunnit?");
120+
121+
cy.contains("Go back home").click();
122+
cy.contains("1338/ssr").click();
123+
124+
cy.get("h1").should("contain", "Show #1338");
125+
cy.get("p").should("contain", "The Whole Truth");
126+
127+
cy.window().should("have.property", "noReload", true);
128+
});
129+
});
130+
95131
describe("pre-rendered pages: /subfolder/[id].js", () => {
96132
it("serves /subfolder/static", () => {
97133
cy.visit("/subfolder/static");

lib/helpers/getSortedRedirects.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
const {
22
getSortedRoutes: getSortedRoutesFromNext,
33
} = require("next/dist/next-server/lib/router/utils/sorted-routes");
4-
5-
// Remove the file extension form the route
6-
const removeFileExtension = (route) => route.replace(/\.[a-zA-Z]+$/, "");
4+
const removeFileExtension = require("./removeFileExtension");
75

86
// Return an array of redirects sorted in order of specificity, i.e., more generic
97
// routes precede more specific ones

lib/helpers/removeFileExtension.js

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// Remove the file extension form the route
2+
const removeFileExtension = (route) => route.replace(/\.[a-zA-Z]+$/, "");
3+
4+
module.exports = removeFileExtension;

lib/steps/copyNextAssets.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ const { NEXT_DIST_DIR } = require("../config");
88
const copyNextAssets = (publishPath) => {
99
const staticAssetsPath = join(NEXT_DIST_DIR, "static");
1010
if (!existsSync(staticAssetsPath)) {
11-
throw new Error("No static assets found in .next dist (aka no /.next/static). Please check your project configuration. Your next.config.js must be one of `serverless` or `experimental-serverless-trace`. Your build command should include `next build`.");
11+
throw new Error(
12+
"No static assets found in .next dist (aka no /.next/static). Please check your project configuration. Your next.config.js must be one of `serverless` or `experimental-serverless-trace`. Your build command should include `next build`."
13+
);
1214
}
1315
logTitle("💼 Copying static NextJS assets to", publishPath);
1416
copySync(staticAssetsPath, join(publishPath, "_next", "static"), {

lib/steps/setupRedirects.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const getSortedRedirects = require("../helpers/getSortedRedirects");
99
const getNetlifyRoutes = require("../helpers/getNetlifyRoutes");
1010
const isRootCatchAllRedirect = require("../helpers/isRootCatchAllRedirect");
1111
const isDynamicRoute = require("../helpers/isDynamicRoute");
12+
const removeFileExtension = require("../helpers/removeFileExtension");
1213

1314
// Setup _redirects file that routes all requests to the appropriate location,
1415
// such as one of the Netlify functions or one of the static files.
@@ -37,10 +38,10 @@ const setupRedirects = (publishPath) => {
3738
redirects.push("# Next-on-Netlify Redirects");
3839

3940
const staticRedirects = nextRedirects.filter(
40-
({ route }) => !isDynamicRoute(route)
41+
({ route }) => !isDynamicRoute(removeFileExtension(route))
4142
);
4243
const dynamicRedirects = nextRedirects.filter(({ route }) =>
43-
isDynamicRoute(route)
44+
isDynamicRoute(removeFileExtension(route))
4445
);
4546

4647
// Add next/image redirect to our image function

tests/__snapshots__/defaults.test.js.snap

+7-7
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ exports[`Headers creates Netlify headers 1`] = `
1111
exports[`Routing creates Netlify redirects 1`] = `
1212
"# Next-on-Netlify Redirects
1313
/ /.netlify/functions/next_index 200
14-
/_next/data/%BUILD_ID%/getServerSideProps/all.json /.netlify/functions/next_getServerSideProps_all_slug 200
15-
/_next/data/%BUILD_ID%/getServerSideProps/all/* /.netlify/functions/next_getServerSideProps_all_slug 200
1614
/_next/data/%BUILD_ID%/getServerSideProps/static.json /.netlify/functions/next_getServerSideProps_static 200
17-
/_next/data/%BUILD_ID%/getServerSideProps/:id.json /.netlify/functions/next_getServerSideProps_id 200
1815
/_next/data/%BUILD_ID%/getStaticProps/1.json /.netlify/functions/next_getStaticProps_id 200! Cookie=__prerender_bypass,__next_preview_data
1916
/_next/data/%BUILD_ID%/getStaticProps/2.json /.netlify/functions/next_getStaticProps_id 200! Cookie=__prerender_bypass,__next_preview_data
2017
/_next/data/%BUILD_ID%/getStaticProps/static.json /.netlify/functions/next_getStaticProps_static 200! Cookie=__prerender_bypass,__next_preview_data
@@ -23,14 +20,10 @@ exports[`Routing creates Netlify redirects 1`] = `
2320
/_next/data/%BUILD_ID%/getStaticProps/withFallback/4.json /.netlify/functions/next_getStaticProps_withFallback_id 200! Cookie=__prerender_bypass,__next_preview_data
2421
/_next/data/%BUILD_ID%/getStaticProps/withFallback/my/path/1.json /.netlify/functions/next_getStaticProps_withFallback_slug 200! Cookie=__prerender_bypass,__next_preview_data
2522
/_next/data/%BUILD_ID%/getStaticProps/withFallback/my/path/2.json /.netlify/functions/next_getStaticProps_withFallback_slug 200! Cookie=__prerender_bypass,__next_preview_data
26-
/_next/data/%BUILD_ID%/getStaticProps/withFallback/:id.json /.netlify/functions/next_getStaticProps_withFallback_id 200
27-
/_next/data/%BUILD_ID%/getStaticProps/withFallback/:slug/* /.netlify/functions/next_getStaticProps_withFallback_slug 200
2823
/_next/data/%BUILD_ID%/getStaticProps/withFallbackBlocking/3.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200! Cookie=__prerender_bypass,__next_preview_data
2924
/_next/data/%BUILD_ID%/getStaticProps/withFallbackBlocking/4.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200! Cookie=__prerender_bypass,__next_preview_data
30-
/_next/data/%BUILD_ID%/getStaticProps/withFallbackBlocking/:id.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200
3125
/_next/data/%BUILD_ID%/getStaticProps/withRevalidate/1.json /.netlify/functions/next_getStaticProps_withRevalidate_id 200
3226
/_next/data/%BUILD_ID%/getStaticProps/withRevalidate/2.json /.netlify/functions/next_getStaticProps_withRevalidate_id 200
33-
/_next/data/%BUILD_ID%/getStaticProps/withRevalidate/withFallback/:id.json /.netlify/functions/next_getStaticProps_withRevalidate_withFallback_id 200
3427
/api/static /.netlify/functions/next_api_static 200
3528
/getServerSideProps/static /.netlify/functions/next_getServerSideProps_static 200
3629
/getStaticProps/1 /.netlify/functions/next_getStaticProps_id 200! Cookie=__prerender_bypass,__next_preview_data
@@ -45,6 +38,13 @@ exports[`Routing creates Netlify redirects 1`] = `
4538
/getStaticProps/withFallbackBlocking/4 /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200! Cookie=__prerender_bypass,__next_preview_data
4639
/getStaticProps/withRevalidate/1 /.netlify/functions/next_getStaticProps_withRevalidate_id 200
4740
/getStaticProps/withRevalidate/2 /.netlify/functions/next_getStaticProps_withRevalidate_id 200
41+
/_next/data/%BUILD_ID%/getServerSideProps/all.json /.netlify/functions/next_getServerSideProps_all_slug 200
42+
/_next/data/%BUILD_ID%/getServerSideProps/all/* /.netlify/functions/next_getServerSideProps_all_slug 200
43+
/_next/data/%BUILD_ID%/getServerSideProps/:id.json /.netlify/functions/next_getServerSideProps_id 200
44+
/_next/data/%BUILD_ID%/getStaticProps/withFallback/:id.json /.netlify/functions/next_getStaticProps_withFallback_id 200
45+
/_next/data/%BUILD_ID%/getStaticProps/withFallback/:slug/* /.netlify/functions/next_getStaticProps_withFallback_slug 200
46+
/_next/data/%BUILD_ID%/getStaticProps/withFallbackBlocking/:id.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200
47+
/_next/data/%BUILD_ID%/getStaticProps/withRevalidate/withFallback/:id.json /.netlify/functions/next_getStaticProps_withRevalidate_withFallback_id 200
4848
/_next/image* url=:url w=:width q=:quality /.netlify/functions/next_image?url=:url&w=:width&q=:quality 200
4949
/api/shows/:id /.netlify/functions/next_api_shows_id 200
5050
/api/shows/:params/* /.netlify/functions/next_api_shows_params 200

tests/__snapshots__/i18n.test.js.snap

+25-25
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ exports[`Routing creates Netlify redirects 1`] = `
55
/ /.netlify/functions/next_index 200
66
/404 /en/404.html 200
77
/_next/data/%BUILD_ID%/en.json /.netlify/functions/next_index 200
8-
/_next/data/%BUILD_ID%/en/getServerSideProps/all.json /.netlify/functions/next_getServerSideProps_all_slug 200
9-
/_next/data/%BUILD_ID%/en/getServerSideProps/all/* /.netlify/functions/next_getServerSideProps_all_slug 200
108
/_next/data/%BUILD_ID%/en/getServerSideProps/static.json /.netlify/functions/next_getServerSideProps_static 200
11-
/_next/data/%BUILD_ID%/en/getServerSideProps/:id.json /.netlify/functions/next_getServerSideProps_id 200
129
/_next/data/%BUILD_ID%/en/getStaticProps/1.json /.netlify/functions/next_getStaticProps_id 200! Cookie=__prerender_bypass,__next_preview_data
1310
/_next/data/%BUILD_ID%/en/getStaticProps/2.json /.netlify/functions/next_getStaticProps_id 200! Cookie=__prerender_bypass,__next_preview_data
1411
/_next/data/%BUILD_ID%/en/getStaticProps/static.json /.netlify/functions/next_getStaticProps_static 200! Cookie=__prerender_bypass,__next_preview_data
@@ -17,37 +14,15 @@ exports[`Routing creates Netlify redirects 1`] = `
1714
/_next/data/%BUILD_ID%/en/getStaticProps/withFallback/4.json /.netlify/functions/next_getStaticProps_withFallback_id 200! Cookie=__prerender_bypass,__next_preview_data
1815
/_next/data/%BUILD_ID%/en/getStaticProps/withFallback/my/path/1.json /.netlify/functions/next_getStaticProps_withFallback_slug 200! Cookie=__prerender_bypass,__next_preview_data
1916
/_next/data/%BUILD_ID%/en/getStaticProps/withFallback/my/path/2.json /.netlify/functions/next_getStaticProps_withFallback_slug 200! Cookie=__prerender_bypass,__next_preview_data
20-
/_next/data/%BUILD_ID%/en/getStaticProps/withFallback/:id.json /.netlify/functions/next_getStaticProps_withFallback_id 200
21-
/_next/data/%BUILD_ID%/en/getStaticProps/withFallback/:slug/* /.netlify/functions/next_getStaticProps_withFallback_slug 200
2217
/_next/data/%BUILD_ID%/en/getStaticProps/withFallbackBlocking/3.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200! Cookie=__prerender_bypass,__next_preview_data
2318
/_next/data/%BUILD_ID%/en/getStaticProps/withFallbackBlocking/4.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200! Cookie=__prerender_bypass,__next_preview_data
24-
/_next/data/%BUILD_ID%/en/getStaticProps/withFallbackBlocking/:id.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200
2519
/_next/data/%BUILD_ID%/en/getStaticProps/withRevalidate/1.json /.netlify/functions/next_getStaticProps_withRevalidate_id 200
2620
/_next/data/%BUILD_ID%/en/getStaticProps/withRevalidate/2.json /.netlify/functions/next_getStaticProps_withRevalidate_id 200
27-
/_next/data/%BUILD_ID%/en/getStaticProps/withRevalidate/withFallback/:id.json /.netlify/functions/next_getStaticProps_withRevalidate_withFallback_id 200
28-
/_next/data/%BUILD_ID%/en/shows/:id.json /.netlify/functions/next_shows_id 200
29-
/_next/data/%BUILD_ID%/en/shows/:params/* /.netlify/functions/next_shows_params 200
3021
/_next/data/%BUILD_ID%/es.json /.netlify/functions/next_index 200
31-
/_next/data/%BUILD_ID%/es/getServerSideProps/all.json /.netlify/functions/next_getServerSideProps_all_slug 200
32-
/_next/data/%BUILD_ID%/es/getServerSideProps/all/* /.netlify/functions/next_getServerSideProps_all_slug 200
3322
/_next/data/%BUILD_ID%/es/getServerSideProps/static.json /.netlify/functions/next_getServerSideProps_static 200
34-
/_next/data/%BUILD_ID%/es/getServerSideProps/:id.json /.netlify/functions/next_getServerSideProps_id 200
3523
/_next/data/%BUILD_ID%/es/getStaticProps/static.json /.netlify/functions/next_getStaticProps_static 200! Cookie=__prerender_bypass,__next_preview_data
3624
/_next/data/%BUILD_ID%/es/getStaticProps/with-revalidate.json /.netlify/functions/next_getStaticProps_withrevalidate 200
37-
/_next/data/%BUILD_ID%/es/getStaticProps/withFallback/:id.json /.netlify/functions/next_getStaticProps_withFallback_id 200
38-
/_next/data/%BUILD_ID%/es/getStaticProps/withFallback/:slug/* /.netlify/functions/next_getStaticProps_withFallback_slug 200
39-
/_next/data/%BUILD_ID%/es/getStaticProps/withFallbackBlocking/:id.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200
40-
/_next/data/%BUILD_ID%/es/getStaticProps/withRevalidate/withFallback/:id.json /.netlify/functions/next_getStaticProps_withRevalidate_withFallback_id 200
41-
/_next/data/%BUILD_ID%/es/shows/:id.json /.netlify/functions/next_shows_id 200
42-
/_next/data/%BUILD_ID%/es/shows/:params/* /.netlify/functions/next_shows_params 200
43-
/_next/data/%BUILD_ID%/getServerSideProps/all.json /.netlify/functions/next_getServerSideProps_all_slug 200
44-
/_next/data/%BUILD_ID%/getServerSideProps/all/* /.netlify/functions/next_getServerSideProps_all_slug 200
4525
/_next/data/%BUILD_ID%/getServerSideProps/static.json /.netlify/functions/next_getServerSideProps_static 200
46-
/_next/data/%BUILD_ID%/getServerSideProps/:id.json /.netlify/functions/next_getServerSideProps_id 200
47-
/_next/data/%BUILD_ID%/getStaticProps/withFallback/:id.json /.netlify/functions/next_getStaticProps_withFallback_id 200
48-
/_next/data/%BUILD_ID%/getStaticProps/withFallback/:slug/* /.netlify/functions/next_getStaticProps_withFallback_slug 200
49-
/_next/data/%BUILD_ID%/getStaticProps/withFallbackBlocking/:id.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200
50-
/_next/data/%BUILD_ID%/getStaticProps/withRevalidate/withFallback/:id.json /.netlify/functions/next_getStaticProps_withRevalidate_withFallback_id 200
5126
/api/static /.netlify/functions/next_api_static 200
5227
/en /.netlify/functions/next_index 200
5328
/en/getServerSideProps/static /.netlify/functions/next_getServerSideProps_static 200
@@ -90,6 +65,31 @@ exports[`Routing creates Netlify redirects 1`] = `
9065
/getStaticProps/withRevalidate/1 /.netlify/functions/next_getStaticProps_withRevalidate_id 200
9166
/getStaticProps/withRevalidate/2 /.netlify/functions/next_getStaticProps_withRevalidate_id 200
9267
/static /en/static.html 200
68+
/_next/data/%BUILD_ID%/en/getServerSideProps/all.json /.netlify/functions/next_getServerSideProps_all_slug 200
69+
/_next/data/%BUILD_ID%/en/getServerSideProps/all/* /.netlify/functions/next_getServerSideProps_all_slug 200
70+
/_next/data/%BUILD_ID%/en/getServerSideProps/:id.json /.netlify/functions/next_getServerSideProps_id 200
71+
/_next/data/%BUILD_ID%/en/getStaticProps/withFallback/:id.json /.netlify/functions/next_getStaticProps_withFallback_id 200
72+
/_next/data/%BUILD_ID%/en/getStaticProps/withFallback/:slug/* /.netlify/functions/next_getStaticProps_withFallback_slug 200
73+
/_next/data/%BUILD_ID%/en/getStaticProps/withFallbackBlocking/:id.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200
74+
/_next/data/%BUILD_ID%/en/getStaticProps/withRevalidate/withFallback/:id.json /.netlify/functions/next_getStaticProps_withRevalidate_withFallback_id 200
75+
/_next/data/%BUILD_ID%/en/shows/:id.json /.netlify/functions/next_shows_id 200
76+
/_next/data/%BUILD_ID%/en/shows/:params/* /.netlify/functions/next_shows_params 200
77+
/_next/data/%BUILD_ID%/es/getServerSideProps/all.json /.netlify/functions/next_getServerSideProps_all_slug 200
78+
/_next/data/%BUILD_ID%/es/getServerSideProps/all/* /.netlify/functions/next_getServerSideProps_all_slug 200
79+
/_next/data/%BUILD_ID%/es/getServerSideProps/:id.json /.netlify/functions/next_getServerSideProps_id 200
80+
/_next/data/%BUILD_ID%/es/getStaticProps/withFallback/:id.json /.netlify/functions/next_getStaticProps_withFallback_id 200
81+
/_next/data/%BUILD_ID%/es/getStaticProps/withFallback/:slug/* /.netlify/functions/next_getStaticProps_withFallback_slug 200
82+
/_next/data/%BUILD_ID%/es/getStaticProps/withFallbackBlocking/:id.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200
83+
/_next/data/%BUILD_ID%/es/getStaticProps/withRevalidate/withFallback/:id.json /.netlify/functions/next_getStaticProps_withRevalidate_withFallback_id 200
84+
/_next/data/%BUILD_ID%/es/shows/:id.json /.netlify/functions/next_shows_id 200
85+
/_next/data/%BUILD_ID%/es/shows/:params/* /.netlify/functions/next_shows_params 200
86+
/_next/data/%BUILD_ID%/getServerSideProps/all.json /.netlify/functions/next_getServerSideProps_all_slug 200
87+
/_next/data/%BUILD_ID%/getServerSideProps/all/* /.netlify/functions/next_getServerSideProps_all_slug 200
88+
/_next/data/%BUILD_ID%/getServerSideProps/:id.json /.netlify/functions/next_getServerSideProps_id 200
89+
/_next/data/%BUILD_ID%/getStaticProps/withFallback/:id.json /.netlify/functions/next_getStaticProps_withFallback_id 200
90+
/_next/data/%BUILD_ID%/getStaticProps/withFallback/:slug/* /.netlify/functions/next_getStaticProps_withFallback_slug 200
91+
/_next/data/%BUILD_ID%/getStaticProps/withFallbackBlocking/:id.json /.netlify/functions/next_getStaticProps_withFallbackBlocking_id 200
92+
/_next/data/%BUILD_ID%/getStaticProps/withRevalidate/withFallback/:id.json /.netlify/functions/next_getStaticProps_withRevalidate_withFallback_id 200
9393
/_next/image* url=:url w=:width q=:quality /.netlify/functions/next_image?url=:url&w=:width&q=:quality 200
9494
/api/shows/:id /.netlify/functions/next_api_shows_id 200
9595
/api/shows/:params/* /.netlify/functions/next_api_shows_params 200

tests/__snapshots__/optionalCatchAll.test.js.snap

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
exports[`Routing creates Netlify redirects 1`] = `
44
"# Next-on-Netlify Redirects
55
/_next/data/%BUILD_ID%/page.json /.netlify/functions/next_page 200
6+
/page /.netlify/functions/next_page 200
67
/_next/data/%BUILD_ID%/index.json /.netlify/functions/next_all 200
78
/_next/data/%BUILD_ID%/* /.netlify/functions/next_all 200
8-
/page /.netlify/functions/next_page 200
99
/_next/image* url=:url w=:width q=:quality /.netlify/functions/next_image?url=:url&w=:width&q=:quality 200
1010
/ /.netlify/functions/next_all 200
1111
/_next/* /_next/:splat 200

0 commit comments

Comments
 (0)