0.1.6 • Published 1 year ago

phojs v0.1.6

Weekly downloads
-
License
MIT
Repository
-
Last release
1 year ago

phojs logo

Phở

The super-tasty configuration framework

Allows you to define configuration declaratively together with supercharged validation and flexability.

Inspired by the popular python libraries flag, and cerberus.

Installation

# Using NPM
npm install phojs

# If you fancy yarn
yarn add phojs

Examples

Basic

const pho = require('phojs')

pho.create(async (root) => {
  root.field('firstname', 'string', 'Your first name').required()
  root.field('lastname', 'string', 'Your last name').required()
  root.field('nickname', 'string', 'Your nickname')
    .required()
    .oneOf('Neo', 'Morpheus', 'Trinity')
  root.field('age', 'number', 'Your age')

  root.category('measurements', 'Body Measurements', (measurements) => {
    measurements.field('height', 'number', 'Your height in centimeters')
    measurements.field('weight', 'number', 'Your weight in kilograms')
  })
})

const validatedConfig = pho.parse({
  firstname: 'Kaladin',
  lastname: 'Stormblessed',
  nickname: 'Neo',
  measurements: {
    height: 170,
    weight: 70,
  },
})

Field Dependencies

Fields can have validators and modifiers attached to them. pho provides some basic ones, but you can write your own of course :)

These validators/modifiers can depend on other fields to in order to work, so they we will called with their dependencies are arguments. Note: Modifiers are run before validators.

const {pho, FieldValidationError} = require('phojs')

pho.create((root) => {
  root.field('first', 'number', 'First number').required()
  root.field('second', 'number', 'Second number').required()

  root.category('calculations', 'Calculation results', (calculations) => {
    calculations
      .field('sum', 'number', 'Sum of first and second')
      .modify('sum', (field, value, first, second) => first + second, ['first', 'second']) // sum field needs both first and second to make sense
      .validate('ensure upper bound', (field, value) => {
        if (value > 1000){
          throw new FieldValidationError(`Sum is too big (value=${value})`)
        }
      })
  })

  root.category('statistics', 'Number statistics', (stats) => {
    stats.field('avg', 'number', 'average of the first and second')
      .modify('avg', (field, value, sum) => sum / 2, ['calculations.sum'])
    })
  })
})


const result = pho.parse({
  first: 10,
  second: 20,
})

// result will be
// {
//   first: 10,
//   second: 20,
//   calculations: {
//     sum: 20 + 10,
//   },
//   statistics: {
//     avg: (20 + 10) / 2,
//   },
// }

Testing

# Clone the repo

# install dependencies
$ npm install

# or
$ yarn

# run tests
$ yarn test
0.1.4

1 year ago

0.1.3

1 year ago

0.1.6

1 year ago

0.1.1

2 years ago

0.1.0

2 years ago