An open API service indexing awesome lists of open source software.

https://github.com/varletjs/ruler-factory

A flexible, chainable validation rule factory for typeScript/javaScript.
https://github.com/varletjs/ruler-factory

chainable data factory form javascript rules typescript validation validator

Last synced: 5 months ago
JSON representation

A flexible, chainable validation rule factory for typeScript/javaScript.

Awesome Lists containing this project

README

          

# ruler-factory

A flexible, chainable validation rule factory for TypeScript/JavaScript.

## Features

- Chainable API for building complex validation rules
- Supports string, number, array, boolean, object, symbol, bigint, null, undefined
- Customizable error messages
- Easy to extend and integrate
- TypeScript support

## Installation

```bash
pnpm add ruler-factory
# or
npm install ruler-factory
# or
yarn add ruler-factory
```

## Integration with UI frameworks

### Varlet UI

```vue

import { ref } from 'vue'
import { rulerFactory } from 'ruler-factory'

const ruler = rulerFactory((validator) => {
return (value) => {
const e = validator(value)
return e ? e.message : true
}
})

const model = ref({
name: '',
email: '',
})




```

### Vant

```vue

import { ref } from 'vue'
import { rulerFactory } from 'ruler-factory'
import type { FieldRule } from 'vant'

const ruler = rulerFactory<FieldRule>((validator, params) => ({
validator(value) {
const e = validator(value)

return e ? e.message : true
},
trigger: ['onChange', 'onBlur', 'onSubmit'],
...params,
}))

const model = ref({
name: '',
email: '',
})






```

### Naive UI

```vue

import { ref } from 'vue'
import type { FormItemRule } from 'naive-ui'
import { rulerFactory } from 'ruler-factory'

const ruler = rulerFactory<FormItemRule>((validator, params = {}) => ({
trigger: ['blur', 'change', 'input'],
validator: (_, value) => validator(value),
...params,
}))

const model = ref({
name: '',
age: 20,
})








```

### Element Plus

```vue

import { ref } from 'vue'
import type { FormItemRule } from 'element-plus'
import { rulerFactory } from 'ruler-factory'

const ruler = rulerFactory<FormItemRule>((validator, params) => ({
validator(_, value, callback) {
const e = validator(value)

e ? callback(e) : callback()
},
trigger: ['blur', 'change', 'input'],
...params,
}))

const model = ref({
name: '',
email: '',
})








```

### Extend API

Take `Naive UI` as an example

```ts
import { FormItemRule } from 'naive-ui'
import { RulerContext, rulerFactory, RulerFactoryMessage } from 'ruler-factory'

interface RulerExtendedContext {
ip(message: RulerFactoryMessage, params?: FormItemRule): RulerContext
}

customRuler().ip('ip format error').done()

const ruler = rulerFactory(
(validator, params = {}) => ({
trigger: ['blur', 'change', 'input'],
validator: (_, value) => validator(value),
...params,
}),
(ctx) => {
function ip(message: RulerFactoryMessage, params?: FormItemRule) {
ctx.addRule((value) => {
// Implement isString and isIP by yourself
if (!isString(value) || !isIP(value)) {
return new Error(ctx.getMessage(message))
}
}, params)

return ctx
}

return { ip }
},
)
```

## API

### Types Validation

- `.string(message?, params?)`
- `.number(message?, params?)`
- `.array(message?, params?)`
- `.boolean(message?, params?)`
- `.object(message?, params?)`
- `.symbol(message?, params?)`
- `.bigint(message?, params?)`
- `.null(message?, params?)`
- `.undefined(message?, params?)`
- `.true(message?, params?)`
- `.false(message?, params?)`

### Non Empty Validation

- `.required(message)`

### String Validation

- `.min(value, message, params?)`
- `.max(value, message, params?)`
- `.length(value, message, params?)`
- `.regex(regexp, message, params?)`
- `.startsWith(value, message, params?)`
- `.endsWith(value, message, params?)`
- `.includes(value, message, params?)`
- `.uppercase(message, params?)`
- `.lowercase(message, params?)`
- `.email(message, params?)`

### Number Validation

- `.number().min(value, message, params?)`
- `.number().max(value, message, params?)`
- `.number().gt(value, message, params?)`
- `.number().gte(value, message, params?)` alias .min
- `.number().lt(value, message, params?)`
- `.number().lte(value, message, params?)` alias .max
- `.number().positive(value, message, params?)`
- `.number().negative(value, message, params?)`

### Bigint Validation

- `.bigint().min(value, message, params?)`
- `.bigint().max(value, message, params?)`
- `.bigint().gt(value, message, params?)`
- `.bigint().gte(value, message, params?)` alias .min
- `.bigint().lt(value, message, params?)`
- `.bigint().lte(value, message, params?)` alias .max
- `.bigint().positive(value, message, params?)`
- `.bigint().negative(value, message, params?)`

### Array Validation

- `.array().min(value, message, params?)`
- `.array().max(value, message, params?)`
- `.array().length(value, message, params?)`
- `.array().includes(value, message, params?)`

### Predicate Validation

- `.is(fn, message, params?)`
- `.not(fn, message, params?)`

### Complete rule building

- `.done()`

### Custom Rule

- `.addRule(validator)`

### Value Transformer

- `.trim()`
- `.toLowerCase()`
- `.toUpperCase()`
- `.transform(fn)`

## License

MIT

## Links

- [GitHub Repository](https://github.com/varletjs/ruler-factory)
- [Issues](https://github.com/varletjs/ruler-factory/issues)

## Inspired By

[`zod`](https://zod.dev/)
[`yup`](https://github.com/jquense/yup)