@netlify/config
Version:
Netlify config module
104 lines (88 loc) • 3.02 kB
JavaScript
import isPlainObj from 'is-plain-obj'
import mapObj from 'map-obj'
import { removeFalsy } from './utils/remove_falsy.js'
// Removes default values (empty objects and arrays) from the configuration.
export const simplifyConfig = function ({
build: { environment, processing: { css, html, images, js, ...processing } = {}, services, ...build } = {},
functions,
plugins,
headers,
redirects,
context = {},
...config
}) {
const buildA = {
...build,
...simplifyEnvironment(environment),
...removeEmptyObject(
{
...processing,
...removeEmptyObject(css, 'css'),
...removeEmptyObject(html, 'html'),
...removeEmptyObject(images, 'images'),
...removeEmptyObject(js, 'js'),
},
'processing',
),
...removeEmptyObject(services, 'services'),
}
return removeFalsy({
...config,
...removeEmptyObject(simplifyFunctions(functions), 'functions'),
...removeEmptyObject(buildA, 'build'),
...removeEmptyArray(plugins, 'plugins'),
...removeEmptyArray(headers, 'headers'),
...removeEmptyArray(simplifyRedirects(redirects), 'redirects'),
...removeEmptyObject(simplifyContexts(context), 'context'),
})
}
const simplifyEnvironment = function (environment) {
return Array.isArray(environment)
? removeEmptyArray(environment, 'environment')
: removeEmptyObject(environment, 'environment')
}
const simplifyContexts = function (contextProps) {
return mapObj(contextProps, simplifyContextProps)
}
const simplifyContextProps = function (context, contextConfig) {
return [context, simplifyConfig(contextConfig)]
}
const simplifyFunctions = function (functions) {
return isPlainObj(functions) ? Object.entries(functions).reduce(simplifyFunction, {}) : functions
}
const simplifyFunction = function (functions, [key, value]) {
return { ...functions, ...removeEmptyObject(value, key) }
}
const simplifyRedirects = function (redirects) {
return Array.isArray(redirects) ? redirects.map(simplifyRedirect) : redirects
}
const simplifyRedirect = function (redirect) {
if (!isPlainObj(redirect)) {
return redirect
}
const { force, proxy, query, conditions, headers, ...redirectA } = redirect
return {
...redirectA,
...removeDefaultValue(force, 'force', false),
...removeDefaultValue(proxy, 'proxy', false),
...removeEmptyObject(query, 'query'),
...removeEmptyObject(conditions, 'conditions'),
...removeEmptyObject(headers, 'headers'),
}
}
const removeDefaultValue = function (value, propName, defaultValue) {
return value === defaultValue ? {} : { [propName]: value }
}
export const removeEmptyObject = function (object, propName) {
if (!isPlainObj(object)) {
return {}
}
const objectA = removeFalsy(object)
return Object.keys(objectA).length === 0 ? {} : { [propName]: objectA }
}
export const removeEmptyArray = function (array, propName) {
if (!Array.isArray(array)) {
return {}
}
return array.length === 0 ? {} : { [propName]: array }
}