All files / src api.js

100% Statements 28/28
90% Branches 27/30
100% Functions 9/9
100% Lines 22/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 531600x 3200x     400x             2500x 17965x     500x               1x 1700x 1700x 1700x 1700x   1700x 1700x   1700x 1700x 1700x 1700x   1700x       6800x 1600x 1600x         1x        
const combinePlugin = field => (list, plugin = {}) => (
  list.concat(plugin[field] || [])
)
 
const combinePlugins = plugins => ({
  chunkers:      plugins.reduce(combinePlugin('chunkers'),      []),
  deserializers: plugins.reduce(combinePlugin('deserializers'), []),
  appliers:      plugins.reduce(combinePlugin('appliers'),      []),
  serializers:   plugins.reduce(combinePlugin('serializers'),   [])
})
 
const combineDefault = field => (def, defaults = {}) => (
  typeof def !== 'undefined' ? def : defaults[field]
)
 
const combineDefaults = defaults => ({
  chunker:      defaults.reduce(combineDefault('chunker'),      undefined),
  deserializer: defaults.reduce(combineDefault('deserializer'), undefined),
  applier:      defaults.reduce(combineDefault('applier'),      undefined),
  serializer:   defaults.reduce(combineDefault('serializer'),   undefined),
  noPlugins:    defaults.reduce(combineDefault('noPlugins'),    undefined)
})
 
const initFunctions = (argv, plugins, defaults, fallbacks) => {
  const chunker      = argv.chunker      || argv.c || argv.by   || defaults.chunker
  const serializer   = argv.serializer   || argv.s || argv.to   || defaults.serializer
  const deserializer = argv.deserializer || argv.d || argv.from || defaults.deserializer
  const applier      = argv.applier      || argv.a || argv.with || defaults.applier
  
  const functions  = argv._.length > 0 ? argv._ : ['json => json']
  const fs         = functions.map(eval)
  
  const chunk       = selectPlugin(chunker,      plugins.chunkers,      fallbacks.chunker     )(argv)
  const deserialize = selectPlugin(deserializer, plugins.deserializers, fallbacks.deserializer)(argv)
  const apply       = selectPlugin(applier,      plugins.appliers,      fallbacks.applier     )(fs, argv)
  const serialize   = selectPlugin(serializer,   plugins.serializers,   fallbacks.serializer  )(argv)
 
  return {chunk, deserialize, apply, serialize}
}
 
function selectPlugin (name, plugins, fallback) {
  if (typeof plugins === 'undefined') return fallback.func
  const p = plugins.find(p => p.name === name)
  return typeof p      === 'undefined' ? fallback.func :
         typeof p.func === 'undefined' ? fallback.func
                                       : p.func
}
 
module.exports = {
  combinePlugins,
  combineDefaults,
  initFunctions
}