All files / plugins _plugins.ts

75.76% Statements 25/33
85.71% Branches 18/21
71.43% Functions 5/7
81.48% Lines 22/27
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71                  1x 36x 36x   34x 34x   2x 2x           36x                   70x 36x 254x   218x 12x     218x 218x 218x 218x 10x       218x 206x   218x   254x                                
import { JsApi } from '../lib/jsapi';
import { Plugin } from './_types';
 
/**
 * Plugins engine.
 * @param {Object} data input data
 * @param {Array} plugins plugins object from config
 * @return {Object} output data
 */
export function processPlugins(item: JsApi, plugins: Plugin[][]) {
  plugins.forEach(batch => {
    switch (batch[0].type) {
      case 'perItem':
        item = perItem(item, batch);
        break;
      case 'perItemReverse':
        item = perItem(item, batch, true);
        break;
      case 'full':
        item = full(item, batch);
        break;
    }
  });
  return item;
}
 
/**
 * Direct or reverse per-item loop.
 * @param {Object} jsApi input data
 * @param {Array} plugins plugins list to process
 * @param {Boolean} [reverse] reverse pass
 * @return {Object} output data
 */
function perItem(jsApi: JsApi, plugins: Plugin[], reverse = false) {
  return (function recurseFn(item) {
    item.content = item.content.filter(i => {
      // Reverse pass.
      if (reverse && i.content) {
        recurseFn(i);
      }
      // Main filter.
      let filter = true;
      for (let j = 0; filter && j < plugins.length; j++) {
        const { active, params, fn } = plugins[j];
        if (active && !fn(i, params)) {
          filter = false;
        }
      }
      // Direct pass.
      if (!reverse && i.content) {
        recurseFn(i);
      }
      return filter;
    });
    return item;
  })(jsApi);
}
 
/**
 * Full plugins.
 * @param {Object} item input data
 * @param {Array} plugins plugins list to process
 * @return {Object} output data
 */
function full(item: JsApi, plugins: Plugin[]) {
  plugins.forEach(({ active, params, fn }) => {
    item = active ? fn(item, params) : item;
  });
  return item;
}