dsl-toolkit/dsl-toolkit

View on GitHub
packages/dsl-framework/src/core/command-parser/index.js

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
/* eslint-disable brace-style */
/* eslint-disable block-spacing */
const getArrayData = require('../lib/get-array-data')
const getBaseKind = require('./get-base-kind')
const getMoreKind = require('./get-more-kind')

module.exports = exports = (returnObject) => {
  const baseObject = {
    init: () => {
      const baseKind = getBaseKind(baseObject, returnObject)

      baseObject.has = baseKind('some')
      baseObject.get = baseKind('filter')

      const moreKind = getMoreKind(baseObject)
      baseObject.has.more = moreKind('has')
      baseObject.get.more = moreKind('get')
      baseObject.hasMore = baseObject.has.more
      baseObject.getMore = baseObject.get.more

      const hasLogicalKind = (kind) => function () {
        const commands = getArrayData(arguments)
        return commands ? baseObject.has.more(commands).reduce(kind) : false}

      baseObject.has.and = hasLogicalKind((acc = true, currValue) => acc && currValue)
      baseObject.has.or = hasLogicalKind((acc = true, currValue) => acc || currValue)
      baseObject.hasAnd = baseObject.has.and
      baseObject.hasOr = baseObject.has.or
      baseObject.has.xor = function () {
        const commands = getArrayData(arguments)

        return commands
          ? baseObject.has.more(commands).filter((entry) => entry).length &&
          baseObject.has.more(commands).filter((entry) => !entry).length
          : false}
      baseObject.hasXor = baseObject.has.xor

      const toObjectKind = (kind) => function () {
        const returnObject = {}
        getArrayData(arguments).forEach(entry => {
          returnObject[entry] = baseObject[kind](entry)})

        return returnObject}
      baseObject.has.object = toObjectKind('has')
      baseObject.get.object = toObjectKind('get')
      baseObject.hasObject = baseObject.has.object
      baseObject.getObject = baseObject.get.object
      return baseObject},

    getArguments: function (command, commands) {
      if (typeof commands === 'undefined') {
        commands = returnObject.data.returnArrayChunks}
      return this.get(command).map((command) => command.slice(1))}
  }
  return baseObject.init()}