You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.9 KiB
118 lines
2.9 KiB
3 years ago
|
const fs = require('fs-extra');
|
||
|
const path = require('path');
|
||
|
const fm = require('gray-matter');
|
||
|
const globby = require('globby');
|
||
|
|
||
|
/**
|
||
|
* This script takes a look at all the redirect frontmatter and converts it
|
||
|
* into a Next.js compatible redirects list. It also merges it with netlify's
|
||
|
* _redirects, which we moved by hand below.
|
||
|
*
|
||
|
* @remarks
|
||
|
* In the old gatsby site, redirects were specified in docs and blog post
|
||
|
* frontmatter that looks like:
|
||
|
*
|
||
|
* ---
|
||
|
* redirect_from:
|
||
|
* - /docs/old-path.html#maybe-an-anchor
|
||
|
* ---
|
||
|
*/
|
||
|
|
||
|
const netlifyRedirects = [
|
||
|
{
|
||
|
source: '/html-jsx.html',
|
||
|
destination: 'https://magic.reactjs.net/htmltojsx.htm',
|
||
|
permanent: true,
|
||
|
},
|
||
|
{
|
||
|
source: '/tips/controlled-input-null-value.html',
|
||
|
destination: '/docs/forms.html#controlled-input-null-value',
|
||
|
permanent: false, // @todo why were these not permanent on netlify?
|
||
|
},
|
||
|
{
|
||
|
source: '/concurrent',
|
||
|
destination: '/docs/concurrent-mode-intro.html',
|
||
|
permanent: false,
|
||
|
},
|
||
|
{
|
||
|
source: '/hooks',
|
||
|
destination: '/docs/hooks-intro.html',
|
||
|
permanent: false,
|
||
|
},
|
||
|
{
|
||
|
source: '/tutorial',
|
||
|
destination: '/tutorial/tutorial.html',
|
||
|
permanent: false,
|
||
|
},
|
||
|
{
|
||
|
source: '/your-story',
|
||
|
destination: 'https://www.surveymonkey.co.uk/r/MVQV2R9',
|
||
|
permanent: true,
|
||
|
},
|
||
|
{
|
||
|
source: '/stories',
|
||
|
destination: 'https://medium.com/react-community-stories',
|
||
|
permanent: true,
|
||
|
},
|
||
|
];
|
||
|
|
||
|
Promise.resolve()
|
||
|
.then(async () => {
|
||
|
let contentRedirects = [];
|
||
|
let redirectPageCount = 0;
|
||
|
|
||
|
// Get all markdown pages
|
||
|
const pages = await globby('src/pages/**/*.{md,mdx}');
|
||
|
for (let filepath of pages) {
|
||
|
// Read file as string
|
||
|
const rawStr = await fs.readFile(filepath, 'utf8');
|
||
|
// Extract frontmatter
|
||
|
const {data, content} = fm(rawStr);
|
||
|
// Look for redirect yaml
|
||
|
if (data.redirect_from) {
|
||
|
redirectPageCount++;
|
||
|
|
||
|
let destinationPath = filepath
|
||
|
.replace('src/pages', '')
|
||
|
.replace('.md', '');
|
||
|
|
||
|
// Fix /docs/index -> /docs
|
||
|
if (destinationPath === '/docs/index') {
|
||
|
destinationPath = '/docs';
|
||
|
}
|
||
|
|
||
|
if (destinationPath === '/index') {
|
||
|
destinationPath = '/';
|
||
|
}
|
||
|
|
||
|
for (let sourcePath of data.redirect_from) {
|
||
|
contentRedirects.push({
|
||
|
source: '/' + sourcePath, // add slash
|
||
|
destination: destinationPath,
|
||
|
permanent: true,
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
console.log(
|
||
|
`Found ${redirectPageCount} pages with \`redirect_from\` frontmatter`
|
||
|
);
|
||
|
console.log(
|
||
|
`Writing ${contentRedirects.length} redirects to redirects.json`
|
||
|
);
|
||
|
|
||
|
await fs.writeFile(
|
||
|
path.resolve('./src/redirects.json'),
|
||
|
JSON.stringify(
|
||
|
{
|
||
|
redirects: [...contentRedirects, ...netlifyRedirects],
|
||
|
},
|
||
|
null,
|
||
|
2
|
||
|
)
|
||
|
);
|
||
|
|
||
|
console.log('✅ Done writing redirects');
|
||
|
})
|
||
|
.catch(console.error);
|