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.
71 lines
1.9 KiB
71 lines
1.9 KiB
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*/
|
|
|
|
const {appendFile, exists, readFile, writeFile} = require('fs-extra');
|
|
|
|
const HEADER_COMMENT = `## Created with gatsby-transformer-versions-yaml`;
|
|
|
|
// Patterned after the 'gatsby-plugin-netlify' plug-in:
|
|
// https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-plugin-netlify/src/create-redirects.js
|
|
module.exports = async function writeRedirectsFile(
|
|
redirects,
|
|
redirectsFilePath,
|
|
) {
|
|
if (!redirects.length) {
|
|
return null;
|
|
}
|
|
|
|
// Map redirect data to the format Netlify expects
|
|
// https://www.netlify.com/docs/redirects/
|
|
redirects = redirects.map(redirect => {
|
|
const {
|
|
fromPath,
|
|
isPermanent,
|
|
redirectInBrowser, // eslint-disable-line no-unused-vars
|
|
toPath,
|
|
...rest
|
|
} = redirect;
|
|
|
|
// The order of these parameters is significant.
|
|
const pieces = [
|
|
fromPath,
|
|
toPath,
|
|
isPermanent ? 301 : 302, // Status
|
|
];
|
|
|
|
for (let key in rest) {
|
|
const value = rest[key];
|
|
|
|
if (typeof value === `string` && value.indexOf(` `) >= 0) {
|
|
console.warn(
|
|
`Invalid redirect value "${value}" specified for key "${key}". ` +
|
|
`Values should not contain spaces.`,
|
|
);
|
|
} else {
|
|
pieces.push(`${key}=${value}`);
|
|
}
|
|
}
|
|
|
|
return pieces.join(` `);
|
|
});
|
|
|
|
let appendToFile = false;
|
|
|
|
// Websites may also have statically defined redirects
|
|
// In that case we should append to them (not overwrite)
|
|
// Make sure we aren't just looking at previous build results though
|
|
const fileExists = await exists(redirectsFilePath);
|
|
if (fileExists) {
|
|
const fileContents = await readFile(redirectsFilePath);
|
|
if (fileContents.indexOf(HEADER_COMMENT) < 0) {
|
|
appendToFile = true;
|
|
}
|
|
}
|
|
|
|
const data = `${HEADER_COMMENT}\n\n${redirects.join(`\n`)}`;
|
|
|
|
return appendToFile
|
|
? appendFile(redirectsFilePath, `\n\n${data}`)
|
|
: writeFile(redirectsFilePath, data);
|
|
};
|
|
|