indicative-parser
Version:
Schema parser for Indicative
111 lines (86 loc) • 3.23 kB
Markdown
<div align="center">
<img src="https://res.cloudinary.com/adonisjs/image/upload/q_100/v1557762307/poppinss_iftxlt.jpg" width="600px">
</div>
# Indicative Parser
> Converts indicative rules and messages schema to a tree
[![circleci-image]][circleci-url] [![npm-image]][npm-url] ![][typescript-image] [![license-image]][license-url]
Indicative parser pre-compiles the Indicative schema to a recursive tree of nodes. Each node is given one of the following types.
- `object`: Node with one or more nested children.
- `array`: Node with one or more index or wildcard based nested children.
- `literal`: The leaf nodes.
Do note, that the `literal` **type is not equal to literal values in Javascript**. For parser, the literal nodes are nodes with no leaf.
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
## Table of contents
- [Why Indicative needs a parser?](#why-indicative-needs-a-parser)
- [Usage](#usage)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
## Why Indicative needs a parser?
If you look at the Indicative schema, it is very concise and developer friendly. However, the same schema needs to be parsed to execute the validation rules.
```js
{
username: 'required',
'account.type': 'required|in:email,social'
}
```
One way is to loop over the schema object keys, split them by `.` and then inline execute the validations for each field. This process is very straight forward, but will have performance issues.
Instead, we parse the schema into a tree. The tree is later converted to an array of top level functions that are highly optimized for performance.
## Usage
Install the package from npm registry as follows:
```sh
npm i indicative-parser
# yarn
yarn add indicative-parser
```
and then use it as follows:
```js
import { rulesParser } from 'indicative-parser'
rulesParser({
username: 'required',
'account.type': 'required|in:email,social'
})
```
Above code outputs the following tree.
```json
{
"username": {
"type": "literal",
"rules": [
{
"name": "required",
"args": []
}
]
},
"account": {
"rules": [],
"type": "object",
"children": {
"type": {
"type": "literal",
"rules": [
{
"name": "required",
"args": []
},
{
"name": "in",
"args": [
"email",
"social"
]
}
]
}
}
}
}
```
[circleci-image]: https://img.shields.io/circleci/project/github/poppinss/indicative-parser/master.svg?style=for-the-badge&logo=circleci
[circleci-url]: https://circleci.com/gh/poppinss/indicative-parser "circleci"
[typescript-image]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript
[typescript-url]: "typescript"
[npm-image]: https://img.shields.io/npm/v/indicative-parser.svg?style=for-the-badge&logo=npm
[npm-url]: https://npmjs.org/package/indicative-parser "npm"
[license-image]: https://img.shields.io/npm/l/indicative-parser?color=blueviolet&style=for-the-badge
[license-url]: LICENSE.md "license"