All files / src/plugins _plugins.ts

63.64% Statements 21/33
61.9% Branches 13/21
71.43% Functions 5/7
66.67% Lines 18/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 1x 1x   1x 1x                 1x                   2x 1x 1x   2x       2x 2x 2x 2x 1x       2x     2x   1x                                
import { JsApi } from '../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[], Ereverse = false) {
  return (function monkeys(item) {
    item.content = item.content.filter(i => {
      // Reverse pass.
      Iif (reverse && i.content) {
        monkeys(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.
      Iif (!reverse && i.content) {
        monkeys(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;
}