{"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\n// http://www.rfc-editor.org/errata_search.php?rfc=3696&eid=1690\nconst MAX_EMAIL_LENGTH = 254;\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 (\n      value !== undefined &&\n      value !== null &&\n      value.length <= MAX_EMAIL_LENGTH &&\n      EMAIL.test(value)\n    );\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","MAX_EMAIL_LENGTH","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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"}