@tadashi/condition

1.8.0 • Public • Published

Condition

NPM version Node.js CI Coverage Status

Create conditional to validate data.

Install

$ npm i @tadashi/condition

Operators

Operator Alias Symbol Description
eq - === Two values are equal
ne - !== Two values are not equal
gt - > The first value is greater than the second value
ge - >= The first value is greater than or equal to the second value
lt - < The first value is less than the second value
le - <= The first value is less than or equal to the second value
intersection - There is an intersection between two arrays
difference - There is a difference between two arrays
arrayEquals - = Two arrays are equal
belongs has includes The value belongs belongs to array
regex - - The value matches a regular expression pattern
length - - The length of a value satisfies a comparison
assigned - - The value was assigned

Schema

Condition:
  type: object
  properties:
    join_operator:
      type: string
      enum: [and, or]
      default: and
    args:
      type: array
      items:
        oneOf:
          - $ref: '#/definitions/ConditionArgument'
          - $ref: '#/definitions/Condition'
  required:
    - join_operator
    - args

ConditionArgument:
  type: object
  properties:
    field:
      type: string
    operator:
      type: string
    value:
      type: any
      anyOf:
        - type: boolean
        - type: string
        - type: number
        - type: array
    flag:
      type: string
    compare:
      type: string
      enum: [eq, ne, gt, ge, greater, lt, le, less]
    not:
      type: boolean
      default: false
  required:
    - field
    - operator
    - value

definitions:
  Condition:
    $ref: '#/Condition'
  ConditionArgument:
    $ref: '#/ConditionArgument'

Usage

See example below.

import condition, {registerOperator} from '@tadashi/condition'

registerOperator('legalAge', params => {
  const {
    fieldValue,
    value: conditionValue,
    // not,
    // flag,
    // compare,
  } = params

  try {
    const today = new Date()
    const externalDate = new Date(fieldValue)
    let age = today.getFullYear() - externalDate.getFullYear()
    const monthDiff = today.getMonth() - externalDate.getMonth()

    if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < externalDate.getDate())) {
      age--
    }

    return age >= conditionValue
  } catch {
    return false
  }
})

const data = {
  user: {
    name: 'Yumi',
    birthday: '1990-12-31',
    gender: 'F',
    issues: 65,
  },
  city: 'São Paulo',
  country: 'Brazil',
  phone: '(11) 988889999',
  hasCar: true,
  colors: ['red', 'blue'],
}

const conditions = [
  {
    join_operator: 'and',
    args: [
      {
        field: 'user.gender',
        operator: 'eq',
        value: 'F',
      },
      {
        field: 'user.birthday',
        operator: 'legalAge',
        value: 21,
      },
      {
        field: 'user.issues',
        operator: 'gt',
        value: 51,
      },
      {
        field: 'phone',
        operator: 'regex',
        value: /\(\d{2}\)\s(\d{8,9})/i,
      },
      {
        join_operator: 'or',
        args: [
          {
            field: 'city',
            operator: 'assigned',
            value: false,
          },
          {
            field: 'country',
            operator: 'intersection',
            value: ['Japan', 'Brazil'],
          },
        ],
      },
      {
        field: 'hasCar',
        operator: 'eq',
        value: true,
      },
      {
        field: 'colors',
        operator: 'intersection',
        value: ['blue', 'green', 123],
      },
      {
        field: 'colors',
        operator: 'arrayEquals',
        value: ['red', 'blue'],
      },
    ],
  },
]

const isValid = condition(conditions)
isValid(data) // => true

Buy Me a Coffee

BTC: bc1q7famhuj5f25n6qvlm3sssnymk2qpxrfwpyq7g4

License

MIT © Thiago Lagden

Readme

Keywords

Package Sidebar

Install

npm i @tadashi/condition

Weekly Downloads

99

Version

1.8.0

License

MIT

Unpacked Size

21.5 kB

Total Files

6

Last publish

Collaborators

  • lagden