Skip to content

Commit 9bf4daa

Browse files
committed
Sync Next.js redirects to Cloudflare
1 parent 8a358d7 commit 9bf4daa

File tree

3 files changed

+70
-16
lines changed

3 files changed

+70
-16
lines changed

next.config.mjs

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
// @ts-check
2-
import fs from "fs";
1+
// @ ts-check
2+
3+
import * as assert from "node:assert/strict";
4+
import * as path from "node:path";
5+
import * as fs from "node:fs/promises";
36
import webpack from "webpack";
47
import rehypeSlug from "rehype-slug";
58
import remarkGfm from "remark-gfm";
@@ -8,14 +11,15 @@ import remarkFrontmatter from "remark-frontmatter";
811
import remarkMdxFrontmatter from "remark-mdx-frontmatter";
912
import { createLoader } from "simple-functional-loader";
1013

11-
const bsconfig = JSON.parse(fs.readFileSync("./rescript.json").toString());
14+
const bsconfig = JSON.parse((await fs.readFile("./rescript.json", "utf8")).toString());
1215

1316
const { ProvidePlugin } = webpack;
1417

1518
const transpileModules = ["rescript"].concat(bsconfig["bs-dependencies"]);
1619

20+
/** @type {import("next").NextConfig} */
1721
const config = {
18-
output: "export",
22+
output: process.env.NODE_ENV === "production" ? "export" : undefined,
1923
pageExtensions: ["jsx", "js", "bs.js", "mdx", "mjs"],
2024
env: {
2125
ENV: process.env.NODE_ENV,
@@ -85,7 +89,7 @@ const config = {
8589
return config;
8690
},
8791
async redirects() {
88-
return [
92+
const redirects = [
8993
{
9094
source: "/community",
9195
destination: "/community/overview",
@@ -126,6 +130,8 @@ const config = {
126130
destination: "/docs/manual/latest/typescript-integration",
127131
permanent: true,
128132
},
133+
];
134+
const splatRedirects = [
129135
{
130136
source: "/docs/manual/latest/:slug*",
131137
destination: `/docs/manual/${process.env.VERSION_LATEST}/:slug*`,
@@ -147,6 +153,33 @@ const config = {
147153
permanent: false,
148154
},
149155
];
156+
157+
/**
158+
* @typedef {{
159+
* source: string,
160+
* destination: string,
161+
* permanent: boolean,
162+
* }} Redirect
163+
*/
164+
165+
const redirectsFile = path.join(import.meta.dirname, "public/_redirects");
166+
await fs.writeFile(
167+
redirectsFile,
168+
redirects
169+
.map(({ source, destination, permanent }) => {
170+
return `${source} ${destination} ${permanent ? 308 : 307}`;
171+
}).join("\n") +
172+
"\n" +
173+
splatRedirects.map(({ source, destination, permanent }) => {
174+
const splatPattern = /:(\w+)\*$/;
175+
assert.match(source, splatPattern);
176+
assert.match(destination, splatPattern);
177+
return `${source.replace(splatPattern, "*")} ${destination.replace(splatPattern, ":splat")} ${permanent ? 308 : 307}`;
178+
}).join("\n"),
179+
"utf8",
180+
);
181+
182+
return [...redirects, ...splatRedirects];
150183
},
151184
};
152185

public/_redirects

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
/community /community/overview 308
2-
32
/bucklescript-rebranding /blog/bucklescript-is-rebranding 308
4-
53
/docs/manual/latest/migrate-from-bucklescript-reason /docs/manual/v10.0.0/migrate-from-bucklescript-reason 308
6-
/docs/manual/latest/unboxed /docs/manual/v10.0.0/unboxed 308
7-
/docs/gentype/latest/introduction /docs/manual/latest/typescript-integration 308
8-
/docs/gentype/latest/getting-started /docs/manual/latest/typescript-integration 308
9-
/docs/gentype/latest/usage /docs/manual/latest/typescript-integration 308
10-
/docs/gentype/latest/supported-types /docs/manual/latest/typescript-integration 308
11-
4+
/docs/manual/latest/unboxed /docs/manual/v10.0.0/unboxed 308
5+
/docs/gentype/latest/introduction /docs/manual/latest/typescript-integration 308
6+
/docs/gentype/latest/getting-started /docs/manual/latest/typescript-integration 308
7+
/docs/gentype/latest/usage /docs/manual/latest/typescript-integration 308
8+
/docs/gentype/latest/supported-types /docs/manual/latest/typescript-integration 308
129
/docs/manual/latest/* /docs/manual/v11.0.0/:splat 307
10+
/docs/manual/next/* /docs/manual/v12.0.0/:splat 307
1311
/llms/manual/latest/* /llms/manual/v11.0.0/:splat 307
14-
15-
/docs/manual/next/* /docs/manual/v12.0.0/:splat 307
16-
/llms/manual/next/* /llms/manual/v12.0.0/:splat 307
12+
/llms/manual/next/* /llms/manual/v12.0.0/:splat 307

scripts/sync-redirects.mjs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import * as path from "node:path";
2+
import * as fs from "node:fs";
3+
4+
import nextConfig from "../next.config.mjs";
5+
6+
const redirectsConfig = await nextConfig.redirects();
7+
8+
/**
9+
* @param {{
10+
* source: string,
11+
* destination: string,
12+
* permanent: boolean,
13+
* }} config
14+
* @return {string}
15+
*/
16+
function lineFormat({
17+
source,
18+
destination,
19+
permanent,
20+
}) {
21+
return `${source} ${destination} ${permanent ? 308 : 307}`;
22+
}
23+
24+
const redirects = redirectsConfig.map(lineFormat).join("\n");
25+
const redirectsFile = path.join(import.meta.dirname, "../public/_redirects");

0 commit comments

Comments
 (0)