All files / src/libs hooks.js

92.59% Statements 25/27
68.75% Branches 11/16
100% Functions 15/15
91.67% Lines 22/24

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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71    148x 148x           60x 60x         60x       56x 32x   56x       208x 208x       36x 36x           64x       32x       60x       92x       92x 56x   44x         12x 12x   16x          
export class Hooks {
  constructor(hooks = []) {
    this.defaultHook = (v) => v
    return this.setHooks(hooks)
  }
 
  // chainables
 
  parse(hooks = []) {
    const _hookList = Array.isArray(hooks) ? hooks : []
    for (let _hook of _hookList) {
      if (this.isProperHook(_hook)) {
        this.hooks.push(_hook)
      }
    }
    return this
  }
 
  addHook(hook) {
    if (this.isProperHook(hook) && this.isNewHook(hook)) {
      this.hooks.push(hook)
    }
    return this
  }
 
  setHooks(hooks = []) {
    this.hooks = hooks.filter(this.isProperHook)
    return this
  }
 
  setDefault(hook) {
    this.defaultHook = hook
    return this
  }
 
  // not chainables
 
  isProperHook(hook) {
    return hook && typeof hook === 'object' && typeof hook.handler === 'function'
  }
 
  isNewHook(hook) {
    return this.hooks.findIndex((h) => h === hook) < 0
  }
 
  getHooks() {
    return this.hooks
  }
 
  empty() {
    return this.hooks.length === 0
  }
 
  apply(value, options) {
    if (this.empty()) {
      return this.defaultHook(value, options)
    } else {
      return this.hooks.reduce((result, hook) => hook.handler(result, options), value)
    }
  }
 
  asSingleHook() {
    const self = this
    return {
      handler(value, options) {
        return self.apply(value, options)
      },
    }
  }
}