aboutsummaryrefslogtreecommitdiff
path: root/node_modules/hullabaloo-config-manager/lib/reduceChains.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/hullabaloo-config-manager/lib/reduceChains.js')
-rw-r--r--node_modules/hullabaloo-config-manager/lib/reduceChains.js158
1 files changed, 158 insertions, 0 deletions
diff --git a/node_modules/hullabaloo-config-manager/lib/reduceChains.js b/node_modules/hullabaloo-config-manager/lib/reduceChains.js
new file mode 100644
index 000000000..33d4de881
--- /dev/null
+++ b/node_modules/hullabaloo-config-manager/lib/reduceChains.js
@@ -0,0 +1,158 @@
+'use strict'
+
+const cloneDeepWith = require('lodash.clonedeepwith')
+const merge = require('lodash.merge')
+
+const resolvePluginsAndPresets = require('./resolvePluginsAndPresets')
+
+function trackDependency (dependencies, filename, fromPackage, envName) {
+ if (dependencies.has(filename)) {
+ const existing = dependencies.get(filename)
+ if (envName) {
+ existing.envs.add(envName)
+ } else {
+ existing.default = true
+ }
+ return
+ }
+
+ const item = {
+ default: !envName,
+ envs: new Set(envName ? [envName] : []),
+ filename,
+ fromPackage
+ }
+ dependencies.set(filename, item)
+}
+
+function trackSource (sources, source, envName) {
+ if (sources.has(source)) {
+ const existing = sources.get(source)
+ if (envName) {
+ existing.envs.add(envName)
+ } else {
+ existing.default = true
+ }
+ return
+ }
+
+ const item = {
+ default: !envName,
+ envs: new Set(envName ? [envName] : []),
+ source
+ }
+ sources.set(source, item)
+}
+
+function createOptions (plugins, presets) {
+ const options = {}
+ if (plugins) options.plugins = plugins
+ // istanbul ignore else
+ if (presets) options.presets = presets
+ return options
+}
+
+function compressOptions (orderedOptions) {
+ const remaining = orderedOptions.slice(0, 1)
+ remaining[0].babelrc = false
+
+ for (let index = 1; index < orderedOptions.length; index++) {
+ const options = orderedOptions[index]
+ delete options.babelrc
+
+ const plugins = options.plugins
+ delete options.plugins
+
+ const presets = options.presets
+ delete options.presets
+
+ merge(remaining[0], options)
+
+ if (plugins || presets) {
+ remaining.push(createOptions(plugins, presets))
+ }
+ }
+
+ return remaining
+}
+
+function reduceOptions (chain, envName, pluginsAndPresets, dependencies, sources, fixedSourceHashes) {
+ let json5 = false
+
+ const orderedOptions = Array.from(chain, config => {
+ trackSource(sources, config.source, envName)
+ if (config.hash) {
+ fixedSourceHashes.set(config.source, config.hash)
+ }
+
+ if (config.json5) json5 = true
+
+ const lookup = pluginsAndPresets.get(config)
+ const mapPluginOrPreset = (getEntry, ref) => {
+ if (Array.isArray(ref)) {
+ return ref.length === 1
+ ? mapPluginOrPreset(getEntry, ref[0])
+ : [mapPluginOrPreset(getEntry, ref[0]), ref[1]]
+ }
+
+ const entry = getEntry(ref)
+ trackDependency(dependencies, entry.filename, entry.fromPackage, envName)
+ return entry.filename
+ }
+
+ return cloneDeepWith(config.options, (value, key, object) => {
+ if (object === config.options && (key === 'plugins' || key === 'presets')) {
+ const getEntry = ref => lookup[key].get(ref)
+ return Array.isArray(value)
+ ? value.map(ref => mapPluginOrPreset(getEntry, ref))
+ : []
+ }
+ })
+ })
+
+ const unflattenedOptions = compressOptions(orderedOptions)
+ unflattenedOptions.json5 = json5
+ return unflattenedOptions
+}
+
+function reduceChains (chains, cache) {
+ const pluginsAndPresets = resolvePluginsAndPresets(chains, cache)
+
+ const dependencies = new Map()
+ const envNames = new Set()
+ const fixedSourceHashes = new Map()
+ const sources = new Map()
+
+ const unflattenedDefaultOptions = reduceOptions(
+ chains.defaultChain, null, pluginsAndPresets, dependencies, sources, fixedSourceHashes
+ )
+
+ const unflattenedEnvOptions = new Map()
+ for (const pair of chains.envChains) {
+ const envName = pair[0]
+ const chain = pair[1]
+
+ envNames.add(envName)
+ unflattenedEnvOptions.set(
+ envName,
+ reduceOptions(chain, envName, pluginsAndPresets, dependencies, sources, fixedSourceHashes)
+ )
+ }
+
+ return {
+ dependencies:
+ Array.from(dependencies.keys())
+ .sort()
+ .map(filename => dependencies.get(filename)),
+ envNames,
+ fixedSourceHashes,
+ sources:
+ Array.from(sources.keys())
+ .sort()
+ .map(source => sources.get(source)),
+ unflattenedDefaultOptions,
+ unflattenedEnvOptions
+ }
+}
+
+module.exports = reduceChains