@eflexsystems/ember-tracked-validations
Version:
Ember computed property based validation library
227 lines (220 loc) • 6.13 kB
JavaScript
import Factory from './decorators/factory';
import Validator from './validations/validator';
/**
* ## Installation
* ```shell
* ember install ember-cp-validations
* ```
*
* ## Changelog
* Changelog can be found [here](https://github.com/offirgolan/ember-cp-validations/blob/master/CHANGELOG.md)
*
* ## Live Demo
* A live demo can be found [here](http://offirgolan.github.io/ember-cp-validations/)
*
* ## Looking for help?
* If it is a bug [please open an issue on GitHub](http://github.com/offirgolan/ember-cp-validations/issues).
*
* @module Usage
*/
/**
* ## Models
*
* The first thing we need to do is build our validation rules. This will then generate a Mixin that you will be able to incorporate into your model or object.
*
* ```javascript
* // models/user.js
*
* import Ember from 'ember';
* import DS from 'ember-data';
* import { validator, buildValidations } from '@eflexsystems/ember-tracked-validations';
*
* const Validations = buildValidations({
* username: validator('presence', true),
* password: [
* validator('presence', true),
* validator('length', {
* min: 4,
* max: 8
* })
* ],
* email: [
* validator('presence', true),
* validator('format', { type: 'email' })
* ],
* emailConfirmation: [
* validator('presence', true),
* validator('confirmation', {
* on: 'email',
* message: '{description} do not match',
* description: 'Email addresses'
* })
* ]
* });
* ```
*
* Once our rules are created and our Mixin is generated, all we have to do is add it to our model.
*
* ```javascript
* // models/user.js
*
* export default DS.Model.extend(Validations, {
* 'username': attr('string'),
* 'password': attr('string'),
* 'email': attr('string')
* });
* ```
*
* ## Objects
*
* You can also use the generated `Validations` mixin on any `Ember.Object` or child
* of `Ember.Object`, like `Ember.Component`. For example:
*
* ```javascript
* // components/x-foo.js
*
* import Ember from 'ember';
* import { validator, buildValidations } from '@eflexsystems/ember-tracked-validations';
*
* const Validations = buildValidations({
* bar: validator('presence', true)
* });
*
* export default Ember.Component.extend(Validations, {
* bar: null
* });
* ```
*
* ```javascript
* // models/user.js
*
* export default Ember.Object.extend(Validations, {
* username: null
* });
* ```
*
* @module Usage
* @submodule Basic
*/
/**
* ### Default Options
*
* Default options can be specified over a set of validations for a given attribute. Local properties will always take precedence.
*
* Instead of doing the following:
*
* ```javascript
* const Validations = buildValidations({
* username: [
* validator('presence', {
* presence: true,
* description: 'Username'
* }),
* validator('length', {
* min: 1,
* description: 'Username'
* }),
* validator('my-custom-validator', {
* description: 'A username'
* })
* ]
* });
* ```
*
* We can declare default options:
*
* ```javascript
* const Validations = buildValidations({
* username: {
* description: 'Username'
* validators: [
* validator('presence', true),
* validator('length', {
* min: 1
* }),
* validator('my-custom-validator', {
* description: 'A username'
* })
* ]
* },
* });
* ```
*
* In the above example, all the validators for username will have a description of `Username` except that of the `my-custom-validator` validator which will be `A username`.
*
* ### Global Options
*
* If you have specific options you want to propagate through all your validation rules, you can do so by passing in a global options object.
*
* ```javascript
* const Validations = buildValidations(validationRules, globalOptions);
* ```
*
* ```javascript
* import Ember from 'ember';
* import { validator, buildValidations } from '@eflexsystems/ember-tracked-validations';
*
* const Validations = buildValidations({
* firstName: {
* description: 'First Name'
* validators: [
* validator('presence', {
* presence: true,
* })
* ]
* },
* lastName: validator('presence', true)
* }, {
* description: 'This field'
* disabled: computed.readOnly('model.disableValidations')
* });
* ```
*
* Just like in the default options, locale validator options will always take precedence over default options and default options will always take precedence
* over global options. This allows you to declare global rules while having the ability to override them in lower levels.
*
* ### Computed Options
*
* All options can also be Computed Properties. These CPs have access to the `model` and `attribute` that is associated with the validator.
*
* Please note that the `message` option of a validator can also be a function with [the following signature](http://offirgolan.github.io/ember-cp-validations/docs/modules/Validators.html#message).
*
* ```javascript
* const Validations = buildValidations({
* username: validator('length', {
* disabled: Ember.computed.not('model.meta.username.isEnabled'),
* min: Ember.computed.readOnly('model.meta.username.minLength'),
* max: Ember.computed.readOnly('model.meta.username.maxLength'),
* description: Ember.computed(function() {
* // CPs have access to the `model` and `attribute`
* return this.get('model').generateDescription(this.get('attribute'));
* })
* })
* });
* ```
*
* @module Usage
* @submodule Advanced
*/
/**
* ### [__Ember-Intl__](https://github.com/ember-intl/cp-validations)
*
* ```bash
* ember install @ember-intl/cp-validations
* ```
*
* ### [__Ember-I18n__](https://github.com/jasonmit/ember-i18n-cp-validations)
*
* ```bash
* ember install ember-i18n-cp-validations
* ```
*
* @module Usage
* @submodule I18n Solutions
*/
export const buildValidations = Factory;
export const validator = Validator;
export default {
buildValidations,
validator,
};