Launch Week Day 5: Introducing Reachability for PHP.Learn More
Socket
Book a DemoSign in
Socket

lgtm

Package Overview
Dependencies
Maintainers
2
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

lgtm - npm Package Compare versions

Comparing version
1.1.0
to
1.2.0
+607
-311
dist/lgtm.js
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.LGTM = global.LGTM || {})));
}(this, function (exports) { 'use strict';
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.LGTM = {})));
}(this, (function (exports) { 'use strict';
var config = {};
var config = {};
/**
* Iteration
*/
/**
* Iteration
*/
function forEach(iterable, iterator) {
if (typeof iterable.forEach === 'function') {
iterable.forEach(iterator);
} else if ({}.toString.call(iterable) === '[object Object]') {
var hasOwnProp = {}.hasOwnProperty;
for (var key in iterable) {
if (hasOwnProp.call(iterable, key)) {
iterator(iterable[key], key);
}
}
} else {
for (var i = 0; i < iterable.length; i++) {
iterator(iterable[i], i);
}
}
}
function keys(object) {
if (Object.getOwnPropertyNames) {
return Object.getOwnPropertyNames(object);
} else {
var result = [];
forEach(object, function (key) {
result.push(key);
});
return result;
}
function keys(object) {
return Object.getOwnPropertyNames(object);
}
/**
* Property access
*/
function get(object, property) {
if (object === null || object === undefined) {
return;
} else if (typeof object.get === 'function') {
return object.get(property);
} else {
return object[property];
}
}
/**
* Property access
*/
function getProperties(object, properties) {
var get = config.get;
function get(object, property) {
if (object === null || object === undefined) {
return;
} else if (typeof object.get === 'function') {
return object.get(property);
} else {
return object[property];
return properties.map(function (prop) {
return get(object, prop);
});
}
/**
* Array manipulation
*/
function contains(array, object) {
return array.indexOf(object) > -1;
}
function uniq(array) {
var result = [];
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (!contains(result, item)) {
result.push(item);
}
}
function getProperties(object, properties) {
var get = config.get;
return result;
}
return properties.map(function (prop) {
return get(object, prop);
});
}
/**
* Promises
*/
/**
* Array manipulation
*/
function resolve(thenable) {
var Promise = config.Promise;
function contains(array, object) {
return array.indexOf(object) > -1;
return new Promise(function (accept) {
return accept(thenable);
});
}
function all(thenables) {
var Promise = config.Promise;
return Promise.all(thenables);
}
var asyncGenerator = function () {
function AwaitValue(value) {
this.value = value;
}
function uniq(array) {
var result = [];
function AsyncGenerator(gen) {
var front, back;
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (!contains(result, item)) {
result.push(item);
function send(key, arg) {
return new Promise(function (resolve, reject) {
var request = {
key: key,
arg: arg,
resolve: resolve,
reject: reject,
next: null
};
if (back) {
back = back.next = request;
} else {
front = back = request;
resume(key, arg);
}
});
}
function resume(key, arg) {
try {
var result = gen[key](arg);
var value = result.value;
if (value instanceof AwaitValue) {
Promise.resolve(value.value).then(function (arg) {
resume("next", arg);
}, function (arg) {
resume("throw", arg);
});
} else {
settle(result.done ? "return" : "normal", result.value);
}
} catch (err) {
settle("throw", err);
}
}
return result;
function settle(type, value) {
switch (type) {
case "return":
front.resolve({
value: value,
done: true
});
break;
case "throw":
front.reject(value);
break;
default:
front.resolve({
value: value,
done: false
});
break;
}
front = front.next;
if (front) {
resume(front.key, front.arg);
} else {
back = null;
}
}
this._invoke = send;
if (typeof gen.return !== "function") {
this.return = undefined;
}
}
/**
* Promises
*/
if (typeof Symbol === "function" && Symbol.asyncIterator) {
AsyncGenerator.prototype[Symbol.asyncIterator] = function () {
return this;
};
}
function resolve(thenable) {
var Promise = config.Promise;
AsyncGenerator.prototype.next = function (arg) {
return this._invoke("next", arg);
};
return new Promise(function (accept) {
return accept(thenable);
});
AsyncGenerator.prototype.throw = function (arg) {
return this._invoke("throw", arg);
};
AsyncGenerator.prototype.return = function (arg) {
return this._invoke("return", arg);
};
return {
wrap: function (fn) {
return function () {
return new AsyncGenerator(fn.apply(this, arguments));
};
},
await: function (value) {
return new AwaitValue(value);
}
};
}();
var classCallCheck = function (instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
};
function all(thenables) {
var Promise = config.Promise;
var createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return Promise.all(thenables);
return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var toConsumableArray = function (arr) {
if (Array.isArray(arr)) {
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
return arr2;
} else {
return Array.from(arr);
}
};
var ObjectValidator = function () {
function ObjectValidator() {
var _this = this;
classCallCheck(this, ObjectValidator);
this._validations = {};
this._dependencies = {};
for (var _len = arguments.length, validations = Array(_len), _key = 0; _key < _len; _key++) {
validations[_key] = arguments[_key];
}
validations.forEach(function (validation) {
return validation.addToValidator(_this);
});
}
ObjectValidator.prototype = {
_validations: null,
_dependencies: null,
addValidation: function addValidation(attr, fn, message) {
createClass(ObjectValidator, [{
key: 'addValidation',
value: function addValidation(attr, fn, message) {
var list = this._validations[attr];

@@ -120,9 +298,9 @@

list.push([fn, message]);
},
}
// e.g. spouseName (dependentAttribute) depends on maritalStatus (parentAttribute)
addDependentsFor: function addDependentsFor() /* parentAttribute, ...dependentAttributes */{
var dependentAttributes = [].slice.apply(arguments);
var parentAttribute = dependentAttributes.shift();
}, {
key: 'addDependentsFor',
value: function addDependentsFor(parentAttribute) {
var dependentsForParent = this._dependencies[parentAttribute];

@@ -134,2 +312,6 @@

for (var _len2 = arguments.length, dependentAttributes = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
dependentAttributes[_key2 - 1] = arguments[_key2];
}
for (var i = 0; i < dependentAttributes.length; i++) {

@@ -141,17 +323,21 @@ var attr = dependentAttributes[i];

}
},
attributes: function attributes() {
}
}, {
key: 'attributes',
value: function attributes() {
return uniq(keys(this._validations).concat(keys(this._dependencies)));
},
}
}, {
key: 'validate',
value: function validate(object) {
var _this2 = this;
validate: function validate() /* object, attributes..., callback */{
var attributes = [].slice.apply(arguments);
var object = attributes.shift();
var callback = attributes.pop();
var self = this;
for (var _len3 = arguments.length, attributes = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
attributes[_key3 - 1] = arguments[_key3];
}
if (typeof callback === 'string') {
attributes.push(callback);
callback = null;
var callback = null;
if (typeof attributes[attributes.length - 1] !== 'string') {
callback = attributes.pop();
}

@@ -171,3 +357,3 @@

var promise = all(validationPromises).then(function (results) {
results = self._collectResults(results);
results = _this2._collectResults(results);
if (callback) {

@@ -187,5 +373,6 @@ callback(null, results);

}
},
_validateAttribute: function _validateAttribute(object, attr, alreadyValidating) {
}
}, {
key: '_validateAttribute',
value: function _validateAttribute(object, attr, alreadyValidating) {
var value = config.get(object, attr);

@@ -222,5 +409,6 @@ var validations = this._validations[attr];

return results;
},
_collectResults: function _collectResults(results) {
}
}, {
key: '_collectResults',
value: function _collectResults(results) {
var result = {

@@ -251,31 +439,35 @@ valid: true,

return result;
},
}
// e.g. getDependents("maritalStatus") # => ["spouseName"]
_getDependentsFor: function _getDependentsFor(parentAttribute) {
}, {
key: '_getDependentsFor',
value: function _getDependentsFor(parentAttribute) {
return (this._dependencies[parentAttribute] || []).slice();
}
};
}]);
return ObjectValidator;
}();
function ValidatorBuilder() {
this._validator = new ObjectValidator();
var Validation = function () {
function Validation(attr) {
classCallCheck(this, Validation);
this._attr = null;
this._conditions = [];
this._subvalidations = [];
this._dependencies = [];
this._attr = attr;
}
ValidatorBuilder.prototype = {
_attr: null,
_conditions: null,
_conditionDependencies: null,
_validator: null,
createClass(Validation, [{
key: 'when',
value: function when() /*, predicate */{
for (var _len = arguments.length, dependencies = Array(_len), _key = 0; _key < _len; _key++) {
dependencies[_key] = arguments[_key];
}
validates: function validates(attr) {
this._attr = attr;
this._conditions = [];
this._conditionDependencies = [];
return this;
},
var predicate = dependencies.pop();
when: function when() /* ...dependencies, condition */{
var dependencies = [].slice.apply(arguments);
var condition = dependencies.pop();
if (dependencies.length === 0) {

@@ -285,20 +477,21 @@ dependencies = [this._attr];

for (var i = 0; i < dependencies.length; i++) {
var dependency = dependencies[i];
if (dependency !== this._attr) {
this._validator.addDependentsFor(dependency, this._attr);
}
}
this._conditions.push({
predicate: predicate,
dependencies: dependencies
});
this._conditions.push(condition);
this._conditionDependencies.push(dependencies);
return this;
},
and: function and() /* ...dependencies, condition */{
}
}, {
key: 'and',
value: function and() {
return this.when.apply(this, arguments);
},
}
}, {
key: 'using',
value: function using() /*, predicate, message */{
for (var _len2 = arguments.length, dependencies = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
dependencies[_key2] = arguments[_key2];
}
using: function using() /* ...dependencies, predicate, message */{
var dependencies = [].slice.apply(arguments);
var message = dependencies.pop();

@@ -319,24 +512,18 @@ var predicate = dependencies.pop();

for (var i = 0; i < dependencies.length; i++) {
var dependency = dependencies[i];
if (dependency !== this._attr) {
this._validator.addDependentsFor(dependency, this._attr);
}
}
function validation(value, attr, object) {
var properties = getProperties(object, dependencies);
return predicate.apply(null, properties.concat([attr, object]));
return predicate.apply(undefined, toConsumableArray(properties).concat([attr, object]));
}
var conditions = this._conditions.slice();
var conditionDependencies = this._conditionDependencies.slice();
function validationWithConditions(value, attr, object) {
return all(conditions.map(function (condition, i) {
var dependencies = conditionDependencies[i];
return all(conditions.map(function (_ref) {
var predicate = _ref.predicate,
dependencies = _ref.dependencies;
var properties = getProperties(object, dependencies);
return condition.apply(null, properties.concat([attr, object]));
return predicate.apply(undefined, toConsumableArray(properties).concat([attr, object]));
})).then(function (results) {
for (var i = 0; i < results.length; i++) {
for (var i = 0; i < results.length; i += 1) {
// a condition resolved to a falsy value; return as valid

@@ -347,2 +534,3 @@ if (!results[i]) {

}
// all conditions resolved to truthy values; continue with validation

@@ -353,227 +541,335 @@ return validation(value, attr, object);

this._validator.addValidation(this._attr, conditions ? validationWithConditions : validation, message);
this._subvalidations.push({
dependencies: dependencies,
validation: conditions ? validationWithConditions : validation,
message: message
});
return this;
},
}
}, {
key: 'addToValidator',
value: function addToValidator(validator) {
var _this = this;
build: function build() {
return this._validator;
this.dependencies().forEach(function (dependency) {
validator.addDependentsFor(dependency, _this._attr);
});
this._subvalidations.forEach(function (subvalidation) {
validator.addValidation(_this._attr, subvalidation.validation, subvalidation.message);
});
}
};
}, {
key: 'dependencies',
value: function dependencies() {
var dependencies = [];
ValidatorBuilder.registerHelper = function (name, fn) {
this.prototype[name] = function () {
fn.apply(this, arguments);
return this;
};
return null;
};
this._conditions.forEach(function (condition) {
condition.dependencies.forEach(function (dependency) {
dependencies.push(dependency);
});
});
ValidatorBuilder.unregisterHelper = function (name) {
delete this.prototype[name];
return null;
};
this._subvalidations.forEach(function (subvalidation) {
subvalidation.dependencies.forEach(function (dependency) {
dependencies.push(dependency);
});
});
function present(value) {
if (typeof value === 'string') {
value = value.trim();
return dependencies;
}
}]);
return Validation;
}();
return value !== '' && value !== null && value !== undefined;
var ValidatorBuilder = function () {
function ValidatorBuilder() {
classCallCheck(this, ValidatorBuilder);
this._validations = null;
this._validation = null;
for (var _len = arguments.length, validations = Array(_len), _key = 0; _key < _len; _key++) {
validations[_key] = arguments[_key];
}
this._validations = validations;
}
var STRICT_CHARS = /^[\x20-\x7F]*$/;
// http://stackoverflow.com/a/46181/11236
var EMAIL = /^(([^<>()\[\]\\.,;:\s@\"]+(\.[^<>()\[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
createClass(ValidatorBuilder, [{
key: 'validates',
value: function validates(attr) {
this._validation = new Validation(attr);
this._validations.push(this._validation);
return this;
}
}, {
key: 'when',
value: function when() /* ...dependencies, condition */{
var _validation;
function checkEmail(options) {
if (!options) {
options = {};
(_validation = this._validation).when.apply(_validation, arguments);
return this;
}
}, {
key: 'and',
value: function and() /* ...dependencies, condition */{
var _validation2;
return function (value) {
if (typeof value === 'string') {
value = value.trim();
}
(_validation2 = this._validation).and.apply(_validation2, arguments);
return this;
}
}, {
key: 'using',
value: function using() /* ...dependencies, predicate, message */{
var _validation3;
if (options.strictCharacters) {
if (!STRICT_CHARS.test(value)) {
return false;
}
}
(_validation3 = this._validation).using.apply(_validation3, arguments);
return this;
}
}, {
key: 'build',
value: function build() {
return new (Function.prototype.bind.apply(ObjectValidator, [null].concat(toConsumableArray(this._validations))))();
}
}], [{
key: 'registerHelper',
value: function registerHelper(name, fn) {
this.prototype[name] = function () {
fn.apply(this._validation, arguments);
return this;
};
return EMAIL.test(value);
};
Validation.prototype[name] = function () {
fn.apply(this, arguments);
return this;
};
return null;
}
}, {
key: 'unregisterHelper',
value: function unregisterHelper(name) {
delete this.prototype[name];
delete Validation.prototype[name];
return null;
}
}]);
return ValidatorBuilder;
}();
function present(value) {
if (typeof value === 'string') {
value = value.trim();
}
function checkMinLength(minLength) {
if (minLength === null || minLength === undefined) {
throw new Error('must specify a min length');
return value !== '' && value !== null && value !== undefined;
}
var STRICT_CHARS = /^[\x20-\x7F]*$/;
// http://stackoverflow.com/a/46181/11236
var EMAIL = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
function checkEmail() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return function (value) {
if (typeof value === 'string') {
value = value.trim();
}
return function (value) {
if (value !== null && value !== undefined) {
return value.length >= minLength;
} else {
if (options.strictCharacters) {
if (!STRICT_CHARS.test(value)) {
return false;
}
};
}
return EMAIL.test(value);
};
}
function checkMinLength(minLength) {
if (minLength === null || minLength === undefined) {
throw new Error('must specify a min length');
}
function checkMaxLength(maxLength) {
if (maxLength === null || maxLength === undefined) {
throw new Error('must specify a max length');
return function (value) {
if (value !== null && value !== undefined) {
return value.length >= minLength;
} else {
return false;
}
};
}
return function (value) {
if (value !== null && value !== undefined) {
return value.length <= maxLength;
} else {
return false;
}
};
function checkMaxLength(maxLength) {
if (maxLength === null || maxLength === undefined) {
throw new Error('must specify a max length');
}
function register$1() {
ValidatorBuilder.registerHelper('required', function (message) {
this.using(present, message);
});
return function (value) {
if (value !== null && value !== undefined) {
return value.length <= maxLength;
} else {
return false;
}
};
}
ValidatorBuilder.registerHelper('optional', function () {
this.when(present);
});
function register$1() {
ValidatorBuilder.registerHelper('required', function (message) {
this.using(present, message);
});
ValidatorBuilder.registerHelper('email', function (message, options) {
this.using(checkEmail(options), message);
});
ValidatorBuilder.registerHelper('optional', function () {
this.when(present);
});
ValidatorBuilder.registerHelper('minLength', function (minLength, message) {
this.using(checkMinLength(minLength), message);
});
ValidatorBuilder.registerHelper('email', function (message, options) {
this.using(checkEmail(options), message);
});
ValidatorBuilder.registerHelper('maxLength', function (maxLength, message) {
this.using(checkMaxLength(maxLength), message);
});
}
ValidatorBuilder.registerHelper('minLength', function (minLength, message) {
this.using(checkMinLength(minLength), message);
});
register$1();
ValidatorBuilder.registerHelper('maxLength', function (maxLength, message) {
this.using(checkMaxLength(maxLength), message);
});
}
function validator() {
return new ValidatorBuilder();
}
register$1();
function register() {
ValidatorBuilder.registerHelper.apply(ValidatorBuilder, arguments);
function validator() {
for (var _len = arguments.length, validations = Array(_len), _key = 0; _key < _len; _key++) {
validations[_key] = arguments[_key];
}
function unregister() {
ValidatorBuilder.unregisterHelper.apply(ValidatorBuilder, arguments);
}
return new (Function.prototype.bind.apply(ValidatorBuilder, [null].concat(validations)))();
}
var helpers = {
core: {
present: present,
checkEmail: checkEmail,
checkMinLength: checkMinLength,
checkMaxLength: checkMaxLength,
register: register$1
},
register: register,
unregister: unregister
};
function validates(attr) {
return new Validation(attr);
}
function configure(key, value) {
config[key] = value;
}
function register$$1() {
ValidatorBuilder.registerHelper.apply(ValidatorBuilder, arguments);
}
configure('defer', function () {
var Promise = config['Promise'];
var resolve = void 0;
var reject = void 0;
var promise = new Promise(function (res, rej) {
resolve = res;
reject = rej;
});
function unregister() {
ValidatorBuilder.unregisterHelper.apply(ValidatorBuilder, arguments);
}
if (!resolve || !reject) {
throw new Error('Configured promise does not behave as expected');
}
var helpers = {
core: {
present: present,
checkEmail: checkEmail,
checkMinLength: checkMinLength,
checkMaxLength: checkMaxLength,
register: register$1
},
register: register$$1,
unregister: unregister
};
return { promise: promise, resolve: resolve, reject: reject };
function configure(key, value) {
config[key] = value;
}
configure('defer', function () {
var Promise = config['Promise'];
var resolve$$1 = void 0;
var reject = void 0;
var promise = new Promise(function (res, rej) {
resolve$$1 = res;
reject = rej;
});
function PromiseProxy(callback) {
var Promise = getPromise();
return new Promise(callback);
if (!resolve$$1 || !reject) {
throw new Error('Configured promise does not behave as expected');
}
PromiseProxy.all = function () {
var _getPromise;
return { promise: promise, resolve: resolve$$1, reject: reject };
});
return (_getPromise = getPromise()).all.apply(_getPromise, arguments);
};
function PromiseProxy(callback) {
var Promise = getPromise();
return new Promise(callback);
}
PromiseProxy.race = function () {
var _getPromise2;
PromiseProxy.all = function () {
var _getPromise;
return (_getPromise2 = getPromise()).race.apply(_getPromise2, arguments);
};
return (_getPromise = getPromise()).all.apply(_getPromise, arguments);
};
PromiseProxy.resolve = function () {
var _getPromise3;
PromiseProxy.race = function () {
var _getPromise2;
return (_getPromise3 = getPromise()).resolve.apply(_getPromise3, arguments);
};
return (_getPromise2 = getPromise()).race.apply(_getPromise2, arguments);
};
PromiseProxy.reject = function () {
var _getPromise4;
PromiseProxy.resolve = function () {
var _getPromise3;
return (_getPromise4 = getPromise()).reject.apply(_getPromise4, arguments);
};
return (_getPromise3 = getPromise()).resolve.apply(_getPromise3, arguments);
};
function getPromise() {
var warn = config['warn'];
PromiseProxy.reject = function () {
var _getPromise4;
/* global Promise, RSVP, require */
if (typeof RSVP !== 'undefined') {
configure('Promise', RSVP.Promise);
warn('Implicitly using RSVP.Promise. This will be removed in LGTM 2.0. ' + 'Instead, use \'LGTM.configure("Promise", RSVP.Promise)\' to ' + 'continue using RSVP promises.');
return RSVP.Promise;
}
return (_getPromise4 = getPromise()).reject.apply(_getPromise4, arguments);
};
if (typeof require === 'function') {
try {
var _Promise = require('rsvp').Promise;
configure('Promise', _Promise);
warn('Implicitly using require("rsvp").Promise. This will be removed in LGTM 2.0. ' + 'Instead, use \'LGTM.configure("Promise", require("rsvp").Promise)\' to ' + 'continue using RSVP promises.');
return _Promise;
} catch (err) {
// Ignore errors, just try built-in Promise or fail.
}
}
function getPromise() {
var warn = config['warn'];
if (typeof Promise === 'function') {
configure('Promise', Promise);
return Promise;
/* global Promise, RSVP, require */
if (typeof RSVP !== 'undefined') {
configure('Promise', RSVP.Promise);
warn('Implicitly using RSVP.Promise. This will be removed in LGTM 2.0. ' + 'Instead, use \'LGTM.configure("Promise", RSVP.Promise)\' to ' + 'continue using RSVP promises.');
return RSVP.Promise;
}
if (typeof require === 'function') {
try {
var _require = require('rsvp'),
_Promise = _require.Promise;
configure('Promise', _Promise);
warn('Implicitly using require("rsvp").Promise. This will be removed in LGTM 2.0. ' + 'Instead, use \'LGTM.configure("Promise", require("rsvp").Promise)\' to ' + 'continue using RSVP promises.');
return _Promise;
} catch (err) {
// Ignore errors, just try built-in Promise or fail.
}
}
throw new Error('\'Promise\' could not be found. Configure LGTM with your promise library using ' + 'e.g. \'LGTM.configure("Promise", RSVP.Promise)\'.');
if (typeof Promise === 'function') {
configure('Promise', Promise);
return Promise;
}
/* global console */
configure('Promise', PromiseProxy);
configure('warn', console.warn.bind(console)); // eslint-disable-line no-console
configure('get', function (object, property) {
var warn = config['warn'];
throw new Error('\'Promise\' could not be found. Configure LGTM with your promise library using ' + 'e.g. \'LGTM.configure("Promise", RSVP.Promise)\'.');
}
configure('get', get);
warn('Implicitly using \'get\' implementation that uses a \'get\' method when available. ' + 'This will be removed in LGTM 2.0. Instead, use e.g. \'LGTM.configure("get", Ember.get)\' ' + 'if you rely on this behavior.');
return get(object, property);
});
/* global console */
configure('Promise', PromiseProxy);
configure('warn', console.warn.bind(console)); // eslint-disable-line no-console
configure('get', function (object, property) {
var warn = config['warn'];
exports.configure = configure;
exports.validator = validator;
exports.helpers = helpers;
exports.ObjectValidator = ObjectValidator;
configure('get', get);
warn('Implicitly using \'get\' implementation that uses a \'get\' method when available. ' + 'This will be removed in LGTM 2.0. Instead, use e.g. \'LGTM.configure("get", Ember.get)\' ' + 'if you rely on this behavior.');
return get(object, property);
});
}));
//# sourceMappingURL=lgtm.js.map
exports.configure = configure;
exports.validator = validator;
exports.validates = validates;
exports.helpers = helpers;
exports.ObjectValidator = ObjectValidator;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=lgtm.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"lgtm.js","sources":["../src/lgtm/config.js","../src/lgtm/utils.js","../src/lgtm/object_validator.js","../src/lgtm/validator_builder.js","../src/lgtm/helpers/core.js","../src/lgtm.js"],"sourcesContent":["export default {};\n","import config from './config.js';\n\n/**\n * Iteration\n */\n\nfunction forEach(iterable, iterator) {\n if (typeof iterable.forEach === 'function') {\n iterable.forEach(iterator);\n } else if ({}.toString.call(iterable) === '[object Object]') {\n var hasOwnProp = {}.hasOwnProperty;\n for (var key in iterable) {\n if (hasOwnProp.call(iterable, key)) {\n iterator(iterable[key], key);\n }\n }\n } else {\n for (var i = 0; i < iterable.length; i++) {\n iterator(iterable[i], i);\n }\n }\n}\n\nfunction keys(object) {\n if (Object.getOwnPropertyNames) {\n return Object.getOwnPropertyNames(object);\n } else {\n var result = [];\n forEach(object, function(key) {\n result.push(key);\n });\n return result;\n }\n}\n\nexport { forEach, keys };\n\n\n/**\n * Property access\n */\n\nfunction get(object, property) {\n if (object === null || object === undefined) {\n return;\n } else if (typeof object.get === 'function') {\n return object.get(property);\n } else {\n return object[property];\n }\n}\n\nfunction getProperties(object, properties) {\n let { get } = config;\n return properties.map(prop => get(object, prop));\n}\n\nexport { get, getProperties };\n\n\n/**\n * Array manipulation\n */\n\nfunction contains(array, object) {\n return array.indexOf(object) > -1;\n}\n\nfunction uniq(array) {\n var result = [];\n\n for (var i = 0; i < array.length; i++) {\n var item = array[i];\n if (!contains(result, item)) {\n result.push(item);\n }\n }\n\n return result;\n}\n\nexport { contains, uniq };\n\n\n/**\n * Promises\n */\n\nfunction resolve(thenable) {\n let { Promise } = config;\n return new Promise(accept => accept(thenable));\n}\n\nfunction all(thenables) {\n let { Promise } = config;\n return Promise.all(thenables);\n}\n\nexport { resolve, all };\n","import config from './config.js';\nimport { all, resolve, contains, keys, uniq } from './utils.js';\n\nfunction ObjectValidator() {\n this._validations = {};\n this._dependencies = {};\n}\n\nObjectValidator.prototype = {\n _validations : null,\n _dependencies : null,\n\n addValidation: function(attr, fn, message) {\n var list = this._validations[attr];\n\n if (!list) {\n list = this._validations[attr] = [];\n }\n\n list.push([fn, message]);\n },\n\n // e.g. spouseName (dependentAttribute) depends on maritalStatus (parentAttribute)\n addDependentsFor: function(/* parentAttribute, ...dependentAttributes */) {\n var dependentAttributes = [].slice.apply(arguments);\n var parentAttribute = dependentAttributes.shift();\n\n var dependentsForParent = this._dependencies[parentAttribute];\n\n if (!dependentsForParent) {\n dependentsForParent = this._dependencies[parentAttribute] = [];\n }\n\n for (var i = 0; i < dependentAttributes.length; i++) {\n var attr = dependentAttributes[i];\n if (!contains(dependentsForParent, attr)) {\n dependentsForParent.push(attr);\n }\n }\n },\n\n attributes: function() {\n return uniq(\n keys(this._validations).concat(\n keys(this._dependencies)\n )\n );\n },\n\n validate: function(/* object, attributes..., callback */) {\n var attributes = [].slice.apply(arguments);\n var object = attributes.shift();\n var callback = attributes.pop();\n var self = this;\n\n if (typeof callback === 'string') {\n attributes.push(callback);\n callback = null;\n }\n\n if (attributes.length === 0) {\n attributes = keys(this._validations);\n }\n\n var validationPromises = [];\n var alreadyValidating = attributes.slice();\n for (var i = 0; i < attributes.length; i++) {\n var attr = attributes[i];\n validationPromises = validationPromises.concat(\n this._validateAttribute(object, attr, alreadyValidating));\n }\n\n var promise = all(validationPromises).then(\n function(results) {\n results = self._collectResults(results);\n if (callback) {\n callback(null, results);\n }\n return results;\n },\n function(err) {\n if (callback) {\n callback(err);\n }\n throw err;\n });\n\n if (!callback) {\n return promise;\n }\n },\n\n _validateAttribute: function(object, attr, alreadyValidating) {\n var value = config.get(object, attr);\n var validations = this._validations[attr];\n var results = [];\n\n if (validations) {\n validations.forEach(function(pair) {\n var fn = pair[0];\n var message = pair[1];\n\n var promise = resolve()\n .then(function() {\n return fn(value, attr, object);\n })\n .then(function(isValid) {\n return [ attr, isValid ? null : message ];\n });\n\n results.push(promise);\n });\n } else if (contains(this.attributes(), attr)) {\n results.push([ attr, null ]);\n }\n\n var dependents = this._getDependentsFor(attr);\n for (var i = 0; i < dependents.length; i++) {\n var dependent = dependents[i];\n if (alreadyValidating.indexOf(dependent) < 0) {\n alreadyValidating.push(dependent);\n results = results.concat(this._validateAttribute(object, dependent, alreadyValidating));\n }\n }\n\n return results;\n },\n\n _collectResults: function(results) {\n var result = {\n valid : true,\n errors : {}\n };\n\n for (var i = 0; i < results.length; i++) {\n if (!results[i]) { continue; }\n\n var attr = results[i][0];\n var message = results[i][1];\n var messages = result.errors[attr];\n\n if (!messages) {\n messages = result.errors[attr] = [];\n }\n\n if (message) {\n messages.push(message);\n result.valid = false;\n }\n }\n\n return result;\n },\n\n // e.g. getDependents(\"maritalStatus\") # => [\"spouseName\"]\n _getDependentsFor: function(parentAttribute) {\n return (this._dependencies[parentAttribute] || []).slice();\n }\n};\n\nexport default ObjectValidator;\n","import ObjectValidator from './object_validator.js';\nimport { getProperties, all } from './utils.js';\n\nfunction ValidatorBuilder() {\n this._validator = new ObjectValidator();\n}\n\nValidatorBuilder.prototype = {\n _attr : null,\n _conditions : null,\n _conditionDependencies : null,\n _validator : null,\n\n validates: function(attr) {\n this._attr = attr;\n this._conditions = [];\n this._conditionDependencies = [];\n return this;\n },\n\n when: function(/* ...dependencies, condition */) {\n var dependencies = [].slice.apply(arguments);\n var condition = dependencies.pop();\n\n if (dependencies.length === 0) {\n dependencies = [this._attr];\n }\n\n for (var i = 0; i < dependencies.length; i++) {\n var dependency = dependencies[i];\n if (dependency !== this._attr) {\n this._validator.addDependentsFor(dependency, this._attr);\n }\n }\n\n this._conditions.push(condition);\n this._conditionDependencies.push(dependencies);\n return this;\n },\n\n and: function(/* ...dependencies, condition */) {\n return this.when.apply(this, arguments);\n },\n\n using: function(/* ...dependencies, predicate, message */) {\n var dependencies = [].slice.apply(arguments);\n var message = dependencies.pop();\n var predicate = dependencies.pop();\n\n if (typeof message === 'undefined') {\n throw new Error(`expected a message but got: ${message}`);\n }\n\n if (typeof message === 'function' && typeof predicate === 'undefined') {\n throw new Error('missing expected argument `message` after predicate function');\n }\n\n if (dependencies.length === 0) {\n dependencies = [this._attr];\n }\n\n for (var i = 0; i < dependencies.length; i++) {\n var dependency = dependencies[i];\n if (dependency !== this._attr) {\n this._validator.addDependentsFor(dependency, this._attr);\n }\n }\n\n function validation(value, attr, object) {\n var properties = getProperties(object, dependencies);\n return predicate.apply(null, properties.concat([attr, object]));\n }\n\n var conditions = this._conditions.slice();\n var conditionDependencies = this._conditionDependencies.slice();\n\n function validationWithConditions(value, attr, object) {\n return all(conditions.map(function(condition, i) {\n var dependencies = conditionDependencies[i];\n var properties = getProperties(object, dependencies);\n return condition.apply(null, properties.concat([attr, object]));\n })).then(function(results) {\n for (var i = 0; i < results.length; i++) {\n // a condition resolved to a falsy value; return as valid\n if (!results[i]) {\n return true;\n }\n }\n // all conditions resolved to truthy values; continue with validation\n return validation(value, attr, object);\n });\n }\n\n this._validator.addValidation(\n this._attr,\n conditions ? validationWithConditions : validation,\n message\n );\n return this;\n },\n\n build: function() {\n return this._validator;\n }\n};\n\nValidatorBuilder.registerHelper = function(name, fn) {\n this.prototype[name] = function() {\n fn.apply(this, arguments);\n return this;\n };\n return null;\n};\n\nValidatorBuilder.unregisterHelper = function(name) {\n delete this.prototype[name];\n return null;\n};\n\nexport default ValidatorBuilder;\n","import ValidatorBuilder from '../validator_builder.js';\n\nfunction present(value) {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n return value !== '' && value !== null && value !== undefined;\n}\n\nconst STRICT_CHARS = /^[\\x20-\\x7F]*$/;\n// http://stackoverflow.com/a/46181/11236\nconst EMAIL = /^(([^<>()\\[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\nfunction checkEmail(options) {\n if (!options) {\n options = {};\n }\n\n return function(value) {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n if (options.strictCharacters) {\n if (!STRICT_CHARS.test(value)) {\n return false;\n }\n }\n\n return EMAIL.test(value);\n };\n}\n\nfunction checkMinLength(minLength) {\n if (minLength === null || minLength === undefined) {\n throw new Error('must specify a min length');\n }\n\n return function(value) {\n if (value !== null && value !== undefined) {\n return value.length >= minLength;\n } else {\n return false;\n }\n };\n}\n\nfunction checkMaxLength(maxLength) {\n if (maxLength === null || maxLength === undefined) {\n throw new Error('must specify a max length');\n }\n\n return function(value) {\n if (value !== null && value !== undefined) {\n return value.length <= maxLength;\n } else {\n return false;\n }\n };\n}\n\nfunction register() {\n ValidatorBuilder.registerHelper('required', function(message) {\n this.using(present, message);\n });\n\n ValidatorBuilder.registerHelper('optional', function() {\n this.when(present);\n });\n\n ValidatorBuilder.registerHelper('email', function(message, options) {\n this.using(checkEmail(options), message);\n });\n\n ValidatorBuilder.registerHelper('minLength', function(minLength, message) {\n this.using(checkMinLength(minLength), message);\n });\n\n ValidatorBuilder.registerHelper('maxLength', function(maxLength, message) {\n this.using(checkMaxLength(maxLength), message);\n });\n}\n\nexport { present, checkEmail, checkMinLength, checkMaxLength, register };\n","import ObjectValidator from './lgtm/object_validator.js';\nimport ValidatorBuilder from './lgtm/validator_builder.js';\nimport config from './lgtm/config.js';\nimport { get } from './lgtm/utils.js';\nimport { present, checkEmail, checkMinLength, checkMaxLength, register as core_register } from './lgtm/helpers/core.js';\n\ncore_register();\n\nfunction validator() {\n return new ValidatorBuilder();\n}\n\nfunction register() {\n ValidatorBuilder.registerHelper.apply(ValidatorBuilder, arguments);\n}\n\nfunction unregister() {\n ValidatorBuilder.unregisterHelper.apply(ValidatorBuilder, arguments);\n}\n\nvar helpers = {\n core: {\n present: present,\n checkEmail: checkEmail,\n checkMinLength: checkMinLength,\n checkMaxLength: checkMaxLength,\n register: core_register\n },\n register: register,\n unregister: unregister\n};\n\nfunction configure(key, value) {\n config[key] = value;\n}\n\nconfigure('defer', () => {\n let Promise = config['Promise'];\n let resolve;\n let reject;\n let promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n if (!resolve || !reject) {\n throw new Error('Configured promise does not behave as expected');\n }\n\n return { promise, resolve, reject };\n});\n\nfunction PromiseProxy(callback) {\n let Promise = getPromise();\n return new Promise(callback);\n}\n\nPromiseProxy.all = function(...args) {\n return getPromise().all(...args);\n};\n\nPromiseProxy.race = function(...args) {\n return getPromise().race(...args);\n};\n\nPromiseProxy.resolve = function(...args) {\n return getPromise().resolve(...args);\n};\n\nPromiseProxy.reject = function(...args) {\n return getPromise().reject(...args);\n};\n\nfunction getPromise() {\n let warn = config['warn'];\n\n /* global Promise, RSVP, require */\n if (typeof RSVP !== 'undefined') {\n configure('Promise', RSVP.Promise);\n warn(\n `Implicitly using RSVP.Promise. This will be removed in LGTM 2.0. ` +\n `Instead, use 'LGTM.configure(\"Promise\", RSVP.Promise)' to ` +\n `continue using RSVP promises.`\n );\n return RSVP.Promise;\n }\n\n if (typeof require === 'function') {\n try {\n let Promise = require('rsvp').Promise;\n configure('Promise', Promise);\n warn(\n `Implicitly using require(\"rsvp\").Promise. This will be removed in LGTM 2.0. ` +\n `Instead, use 'LGTM.configure(\"Promise\", require(\"rsvp\").Promise)' to ` +\n `continue using RSVP promises.`\n );\n return Promise;\n } catch (err) {\n // Ignore errors, just try built-in Promise or fail.\n }\n }\n\n if (typeof Promise === 'function') {\n configure('Promise', Promise);\n return Promise;\n }\n\n throw new Error(\n `'Promise' could not be found. Configure LGTM with your promise library using ` +\n `e.g. 'LGTM.configure(\"Promise\", RSVP.Promise)'.`\n );\n}\n\n/* global console */\nconfigure('Promise', PromiseProxy);\nconfigure('warn', console.warn.bind(console)); // eslint-disable-line no-console\nconfigure('get', (object, property) => {\n let warn = config['warn'];\n\n configure('get', get);\n warn(\n `Implicitly using 'get' implementation that uses a 'get' method when available. ` +\n `This will be removed in LGTM 2.0. Instead, use e.g. 'LGTM.configure(\"get\", Ember.get)' ` +\n `if you rely on this behavior.`\n );\n return get(object, property);\n});\n\nexport { configure, validator, helpers, ObjectValidator };\n"],"names":["register","core_register"],"mappings":"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"}
{"version":3,"file":"lgtm.js","sources":["../src/lgtm/config.js","../src/lgtm/utils.js","../src/lgtm/object_validator.js","../src/lgtm/validation.js","../src/lgtm/validator_builder.js","../src/lgtm/helpers/core.js","../src/lgtm.js"],"sourcesContent":["export default {};\n","import config from './config.js';\n\n/**\n * Iteration\n */\n\nexport function forEach(iterable, iterator) {\n if (typeof iterable.forEach === 'function') {\n iterable.forEach(iterator);\n } else if ({}.toString.call(iterable) === '[object Object]') {\n let hasOwnProp = {}.hasOwnProperty;\n for (let key in iterable) {\n if (hasOwnProp.call(iterable, key)) {\n iterator(iterable[key], key);\n }\n }\n } else {\n for (let i = 0; i < iterable.length; i++) {\n iterator(iterable[i], i);\n }\n }\n}\n\nexport function keys(object) {\n return Object.getOwnPropertyNames(object);\n}\n\n/**\n * Property access\n */\n\nexport function get(object, property) {\n if (object === null || object === undefined) {\n return;\n } else if (typeof object.get === 'function') {\n return object.get(property);\n } else {\n return object[property];\n }\n}\n\nexport function getProperties(object, properties) {\n let { get } = config;\n return properties.map(prop => get(object, prop));\n}\n\n/**\n * Array manipulation\n */\n\nexport function contains(array, object) {\n return array.indexOf(object) > -1;\n}\n\nexport function uniq(array) {\n let result = [];\n\n for (let i = 0; i < array.length; i++) {\n let item = array[i];\n if (!contains(result, item)) {\n result.push(item);\n }\n }\n\n return result;\n}\n\n/**\n * Promises\n */\n\nexport function resolve(thenable) {\n let { Promise } = config;\n return new Promise(accept => accept(thenable));\n}\n\nexport function all(thenables) {\n let { Promise } = config;\n return Promise.all(thenables);\n}\n","import config from './config.js';\nimport { all, resolve, contains, keys, uniq } from './utils.js';\n\nexport default class ObjectValidator {\n _validations = {};\n _dependencies = {};\n\n constructor(...validations) {\n validations.forEach(validation => validation.addToValidator(this));\n }\n\n addValidation(attr, fn, message) {\n let list = this._validations[attr];\n\n if (!list) {\n list = this._validations[attr] = [];\n }\n\n list.push([fn, message]);\n }\n\n // e.g. spouseName (dependentAttribute) depends on maritalStatus (parentAttribute)\n addDependentsFor(parentAttribute, ...dependentAttributes) {\n let dependentsForParent = this._dependencies[parentAttribute];\n\n if (!dependentsForParent) {\n dependentsForParent = this._dependencies[parentAttribute] = [];\n }\n\n for (let i = 0; i < dependentAttributes.length; i++) {\n let attr = dependentAttributes[i];\n if (!contains(dependentsForParent, attr)) {\n dependentsForParent.push(attr);\n }\n }\n }\n\n attributes() {\n return uniq(keys(this._validations).concat(keys(this._dependencies)));\n }\n\n validate(object, ...attributes) {\n let callback = null;\n\n if (typeof attributes[attributes.length - 1] !== 'string') {\n callback = attributes.pop();\n }\n\n if (attributes.length === 0) {\n attributes = keys(this._validations);\n }\n\n let validationPromises = [];\n let alreadyValidating = attributes.slice();\n for (let i = 0; i < attributes.length; i++) {\n let attr = attributes[i];\n validationPromises = validationPromises.concat(\n this._validateAttribute(object, attr, alreadyValidating)\n );\n }\n\n let self = this;\n let promise = all(validationPromises).then(\n results => {\n results = this._collectResults(results);\n if (callback) {\n callback(null, results);\n }\n return results;\n },\n err => {\n if (callback) {\n callback(err);\n }\n throw err;\n }\n );\n\n if (!callback) {\n return promise;\n }\n }\n\n _validateAttribute(object, attr, alreadyValidating) {\n let value = config.get(object, attr);\n let validations = this._validations[attr];\n let results = [];\n\n if (validations) {\n validations.forEach(function(pair) {\n let fn = pair[0];\n let message = pair[1];\n\n let promise = resolve()\n .then(() => fn(value, attr, object))\n .then(isValid => [attr, isValid ? null : message]);\n\n results.push(promise);\n });\n } else if (contains(this.attributes(), attr)) {\n results.push([attr, null]);\n }\n\n let dependents = this._getDependentsFor(attr);\n for (let i = 0; i < dependents.length; i++) {\n let dependent = dependents[i];\n if (alreadyValidating.indexOf(dependent) < 0) {\n alreadyValidating.push(dependent);\n results = results.concat(\n this._validateAttribute(object, dependent, alreadyValidating)\n );\n }\n }\n\n return results;\n }\n\n _collectResults(results) {\n let result = {\n valid: true,\n errors: {}\n };\n\n for (let i = 0; i < results.length; i++) {\n if (!results[i]) {\n continue;\n }\n\n let attr = results[i][0];\n let message = results[i][1];\n let messages = result.errors[attr];\n\n if (!messages) {\n messages = result.errors[attr] = [];\n }\n\n if (message) {\n messages.push(message);\n result.valid = false;\n }\n }\n\n return result;\n }\n\n // e.g. getDependents(\"maritalStatus\") # => [\"spouseName\"]\n _getDependentsFor(parentAttribute) {\n return (this._dependencies[parentAttribute] || []).slice();\n }\n}\n","import { getProperties, all } from './utils.js';\n\nexport default class Validation {\n _attr = null;\n _conditions = [];\n _subvalidations = [];\n _dependencies = [];\n\n constructor(attr) {\n this._attr = attr;\n }\n\n when(...dependencies /*, predicate */) {\n const predicate = dependencies.pop();\n\n if (dependencies.length === 0) {\n dependencies = [this._attr];\n }\n\n this._conditions.push({\n predicate,\n dependencies\n });\n\n return this;\n }\n\n and(...args) {\n return this.when(...args);\n }\n\n using(...dependencies /*, predicate, message */) {\n const message = dependencies.pop();\n const predicate = dependencies.pop();\n\n if (typeof message === 'undefined') {\n throw new Error(`expected a message but got: ${message}`);\n }\n\n if (typeof message === 'function' && typeof predicate === 'undefined') {\n throw new Error(\n 'missing expected argument `message` after predicate function'\n );\n }\n\n if (dependencies.length === 0) {\n dependencies = [this._attr];\n }\n\n function validation(value, attr, object) {\n const properties = getProperties(object, dependencies);\n return predicate(...properties, attr, object);\n }\n\n const conditions = this._conditions.slice();\n\n function validationWithConditions(value, attr, object) {\n return all(\n conditions.map(({ predicate, dependencies }) => {\n const properties = getProperties(object, dependencies);\n return predicate(...properties, attr, object);\n })\n ).then(results => {\n for (let i = 0; i < results.length; i += 1) {\n // a condition resolved to a falsy value; return as valid\n if (!results[i]) {\n return true;\n }\n }\n\n // all conditions resolved to truthy values; continue with validation\n return validation(value, attr, object);\n });\n }\n\n this._subvalidations.push({\n dependencies,\n validation: conditions ? validationWithConditions : validation,\n message\n });\n\n return this;\n }\n\n addToValidator(validator) {\n this.dependencies().forEach(dependency => {\n validator.addDependentsFor(dependency, this._attr);\n });\n\n this._subvalidations.forEach(subvalidation => {\n validator.addValidation(\n this._attr,\n subvalidation.validation,\n subvalidation.message\n );\n });\n }\n\n dependencies() {\n const dependencies = [];\n\n this._conditions.forEach(condition => {\n condition.dependencies.forEach(dependency => {\n dependencies.push(dependency);\n });\n });\n\n this._subvalidations.forEach(subvalidation => {\n subvalidation.dependencies.forEach(dependency => {\n dependencies.push(dependency);\n });\n });\n\n return dependencies;\n }\n}\n","import ObjectValidator from './object_validator.js';\nimport Validation from './validation';\n\nexport default class ValidatorBuilder {\n _validations = null;\n _validation = null;\n\n constructor(...validations) {\n this._validations = validations;\n }\n\n validates(attr) {\n this._validation = new Validation(attr);\n this._validations.push(this._validation);\n return this;\n }\n\n when(/* ...dependencies, condition */) {\n this._validation.when(...arguments);\n return this;\n }\n\n and(/* ...dependencies, condition */) {\n this._validation.and(...arguments);\n return this;\n }\n\n using(/* ...dependencies, predicate, message */) {\n this._validation.using(...arguments);\n return this;\n }\n\n build() {\n return new ObjectValidator(...this._validations);\n }\n\n static registerHelper(name, fn) {\n this.prototype[name] = function() {\n fn.apply(this._validation, arguments);\n return this;\n };\n\n Validation.prototype[name] = function() {\n fn.apply(this, arguments);\n return this;\n };\n\n return null;\n }\n\n static unregisterHelper(name) {\n delete this.prototype[name];\n delete Validation.prototype[name];\n return null;\n }\n}\n","import ValidatorBuilder from '../validator_builder.js';\n\nexport function present(value) {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n return value !== '' && value !== null && value !== undefined;\n}\n\nconst STRICT_CHARS = /^[\\x20-\\x7F]*$/;\n// http://stackoverflow.com/a/46181/11236\nconst EMAIL = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\nexport function checkEmail(options = {}) {\n return function(value) {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n if (options.strictCharacters) {\n if (!STRICT_CHARS.test(value)) {\n return false;\n }\n }\n\n return EMAIL.test(value);\n };\n}\n\nexport function checkMinLength(minLength) {\n if (minLength === null || minLength === undefined) {\n throw new Error('must specify a min length');\n }\n\n return function(value) {\n if (value !== null && value !== undefined) {\n return value.length >= minLength;\n } else {\n return false;\n }\n };\n}\n\nexport function checkMaxLength(maxLength) {\n if (maxLength === null || maxLength === undefined) {\n throw new Error('must specify a max length');\n }\n\n return function(value) {\n if (value !== null && value !== undefined) {\n return value.length <= maxLength;\n } else {\n return false;\n }\n };\n}\n\nexport function register() {\n ValidatorBuilder.registerHelper('required', function(message) {\n this.using(present, message);\n });\n\n ValidatorBuilder.registerHelper('optional', function() {\n this.when(present);\n });\n\n ValidatorBuilder.registerHelper('email', function(message, options) {\n this.using(checkEmail(options), message);\n });\n\n ValidatorBuilder.registerHelper('minLength', function(minLength, message) {\n this.using(checkMinLength(minLength), message);\n });\n\n ValidatorBuilder.registerHelper('maxLength', function(maxLength, message) {\n this.using(checkMaxLength(maxLength), message);\n });\n}\n","import ObjectValidator from './lgtm/object_validator.js';\nimport Validation from './lgtm/validation.js';\nimport ValidatorBuilder from './lgtm/validator_builder.js';\nimport config from './lgtm/config.js';\nimport { get } from './lgtm/utils.js';\nimport {\n present,\n checkEmail,\n checkMinLength,\n checkMaxLength,\n register as core_register\n} from './lgtm/helpers/core.js';\n\ncore_register();\n\nfunction validator(...validations) {\n return new ValidatorBuilder(...validations);\n}\n\nfunction validates(attr) {\n return new Validation(attr);\n}\n\nfunction register() {\n ValidatorBuilder.registerHelper(...arguments);\n}\n\nfunction unregister() {\n ValidatorBuilder.unregisterHelper(...arguments);\n}\n\nlet helpers = {\n core: {\n present,\n checkEmail,\n checkMinLength,\n checkMaxLength,\n register: core_register\n },\n register,\n unregister\n};\n\nfunction configure(key, value) {\n config[key] = value;\n}\n\nconfigure('defer', () => {\n let Promise = config['Promise'];\n let resolve;\n let reject;\n let promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n if (!resolve || !reject) {\n throw new Error('Configured promise does not behave as expected');\n }\n\n return { promise, resolve, reject };\n});\n\nfunction PromiseProxy(callback) {\n let Promise = getPromise();\n return new Promise(callback);\n}\n\nPromiseProxy.all = (...args) => getPromise().all(...args);\n\nPromiseProxy.race = (...args) => getPromise().race(...args);\n\nPromiseProxy.resolve = (...args) => getPromise().resolve(...args);\n\nPromiseProxy.reject = (...args) => getPromise().reject(...args);\n\nfunction getPromise() {\n let warn = config['warn'];\n\n /* global Promise, RSVP, require */\n if (typeof RSVP !== 'undefined') {\n configure('Promise', RSVP.Promise);\n warn(\n `Implicitly using RSVP.Promise. This will be removed in LGTM 2.0. ` +\n `Instead, use 'LGTM.configure(\"Promise\", RSVP.Promise)' to ` +\n `continue using RSVP promises.`\n );\n return RSVP.Promise;\n }\n\n if (typeof require === 'function') {\n try {\n let { Promise } = require('rsvp');\n configure('Promise', Promise);\n warn(\n `Implicitly using require(\"rsvp\").Promise. This will be removed in LGTM 2.0. ` +\n `Instead, use 'LGTM.configure(\"Promise\", require(\"rsvp\").Promise)' to ` +\n `continue using RSVP promises.`\n );\n return Promise;\n } catch (err) {\n // Ignore errors, just try built-in Promise or fail.\n }\n }\n\n if (typeof Promise === 'function') {\n configure('Promise', Promise);\n return Promise;\n }\n\n throw new Error(\n `'Promise' could not be found. Configure LGTM with your promise library using ` +\n `e.g. 'LGTM.configure(\"Promise\", RSVP.Promise)'.`\n );\n}\n\n/* global console */\nconfigure('Promise', PromiseProxy);\nconfigure('warn', console.warn.bind(console)); // eslint-disable-line no-console\nconfigure('get', (object, property) => {\n let warn = config['warn'];\n\n configure('get', get);\n warn(\n `Implicitly using 'get' implementation that uses a 'get' method when available. ` +\n `This will be removed in LGTM 2.0. Instead, use e.g. 'LGTM.configure(\"get\", Ember.get)' ` +\n `if you rely on this behavior.`\n );\n return get(object, property);\n});\n\nexport { configure, validator, validates, helpers, ObjectValidator };\n"],"names":["keys","object","Object","getOwnPropertyNames","get","property","undefined","getProperties","properties","config","map","prop","contains","array","indexOf","uniq","result","i","length","item","push","resolve","thenable","Promise","accept","all","thenables","ObjectValidator","_validations","_dependencies","validations","forEach","validation","addToValidator","attr","fn","message","list","parentAttribute","dependentsForParent","dependentAttributes","concat","attributes","callback","pop","validationPromises","alreadyValidating","slice","_validateAttribute","promise","then","_collectResults","results","err","value","pair","isValid","dependents","_getDependentsFor","dependent","messages","errors","valid","Validation","_attr","_conditions","_subvalidations","dependencies","predicate","when","Error","conditions","validationWithConditions","validator","addDependentsFor","dependency","addValidation","subvalidation","ValidatorBuilder","_validation","arguments","and","using","name","prototype","apply","present","trim","STRICT_CHARS","EMAIL","checkEmail","options","strictCharacters","test","checkMinLength","minLength","checkMaxLength","maxLength","register","registerHelper","core_register","validates","unregister","unregisterHelper","helpers","configure","key","reject","res","rej","PromiseProxy","getPromise","race","warn","RSVP","require","console","bind"],"mappings":"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"}

@@ -7,29 +7,6 @@ var config = {};

function forEach(iterable, iterator) {
if (typeof iterable.forEach === 'function') {
iterable.forEach(iterator);
} else if ({}.toString.call(iterable) === '[object Object]') {
var hasOwnProp = {}.hasOwnProperty;
for (var key in iterable) {
if (hasOwnProp.call(iterable, key)) {
iterator(iterable[key], key);
}
}
} else {
for (var i = 0; i < iterable.length; i++) {
iterator(iterable[i], i);
}
}
}
function keys(object) {
if (Object.getOwnPropertyNames) {
return Object.getOwnPropertyNames(object);
} else {
var result = [];
forEach(object, function (key) {
result.push(key);
});
return result;
}
return Object.getOwnPropertyNames(object);
}

@@ -98,264 +75,572 @@

function ObjectValidator() {
this._validations = {};
this._dependencies = {};
}
var asyncGenerator = function () {
function AwaitValue(value) {
this.value = value;
}
ObjectValidator.prototype = {
_validations: null,
_dependencies: null,
function AsyncGenerator(gen) {
var front, back;
addValidation: function addValidation(attr, fn, message) {
var list = this._validations[attr];
function send(key, arg) {
return new Promise(function (resolve, reject) {
var request = {
key: key,
arg: arg,
resolve: resolve,
reject: reject,
next: null
};
if (!list) {
list = this._validations[attr] = [];
if (back) {
back = back.next = request;
} else {
front = back = request;
resume(key, arg);
}
});
}
list.push([fn, message]);
},
function resume(key, arg) {
try {
var result = gen[key](arg);
var value = result.value;
// e.g. spouseName (dependentAttribute) depends on maritalStatus (parentAttribute)
addDependentsFor: function addDependentsFor() /* parentAttribute, ...dependentAttributes */{
var dependentAttributes = [].slice.apply(arguments);
var parentAttribute = dependentAttributes.shift();
if (value instanceof AwaitValue) {
Promise.resolve(value.value).then(function (arg) {
resume("next", arg);
}, function (arg) {
resume("throw", arg);
});
} else {
settle(result.done ? "return" : "normal", result.value);
}
} catch (err) {
settle("throw", err);
}
}
var dependentsForParent = this._dependencies[parentAttribute];
function settle(type, value) {
switch (type) {
case "return":
front.resolve({
value: value,
done: true
});
break;
if (!dependentsForParent) {
dependentsForParent = this._dependencies[parentAttribute] = [];
}
case "throw":
front.reject(value);
break;
for (var i = 0; i < dependentAttributes.length; i++) {
var attr = dependentAttributes[i];
if (!contains(dependentsForParent, attr)) {
dependentsForParent.push(attr);
default:
front.resolve({
value: value,
done: false
});
break;
}
front = front.next;
if (front) {
resume(front.key, front.arg);
} else {
back = null;
}
}
},
attributes: function attributes() {
return uniq(keys(this._validations).concat(keys(this._dependencies)));
},
this._invoke = send;
validate: function validate() /* object, attributes..., callback */{
var attributes = [].slice.apply(arguments);
var object = attributes.shift();
var callback = attributes.pop();
var self = this;
if (typeof gen.return !== "function") {
this.return = undefined;
}
}
if (typeof callback === 'string') {
attributes.push(callback);
callback = null;
if (typeof Symbol === "function" && Symbol.asyncIterator) {
AsyncGenerator.prototype[Symbol.asyncIterator] = function () {
return this;
};
}
AsyncGenerator.prototype.next = function (arg) {
return this._invoke("next", arg);
};
AsyncGenerator.prototype.throw = function (arg) {
return this._invoke("throw", arg);
};
AsyncGenerator.prototype.return = function (arg) {
return this._invoke("return", arg);
};
return {
wrap: function (fn) {
return function () {
return new AsyncGenerator(fn.apply(this, arguments));
};
},
await: function (value) {
return new AwaitValue(value);
}
};
}();
if (attributes.length === 0) {
attributes = keys(this._validations);
var classCallCheck = function (instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
};
var createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
var validationPromises = [];
var alreadyValidating = attributes.slice();
for (var i = 0; i < attributes.length; i++) {
var attr = attributes[i];
validationPromises = validationPromises.concat(this._validateAttribute(object, attr, alreadyValidating));
return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var toConsumableArray = function (arr) {
if (Array.isArray(arr)) {
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
return arr2;
} else {
return Array.from(arr);
}
};
var ObjectValidator = function () {
function ObjectValidator() {
var _this = this;
classCallCheck(this, ObjectValidator);
this._validations = {};
this._dependencies = {};
for (var _len = arguments.length, validations = Array(_len), _key = 0; _key < _len; _key++) {
validations[_key] = arguments[_key];
}
var promise = all(validationPromises).then(function (results) {
results = self._collectResults(results);
if (callback) {
callback(null, results);
validations.forEach(function (validation) {
return validation.addToValidator(_this);
});
}
createClass(ObjectValidator, [{
key: 'addValidation',
value: function addValidation(attr, fn, message) {
var list = this._validations[attr];
if (!list) {
list = this._validations[attr] = [];
}
return results;
}, function (err) {
if (callback) {
callback(err);
list.push([fn, message]);
}
// e.g. spouseName (dependentAttribute) depends on maritalStatus (parentAttribute)
}, {
key: 'addDependentsFor',
value: function addDependentsFor(parentAttribute) {
var dependentsForParent = this._dependencies[parentAttribute];
if (!dependentsForParent) {
dependentsForParent = this._dependencies[parentAttribute] = [];
}
throw err;
});
if (!callback) {
return promise;
for (var _len2 = arguments.length, dependentAttributes = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
dependentAttributes[_key2 - 1] = arguments[_key2];
}
for (var i = 0; i < dependentAttributes.length; i++) {
var attr = dependentAttributes[i];
if (!contains(dependentsForParent, attr)) {
dependentsForParent.push(attr);
}
}
}
},
}, {
key: 'attributes',
value: function attributes() {
return uniq(keys(this._validations).concat(keys(this._dependencies)));
}
}, {
key: 'validate',
value: function validate(object) {
var _this2 = this;
_validateAttribute: function _validateAttribute(object, attr, alreadyValidating) {
var value = config.get(object, attr);
var validations = this._validations[attr];
var results = [];
for (var _len3 = arguments.length, attributes = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
attributes[_key3 - 1] = arguments[_key3];
}
if (validations) {
validations.forEach(function (pair) {
var fn = pair[0];
var message = pair[1];
var callback = null;
var promise = resolve().then(function () {
return fn(value, attr, object);
}).then(function (isValid) {
return [attr, isValid ? null : message];
});
if (typeof attributes[attributes.length - 1] !== 'string') {
callback = attributes.pop();
}
results.push(promise);
if (attributes.length === 0) {
attributes = keys(this._validations);
}
var validationPromises = [];
var alreadyValidating = attributes.slice();
for (var i = 0; i < attributes.length; i++) {
var attr = attributes[i];
validationPromises = validationPromises.concat(this._validateAttribute(object, attr, alreadyValidating));
}
var promise = all(validationPromises).then(function (results) {
results = _this2._collectResults(results);
if (callback) {
callback(null, results);
}
return results;
}, function (err) {
if (callback) {
callback(err);
}
throw err;
});
} else if (contains(this.attributes(), attr)) {
results.push([attr, null]);
}
var dependents = this._getDependentsFor(attr);
for (var i = 0; i < dependents.length; i++) {
var dependent = dependents[i];
if (alreadyValidating.indexOf(dependent) < 0) {
alreadyValidating.push(dependent);
results = results.concat(this._validateAttribute(object, dependent, alreadyValidating));
if (!callback) {
return promise;
}
}
}, {
key: '_validateAttribute',
value: function _validateAttribute(object, attr, alreadyValidating) {
var value = config.get(object, attr);
var validations = this._validations[attr];
var results = [];
return results;
},
if (validations) {
validations.forEach(function (pair) {
var fn = pair[0];
var message = pair[1];
_collectResults: function _collectResults(results) {
var result = {
valid: true,
errors: {}
};
var promise = resolve().then(function () {
return fn(value, attr, object);
}).then(function (isValid) {
return [attr, isValid ? null : message];
});
for (var i = 0; i < results.length; i++) {
if (!results[i]) {
continue;
results.push(promise);
});
} else if (contains(this.attributes(), attr)) {
results.push([attr, null]);
}
var attr = results[i][0];
var message = results[i][1];
var messages = result.errors[attr];
var dependents = this._getDependentsFor(attr);
for (var i = 0; i < dependents.length; i++) {
var dependent = dependents[i];
if (alreadyValidating.indexOf(dependent) < 0) {
alreadyValidating.push(dependent);
results = results.concat(this._validateAttribute(object, dependent, alreadyValidating));
}
}
if (!messages) {
messages = result.errors[attr] = [];
return results;
}
}, {
key: '_collectResults',
value: function _collectResults(results) {
var result = {
valid: true,
errors: {}
};
for (var i = 0; i < results.length; i++) {
if (!results[i]) {
continue;
}
var attr = results[i][0];
var message = results[i][1];
var messages = result.errors[attr];
if (!messages) {
messages = result.errors[attr] = [];
}
if (message) {
messages.push(message);
result.valid = false;
}
}
if (message) {
messages.push(message);
result.valid = false;
}
return result;
}
return result;
},
// e.g. getDependents("maritalStatus") # => ["spouseName"]
// e.g. getDependents("maritalStatus") # => ["spouseName"]
_getDependentsFor: function _getDependentsFor(parentAttribute) {
return (this._dependencies[parentAttribute] || []).slice();
}, {
key: '_getDependentsFor',
value: function _getDependentsFor(parentAttribute) {
return (this._dependencies[parentAttribute] || []).slice();
}
}]);
return ObjectValidator;
}();
var Validation = function () {
function Validation(attr) {
classCallCheck(this, Validation);
this._attr = null;
this._conditions = [];
this._subvalidations = [];
this._dependencies = [];
this._attr = attr;
}
};
function ValidatorBuilder() {
this._validator = new ObjectValidator();
}
createClass(Validation, [{
key: 'when',
value: function when() /*, predicate */{
for (var _len = arguments.length, dependencies = Array(_len), _key = 0; _key < _len; _key++) {
dependencies[_key] = arguments[_key];
}
ValidatorBuilder.prototype = {
_attr: null,
_conditions: null,
_conditionDependencies: null,
_validator: null,
var predicate = dependencies.pop();
validates: function validates(attr) {
this._attr = attr;
this._conditions = [];
this._conditionDependencies = [];
return this;
},
if (dependencies.length === 0) {
dependencies = [this._attr];
}
when: function when() /* ...dependencies, condition */{
var dependencies = [].slice.apply(arguments);
var condition = dependencies.pop();
this._conditions.push({
predicate: predicate,
dependencies: dependencies
});
if (dependencies.length === 0) {
dependencies = [this._attr];
return this;
}
}, {
key: 'and',
value: function and() {
return this.when.apply(this, arguments);
}
}, {
key: 'using',
value: function using() /*, predicate, message */{
for (var _len2 = arguments.length, dependencies = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
dependencies[_key2] = arguments[_key2];
}
for (var i = 0; i < dependencies.length; i++) {
var dependency = dependencies[i];
if (dependency !== this._attr) {
this._validator.addDependentsFor(dependency, this._attr);
var message = dependencies.pop();
var predicate = dependencies.pop();
if (typeof message === 'undefined') {
throw new Error('expected a message but got: ' + message);
}
}
this._conditions.push(condition);
this._conditionDependencies.push(dependencies);
return this;
},
if (typeof message === 'function' && typeof predicate === 'undefined') {
throw new Error('missing expected argument `message` after predicate function');
}
and: function and() /* ...dependencies, condition */{
return this.when.apply(this, arguments);
},
if (dependencies.length === 0) {
dependencies = [this._attr];
}
using: function using() /* ...dependencies, predicate, message */{
var dependencies = [].slice.apply(arguments);
var message = dependencies.pop();
var predicate = dependencies.pop();
function validation(value, attr, object) {
var properties = getProperties(object, dependencies);
return predicate.apply(undefined, toConsumableArray(properties).concat([attr, object]));
}
if (typeof message === 'undefined') {
throw new Error('expected a message but got: ' + message);
}
var conditions = this._conditions.slice();
if (typeof message === 'function' && typeof predicate === 'undefined') {
throw new Error('missing expected argument `message` after predicate function');
}
function validationWithConditions(value, attr, object) {
return all(conditions.map(function (_ref) {
var predicate = _ref.predicate,
dependencies = _ref.dependencies;
if (dependencies.length === 0) {
dependencies = [this._attr];
}
var properties = getProperties(object, dependencies);
return predicate.apply(undefined, toConsumableArray(properties).concat([attr, object]));
})).then(function (results) {
for (var i = 0; i < results.length; i += 1) {
// a condition resolved to a falsy value; return as valid
if (!results[i]) {
return true;
}
}
for (var i = 0; i < dependencies.length; i++) {
var dependency = dependencies[i];
if (dependency !== this._attr) {
this._validator.addDependentsFor(dependency, this._attr);
// all conditions resolved to truthy values; continue with validation
return validation(value, attr, object);
});
}
this._subvalidations.push({
dependencies: dependencies,
validation: conditions ? validationWithConditions : validation,
message: message
});
return this;
}
}, {
key: 'addToValidator',
value: function addToValidator(validator) {
var _this = this;
function validation(value, attr, object) {
var properties = getProperties(object, dependencies);
return predicate.apply(null, properties.concat([attr, object]));
this.dependencies().forEach(function (dependency) {
validator.addDependentsFor(dependency, _this._attr);
});
this._subvalidations.forEach(function (subvalidation) {
validator.addValidation(_this._attr, subvalidation.validation, subvalidation.message);
});
}
}, {
key: 'dependencies',
value: function dependencies() {
var dependencies = [];
var conditions = this._conditions.slice();
var conditionDependencies = this._conditionDependencies.slice();
this._conditions.forEach(function (condition) {
condition.dependencies.forEach(function (dependency) {
dependencies.push(dependency);
});
});
function validationWithConditions(value, attr, object) {
return all(conditions.map(function (condition, i) {
var dependencies = conditionDependencies[i];
var properties = getProperties(object, dependencies);
return condition.apply(null, properties.concat([attr, object]));
})).then(function (results) {
for (var i = 0; i < results.length; i++) {
// a condition resolved to a falsy value; return as valid
if (!results[i]) {
return true;
}
}
// all conditions resolved to truthy values; continue with validation
return validation(value, attr, object);
this._subvalidations.forEach(function (subvalidation) {
subvalidation.dependencies.forEach(function (dependency) {
dependencies.push(dependency);
});
});
return dependencies;
}
}]);
return Validation;
}();
this._validator.addValidation(this._attr, conditions ? validationWithConditions : validation, message);
return this;
},
var ValidatorBuilder = function () {
function ValidatorBuilder() {
classCallCheck(this, ValidatorBuilder);
this._validations = null;
this._validation = null;
build: function build() {
return this._validator;
for (var _len = arguments.length, validations = Array(_len), _key = 0; _key < _len; _key++) {
validations[_key] = arguments[_key];
}
this._validations = validations;
}
};
ValidatorBuilder.registerHelper = function (name, fn) {
this.prototype[name] = function () {
fn.apply(this, arguments);
return this;
};
return null;
};
createClass(ValidatorBuilder, [{
key: 'validates',
value: function validates(attr) {
this._validation = new Validation(attr);
this._validations.push(this._validation);
return this;
}
}, {
key: 'when',
value: function when() /* ...dependencies, condition */{
var _validation;
ValidatorBuilder.unregisterHelper = function (name) {
delete this.prototype[name];
return null;
};
(_validation = this._validation).when.apply(_validation, arguments);
return this;
}
}, {
key: 'and',
value: function and() /* ...dependencies, condition */{
var _validation2;
(_validation2 = this._validation).and.apply(_validation2, arguments);
return this;
}
}, {
key: 'using',
value: function using() /* ...dependencies, predicate, message */{
var _validation3;
(_validation3 = this._validation).using.apply(_validation3, arguments);
return this;
}
}, {
key: 'build',
value: function build() {
return new (Function.prototype.bind.apply(ObjectValidator, [null].concat(toConsumableArray(this._validations))))();
}
}], [{
key: 'registerHelper',
value: function registerHelper(name, fn) {
this.prototype[name] = function () {
fn.apply(this._validation, arguments);
return this;
};
Validation.prototype[name] = function () {
fn.apply(this, arguments);
return this;
};
return null;
}
}, {
key: 'unregisterHelper',
value: function unregisterHelper(name) {
delete this.prototype[name];
delete Validation.prototype[name];
return null;
}
}]);
return ValidatorBuilder;
}();
function present(value) {

@@ -371,8 +656,6 @@ if (typeof value === 'string') {

// http://stackoverflow.com/a/46181/11236
var EMAIL = /^(([^<>()\[\]\\.,;:\s@\"]+(\.[^<>()\[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
var EMAIL = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
function checkEmail(options) {
if (!options) {
options = {};
}
function checkEmail() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

@@ -447,6 +730,14 @@ return function (value) {

function validator() {
return new ValidatorBuilder();
for (var _len = arguments.length, validations = Array(_len), _key = 0; _key < _len; _key++) {
validations[_key] = arguments[_key];
}
return new (Function.prototype.bind.apply(ValidatorBuilder, [null].concat(validations)))();
}
function register() {
function validates(attr) {
return new Validation(attr);
}
function register$$1() {
ValidatorBuilder.registerHelper.apply(ValidatorBuilder, arguments);

@@ -467,3 +758,3 @@ }

},
register: register,
register: register$$1,
unregister: unregister

@@ -478,14 +769,14 @@ };

var Promise = config['Promise'];
var resolve = void 0;
var resolve$$1 = void 0;
var reject = void 0;
var promise = new Promise(function (res, rej) {
resolve = res;
resolve$$1 = res;
reject = rej;
});
if (!resolve || !reject) {
if (!resolve$$1 || !reject) {
throw new Error('Configured promise does not behave as expected');
}
return { promise: promise, resolve: resolve, reject: reject };
return { promise: promise, resolve: resolve$$1, reject: reject };
});

@@ -534,3 +825,5 @@

try {
var _Promise = require('rsvp').Promise;
var _require = require('rsvp'),
_Promise = _require.Promise;
configure('Promise', _Promise);

@@ -563,3 +856,3 @@ warn('Implicitly using require("rsvp").Promise. This will be removed in LGTM 2.0. ' + 'Instead, use \'LGTM.configure("Promise", require("rsvp").Promise)\' to ' + 'continue using RSVP promises.');

export { configure, validator, helpers, ObjectValidator };
//# sourceMappingURL=lgtm.mjs.map
export { configure, validator, validates, helpers, ObjectValidator };
//# sourceMappingURL=lgtm.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"lgtm.mjs","sources":["../src/lgtm/config.js","../src/lgtm/utils.js","../src/lgtm/object_validator.js","../src/lgtm/validator_builder.js","../src/lgtm/helpers/core.js","../src/lgtm.js"],"sourcesContent":["export default {};\n","import config from './config.js';\n\n/**\n * Iteration\n */\n\nfunction forEach(iterable, iterator) {\n if (typeof iterable.forEach === 'function') {\n iterable.forEach(iterator);\n } else if ({}.toString.call(iterable) === '[object Object]') {\n var hasOwnProp = {}.hasOwnProperty;\n for (var key in iterable) {\n if (hasOwnProp.call(iterable, key)) {\n iterator(iterable[key], key);\n }\n }\n } else {\n for (var i = 0; i < iterable.length; i++) {\n iterator(iterable[i], i);\n }\n }\n}\n\nfunction keys(object) {\n if (Object.getOwnPropertyNames) {\n return Object.getOwnPropertyNames(object);\n } else {\n var result = [];\n forEach(object, function(key) {\n result.push(key);\n });\n return result;\n }\n}\n\nexport { forEach, keys };\n\n\n/**\n * Property access\n */\n\nfunction get(object, property) {\n if (object === null || object === undefined) {\n return;\n } else if (typeof object.get === 'function') {\n return object.get(property);\n } else {\n return object[property];\n }\n}\n\nfunction getProperties(object, properties) {\n let { get } = config;\n return properties.map(prop => get(object, prop));\n}\n\nexport { get, getProperties };\n\n\n/**\n * Array manipulation\n */\n\nfunction contains(array, object) {\n return array.indexOf(object) > -1;\n}\n\nfunction uniq(array) {\n var result = [];\n\n for (var i = 0; i < array.length; i++) {\n var item = array[i];\n if (!contains(result, item)) {\n result.push(item);\n }\n }\n\n return result;\n}\n\nexport { contains, uniq };\n\n\n/**\n * Promises\n */\n\nfunction resolve(thenable) {\n let { Promise } = config;\n return new Promise(accept => accept(thenable));\n}\n\nfunction all(thenables) {\n let { Promise } = config;\n return Promise.all(thenables);\n}\n\nexport { resolve, all };\n","import config from './config.js';\nimport { all, resolve, contains, keys, uniq } from './utils.js';\n\nfunction ObjectValidator() {\n this._validations = {};\n this._dependencies = {};\n}\n\nObjectValidator.prototype = {\n _validations : null,\n _dependencies : null,\n\n addValidation: function(attr, fn, message) {\n var list = this._validations[attr];\n\n if (!list) {\n list = this._validations[attr] = [];\n }\n\n list.push([fn, message]);\n },\n\n // e.g. spouseName (dependentAttribute) depends on maritalStatus (parentAttribute)\n addDependentsFor: function(/* parentAttribute, ...dependentAttributes */) {\n var dependentAttributes = [].slice.apply(arguments);\n var parentAttribute = dependentAttributes.shift();\n\n var dependentsForParent = this._dependencies[parentAttribute];\n\n if (!dependentsForParent) {\n dependentsForParent = this._dependencies[parentAttribute] = [];\n }\n\n for (var i = 0; i < dependentAttributes.length; i++) {\n var attr = dependentAttributes[i];\n if (!contains(dependentsForParent, attr)) {\n dependentsForParent.push(attr);\n }\n }\n },\n\n attributes: function() {\n return uniq(\n keys(this._validations).concat(\n keys(this._dependencies)\n )\n );\n },\n\n validate: function(/* object, attributes..., callback */) {\n var attributes = [].slice.apply(arguments);\n var object = attributes.shift();\n var callback = attributes.pop();\n var self = this;\n\n if (typeof callback === 'string') {\n attributes.push(callback);\n callback = null;\n }\n\n if (attributes.length === 0) {\n attributes = keys(this._validations);\n }\n\n var validationPromises = [];\n var alreadyValidating = attributes.slice();\n for (var i = 0; i < attributes.length; i++) {\n var attr = attributes[i];\n validationPromises = validationPromises.concat(\n this._validateAttribute(object, attr, alreadyValidating));\n }\n\n var promise = all(validationPromises).then(\n function(results) {\n results = self._collectResults(results);\n if (callback) {\n callback(null, results);\n }\n return results;\n },\n function(err) {\n if (callback) {\n callback(err);\n }\n throw err;\n });\n\n if (!callback) {\n return promise;\n }\n },\n\n _validateAttribute: function(object, attr, alreadyValidating) {\n var value = config.get(object, attr);\n var validations = this._validations[attr];\n var results = [];\n\n if (validations) {\n validations.forEach(function(pair) {\n var fn = pair[0];\n var message = pair[1];\n\n var promise = resolve()\n .then(function() {\n return fn(value, attr, object);\n })\n .then(function(isValid) {\n return [ attr, isValid ? null : message ];\n });\n\n results.push(promise);\n });\n } else if (contains(this.attributes(), attr)) {\n results.push([ attr, null ]);\n }\n\n var dependents = this._getDependentsFor(attr);\n for (var i = 0; i < dependents.length; i++) {\n var dependent = dependents[i];\n if (alreadyValidating.indexOf(dependent) < 0) {\n alreadyValidating.push(dependent);\n results = results.concat(this._validateAttribute(object, dependent, alreadyValidating));\n }\n }\n\n return results;\n },\n\n _collectResults: function(results) {\n var result = {\n valid : true,\n errors : {}\n };\n\n for (var i = 0; i < results.length; i++) {\n if (!results[i]) { continue; }\n\n var attr = results[i][0];\n var message = results[i][1];\n var messages = result.errors[attr];\n\n if (!messages) {\n messages = result.errors[attr] = [];\n }\n\n if (message) {\n messages.push(message);\n result.valid = false;\n }\n }\n\n return result;\n },\n\n // e.g. getDependents(\"maritalStatus\") # => [\"spouseName\"]\n _getDependentsFor: function(parentAttribute) {\n return (this._dependencies[parentAttribute] || []).slice();\n }\n};\n\nexport default ObjectValidator;\n","import ObjectValidator from './object_validator.js';\nimport { getProperties, all } from './utils.js';\n\nfunction ValidatorBuilder() {\n this._validator = new ObjectValidator();\n}\n\nValidatorBuilder.prototype = {\n _attr : null,\n _conditions : null,\n _conditionDependencies : null,\n _validator : null,\n\n validates: function(attr) {\n this._attr = attr;\n this._conditions = [];\n this._conditionDependencies = [];\n return this;\n },\n\n when: function(/* ...dependencies, condition */) {\n var dependencies = [].slice.apply(arguments);\n var condition = dependencies.pop();\n\n if (dependencies.length === 0) {\n dependencies = [this._attr];\n }\n\n for (var i = 0; i < dependencies.length; i++) {\n var dependency = dependencies[i];\n if (dependency !== this._attr) {\n this._validator.addDependentsFor(dependency, this._attr);\n }\n }\n\n this._conditions.push(condition);\n this._conditionDependencies.push(dependencies);\n return this;\n },\n\n and: function(/* ...dependencies, condition */) {\n return this.when.apply(this, arguments);\n },\n\n using: function(/* ...dependencies, predicate, message */) {\n var dependencies = [].slice.apply(arguments);\n var message = dependencies.pop();\n var predicate = dependencies.pop();\n\n if (typeof message === 'undefined') {\n throw new Error(`expected a message but got: ${message}`);\n }\n\n if (typeof message === 'function' && typeof predicate === 'undefined') {\n throw new Error('missing expected argument `message` after predicate function');\n }\n\n if (dependencies.length === 0) {\n dependencies = [this._attr];\n }\n\n for (var i = 0; i < dependencies.length; i++) {\n var dependency = dependencies[i];\n if (dependency !== this._attr) {\n this._validator.addDependentsFor(dependency, this._attr);\n }\n }\n\n function validation(value, attr, object) {\n var properties = getProperties(object, dependencies);\n return predicate.apply(null, properties.concat([attr, object]));\n }\n\n var conditions = this._conditions.slice();\n var conditionDependencies = this._conditionDependencies.slice();\n\n function validationWithConditions(value, attr, object) {\n return all(conditions.map(function(condition, i) {\n var dependencies = conditionDependencies[i];\n var properties = getProperties(object, dependencies);\n return condition.apply(null, properties.concat([attr, object]));\n })).then(function(results) {\n for (var i = 0; i < results.length; i++) {\n // a condition resolved to a falsy value; return as valid\n if (!results[i]) {\n return true;\n }\n }\n // all conditions resolved to truthy values; continue with validation\n return validation(value, attr, object);\n });\n }\n\n this._validator.addValidation(\n this._attr,\n conditions ? validationWithConditions : validation,\n message\n );\n return this;\n },\n\n build: function() {\n return this._validator;\n }\n};\n\nValidatorBuilder.registerHelper = function(name, fn) {\n this.prototype[name] = function() {\n fn.apply(this, arguments);\n return this;\n };\n return null;\n};\n\nValidatorBuilder.unregisterHelper = function(name) {\n delete this.prototype[name];\n return null;\n};\n\nexport default ValidatorBuilder;\n","import ValidatorBuilder from '../validator_builder.js';\n\nfunction present(value) {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n return value !== '' && value !== null && value !== undefined;\n}\n\nconst STRICT_CHARS = /^[\\x20-\\x7F]*$/;\n// http://stackoverflow.com/a/46181/11236\nconst EMAIL = /^(([^<>()\\[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\nfunction checkEmail(options) {\n if (!options) {\n options = {};\n }\n\n return function(value) {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n if (options.strictCharacters) {\n if (!STRICT_CHARS.test(value)) {\n return false;\n }\n }\n\n return EMAIL.test(value);\n };\n}\n\nfunction checkMinLength(minLength) {\n if (minLength === null || minLength === undefined) {\n throw new Error('must specify a min length');\n }\n\n return function(value) {\n if (value !== null && value !== undefined) {\n return value.length >= minLength;\n } else {\n return false;\n }\n };\n}\n\nfunction checkMaxLength(maxLength) {\n if (maxLength === null || maxLength === undefined) {\n throw new Error('must specify a max length');\n }\n\n return function(value) {\n if (value !== null && value !== undefined) {\n return value.length <= maxLength;\n } else {\n return false;\n }\n };\n}\n\nfunction register() {\n ValidatorBuilder.registerHelper('required', function(message) {\n this.using(present, message);\n });\n\n ValidatorBuilder.registerHelper('optional', function() {\n this.when(present);\n });\n\n ValidatorBuilder.registerHelper('email', function(message, options) {\n this.using(checkEmail(options), message);\n });\n\n ValidatorBuilder.registerHelper('minLength', function(minLength, message) {\n this.using(checkMinLength(minLength), message);\n });\n\n ValidatorBuilder.registerHelper('maxLength', function(maxLength, message) {\n this.using(checkMaxLength(maxLength), message);\n });\n}\n\nexport { present, checkEmail, checkMinLength, checkMaxLength, register };\n","import ObjectValidator from './lgtm/object_validator.js';\nimport ValidatorBuilder from './lgtm/validator_builder.js';\nimport config from './lgtm/config.js';\nimport { get } from './lgtm/utils.js';\nimport { present, checkEmail, checkMinLength, checkMaxLength, register as core_register } from './lgtm/helpers/core.js';\n\ncore_register();\n\nfunction validator() {\n return new ValidatorBuilder();\n}\n\nfunction register() {\n ValidatorBuilder.registerHelper.apply(ValidatorBuilder, arguments);\n}\n\nfunction unregister() {\n ValidatorBuilder.unregisterHelper.apply(ValidatorBuilder, arguments);\n}\n\nvar helpers = {\n core: {\n present: present,\n checkEmail: checkEmail,\n checkMinLength: checkMinLength,\n checkMaxLength: checkMaxLength,\n register: core_register\n },\n register: register,\n unregister: unregister\n};\n\nfunction configure(key, value) {\n config[key] = value;\n}\n\nconfigure('defer', () => {\n let Promise = config['Promise'];\n let resolve;\n let reject;\n let promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n if (!resolve || !reject) {\n throw new Error('Configured promise does not behave as expected');\n }\n\n return { promise, resolve, reject };\n});\n\nfunction PromiseProxy(callback) {\n let Promise = getPromise();\n return new Promise(callback);\n}\n\nPromiseProxy.all = function(...args) {\n return getPromise().all(...args);\n};\n\nPromiseProxy.race = function(...args) {\n return getPromise().race(...args);\n};\n\nPromiseProxy.resolve = function(...args) {\n return getPromise().resolve(...args);\n};\n\nPromiseProxy.reject = function(...args) {\n return getPromise().reject(...args);\n};\n\nfunction getPromise() {\n let warn = config['warn'];\n\n /* global Promise, RSVP, require */\n if (typeof RSVP !== 'undefined') {\n configure('Promise', RSVP.Promise);\n warn(\n `Implicitly using RSVP.Promise. This will be removed in LGTM 2.0. ` +\n `Instead, use 'LGTM.configure(\"Promise\", RSVP.Promise)' to ` +\n `continue using RSVP promises.`\n );\n return RSVP.Promise;\n }\n\n if (typeof require === 'function') {\n try {\n let Promise = require('rsvp').Promise;\n configure('Promise', Promise);\n warn(\n `Implicitly using require(\"rsvp\").Promise. This will be removed in LGTM 2.0. ` +\n `Instead, use 'LGTM.configure(\"Promise\", require(\"rsvp\").Promise)' to ` +\n `continue using RSVP promises.`\n );\n return Promise;\n } catch (err) {\n // Ignore errors, just try built-in Promise or fail.\n }\n }\n\n if (typeof Promise === 'function') {\n configure('Promise', Promise);\n return Promise;\n }\n\n throw new Error(\n `'Promise' could not be found. Configure LGTM with your promise library using ` +\n `e.g. 'LGTM.configure(\"Promise\", RSVP.Promise)'.`\n );\n}\n\n/* global console */\nconfigure('Promise', PromiseProxy);\nconfigure('warn', console.warn.bind(console)); // eslint-disable-line no-console\nconfigure('get', (object, property) => {\n let warn = config['warn'];\n\n configure('get', get);\n warn(\n `Implicitly using 'get' implementation that uses a 'get' method when available. ` +\n `This will be removed in LGTM 2.0. Instead, use e.g. 'LGTM.configure(\"get\", Ember.get)' ` +\n `if you rely on this behavior.`\n );\n return get(object, property);\n});\n\nexport { configure, validator, helpers, ObjectValidator };\n"],"names":["register","core_register"],"mappings":"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"}
{"version":3,"file":"lgtm.mjs","sources":["../src/lgtm/config.js","../src/lgtm/utils.js","../src/lgtm/object_validator.js","../src/lgtm/validation.js","../src/lgtm/validator_builder.js","../src/lgtm/helpers/core.js","../src/lgtm.js"],"sourcesContent":["export default {};\n","import config from './config.js';\n\n/**\n * Iteration\n */\n\nexport function forEach(iterable, iterator) {\n if (typeof iterable.forEach === 'function') {\n iterable.forEach(iterator);\n } else if ({}.toString.call(iterable) === '[object Object]') {\n let hasOwnProp = {}.hasOwnProperty;\n for (let key in iterable) {\n if (hasOwnProp.call(iterable, key)) {\n iterator(iterable[key], key);\n }\n }\n } else {\n for (let i = 0; i < iterable.length; i++) {\n iterator(iterable[i], i);\n }\n }\n}\n\nexport function keys(object) {\n return Object.getOwnPropertyNames(object);\n}\n\n/**\n * Property access\n */\n\nexport function get(object, property) {\n if (object === null || object === undefined) {\n return;\n } else if (typeof object.get === 'function') {\n return object.get(property);\n } else {\n return object[property];\n }\n}\n\nexport function getProperties(object, properties) {\n let { get } = config;\n return properties.map(prop => get(object, prop));\n}\n\n/**\n * Array manipulation\n */\n\nexport function contains(array, object) {\n return array.indexOf(object) > -1;\n}\n\nexport function uniq(array) {\n let result = [];\n\n for (let i = 0; i < array.length; i++) {\n let item = array[i];\n if (!contains(result, item)) {\n result.push(item);\n }\n }\n\n return result;\n}\n\n/**\n * Promises\n */\n\nexport function resolve(thenable) {\n let { Promise } = config;\n return new Promise(accept => accept(thenable));\n}\n\nexport function all(thenables) {\n let { Promise } = config;\n return Promise.all(thenables);\n}\n","import config from './config.js';\nimport { all, resolve, contains, keys, uniq } from './utils.js';\n\nexport default class ObjectValidator {\n _validations = {};\n _dependencies = {};\n\n constructor(...validations) {\n validations.forEach(validation => validation.addToValidator(this));\n }\n\n addValidation(attr, fn, message) {\n let list = this._validations[attr];\n\n if (!list) {\n list = this._validations[attr] = [];\n }\n\n list.push([fn, message]);\n }\n\n // e.g. spouseName (dependentAttribute) depends on maritalStatus (parentAttribute)\n addDependentsFor(parentAttribute, ...dependentAttributes) {\n let dependentsForParent = this._dependencies[parentAttribute];\n\n if (!dependentsForParent) {\n dependentsForParent = this._dependencies[parentAttribute] = [];\n }\n\n for (let i = 0; i < dependentAttributes.length; i++) {\n let attr = dependentAttributes[i];\n if (!contains(dependentsForParent, attr)) {\n dependentsForParent.push(attr);\n }\n }\n }\n\n attributes() {\n return uniq(keys(this._validations).concat(keys(this._dependencies)));\n }\n\n validate(object, ...attributes) {\n let callback = null;\n\n if (typeof attributes[attributes.length - 1] !== 'string') {\n callback = attributes.pop();\n }\n\n if (attributes.length === 0) {\n attributes = keys(this._validations);\n }\n\n let validationPromises = [];\n let alreadyValidating = attributes.slice();\n for (let i = 0; i < attributes.length; i++) {\n let attr = attributes[i];\n validationPromises = validationPromises.concat(\n this._validateAttribute(object, attr, alreadyValidating)\n );\n }\n\n let self = this;\n let promise = all(validationPromises).then(\n results => {\n results = this._collectResults(results);\n if (callback) {\n callback(null, results);\n }\n return results;\n },\n err => {\n if (callback) {\n callback(err);\n }\n throw err;\n }\n );\n\n if (!callback) {\n return promise;\n }\n }\n\n _validateAttribute(object, attr, alreadyValidating) {\n let value = config.get(object, attr);\n let validations = this._validations[attr];\n let results = [];\n\n if (validations) {\n validations.forEach(function(pair) {\n let fn = pair[0];\n let message = pair[1];\n\n let promise = resolve()\n .then(() => fn(value, attr, object))\n .then(isValid => [attr, isValid ? null : message]);\n\n results.push(promise);\n });\n } else if (contains(this.attributes(), attr)) {\n results.push([attr, null]);\n }\n\n let dependents = this._getDependentsFor(attr);\n for (let i = 0; i < dependents.length; i++) {\n let dependent = dependents[i];\n if (alreadyValidating.indexOf(dependent) < 0) {\n alreadyValidating.push(dependent);\n results = results.concat(\n this._validateAttribute(object, dependent, alreadyValidating)\n );\n }\n }\n\n return results;\n }\n\n _collectResults(results) {\n let result = {\n valid: true,\n errors: {}\n };\n\n for (let i = 0; i < results.length; i++) {\n if (!results[i]) {\n continue;\n }\n\n let attr = results[i][0];\n let message = results[i][1];\n let messages = result.errors[attr];\n\n if (!messages) {\n messages = result.errors[attr] = [];\n }\n\n if (message) {\n messages.push(message);\n result.valid = false;\n }\n }\n\n return result;\n }\n\n // e.g. getDependents(\"maritalStatus\") # => [\"spouseName\"]\n _getDependentsFor(parentAttribute) {\n return (this._dependencies[parentAttribute] || []).slice();\n }\n}\n","import { getProperties, all } from './utils.js';\n\nexport default class Validation {\n _attr = null;\n _conditions = [];\n _subvalidations = [];\n _dependencies = [];\n\n constructor(attr) {\n this._attr = attr;\n }\n\n when(...dependencies /*, predicate */) {\n const predicate = dependencies.pop();\n\n if (dependencies.length === 0) {\n dependencies = [this._attr];\n }\n\n this._conditions.push({\n predicate,\n dependencies\n });\n\n return this;\n }\n\n and(...args) {\n return this.when(...args);\n }\n\n using(...dependencies /*, predicate, message */) {\n const message = dependencies.pop();\n const predicate = dependencies.pop();\n\n if (typeof message === 'undefined') {\n throw new Error(`expected a message but got: ${message}`);\n }\n\n if (typeof message === 'function' && typeof predicate === 'undefined') {\n throw new Error(\n 'missing expected argument `message` after predicate function'\n );\n }\n\n if (dependencies.length === 0) {\n dependencies = [this._attr];\n }\n\n function validation(value, attr, object) {\n const properties = getProperties(object, dependencies);\n return predicate(...properties, attr, object);\n }\n\n const conditions = this._conditions.slice();\n\n function validationWithConditions(value, attr, object) {\n return all(\n conditions.map(({ predicate, dependencies }) => {\n const properties = getProperties(object, dependencies);\n return predicate(...properties, attr, object);\n })\n ).then(results => {\n for (let i = 0; i < results.length; i += 1) {\n // a condition resolved to a falsy value; return as valid\n if (!results[i]) {\n return true;\n }\n }\n\n // all conditions resolved to truthy values; continue with validation\n return validation(value, attr, object);\n });\n }\n\n this._subvalidations.push({\n dependencies,\n validation: conditions ? validationWithConditions : validation,\n message\n });\n\n return this;\n }\n\n addToValidator(validator) {\n this.dependencies().forEach(dependency => {\n validator.addDependentsFor(dependency, this._attr);\n });\n\n this._subvalidations.forEach(subvalidation => {\n validator.addValidation(\n this._attr,\n subvalidation.validation,\n subvalidation.message\n );\n });\n }\n\n dependencies() {\n const dependencies = [];\n\n this._conditions.forEach(condition => {\n condition.dependencies.forEach(dependency => {\n dependencies.push(dependency);\n });\n });\n\n this._subvalidations.forEach(subvalidation => {\n subvalidation.dependencies.forEach(dependency => {\n dependencies.push(dependency);\n });\n });\n\n return dependencies;\n }\n}\n","import ObjectValidator from './object_validator.js';\nimport Validation from './validation';\n\nexport default class ValidatorBuilder {\n _validations = null;\n _validation = null;\n\n constructor(...validations) {\n this._validations = validations;\n }\n\n validates(attr) {\n this._validation = new Validation(attr);\n this._validations.push(this._validation);\n return this;\n }\n\n when(/* ...dependencies, condition */) {\n this._validation.when(...arguments);\n return this;\n }\n\n and(/* ...dependencies, condition */) {\n this._validation.and(...arguments);\n return this;\n }\n\n using(/* ...dependencies, predicate, message */) {\n this._validation.using(...arguments);\n return this;\n }\n\n build() {\n return new ObjectValidator(...this._validations);\n }\n\n static registerHelper(name, fn) {\n this.prototype[name] = function() {\n fn.apply(this._validation, arguments);\n return this;\n };\n\n Validation.prototype[name] = function() {\n fn.apply(this, arguments);\n return this;\n };\n\n return null;\n }\n\n static unregisterHelper(name) {\n delete this.prototype[name];\n delete Validation.prototype[name];\n return null;\n }\n}\n","import ValidatorBuilder from '../validator_builder.js';\n\nexport function present(value) {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n return value !== '' && value !== null && value !== undefined;\n}\n\nconst STRICT_CHARS = /^[\\x20-\\x7F]*$/;\n// http://stackoverflow.com/a/46181/11236\nconst EMAIL = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\nexport function checkEmail(options = {}) {\n return function(value) {\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n if (options.strictCharacters) {\n if (!STRICT_CHARS.test(value)) {\n return false;\n }\n }\n\n return EMAIL.test(value);\n };\n}\n\nexport function checkMinLength(minLength) {\n if (minLength === null || minLength === undefined) {\n throw new Error('must specify a min length');\n }\n\n return function(value) {\n if (value !== null && value !== undefined) {\n return value.length >= minLength;\n } else {\n return false;\n }\n };\n}\n\nexport function checkMaxLength(maxLength) {\n if (maxLength === null || maxLength === undefined) {\n throw new Error('must specify a max length');\n }\n\n return function(value) {\n if (value !== null && value !== undefined) {\n return value.length <= maxLength;\n } else {\n return false;\n }\n };\n}\n\nexport function register() {\n ValidatorBuilder.registerHelper('required', function(message) {\n this.using(present, message);\n });\n\n ValidatorBuilder.registerHelper('optional', function() {\n this.when(present);\n });\n\n ValidatorBuilder.registerHelper('email', function(message, options) {\n this.using(checkEmail(options), message);\n });\n\n ValidatorBuilder.registerHelper('minLength', function(minLength, message) {\n this.using(checkMinLength(minLength), message);\n });\n\n ValidatorBuilder.registerHelper('maxLength', function(maxLength, message) {\n this.using(checkMaxLength(maxLength), message);\n });\n}\n","import ObjectValidator from './lgtm/object_validator.js';\nimport Validation from './lgtm/validation.js';\nimport ValidatorBuilder from './lgtm/validator_builder.js';\nimport config from './lgtm/config.js';\nimport { get } from './lgtm/utils.js';\nimport {\n present,\n checkEmail,\n checkMinLength,\n checkMaxLength,\n register as core_register\n} from './lgtm/helpers/core.js';\n\ncore_register();\n\nfunction validator(...validations) {\n return new ValidatorBuilder(...validations);\n}\n\nfunction validates(attr) {\n return new Validation(attr);\n}\n\nfunction register() {\n ValidatorBuilder.registerHelper(...arguments);\n}\n\nfunction unregister() {\n ValidatorBuilder.unregisterHelper(...arguments);\n}\n\nlet helpers = {\n core: {\n present,\n checkEmail,\n checkMinLength,\n checkMaxLength,\n register: core_register\n },\n register,\n unregister\n};\n\nfunction configure(key, value) {\n config[key] = value;\n}\n\nconfigure('defer', () => {\n let Promise = config['Promise'];\n let resolve;\n let reject;\n let promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n if (!resolve || !reject) {\n throw new Error('Configured promise does not behave as expected');\n }\n\n return { promise, resolve, reject };\n});\n\nfunction PromiseProxy(callback) {\n let Promise = getPromise();\n return new Promise(callback);\n}\n\nPromiseProxy.all = (...args) => getPromise().all(...args);\n\nPromiseProxy.race = (...args) => getPromise().race(...args);\n\nPromiseProxy.resolve = (...args) => getPromise().resolve(...args);\n\nPromiseProxy.reject = (...args) => getPromise().reject(...args);\n\nfunction getPromise() {\n let warn = config['warn'];\n\n /* global Promise, RSVP, require */\n if (typeof RSVP !== 'undefined') {\n configure('Promise', RSVP.Promise);\n warn(\n `Implicitly using RSVP.Promise. This will be removed in LGTM 2.0. ` +\n `Instead, use 'LGTM.configure(\"Promise\", RSVP.Promise)' to ` +\n `continue using RSVP promises.`\n );\n return RSVP.Promise;\n }\n\n if (typeof require === 'function') {\n try {\n let { Promise } = require('rsvp');\n configure('Promise', Promise);\n warn(\n `Implicitly using require(\"rsvp\").Promise. This will be removed in LGTM 2.0. ` +\n `Instead, use 'LGTM.configure(\"Promise\", require(\"rsvp\").Promise)' to ` +\n `continue using RSVP promises.`\n );\n return Promise;\n } catch (err) {\n // Ignore errors, just try built-in Promise or fail.\n }\n }\n\n if (typeof Promise === 'function') {\n configure('Promise', Promise);\n return Promise;\n }\n\n throw new Error(\n `'Promise' could not be found. Configure LGTM with your promise library using ` +\n `e.g. 'LGTM.configure(\"Promise\", RSVP.Promise)'.`\n );\n}\n\n/* global console */\nconfigure('Promise', PromiseProxy);\nconfigure('warn', console.warn.bind(console)); // eslint-disable-line no-console\nconfigure('get', (object, property) => {\n let warn = config['warn'];\n\n configure('get', get);\n warn(\n `Implicitly using 'get' implementation that uses a 'get' method when available. ` +\n `This will be removed in LGTM 2.0. Instead, use e.g. 'LGTM.configure(\"get\", Ember.get)' ` +\n `if you rely on this behavior.`\n );\n return get(object, property);\n});\n\nexport { configure, validator, validates, helpers, ObjectValidator };\n"],"names":["keys","object","Object","getOwnPropertyNames","get","property","undefined","getProperties","properties","config","map","prop","contains","array","indexOf","uniq","result","i","length","item","push","resolve","thenable","Promise","accept","all","thenables","ObjectValidator","_validations","_dependencies","validations","forEach","validation","addToValidator","attr","fn","message","list","parentAttribute","dependentsForParent","dependentAttributes","concat","attributes","callback","pop","validationPromises","alreadyValidating","slice","_validateAttribute","promise","then","_collectResults","results","err","value","pair","isValid","dependents","_getDependentsFor","dependent","messages","errors","valid","Validation","_attr","_conditions","_subvalidations","dependencies","predicate","when","Error","conditions","validationWithConditions","validator","addDependentsFor","dependency","addValidation","subvalidation","ValidatorBuilder","_validation","arguments","and","using","name","prototype","apply","present","trim","STRICT_CHARS","EMAIL","checkEmail","options","strictCharacters","test","checkMinLength","minLength","checkMaxLength","maxLength","register","registerHelper","core_register","validates","unregister","unregisterHelper","helpers","configure","key","reject","res","rej","PromiseProxy","getPromise","race","warn","RSVP","require","console","bind"],"mappings":"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"}
{
"name": "lgtm",
"version": "1.1.0",
"version": "1.2.0",
"description": "Simple JavaScript validation for objects.",

@@ -12,7 +12,8 @@ "main": "dist/lgtm.js",

"test": "mocha",
"prepublish": "npm test && npm run build"
"prepublish": "npm test && npm run build",
"semantic-release": "semantic-release pre && npm publish && semantic-release post"
},
"repository": {
"type": "git",
"url": "git@github.com:square/lgtm.git"
"url": "https://github.com/square/lgtm.git"
},

@@ -25,11 +26,21 @@ "keywords": [

"devDependencies": {
"babel": "^6.5.2",
"babel-preset-es2015": "^6.9.0",
"babel-preset-es2015-rollup": "^1.1.1",
"babel-register": "^6.9.0",
"babelrc-rollup": "^1.0.0",
"eslint": "^2.10.2",
"mocha": "^2.4.5",
"rollup": "^0.26.3",
"rollup-plugin-babel": "^2.4.0"
"babel-core": "^6.26.0",
"babel-eslint": "^8.0.0",
"babel-plugin-external-helpers": "^6.22.0",
"babel-plugin-syntax-class-properties": "^6.13.0",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-preset-env": "^1.6.0",
"babel-preset-es2015": "^6.24.1",
"babel-register": "^6.26.0",
"eslint": "^4.7.2",
"eslint-config-prettier": "^2.6.0",
"eslint-plugin-prettier": "^2.3.1",
"file-size": "^1.0.0",
"gzip-size": "^4.0.0",
"mocha": "^3.5.3",
"prettier": "^1.7.0",
"rollup": "^0.50.0",
"rollup-plugin-babel": "^3.0.2",
"semantic-release": "^8.0.3",
"uglify-js": "^3.1.2"
},

@@ -42,2 +53,2 @@ "files": [

}
}
}

@@ -9,1 +9,3 @@ # LGTM

For examples, installation, setup and more [see the wiki](https://github.com/square/lgtm/wiki).
[![Greenkeeper badge](https://badges.greenkeeper.io/square/lgtm.svg)](https://greenkeeper.io/)