UNPKG

1.45 kBJavaScriptView Raw
1const { inspect, isDeepStrictEqual } = require('util')
2
3const { splitResults } = require('./results')
4
5// Merge redirects from `_redirects` with the ones from `netlify.toml`.
6// When both are specified, both are used and `_redirects` has priority.
7// Since in both `netlify.toml` and `_redirects`, only the first matching rule
8// is used, it is possible to merge `_redirects` to `netlify.toml` by prepending
9// its rules to `netlify.toml` `redirects` field.
10const mergeRedirects = function ({ fileRedirects = [], configRedirects = [] }) {
11 const results = [...validateArray(fileRedirects), ...validateArray(configRedirects)]
12 const { redirects, errors } = splitResults(results)
13 const mergedRedirects = redirects.filter(isUniqueRedirect)
14 return { redirects: mergedRedirects, errors }
15}
16
17const validateArray = function (redirects) {
18 return Array.isArray(redirects)
19 ? redirects
20 : [new TypeError(`Redirects should be an array: ${inspect(redirects, { colors: false })}`)]
21}
22
23// Remove duplicates. This is especially likely considering `fileRedirects`
24// might have been previously merged to `configRedirects`, which happens when
25// `netlifyConfig.redirects` is modified by plugins.
26// The latest duplicate value is the one kept.
27const isUniqueRedirect = function (redirect, index, redirects) {
28 return !redirects.slice(index + 1).some((otherRedirect) => isDeepStrictEqual(redirect, otherRedirect))
29}
30
31module.exports = { mergeRedirects }