1 | import { isDeepStrictEqual } from 'util'
|
2 |
|
3 | import { splitResults } from './results.js'
|
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.
|
10 | export const mergeRedirects = function ({ fileRedirects, configRedirects }) {
|
11 | const results = [...fileRedirects, ...configRedirects]
|
12 | const { redirects, errors } = splitResults(results)
|
13 | const mergedRedirects = redirects.filter(isUniqueRedirect)
|
14 | return { redirects: mergedRedirects, errors }
|
15 | }
|
16 |
|
17 | // Remove duplicates. This is especially likely considering `fileRedirects`
|
18 | // might have been previously merged to `configRedirects`, which happens when
|
19 | // `netlifyConfig.redirects` is modified by plugins.
|
20 | // The latest duplicate value is the one kept.
|
21 | const isUniqueRedirect = function (redirect, index, redirects) {
|
22 | return !redirects.slice(index + 1).some((otherRedirect) => isDeepStrictEqual(redirect, otherRedirect))
|
23 | }
|