From d2168fed68bcc390cd3788c90cecb7d972b50d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Buscht=C3=B6ns?= Date: Thu, 20 Jan 2022 06:04:05 +0100 Subject: [PATCH] fix(deps): patch `ember-cp-validations` https://github.com/qonto/ember-cp-validations/pull/3 --- .npmignore | 3 + package.json | 8 +- patches/ember-cp-validations+3.5.6.patch | 2787 ++++++++++++++++++++++ yarn.lock | 347 ++- 4 files changed, 3120 insertions(+), 25 deletions(-) create mode 100644 patches/ember-cp-validations+3.5.6.patch diff --git a/.npmignore b/.npmignore index 3aac244..7be0d5d 100644 --- a/.npmignore +++ b/.npmignore @@ -31,6 +31,9 @@ /yarn.lock .gitkeep +# https://github.com/ds300/patch-package#dev-only-patches +/patches/ + # ember-try /.node_modules.ember-try/ /bower.json.ember-try diff --git a/package.json b/package.json index e93cc2d..8efa850 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "test": "tests" }, "scripts": { + "postinstall": "patch-package", "build": "ember build --environment=production", "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", @@ -31,8 +32,7 @@ "test:ember-compatibility": "ember try:each" }, "dependencies": { - "ember-cli-babel": "^7.26.11", - "ember-cli-htmlbars": "^6.0.1" + "ember-cli-babel": "^7.26.11" }, "devDependencies": { "@ember/optional-features": "^2.0.0", @@ -45,10 +45,12 @@ "ember-auto-import": "^2.3.0", "ember-cli": "~4.1.0", "ember-cli-dependency-checker": "^3.2.0", + "ember-cli-htmlbars": "^6.0.1", "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", "ember-cli-terser": "^4.0.2", "ember-cp-validations": "^3.5.6", + "ember-data": "^4.1.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.1", "ember-intl": "^5.7.2", @@ -68,6 +70,8 @@ "eslint-plugin-qunit": "^7.2.0", "loader.js": "^4.7.0", "npm-run-all": "^4.1.5", + "patch-package": "^6.4.7", + "postinstall-postinstall": "^2.1.0", "prettier": "^2.5.1", "qunit": "^2.17.2", "qunit-dom": "^2.0.0", diff --git a/patches/ember-cp-validations+3.5.6.patch b/patches/ember-cp-validations+3.5.6.patch new file mode 100644 index 0000000..d538b91 --- /dev/null +++ b/patches/ember-cp-validations+3.5.6.patch @@ -0,0 +1,2787 @@ +diff --git a/node_modules/ember-cp-validations/addon/-private/ember-internals.js b/node_modules/ember-cp-validations/addon/-private/ember-internals.js +new file mode 100644 +index 0000000..def0415 +--- /dev/null ++++ b/node_modules/ember-cp-validations/addon/-private/ember-internals.js +@@ -0,0 +1,33 @@ ++import Ember from 'ember'; ++import { A } from '@ember/array'; ++ ++let __EMBER_METAL__; ++let emberMetalPaths = [ ++ '@ember/-internals/metal', // ember-source from 3.10 ++ '@ember/-internals/metal/index' // ember-source from 3.13 ++]; ++let metalPath = A(emberMetalPaths).find(path => Ember.__loader.registry[path]); ++if (metalPath) { ++ __EMBER_METAL__ = Ember.__loader.require(metalPath); ++} ++ ++export function getDependentKeys(descriptorOrDecorator) { ++ if (__EMBER_METAL__ && __EMBER_METAL__.descriptorForDecorator) { ++ let descriptor = __EMBER_METAL__.descriptorForDecorator( ++ descriptorOrDecorator ++ ); ++ return descriptor._dependentKeys || [descriptor.altKey]; ++ } else { ++ return descriptorOrDecorator._dependentKeys; ++ } ++} ++ ++export function isDescriptor(o) { ++ if (__EMBER_METAL__ && __EMBER_METAL__.isClassicDecorator) { ++ return __EMBER_METAL__.isClassicDecorator(o); ++ } else { ++ return ( ++ o && (typeof o === 'object' || typeof o === 'function') && o.isDescriptor ++ ); ++ } ++} +diff --git a/node_modules/ember-cp-validations/addon/-private/ember-validator.js b/node_modules/ember-cp-validations/addon/-private/ember-validator.js +index 78f8e3f..3d8c79e 100644 +--- a/node_modules/ember-cp-validations/addon/-private/ember-validator.js ++++ b/node_modules/ember-cp-validations/addon/-private/ember-validator.js +@@ -6,7 +6,9 @@ export default Base.extend({ + let result = _validate(this.get('_evType'), ...arguments); + + if (result && typeof result === 'object') { +- return result.message ? result.message : this.createErrorMessage(result.type, result.value, result.context); ++ return result.message ++ ? result.message ++ : this.createErrorMessage(result.type, result.value, result.context); + } + + return result; +diff --git a/node_modules/ember-cp-validations/addon/-private/internal-result-object.js b/node_modules/ember-cp-validations/addon/-private/internal-result-object.js +index 54092ce..e5d65e9 100644 +--- a/node_modules/ember-cp-validations/addon/-private/internal-result-object.js ++++ b/node_modules/ember-cp-validations/addon/-private/internal-result-object.js +@@ -1,29 +1,11 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- +-import Ember from 'ember'; ++import EmberObject, { computed, set, get } from '@ember/object'; ++import { and, not, readOnly } from '@ember/object/computed'; ++import { isNone } from '@ember/utils'; ++import { makeArray } from '@ember/array'; + import ValidationError from '../validations/error'; +-import { isDsModel, isPromise } from '../utils/utils'; +- +-const { +- get, +- set, +- isNone, +- computed, +- canInvoke, +- makeArray, +- defineProperty +-} = Ember; +- +-const { +- and, +- not, +- readOnly +-} = computed; +- +-export default Ember.Object.extend({ ++import { isPromise } from '../utils/utils'; ++ ++export default EmberObject.extend({ + model: null, + isValid: true, + isValidating: false, +@@ -31,7 +13,6 @@ export default Ember.Object.extend({ + warningMessage: null, + attribute: '', + +- attrValue: null, + _promise: null, + _validator: null, + _type: readOnly('_validator._type'), +@@ -39,8 +20,6 @@ export default Ember.Object.extend({ + init() { + this._super(...arguments); + +- defineProperty(this, 'attrValue', computed.readOnly(`model.${get(this, 'attribute')}`)); +- + if (this.get('isAsync')) { + this._handlePromise(); + } +@@ -56,26 +35,6 @@ export default Ember.Object.extend({ + return isPromise(get(this, '_promise')); + }), + +- isDirty: computed('attrValue', function() { +- let model = get(this, 'model'); +- let attribute = get(this, 'attribute'); +- let attrValue = get(this, 'attrValue'); +- +- // Check default model values +- if (isDsModel(model) && canInvoke(model, 'eachAttribute')) { +- let attrMeta = model.get('constructor.attributes').get(attribute); +- +- if (attrMeta) { +- let { defaultValue } = attrMeta.options; +- +- if (!isNone(defaultValue)) { +- return defaultValue !== attrValue; +- } +- } +- } +- return !isNone(attrValue); +- }), +- + messages: computed('message', function() { + return makeArray(get(this, 'message')); + }), +@@ -100,17 +59,23 @@ export default Ember.Object.extend({ + return makeArray(get(this, 'warningMessage')); + }), + +- warning: computed('isWarning', 'type', 'warningMessage', 'attribute', function() { +- if (get(this, 'isWarning') && !isNone(get(this, 'warningMessage'))) { +- return ValidationError.create({ +- type: get(this, '_type'), +- message: get(this, 'warningMessage'), +- attribute: get(this, 'attribute') +- }); +- } ++ warning: computed( ++ 'isWarning', ++ 'type', ++ 'warningMessage', ++ 'attribute', ++ function() { ++ if (get(this, 'isWarning') && !isNone(get(this, 'warningMessage'))) { ++ return ValidationError.create({ ++ type: get(this, '_type'), ++ message: get(this, 'warningMessage'), ++ attribute: get(this, 'attribute') ++ }); ++ } + +- return null; +- }), ++ return null; ++ } ++ ), + + warnings: computed('warning', function() { + return makeArray(get(this, 'warning')); +diff --git a/node_modules/ember-cp-validations/addon/-private/options.js b/node_modules/ember-cp-validations/addon/-private/options.js +index a9f7e3d..6ece5eb 100644 +--- a/node_modules/ember-cp-validations/addon/-private/options.js ++++ b/node_modules/ember-cp-validations/addon/-private/options.js +@@ -1,51 +1,28 @@ +-import Ember from 'ember'; +-import { isDescriptor } from 'ember-cp-validations/utils/utils'; ++import EmberObject, { get } from '@ember/object'; ++import { isDescriptor } from '../utils/utils'; + +-const { +- get, +- set, +- defineProperty +-} = Ember; ++const { keys } = Object; ++const OPTION_KEYS = '__option_keys__'; + +-const Options = Ember.Object.extend({ +- model: null, +- attribute: null, +- +- // Private +- __options__: null, +- +- init() { +- this._super(...arguments); +- +- let options = this.get('__options__'); +- +- Object.keys(options).forEach((key) => { +- let value = options[key]; +- +- if (isDescriptor(value)) { +- defineProperty(this, key, value); +- } else { +- set(this, key, value); +- } +- }); +- }, ++const OptionsObject = EmberObject.extend({ ++ toObject() { ++ return this[OPTION_KEYS].reduce((obj, key) => { ++ obj[key] = get(this, key); ++ return obj; ++ }, {}); ++ } ++}); + +- copy(deep) { +- let options = this.get('__options__'); ++export default class Options { ++ constructor({ model, attribute, options = {} }) { ++ const optionKeys = keys(options); ++ const createParams = { [OPTION_KEYS]: optionKeys, model, attribute }; + +- if (deep) { +- return Options.create({ +- model: get(this, 'model'), +- attribute: get(this, 'attribute'), +- __options__: options +- }); ++ // If any of the options is a CP, we need to create a custom class for it ++ if (optionKeys.some(key => isDescriptor(options[key]))) { ++ return OptionsObject.extend(options).create(createParams); + } + +- return Ember.Object.create(Object.keys(options).reduce((obj, o) => { +- obj[o] = get(this, o); +- return obj; +- }, {})); ++ return OptionsObject.create(createParams, options); + } +-}); +- +-export default Options; ++} +diff --git a/node_modules/ember-cp-validations/addon/-private/result.js b/node_modules/ember-cp-validations/addon/-private/result.js +index 312cd32..a93edd0 100644 +--- a/node_modules/ember-cp-validations/addon/-private/result.js ++++ b/node_modules/ember-cp-validations/addon/-private/result.js +@@ -1,26 +1,18 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ ++import { isNone } from '@ember/utils'; + +-import Ember from 'ember'; ++import { isArray } from '@ember/array'; ++import EmberObject, { ++ getProperties, ++ setProperties, ++ computed, ++ set, ++ get ++} from '@ember/object'; + import ResultCollection from '../validations/result-collection'; + import WarningResultCollection from '../validations/warning-result-collection'; + import InternalResultObject from './internal-result-object'; + +-const { +- get, +- set, +- isNone, +- isArray, +- computed, +- setProperties, +- getProperties +-} = Ember; +- +-const { +- readOnly +-} = computed; ++const { readOnly } = computed; + + /** + * __PRIVATE__ +@@ -30,8 +22,7 @@ const { + * @private + */ + +-const Result = Ember.Object.extend({ +- ++const Result = EmberObject.extend({ + /** + * @property model + * @type {Object} +@@ -73,7 +64,10 @@ const Result = Ember.Object.extend({ + */ + _isReadOnly: computed('_result', function() { + let validations = get(this, '_result'); +- return (validations instanceof ResultCollection) || get(validations, 'isValidations'); ++ return ( ++ validations instanceof ResultCollection || ++ get(validations, 'isValidations') ++ ); + }).readOnly(), + + /** +@@ -125,13 +119,6 @@ const Result = Ember.Object.extend({ + */ + isAsync: readOnly('_result.isAsync'), + +- /** +- * @property isDirty +- * @readOnly +- * @type {Boolean} +- */ +- isDirty: readOnly('_result.isDirty'), +- + /** + * @property message + * @readOnly +@@ -194,9 +181,21 @@ const Result = Ember.Object.extend({ + * @private + * @type {Result} + */ +- _result: computed('model', 'attribute', '_promise', '_validator', function() { +- return InternalResultObject.create(getProperties(this, ['model', 'attribute', '_promise', '_validator'])); +- }), ++ _result: computed( ++ 'model', ++ 'attribute', ++ '_promise', ++ '_validator', ++ '_resultOverride', ++ function() { ++ return ( ++ get(this, '_resultOverride') || ++ InternalResultObject.create( ++ getProperties(this, ['model', 'attribute', '_promise', '_validator']) ++ ) ++ ); ++ } ++ ), + + init() { + this._super(...arguments); +@@ -228,15 +227,17 @@ const Result = Ember.Object.extend({ + if (isNone(value)) { + return this.update(false); + } else if (get(value, 'isValidations')) { +- set(this, '_result', Collection.create({ attribute, content: [ value ]})); ++ this._overrideResult(Collection.create({ attribute, content: [value] })); + } else if (isArray(value)) { +- set(this, '_result', Collection.create({ attribute, content: value })); ++ this._overrideResult(Collection.create({ attribute, content: value })); + } else if (!get(this, '_isReadOnly')) { ++ this._overrideResult(undefined); ++ + if (typeof value === 'string') { + setProperties(get(this, '_result'), { + [isWarning ? 'warningMessage' : 'message']: value, + isValid: isWarning ? true : false +- }) ++ }); + } else if (typeof value === 'boolean') { + set(result, 'isValid', value); + } else if (typeof value === 'object') { +@@ -245,19 +246,28 @@ const Result = Ember.Object.extend({ + } + }, + ++ /** ++ * Override the internal _result property. ++ * @method _overrideResult ++ * @param result ++ * @private ++ */ ++ _overrideResult(result) { ++ set(this, '_resultOverride', result); ++ }, ++ + /** + * Promise handler + * @method _handlePromise + * @private + */ + _handlePromise() { +- get(this, '_promise').then( +- (value) => this.update(value), +- (value) => this.update(value) +- ).catch((reason) => { +- // TODO: send into error state +- throw reason; +- }); ++ get(this, '_promise') ++ .then(value => this.update(value), value => this.update(value)) ++ .catch(reason => { ++ // TODO: send into error state ++ throw reason; ++ }); + } + }); + +diff --git a/node_modules/ember-cp-validations/addon/-private/symbols.js b/node_modules/ember-cp-validations/addon/-private/symbols.js +new file mode 100644 +index 0000000..0edac08 +--- /dev/null ++++ b/node_modules/ember-cp-validations/addon/-private/symbols.js +@@ -0,0 +1,5 @@ ++export const VALIDATIONS_CLASS = '__VALIDATIONS_CLASS__'; ++export const IS_VALIDATIONS_CLASS = '__IS_VALIDATIONS_CLASS__'; ++export const ATTRS_MODEL = '__ATTRS_MODEL__'; ++export const ATTRS_PATH = '__ATTRS_PATH__'; ++export const ATTRS_RESULT_COLLECTION = '__ATTRS_RESULT_COLLECTION__'; +diff --git a/node_modules/ember-cp-validations/addon/.DS_Store b/node_modules/ember-cp-validations/addon/.DS_Store +new file mode 100644 +index 0000000..9e27f71 +Binary files /dev/null and b/node_modules/ember-cp-validations/addon/.DS_Store differ +diff --git a/node_modules/ember-cp-validations/addon/index.js b/node_modules/ember-cp-validations/addon/index.js +index 1571f0d..48b6e74 100644 +--- a/node_modules/ember-cp-validations/addon/index.js ++++ b/node_modules/ember-cp-validations/addon/index.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import Factory from './validations/factory'; + import Validator from './validations/validator'; + +@@ -114,7 +109,7 @@ import Validator from './validations/validator'; + * + * export default Ember.Route.extend({ + * model() { +- * var container = this.get('container'); ++ * const container = this.get('container'); + * return User.create({ username: 'John', container }) + * } + * }); +@@ -288,10 +283,10 @@ import Validator from './validations/validator'; + */ + + /** +- * ### [__Ember-Intl__](https://github.com/jasonmit/ember-intl-cp-validations) ++ * ### [__Ember-Intl__](https://github.com/ember-intl/cp-validations) + * + * ```bash +- * ember install ember-intl-cp-validations ++ * ember install @ember-intl/cp-validations + * ``` + * + * ### [__Ember-I18n__](https://github.com/jasonmit/ember-i18n-cp-validations) +diff --git a/node_modules/ember-cp-validations/addon/utils/array.js b/node_modules/ember-cp-validations/addon/utils/array.js +index 7146485..3767b91 100644 +--- a/node_modules/ember-cp-validations/addon/utils/array.js ++++ b/node_modules/ember-cp-validations/addon/utils/array.js +@@ -1,8 +1,4 @@ +-import Ember from 'ember'; +- +-const { +- A: emberArray +-} = Ember; ++import { A as emberArray } from '@ember/array'; + + const A = emberArray(); + +diff --git a/node_modules/ember-cp-validations/addon/utils/cycle-breaker.js b/node_modules/ember-cp-validations/addon/utils/cycle-breaker.js +index ac00040..198be13 100644 +--- a/node_modules/ember-cp-validations/addon/utils/cycle-breaker.js ++++ b/node_modules/ember-cp-validations/addon/utils/cycle-breaker.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + /** + * Use Ember Meta to break cycles in the CP chains. Lets say we have a User model with a `friends` property that is a hasMany + * relationship. If we have a user John and he has a friend Jane, that creates a two-way relationship. John is Jane's friends and vise +diff --git a/node_modules/ember-cp-validations/addon/utils/assign.js b/node_modules/ember-cp-validations/addon/utils/deep-set.js +similarity index 65% +rename from node_modules/ember-cp-validations/addon/utils/assign.js +rename to node_modules/ember-cp-validations/addon/utils/deep-set.js +index beddbd5..5ef1e96 100644 +--- a/node_modules/ember-cp-validations/addon/utils/assign.js ++++ b/node_modules/ember-cp-validations/addon/utils/deep-set.js +@@ -1,23 +1,19 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + /** + * Assigns a value to an object via the given path while creating new objects if + * the pathing requires it. If the given path is `foo.bar`, it will create a new object (obj.foo) + * and assign value to obj.foo.bar. If the given object is an Ember.Object, it will create new Ember.Objects. + */ +-import Ember from 'ember'; +- +-const { +- get, +- set, +- isNone, +- defineProperty +-} = Ember; ++import { isDescriptor } from './utils'; ++import { isNone } from '@ember/utils'; ++import EmberObject, { defineProperty, set, get } from '@ember/object'; + +-export default function assign(obj, path, value, useEmberObject = false, delimiter = '.') { ++export default function deepSet( ++ obj, ++ path, ++ value, ++ useEmberObject = false, ++ delimiter = '.' ++) { + let keyPath = path.split(delimiter); + let lastKeyIndex = keyPath.length - 1; + let currObj = obj; +@@ -28,12 +24,12 @@ export default function assign(obj, path, value, useEmberObject = false, delimit + + // Create a new object if it doesnt exist + if (isNone(get(currObj, key))) { +- set(currObj, key, useEmberObject ? Ember.Object.create() : {}); ++ set(currObj, key, useEmberObject ? EmberObject.create() : {}); + } + currObj = get(currObj, key); + } + +- if (value instanceof Ember.ComputedProperty) { ++ if (isDescriptor(value)) { + defineProperty(currObj, keyPath[lastKeyIndex], value); + } else { + set(currObj, keyPath[lastKeyIndex], value); +diff --git a/node_modules/ember-cp-validations/addon/utils/get-with-default.js b/node_modules/ember-cp-validations/addon/utils/get-with-default.js +new file mode 100644 +index 0000000..bd1aca8 +--- /dev/null ++++ b/node_modules/ember-cp-validations/addon/utils/get-with-default.js +@@ -0,0 +1,10 @@ ++import { get } from '@ember/object'; ++ ++export default function getWithDefault(obj, key, defaultValue) { ++ let result = get(obj, key); ++ ++ if (result === undefined) { ++ result = defaultValue; ++ } ++ return result; ++} +diff --git a/node_modules/ember-cp-validations/addon/utils/lookup-validator.js b/node_modules/ember-cp-validations/addon/utils/lookup-validator.js +new file mode 100644 +index 0000000..8a44cd1 +--- /dev/null ++++ b/node_modules/ember-cp-validations/addon/utils/lookup-validator.js +@@ -0,0 +1,25 @@ ++/** ++ * Lookup a validator of a specific type on the owner ++ * ++ * @param {Ember.Owner} owner ++ * @param {String} type ++ * @throws {Error} Validator not found ++ * @return {Class} Validator class ++ */ ++export default function lookupValidator(owner, type) { ++ if (!owner) { ++ throw new Error( ++ `[ember-cp-validations] \`lookupValidator\` requires owner/container access.` ++ ); ++ } ++ ++ const validatorClass = owner.factoryFor(`validator:${type}`); ++ ++ if (!validatorClass) { ++ throw new Error( ++ `[ember-cp-validations] Validator not found of type: ${type}.` ++ ); ++ } ++ ++ return validatorClass; ++} +diff --git a/node_modules/ember-cp-validations/addon/utils/meta-data.js b/node_modules/ember-cp-validations/addon/utils/meta-data.js +index a7dfda8..a80c43a 100644 +--- a/node_modules/ember-cp-validations/addon/utils/meta-data.js ++++ b/node_modules/ember-cp-validations/addon/utils/meta-data.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import Ember from 'ember'; + + let id = 0; +@@ -23,7 +18,7 @@ function getData(obj, s) { + + function setData(obj, s, value) { + let m = Ember.meta(obj); +- let data = m[dataKey] = m[dataKey] || {}; ++ let data = (m[dataKey] = m[dataKey] || {}); + + data[s] = value; + } +diff --git a/node_modules/ember-cp-validations/addon/utils/should-call-super.js b/node_modules/ember-cp-validations/addon/utils/should-call-super.js +index 80c9d4e..01ecabf 100644 +--- a/node_modules/ember-cp-validations/addon/utils/should-call-super.js ++++ b/node_modules/ember-cp-validations/addon/utils/should-call-super.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + /** + * Checks if the give key exists on the object's super. + * If so, we can successfully call the obj[key] _super +diff --git a/node_modules/ember-cp-validations/addon/utils/utils.js b/node_modules/ember-cp-validations/addon/utils/utils.js +index 32b0423..bb8cd72 100644 +--- a/node_modules/ember-cp-validations/addon/utils/utils.js ++++ b/node_modules/ember-cp-validations/addon/utils/utils.js +@@ -1,24 +1,17 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ ++import ArrayProxy from '@ember/array/proxy'; ++import ObjectProxy from '@ember/object/proxy'; ++import { assign } from '@ember/polyfills'; ++import { isHTMLSafe } from '@ember/template'; ++import EmberObject, { get } from '@ember/object'; ++import { typeOf } from '@ember/utils'; ++import { A as emberArray, isArray } from '@ember/array'; ++import DS from 'ember-data'; + + import Ember from 'ember'; +-import requireModule from 'ember-require-module'; + +-const DS = requireModule('ember-data'); ++const { canInvoke } = Ember; + +-const { +- get, +- typeOf, +- isArray, +- canInvoke, +- A: emberArray +-} = Ember; +- +-const { isHTMLSafe } = Ember.String; +- +-const assign = Ember.assign || Ember.merge; ++export { getDependentKeys, isDescriptor } from '../-private/ember-internals'; + + export function unwrapString(s) { + if (isHTMLSafe(s)) { +@@ -33,7 +26,7 @@ export function unwrapProxy(o) { + } + + export function isProxy(o) { +- return !!(o && (o instanceof Ember.ObjectProxy || o instanceof Ember.ArrayProxy)); ++ return !!(o && (o instanceof ObjectProxy || o instanceof ArrayProxy)); + } + + export function isPromise(p) { +@@ -45,21 +38,22 @@ export function isDsModel(o) { + } + + export function isDSManyArray(o) { +- return !!(DS && o && isArray(o) && (o instanceof DS.PromiseManyArray || o instanceof DS.ManyArray)); ++ return !!( ++ DS && ++ o && ++ isArray(o) && ++ (o instanceof DS.PromiseManyArray || o instanceof DS.ManyArray) ++ ); + } + + export function isEmberObject(o) { +- return !!(o && o instanceof Ember.Object); ++ return !!(o && o instanceof EmberObject); + } + + export function isObject(o) { + return typeOf(o) === 'object' || typeOf(o) === 'instance'; + } + +-export function isDescriptor(o) { +- return o && typeof o === 'object' && o.isDescriptor; +-} +- + export function isValidatable(value) { + let v = unwrapProxy(value); + return isDsModel(v) ? !get(v, 'isDeleted') : true; +@@ -71,7 +65,7 @@ export function getValidatableValue(value) { + } + + if (isDSManyArray(value)) { +- return emberArray(value.filter((v) => isValidatable(v))); ++ return emberArray(value.filter(v => isValidatable(v))); + } + + return isValidatable(value) ? value : undefined; +diff --git a/node_modules/ember-cp-validations/addon/validations/error.js b/node_modules/ember-cp-validations/addon/validations/error.js +index 2e46594..1e7308a 100644 +--- a/node_modules/ember-cp-validations/addon/validations/error.js ++++ b/node_modules/ember-cp-validations/addon/validations/error.js +@@ -1,11 +1,11 @@ +-import Ember from 'ember'; ++import EmberObject from '@ember/object'; + + /** + * @module Validations + * @class Error + */ + +-export default Ember.Object.extend({ ++export default EmberObject.extend({ + /** + * The error validator type + * @property type +diff --git a/node_modules/ember-cp-validations/addon/validations/factory.js b/node_modules/ember-cp-validations/addon/validations/factory.js +index 12d2eed..01fc8a3 100644 +--- a/node_modules/ember-cp-validations/addon/validations/factory.js ++++ b/node_modules/ember-cp-validations/addon/validations/factory.js +@@ -1,39 +1,39 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- +-import Ember from 'ember'; +-import assign from '../utils/assign'; ++import Mixin from '@ember/object/mixin'; ++import { Promise } from 'rsvp'; ++import EmberObject, { computed, set, get } from '@ember/object'; ++import { A as emberArray, makeArray, isArray } from '@ember/array'; ++import { readOnly } from '@ember/object/computed'; ++import { assign } from '@ember/polyfills'; ++import { run } from '@ember/runloop'; ++import { guidFor } from '@ember/object/internals'; ++import { isEmpty, isNone } from '@ember/utils'; ++import { getOwner } from '@ember/application'; ++import deepSet from '../utils/deep-set'; + import ValidationResult from '../-private/result'; + import ResultCollection from './result-collection'; + import BaseValidator from '../validators/base'; + import cycleBreaker from '../utils/cycle-breaker'; + import shouldCallSuper from '../utils/should-call-super'; ++import lookupValidator from '../utils/lookup-validator'; + import { flatten } from '../utils/array'; +-import { isDsModel, isValidatable, isPromise, isDescriptor, mergeOptions } from '../utils/utils'; +- +-const { +- get, +- set, +- run, +- RSVP, +- isNone, +- guidFor, +- isEmpty, +- isArray, +- computed, +- getOwner, +- makeArray, +- getWithDefault, +- A: emberArray +-} = Ember; +- +-const merge = Ember.assign || Ember.merge; +- +-const { +- Promise +-} = RSVP; ++import getWithDefault from '../utils/get-with-default'; ++import { ++ getDependentKeys, ++ isDescriptor, ++ isDsModel, ++ isValidatable, ++ isPromise, ++ mergeOptions ++} from '../utils/utils'; ++import { ++ VALIDATIONS_CLASS, ++ IS_VALIDATIONS_CLASS, ++ ATTRS_MODEL, ++ ATTRS_PATH, ++ ATTRS_RESULT_COLLECTION ++} from '../-private/symbols'; ++ ++const VALIDATION_COUNT_MAP = new WeakMap(); + + /** + * ## Running Manual Validations +@@ -98,19 +98,22 @@ export default function buildValidations(validations = {}, globalOptions = {}) { + + let Validations, validationMixinCount; + +- return Ember.Mixin.create({ ++ return Mixin.create({ + init() { + this._super(...arguments); + + // Count number of mixins to bypass super check if there is more than 1 +- validationMixinCount = (get(this, '__validationsMixinCount__') || 0) + 1; +- set(this, '__validationsMixinCount__', validationMixinCount); ++ validationMixinCount = (VALIDATION_COUNT_MAP.get(this) || 0) + 1; ++ VALIDATION_COUNT_MAP.set(this, validationMixinCount); + }, +- __validationsClass__: computed(function() { ++ [VALIDATIONS_CLASS]: computed(function() { + if (!Validations) { + let inheritedClass; + +- if (shouldCallSuper(this, '__validationsClass__') || validationMixinCount > 1) { ++ if ( ++ shouldCallSuper(this, VALIDATIONS_CLASS) || ++ validationMixinCount > 1 ++ ) { + inheritedClass = this._super(); + } + +@@ -120,7 +123,7 @@ export default function buildValidations(validations = {}, globalOptions = {}) { + }).readOnly(), + + validations: computed(function() { +- return this.get('__validationsClass__').create({ model: this }); ++ return this.get(VALIDATIONS_CLASS).create({ model: this }); + }).readOnly(), + + validate() { +@@ -159,7 +162,7 @@ export default function buildValidations(validations = {}, globalOptions = {}) { + function normalizeOptions(validations = {}, globalOptions = {}) { + let validatableAttrs = Object.keys(validations); + +- validatableAttrs.forEach((attribute) => { ++ validatableAttrs.forEach(attribute => { + let rules = validations[attribute]; + + if (rules && typeof rules === 'object' && isArray(rules.validators)) { +@@ -171,13 +174,13 @@ function normalizeOptions(validations = {}, globalOptions = {}) { + }, {}); + + let { validators } = rules; +- validators.forEach((v) => { ++ validators.forEach(v => { + v.defaultOptions = options; + }); + validations[attribute] = validators; + } + validations[attribute] = makeArray(validations[attribute]); +- validations[attribute].forEach((v) => { ++ validations[attribute].forEach(v => { + v.globalOptions = globalOptions; + }); + }); +@@ -202,16 +205,26 @@ function createValidationsClass(inheritedValidationsClass, validations, model) { + let validatableAttributes = Object.keys(validations); + + // Setup validation inheritance +- if (inheritedValidationsClass && inheritedValidationsClass.__isCPValidationsClass__) { ++ if ( ++ inheritedValidationsClass && ++ inheritedValidationsClass[IS_VALIDATIONS_CLASS] ++ ) { + let inheritedValidations = inheritedValidationsClass.create(); + +- validationRules = merge(validationRules, inheritedValidations.get('_validationRules')); +- validatableAttributes = emberArray(inheritedValidations.get('validatableAttributes').concat(validatableAttributes)).uniq(); ++ validationRules = assign( ++ validationRules, ++ inheritedValidations.get('_validationRules') ++ ); ++ validatableAttributes = emberArray( ++ inheritedValidations ++ .get('validatableAttributes') ++ .concat(validatableAttributes) ++ ).uniq(); + } + + // Normalize nested keys into actual objects and merge them with parent object + Object.keys(validations).reduce((obj, key) => { +- assign(obj, key, validations[key]); ++ deepSet(obj, key, validations[key]); + return obj; + }, validationRules); + +@@ -219,36 +232,35 @@ function createValidationsClass(inheritedValidationsClass, validations, model) { + let TopLevelProps = createTopLevelPropsMixin(validatableAttributes); + + // Create the `attrs` class which will add the current model reference once instantiated +- let AttrsClass = createAttrsClass(validatableAttributes, validationRules, model); ++ let AttrsClass = createAttrsClass( ++ validatableAttributes, ++ validationRules, ++ model ++ ); + + // Create `validations` class +- let ValidationsClass = Ember.Object.extend(TopLevelProps, { ++ let ValidationsClass = EmberObject.extend(TopLevelProps, { + model: null, + attrs: null, + isValidations: true, + +- validatableAttributes: computed(function() { +- return validatableAttributes; +- }).readOnly(), +- + // Caches + _validators: null, + _debouncedValidations: null, + + // Private +- _validationRules: computed(function() { +- return validationRules; +- }).readOnly(), ++ _validationRules: validationRules, + + validate, + validateSync, + validateAttribute, ++ validatableAttributes, + + init() { + this._super(...arguments); + this.setProperties({ + attrs: AttrsClass.create({ +- _model: this.get('model') ++ [ATTRS_MODEL]: this.get('model') + }), + _validators: {}, + _debouncedValidations: {} +@@ -264,19 +276,19 @@ function createValidationsClass(inheritedValidationsClass, validations, model) { + this.get('attrs').destroy(); + + // Cancel all debounced timers +- validatableAttrs.forEach((attr) => { ++ validatableAttrs.forEach(attr => { + let attrCache = get(debouncedValidations, attr); + + if (!isNone(attrCache)) { + // Itterate over each attribute and cancel all of its debounced validations +- Object.keys(attrCache).forEach((v) => run.cancel(attrCache[v])); ++ Object.keys(attrCache).forEach(v => run.cancel(attrCache[v])); + } + }); + } + }); + + ValidationsClass.reopenClass({ +- __isCPValidationsClass__: true ++ [IS_VALIDATIONS_CLASS]: true + }); + + return ValidationsClass; +@@ -301,37 +313,41 @@ function createAttrsClass(validatableAttributes, validationRules, model) { + let nestedClasses = {}; + let rootPath = 'root'; + +- let AttrsClass = Ember.Object.extend({ +- __path__: rootPath, ++ let AttrsClass = EmberObject.extend({ ++ [ATTRS_PATH]: rootPath, + + init() { + this._super(...arguments); + +- let _model = this.get('_model'); +- let path = this.get('__path__'); ++ let model = this.get(ATTRS_MODEL); ++ let path = this.get(ATTRS_PATH); + + /* + Instantiate the nested attrs classes for the current path + */ +- Object.keys(nestedClasses[path] || []).forEach((key) => { +- set(this, key, nestedClasses[path][key].create({ _model })); ++ Object.keys(nestedClasses[path] || []).forEach(key => { ++ set( ++ this, ++ key, ++ nestedClasses[path][key].create({ [ATTRS_MODEL]: model }) ++ ); + }); + }, + + willDestroy() { + this._super(...arguments); + +- let path = this.get('__path__'); ++ let path = this.get(ATTRS_PATH); + + /* + Remove the model reference + */ +- set(this, '_model', null); ++ set(this, ATTRS_MODEL, null); + + /* + Destroy all nested classes + */ +- Object.keys(nestedClasses[path] || []).forEach((key) => { ++ Object.keys(nestedClasses[path] || []).forEach(key => { + get(this, key).destroy(); + }); + } +@@ -340,7 +356,7 @@ function createAttrsClass(validatableAttributes, validationRules, model) { + /* + Insert CPs + Create nested classes + */ +- validatableAttributes.forEach((attribute) => { ++ validatableAttributes.forEach(attribute => { + let path = attribute.split('.'); + let attr = path.pop(); + let currPath = [rootPath]; +@@ -359,7 +375,7 @@ function createAttrsClass(validatableAttributes, validationRules, model) { + + if (!_nestedClasses[key]) { + _nestedClasses[key] = AttrsClass.extend({ +- __path__: currPath.join('.') ++ [ATTRS_PATH]: currPath.join('.') + }); + } + +@@ -368,7 +384,11 @@ function createAttrsClass(validatableAttributes, validationRules, model) { + + // Add the final attr's CP to the class + currClass.reopen({ +- [attr]: createCPValidationFor(attribute, model, get(validationRules, attribute)) ++ [attr]: createCPValidationFor( ++ attribute, ++ model, ++ get(validationRules, attribute) ++ ) + }); + }); + +@@ -388,21 +408,36 @@ function createAttrsClass(validatableAttributes, validationRules, model) { + */ + function createCPValidationFor(attribute, model, validations) { + let isVolatile = hasOption(validations, 'volatile', true); +- let dependentKeys = isVolatile ? [] : getCPDependentKeysFor(attribute, model, validations); +- +- let cp = computed(...dependentKeys, cycleBreaker(function() { +- let model = get(this, '_model'); +- let validators = !isNone(model) ? getValidatorsFor(attribute, model) : []; +- +- let validationResults = generateValidationResultsFor(attribute, model, validators, (validator, options) => { +- return validator.validate(validator.getValue(), options, model, attribute); +- }); ++ let dependentKeys = isVolatile ++ ? [] ++ : getCPDependentKeysFor(attribute, model, validations); ++ ++ let cp = computed( ++ ...dependentKeys, ++ cycleBreaker(function() { ++ let model = get(this, ATTRS_MODEL); ++ let validators = !isNone(model) ? getValidatorsFor(attribute, model) : []; ++ ++ let validationResults = generateValidationResultsFor( ++ attribute, ++ model, ++ validators, ++ (validator, options) => { ++ return validator.validate( ++ validator.getValue(), ++ options, ++ model, ++ attribute ++ ); ++ } ++ ); + +- return ResultCollection.create({ +- attribute, +- content: validationResults +- }); +- })).readOnly(); ++ return ResultCollection.create({ ++ attribute, ++ content: validationResults ++ }); ++ }) ++ ).readOnly(); + + if (isVolatile) { + cp = cp.volatile(); +@@ -450,13 +485,19 @@ function hasOption(validations, option, value = true) { + * - disableDebounceCache {Boolean} + * @return {Array} + */ +-function generateValidationResultsFor(attribute, model, validators, validate, opts = {}) { ++function generateValidationResultsFor( ++ attribute, ++ model, ++ validators, ++ validate, ++ opts = {} ++) { + let isModelValidatable = isValidatable(model); + let isInvalid = false; + let value, result; + +- return validators.map((validator) => { +- let options = get(validator, 'options').copy(); ++ return validators.map(validator => { ++ let options = get(validator, 'options').toObject(); + let isWarning = getWithDefault(options, 'isWarning', false); + let disabled = getWithDefault(options, 'disabled', false); + let debounce = getWithDefault(options, 'debounce', 0); +@@ -468,14 +509,14 @@ function generateValidationResultsFor(attribute, model, validators, validate, op + let cache = getDebouncedValidationsCacheFor(attribute, model); + + // Return a promise and pass the resolve method to the debounce handler +- value = new Promise((resolve) => { ++ value = new Promise(resolve => { + let t = run.debounce(validator, resolveDebounce, resolve, debounce); + + if (!opts.disableDebounceCache) { + cache[guidFor(validator)] = t; + } + }).then(() => { +- return validate(validator, get(validator, 'options').copy()); ++ return validate(validator, get(validator, 'options').toObject()); + }); + } else { + value = validate(validator, options); +@@ -508,7 +549,6 @@ function createTopLevelPropsMixin(validatableAttrs) { + let aliases = [ + 'isValid', + 'isValidating', +- 'isDirty', + 'isAsync', + 'isNotValidating', + 'isInvalid', +@@ -527,20 +567,23 @@ function createTopLevelPropsMixin(validatableAttrs) { + ]; + + let topLevelProps = aliases.reduce((props, alias) => { +- props[alias] = computed.readOnly(`__attrsResultCollection__.${alias}`); ++ props[alias] = readOnly(`${ATTRS_RESULT_COLLECTION}.${alias}`); + return props; + }, {}); + +- return Ember.Mixin.create(topLevelProps, { ++ return Mixin.create(topLevelProps, { + /* + Dedupe logic by creating a top level ResultCollection for all attr's ResultCollections + */ +- __attrsResultCollection__: computed(...validatableAttrs.map((attr) => `attrs.${attr}`), function() { +- return ResultCollection.create({ +- attribute: `Model:${this}`, +- content: validatableAttrs.map((attr) => get(this, `attrs.${attr}`)) +- }); +- }).readOnly() ++ [ATTRS_RESULT_COLLECTION]: computed( ++ ...validatableAttrs.map(attr => `attrs.${attr}`), ++ function() { ++ return ResultCollection.create({ ++ attribute: `Model:${this}`, ++ content: validatableAttrs.map(attr => get(this, `attrs.${attr}`)) ++ }); ++ } ++ ).readOnly() + }); + } + +@@ -558,11 +601,13 @@ function createTopLevelPropsMixin(validatableAttrs) { + function getCPDependentKeysFor(attribute, model, validations) { + let owner = getOwner(model); + +- let dependentKeys = validations.map((validation) => { ++ let dependentKeys = validations.map(validation => { + let { options } = validation; + let type = validation._type; +- let Validator = type === 'function' ? BaseValidator : lookupValidator(owner, type).class; +- let baseDependents = BaseValidator.getDependentsFor(attribute, options) || []; ++ let Validator = ++ type === 'function' ? BaseValidator : lookupValidator(owner, type).class; ++ let baseDependents = ++ BaseValidator.getDependentsFor(attribute, options) || []; + let dependents = Validator.getDependentsFor(attribute, options) || []; + + return [ +@@ -589,8 +634,8 @@ function getCPDependentKeysFor(attribute, model, validations) { + dependentKeys.push('model.isDeleted'); + } + +- dependentKeys = dependentKeys.map((d) => { +- return `${d.split('.')[0] === 'model' ? '_' : ''}${d}`; ++ dependentKeys = dependentKeys.filter(Boolean).map(d => { ++ return d.replace(/^model\./, `${ATTRS_MODEL}.`); + }); + + return emberArray(dependentKeys).uniq(); +@@ -610,7 +655,7 @@ function extractOptionsDependentKeys(options) { + let option = options[key]; + + if (isDescriptor(option)) { +- return arr.concat(option._dependentKeys || []); ++ return arr.concat(getDependentKeys(option) || []); + } + + return arr; +@@ -661,7 +706,9 @@ function validationReturnValueHandler(attribute, value, model, validator) { + */ + function getValidatorsFor(attribute, model) { + let validators = get(model, `validations._validators.${attribute}`); +- return isNone(validators) ? createValidatorsFor(attribute, model) : validators; ++ return isNone(validators) ++ ? createValidatorsFor(attribute, model) ++ : validators; + } + + /** +@@ -677,7 +724,7 @@ function getDebouncedValidationsCacheFor(attribute, model) { + let debouncedValidations = get(model, 'validations._debouncedValidations'); + + if (isNone(get(debouncedValidations, attribute))) { +- assign(debouncedValidations, attribute, {}); ++ deepSet(debouncedValidations, attribute, {}); + } + + return get(debouncedValidations, attribute); +@@ -694,57 +741,32 @@ function getDebouncedValidationsCacheFor(attribute, model) { + */ + function createValidatorsFor(attribute, model) { + let validations = get(model, 'validations'); +- let validationRules = makeArray(get(validations, `_validationRules.${attribute}`)); ++ let validationRules = makeArray( ++ get(validations, `_validationRules.${attribute}`) ++ ); + let validatorCache = get(validations, '_validators'); + let owner = getOwner(model); + let validators = []; +- let validator; + + // We must have an owner to be able to lookup our validators + if (isNone(owner)) { +- throw new TypeError(`[ember-cp-validations] ${model.toString()} is missing a container or owner.`); ++ throw new TypeError( ++ `[ember-cp-validations] ${model.toString()} is missing a container or owner.` ++ ); + } + +- validationRules.forEach((v) => { ++ validationRules.forEach(v => { + v.attribute = attribute; + v.model = model; +- +- // If validate function exists, that means validator was created with a function so use the base class +- if (v._type === 'function') { +- validator = BaseValidator.create(owner.ownerInjection(), v); +- } else { +- validator = lookupValidator(owner, v._type).create(v); +- } +- +- validators.push(validator); ++ validators.push(lookupValidator(owner, v._type).create(v)); + }); + + // Add validators to model instance cache +- assign(validatorCache, attribute, validators); ++ deepSet(validatorCache, attribute, validators); + + return validators; + } + +-/** +- * Lookup a validators of a specific type on the owner +- * +- * @method lookupValidator +- * @throws {Error} Validator not found +- * @private +- * @param {Ember.Owner} owner +- * @param {String} type +- * @return {Class} Validator class or undefined if not found +- */ +-function lookupValidator(owner, type) { +- let validatorClass = owner.factoryFor(`validator:${type}`); +- +- if (isNone(validatorClass)) { +- throw new Error(`[ember-cp-validations] Validator not found of type: ${type}.`); +- } +- +- return validatorClass; +-} +- + /** + * Call the passed resolve method. This is needed as run.debounce expects a + * static method to work properly. +@@ -753,7 +775,7 @@ function lookupValidator(owner, type) { + * @private + * @param {Function} resolve + */ +-function resolveDebounce(resolve) { ++function resolveDebounce(resolve) { + resolve(); + } + +@@ -781,24 +803,29 @@ function validate(options = {}, isAsync = true) { + let whiteList = makeArray(options.on); + let blackList = makeArray(options.excludes); + +- let validationResults = get(this, 'validatableAttributes').reduce((v, name) => { +- if (!isEmpty(blackList) && blackList.indexOf(name) !== -1) { +- return v; +- } ++ let validationResults = get(this, 'validatableAttributes').reduce( ++ (v, name) => { ++ if (!isEmpty(blackList) && blackList.indexOf(name) !== -1) { ++ return v; ++ } + +- if (isEmpty(whiteList) || whiteList.indexOf(name) !== -1) { +- let validationResult = get(this, `attrs.${name}`); ++ if (isEmpty(whiteList) || whiteList.indexOf(name) !== -1) { ++ let validationResult = get(this, `attrs.${name}`); + +- // If an async validation is found, throw an error +- if (!isAsync && get(validationResult, 'isAsync')) { +- throw new Error(`[ember-cp-validations] Synchronous validation failed due to ${name} being an async validation.`); +- } ++ // If an async validation is found, throw an error ++ if (!isAsync && get(validationResult, 'isAsync')) { ++ throw new Error( ++ `[ember-cp-validations] Synchronous validation failed due to ${name} being an async validation.` ++ ); ++ } + +- v.push(validationResult); +- } ++ v.push(validationResult); ++ } + +- return v; +- }, []); ++ return v; ++ }, ++ [] ++ ); + + let validations = ResultCollection.create({ + attribute: `Validate:${model}`, +@@ -814,7 +841,9 @@ function validate(options = {}, isAsync = true) { + where we have to resolve the actual models and only then resolve all the underlying + validation promises. This is the reason that `validate` must be called recursively. + */ +- return get(validations, 'isValidating') ? this.validate(options, isAsync) : resultObject; ++ return get(validations, 'isValidating') ++ ? this.validate(options, isAsync) ++ : resultObject; + }); + } + +@@ -843,11 +872,17 @@ function validateAttribute(attribute, value) { + let model = get(this, 'model'); + let validators = !isNone(model) ? getValidatorsFor(attribute, model) : []; + +- let validationResults = generateValidationResultsFor(attribute, model, validators, (validator, options) => { +- return validator.validate(value, options, model, attribute); +- }, { +- disableDebounceCache: true +- }); ++ let validationResults = generateValidationResultsFor( ++ attribute, ++ model, ++ validators, ++ (validator, options) => { ++ return validator.validate(value, options, model, attribute); ++ }, ++ { ++ disableDebounceCache: true ++ } ++ ); + + let validations = ResultCollection.create({ + attribute, +@@ -862,7 +897,9 @@ function validateAttribute(attribute, value) { + where we have to resolve the actual models and only then resolve all the underlying + validation promises. This is the reason that `validateAttribute` must be called recursively. + */ +- return get(validations, 'isValidating') ? this.validateAttribute(attribute, value) : result; ++ return get(validations, 'isValidating') ++ ? this.validateAttribute(attribute, value) ++ : result; + }); + } + +diff --git a/node_modules/ember-cp-validations/addon/validations/result-collection.js b/node_modules/ember-cp-validations/addon/validations/result-collection.js +index 0c832da..fbf5c3b 100644 +--- a/node_modules/ember-cp-validations/addon/validations/result-collection.js ++++ b/node_modules/ember-cp-validations/addon/validations/result-collection.js +@@ -1,42 +1,38 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- +-import Ember from 'ember'; ++import { not, readOnly, notEmpty, mapBy } from '@ember/object/computed'; ++import ArrayProxy from '@ember/array/proxy'; ++import RSVP from 'rsvp'; ++import { computed, set, get } from '@ember/object'; ++import { isNone } from '@ember/utils'; ++import { A as emberArray, isArray } from '@ember/array'; + import cycleBreaker from '../utils/cycle-breaker'; + import { flatten, uniq, compact } from '../utils/array'; + +-const { +- get, +- set, +- RSVP, +- computed, +- isArray, +- isNone, +- A: emberArray +-} = Ember; +- + /* + CP Macros + */ + function isAny(collection, key, value, defaultValue) { +- return computed(`${collection}.@each.${key}`, cycleBreaker(function() { +- return get(this, collection).isAny(key, value); +- }, defaultValue)); ++ return computed( ++ `${collection}.@each.${key}`, ++ cycleBreaker(function() { ++ return get(this, collection).isAny(key, value); ++ }, defaultValue) ++ ); + } + + function isEvery(collection, key, value, defaultValue) { +- return computed(`${collection}.@each.${key}`, cycleBreaker(function() { +- return get(this, collection).isEvery(key, value); +- }, defaultValue)); ++ return computed( ++ `${collection}.@each.${key}`, ++ cycleBreaker(function() { ++ return get(this, collection).isEvery(key, value); ++ }, defaultValue) ++ ); + } + + /** + * @module Validations + * @class ResultCollection + */ +-export default Ember.ArrayProxy.extend({ ++export default ArrayProxy.extend({ + init() { + set(this, 'content', emberArray(compact(get(this, 'content')))); + this._super(...arguments); +@@ -62,7 +58,7 @@ export default Ember.ArrayProxy.extend({ + * @readOnly + * @type {Boolean} + */ +- isInvalid: computed.not('isValid').readOnly(), ++ isInvalid: not('isValid').readOnly(), + + /** + * ```javascript +@@ -126,24 +122,6 @@ export default Ember.ArrayProxy.extend({ + */ + isTruelyInvalid: isAny('content', 'isTruelyInvalid', true, false).readOnly(), + +- /** +- * Will be true is the attribute in question is not `null` or `undefined`. If the object being +- * validated is an Ember Data Model and you have a `defaultValue` specified, then it will use that for comparison. +- * +- * ```javascript +- * // Examples +- * // 'username' : DS.attr('string', { defaultValue: 'johndoe' }) +- * get(user, 'validations.isDirty') +- * get(user, 'validations.attrs.username.isDirty') +- * ``` +- * +- * @property isDirty +- * @default false +- * @readOnly +- * @type {Boolean} +- */ +- isDirty: isAny('content', 'isDirty', true, false).readOnly(), +- + /** + * Will be `true` only if a validation returns a promise + * +@@ -173,9 +151,12 @@ export default Ember.ArrayProxy.extend({ + * @readOnly + * @type {Array} + */ +- messages: computed('content.@each.messages', cycleBreaker(function() { +- return uniq(compact(flatten(this.getEach('messages')))); +- })).readOnly(), ++ messages: computed( ++ 'content.@each.messages', ++ cycleBreaker(function() { ++ return uniq(compact(flatten(this.getEach('messages')))); ++ }) ++ ).readOnly(), + + /** + * An alias to the first message in the messages collection. +@@ -190,7 +171,7 @@ export default Ember.ArrayProxy.extend({ + * @readOnly + * @type {String} + */ +- message: computed.readOnly('messages.firstObject'), ++ message: readOnly('messages.firstObject'), + + /** + * Will be `true` if there are warnings in the collection. +@@ -205,7 +186,7 @@ export default Ember.ArrayProxy.extend({ + * @readOnly + * @type {String} + */ +- hasWarnings: computed.notEmpty('warningMessages').readOnly(), ++ hasWarnings: notEmpty('warningMessages').readOnly(), + + /** + * A collection of all warning messages on the object in question +@@ -220,9 +201,12 @@ export default Ember.ArrayProxy.extend({ + * @readOnly + * @type {Array} + */ +- warningMessages: computed('content.@each.warningMessages', cycleBreaker(function() { +- return uniq(compact(flatten(this.getEach('warningMessages')))); +- })).readOnly(), ++ warningMessages: computed( ++ 'content.@each.warningMessages', ++ cycleBreaker(function() { ++ return uniq(compact(flatten(this.getEach('warningMessages')))); ++ }) ++ ).readOnly(), + + /** + * An alias to the first message in the warningMessages collection. +@@ -237,7 +221,7 @@ export default Ember.ArrayProxy.extend({ + * @readOnly + * @type {String} + */ +- warningMessage: computed.readOnly('warningMessages.firstObject'), ++ warningMessage: readOnly('warningMessages.firstObject'), + + /** + * A collection of all {{#crossLink "Error"}}Warnings{{/crossLink}} on the object in question. +@@ -253,9 +237,13 @@ export default Ember.ArrayProxy.extend({ + * @readOnly + * @type {Array} + */ +- warnings: computed('attribute', 'content.@each.warnings', cycleBreaker(function() { +- return this._computeErrorCollection(this.getEach('warnings')); +- })).readOnly(), ++ warnings: computed( ++ 'attribute', ++ 'content.@each.warnings', ++ cycleBreaker(function() { ++ return this._computeErrorCollection(this.getEach('warnings')); ++ }) ++ ).readOnly(), + + /** + * An alias to the first {{#crossLink "Warning"}}{{/crossLink}} in the warnings collection. +@@ -270,7 +258,7 @@ export default Ember.ArrayProxy.extend({ + * @readOnly + * @type {Error} + */ +- warning: computed.readOnly('warnings.firstObject'), ++ warning: readOnly('warnings.firstObject'), + + /** + * A collection of all {{#crossLink "Error"}}Errors{{/crossLink}} on the object in question. +@@ -286,9 +274,13 @@ export default Ember.ArrayProxy.extend({ + * @readOnly + * @type {Array} + */ +- errors: computed('attribute', 'content.@each.errors', cycleBreaker(function() { +- return this._computeErrorCollection(this.getEach('errors')); +- })).readOnly(), ++ errors: computed( ++ 'attribute', ++ 'content.@each.errors', ++ cycleBreaker(function() { ++ return this._computeErrorCollection(this.getEach('errors')); ++ }) ++ ).readOnly(), + + /** + * An alias to the first {{#crossLink "Error"}}{{/crossLink}} in the errors collection. +@@ -303,7 +295,7 @@ export default Ember.ArrayProxy.extend({ + * @readOnly + * @type {Error} + */ +- error: computed.readOnly('errors.firstObject'), ++ error: readOnly('errors.firstObject'), + + /** + * All built options of the validators associated with the results in this collection grouped by validator type +@@ -347,17 +339,26 @@ export default Ember.ArrayProxy.extend({ + * @private + * @type {Promise} + */ +- _promise: computed('content.@each._promise', '_contentResults.@each._promise', cycleBreaker(function() { +- return RSVP.allSettled(compact(flatten([ +- this.get('_contentResults').getEach('_promise'), this.getEach('_promise') +- ]))); +- })).readOnly(), ++ _promise: computed( ++ 'content.@each._promise', ++ '_contentResults.@each._promise', ++ cycleBreaker(function() { ++ return RSVP.allSettled( ++ compact( ++ flatten([ ++ this.get('_contentResults').getEach('_promise'), ++ this.getEach('_promise') ++ ]) ++ ) ++ ); ++ }) ++ ).readOnly(), + + /** +- * @property _contentResults +- * @type {Array} +- * @private +- */ ++ * @property _contentResults ++ * @type {Array} ++ * @private ++ */ + _contentResults: computed('content.@each._result', function() { + return emberArray(compact(this.getEach('_result'))); + }).readOnly(), +@@ -367,13 +368,13 @@ export default Ember.ArrayProxy.extend({ + * @type {Array} + * @private + */ +- _contentValidators: computed.mapBy('content', '_validator').readOnly(), ++ _contentValidators: mapBy('content', '_validator').readOnly(), + + _computeErrorCollection(collection = []) { + let attribute = get(this, 'attribute'); + let errors = uniq(compact(flatten(collection))); + +- errors.forEach((e) => { ++ errors.forEach(e => { + if (attribute && e.get('attribute') !== attribute) { + e.set('parentAttribute', attribute); + } +@@ -393,7 +394,7 @@ export default Ember.ArrayProxy.extend({ + } + + let type = get(v, '_type'); +- let vOpts = get(v, 'options').copy(); ++ let vOpts = get(v, 'options').toObject(); + + if (options[type]) { + if (isArray(options[type])) { +diff --git a/node_modules/ember-cp-validations/addon/validations/validator.js b/node_modules/ember-cp-validations/addon/validations/validator.js +index 4e67456..4442690 100644 +--- a/node_modules/ember-cp-validations/addon/validations/validator.js ++++ b/node_modules/ember-cp-validations/addon/validations/validator.js +@@ -1,12 +1,5 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +-import Ember from 'ember'; +- +-const { +- isNone +-} = Ember; ++import { isNone } from '@ember/utils'; ++import { deprecate } from '@ember/application/deprecations'; + + /** + * @module Validators +@@ -218,12 +211,21 @@ export default function(arg1, options) { + }; + + if (typeof arg1 === 'function') { +- props.validate = arg1; +- props._type = 'function'; ++ deprecate( ++ '[ember-cp-validations] `validator` no longer directly accepts ' + ++ 'a function. Please use the inline validator syntax:' + ++ "\n\nvalidator('inline', { validate() {} )\n\n", ++ false, ++ { id: 'ember-cp-validations.inline-validator', until: '4.2.0' } ++ ); ++ props.options.validate = arg1; ++ props._type = 'inline'; + } else if (typeof arg1 === 'string') { + props._type = arg1; + } else { +- throw new TypeError('[ember-cp-validations] Unexpected type for first validator argument. It should either be a string or a function'); ++ throw new TypeError( ++ '[ember-cp-validations] Unexpected type for first validator argument — It must be a string.' ++ ); + } + + return props; +diff --git a/node_modules/ember-cp-validations/addon/validations/warning-result-collection.js b/node_modules/ember-cp-validations/addon/validations/warning-result-collection.js +index fbb6a4c..9c62015 100644 +--- a/node_modules/ember-cp-validations/addon/validations/warning-result-collection.js ++++ b/node_modules/ember-cp-validations/addon/validations/warning-result-collection.js +@@ -1,29 +1,34 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- +-import Ember from 'ember'; ++import { not } from '@ember/object/computed'; ++import { computed } from '@ember/object'; + import ResultCollection from './result-collection'; + import cycleBreaker from '../utils/cycle-breaker'; + import { flatten, uniq, compact } from '../utils/array'; + +-const { +- computed, +-} = Ember; +- + export default ResultCollection.extend({ + isValid: computed(() => true).readOnly(), +- isTruelyValid: computed.not('isValidating').readOnly(), ++ isTruelyValid: not('isValidating').readOnly(), + + messages: computed(() => []).readOnly(), + errors: computed(() => []).readOnly(), + +- warningMessages: computed('content.@each.{messages,warningMessages}', cycleBreaker(function() { +- return uniq(compact(flatten([this.getEach('messages'), this.getEach('warningMessages')]))); +- })).readOnly(), ++ warningMessages: computed( ++ 'content.@each.{messages,warningMessages}', ++ cycleBreaker(function() { ++ return uniq( ++ compact( ++ flatten([this.getEach('messages'), this.getEach('warningMessages')]) ++ ) ++ ); ++ }) ++ ).readOnly(), + +- warnings: computed('attribute', 'content.@each.{errors,warnings}', cycleBreaker(function() { +- return this._computeErrorCollection(flatten([this.getEach('errors'), this.getEach('warnings')])); +- })).readOnly() ++ warnings: computed( ++ 'attribute', ++ 'content.@each.{errors,warnings}', ++ cycleBreaker(function() { ++ return this._computeErrorCollection( ++ flatten([this.getEach('errors'), this.getEach('warnings')]) ++ ); ++ }) ++ ).readOnly() + }); +diff --git a/node_modules/ember-cp-validations/addon/validators/alias.js b/node_modules/ember-cp-validations/addon/validators/alias.js +index 00a082b..1f99139 100644 +--- a/node_modules/ember-cp-validations/addon/validators/alias.js ++++ b/node_modules/ember-cp-validations/addon/validators/alias.js +@@ -1,18 +1,9 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ ++import { assert } from '@ember/debug'; + +-import Ember from 'ember'; ++import { isPresent } from '@ember/utils'; ++import { getProperties, get } from '@ember/object'; + import Base from 'ember-cp-validations/validators/base'; + +-const { +- get, +- assert, +- isPresent, +- getProperties +-} = Ember; +- + /** + * [See All Options](#method_validate) + * +@@ -73,13 +64,21 @@ const Alias = Base.extend({ + * @param {String} attribute + */ + validate(value, options, model, attribute) { +- let { alias, firstMessageOnly } = getProperties(options, ['alias', 'firstMessageOnly']); ++ let { alias, firstMessageOnly } = getProperties(options, [ ++ 'alias', ++ 'firstMessageOnly' ++ ]); + +- assert(`[validator:alias] [${attribute}] option 'alias' is required`, isPresent(alias)); ++ assert( ++ `[validator:alias] [${attribute}] option 'alias' is required`, ++ isPresent(alias) ++ ); + + let aliasValidation = get(model, `validations.attrs.${alias}`); + +- return firstMessageOnly ? get(aliasValidation, 'message') : get(aliasValidation, 'content'); ++ return firstMessageOnly ++ ? get(aliasValidation, 'message') ++ : get(aliasValidation, 'content'); + } + }); + +@@ -87,9 +86,12 @@ Alias.reopenClass({ + getDependentsFor(attribute, options) { + let alias = typeof options === 'string' ? options : get(options, 'alias'); + +- assert(`[validator:alias] [${attribute}] 'alias' must be a string`, typeof alias === 'string'); ++ assert( ++ `[validator:alias] [${attribute}] 'alias' must be a string`, ++ typeof alias === 'string' ++ ); + +- return [ `${alias}.messages.[]`, `${alias}.isTruelyValid` ]; ++ return [`${alias}.messages.[]`, `${alias}.isTruelyValid`]; + } + }); + +diff --git a/node_modules/ember-cp-validations/addon/validators/base.js b/node_modules/ember-cp-validations/addon/validators/base.js +index 30ef21d..b14a9ef 100644 +--- a/node_modules/ember-cp-validations/addon/validators/base.js ++++ b/node_modules/ember-cp-validations/addon/validators/base.js +@@ -1,27 +1,29 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- +-import Ember from 'ember'; ++import { bool } from '@ember/object/computed'; ++import EmberObject, { set, get, computed } from '@ember/object'; ++import { isNone } from '@ember/utils'; ++import { getOwner } from '@ember/application'; + import Messages from 'ember-cp-validations/validators/messages'; + import Options from 'ember-cp-validations/-private/options'; +-import { unwrapString, getValidatableValue, mergeOptions } from 'ember-cp-validations/utils/utils'; ++import lookupValidator from 'ember-cp-validations/utils/lookup-validator'; ++import { ++ unwrapString, ++ getValidatableValue, ++ mergeOptions, ++ isPromise ++} from 'ember-cp-validations/utils/utils'; + +-const { +- get, +- set, +- isNone, +- computed, +- getOwner +-} = Ember; ++class TestResult { ++ constructor(result) { ++ this.isValid = result === true; ++ this.message = typeof result === 'string' ? result : null; ++ } ++} + + /** + * @class Base + * @module Validators + */ +-const Base = Ember.Object.extend({ +- ++const Base = EmberObject.extend({ + /** + * Options passed in to the validator when defined in the model + * @property options +@@ -68,7 +70,7 @@ const Base = Ember.Object.extend({ + * @property isWarning + * @type {Boolean} + */ +- isWarning: computed.bool('options.isWarning').readOnly(), ++ isWarning: bool('options.isWarning').readOnly(), + + /** + * Validator type +@@ -78,6 +80,14 @@ const Base = Ember.Object.extend({ + */ + _type: null, + ++ /** ++ * Validators cache used by `test` api ++ * @property _testValidatorCache ++ * @private ++ * @type {Object} ++ */ ++ _testValidatorCache: computed(() => ({})).readOnly(), ++ + init() { + this._super(...arguments); + let globalOptions = get(this, 'globalOptions'); +@@ -94,14 +104,18 @@ const Base = Ember.Object.extend({ + // If for some reason, we can't find the messages object (i.e. unit tests), use default + errorMessages = errorMessages || Messages; + +- set(this, 'options', this.buildOptions(options || {}, defaultOptions || {}, globalOptions || {})); ++ set( ++ this, ++ 'options', ++ this.buildOptions(options, defaultOptions, globalOptions) ++ ); + set(this, 'errorMessages', errorMessages.create()); + }, + + /** + * Build options hook. Merges default options into options object. + * This method gets called on init and is the ideal place to normalize your options. +- * The [presence validator](https://github.com/offirgolan/ember-cp-validations/blob/master/app/validators/presence.js) is a good example to checkout ++ * The [presence validator](https://github.com/offirgolan/ember-cp-validations/blob/master/addon/validators/presence.js) is a good example to checkout + * @method buildOptions + * @param {Object} options + * @param {Object} defaultOptions +@@ -116,10 +130,10 @@ const Base = Ember.Object.extend({ + this.value = builtOptions.value || this.value; + delete builtOptions.value; + +- return Options.create({ ++ return new Options({ + model: get(this, 'model'), + attribute: get(this, 'attribute'), +- __options__: builtOptions ++ options: builtOptions + }); + }, + +@@ -177,14 +191,13 @@ const Base = Ember.Object.extend({ + * + * ```javascript + * validate(value, options) { +- * var exists = false; +- * +- * get(options, 'description') = 'Username'; +- * get(options, 'username') = value; ++ * const exists = false; + * + * // check with server if username exists... + * + * if(exists) { ++ * // The username key on the options object will be used to create the error message ++ * options.username = value; + * return this.createErrorMessage('uniqueUsername', value, options); + * } + * +@@ -196,7 +209,7 @@ const Base = Ember.Object.extend({ + * + * @method createErrorMessage + * @param {String} type The type of message template to use +- * @param {Mixed} value Current value being evaluated ++ * @param {Mixed} value Current value being evaluated + * @param {Object} options Validator built and processed options (used as the message string context) + * @return {String} The generated message + */ +@@ -204,26 +217,92 @@ const Base = Ember.Object.extend({ + let messages = this.get('errorMessages'); + let message = unwrapString(get(options, 'message')); + +- set(options, 'description', messages.getDescriptionFor(get(this, 'attribute'), options)); ++ set( ++ options, ++ 'description', ++ messages.getDescriptionFor(get(this, 'attribute'), options) ++ ); + + if (message) { + if (typeof message === 'string') { + message = messages.formatMessage(message, options); + } else if (typeof message === 'function') { + message = message.apply(this, arguments); +- message = isNone(message) ? messages.getMessageFor(type, options) : messages.formatMessage(message, options); ++ message = isNone(message) ++ ? messages.getMessageFor(type, options) ++ : messages.formatMessage(message, options); + } + } else { + message = messages.getMessageFor(type, options); + } + + return message.trim(); ++ }, ++ ++ /** ++ * Easily compose complicated validations by using this method to validate ++ * against other validators. ++ * ++ * ```javascript ++ * validate(value, options, ...args) { ++ * let result = this.test('presence', value, { presence: true }, ...args); ++ * ++ * if (!result.isValid) { ++ * return result.message; ++ * } ++ * ++ * // You can even test against your own custom validators ++ * result = this.test('my-validator', value, { foo: 'bar' }, ...args); ++ * ++ * if (!result.isValid) { ++ * return result.message; ++ * } ++ * ++ * result = this.test('number', value, { integer: true }, ...args); ++ * ++ * // You can easily override the error message by returning your own. ++ * if (!result.isValid) { ++ * return 'This value must be an integer!'; ++ * } ++ * ++ * // Add custom logic... ++ * ++ * return true; ++ * } ++ * ``` ++ * @method test ++ * @param {String} type The validator type (e.x. 'presence', 'length', etc.) ++ * The following types are unsupported: ++ * 'alias', 'belongs-to', 'dependent', 'has-many' ++ * @param {...args} args The arguments to pass through to the validator ++ * @return {Object} The test result object which will contain `isValid` ++ * and `message`. If the validator is async, then the ++ * return value will be a promise. ++ */ ++ test(type, ...args) { ++ const cache = this.get('_testValidatorCache'); ++ const unsupportedTypes = ['alias', 'belongs-to', 'dependent', 'has-many']; ++ ++ if (unsupportedTypes.includes(type)) { ++ throw new Error( ++ `[ember-cp-validations] The \`test\` API does not support validators of type: ${type}.` ++ ); ++ } ++ ++ cache[type] = cache[type] || lookupValidator(getOwner(this), type).create(); ++ const result = cache[type].validate(...args); ++ ++ if (isPromise(result)) { ++ return result.then(r => new TestResult(r), r => new TestResult(r)); ++ } ++ ++ return new TestResult(result); + } + }); + + Base.reopenClass({ + /** +- * Generate the needed depenent keys for this validator ++ * Generate the needed dependent keys for this validator + * + * @method getDependentsFor + * @static +@@ -290,7 +369,7 @@ export default Base; + * let message = `The username '${value}' already exists.`; + * let meta = user.get('meta'); + * +- * if(get(options, 'showSuggestions') && meta && meta.suggestions) { ++ * if(options.showSuggestions && meta && meta.suggestions) { + * message += "What about one of the these: " + meta.suggestions.join(', '); + * } + * return message; +@@ -338,7 +417,7 @@ export default Base; + * To use our unique-username validator we just have to add it to the model definition + * + * ```javascript +- * var Validations = buildValidations({ ++ * const Validations = buildValidations({ + * username: validator('unique-username', { + * showSuggestions: true + * }), +@@ -363,7 +442,7 @@ export default Base; + * }); + * + * test('it works', function(assert) { +- * var validator = this.subject(); ++ * const validator = this.subject(); + * assert.ok(validator); + * }); + * ``` +@@ -387,20 +466,3 @@ export default Base; + * @module Validators + * @extends Base + */ +- +-/** +- * A validator can also be declared with an inline function. The function will be then wrapped in the {{#crossLink 'Base'}}Base Validator{{/crossLink}} class and used just like any other pre-defined validator. +- * +- * ```javascript +- * // Example +- * validator(function(value, options, model, attribute) { +- * return value === get(options, 'username') ? true : `must be ${get(options, 'username')}`; +- * } , { +- * username: 'John' // Any options can be passed here +- * }) +- * ``` +- * +- * @class Inline +- * @module Validators +- * @extends Base +- */ +diff --git a/node_modules/ember-cp-validations/addon/validators/belongs-to.js b/node_modules/ember-cp-validations/addon/validators/belongs-to.js +index e666101..415bead 100755 +--- a/node_modules/ember-cp-validations/addon/validators/belongs-to.js ++++ b/node_modules/ember-cp-validations/addon/validators/belongs-to.js +@@ -1,16 +1,7 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- +-import Ember from 'ember'; ++import { get } from '@ember/object'; + import Base from 'ember-cp-validations/validators/base'; + import { isPromise } from 'ember-cp-validations/utils/utils'; + +-const { +- get +-} = Ember; +- + /** + * [See All Options](#method_validate) + * +@@ -84,7 +75,7 @@ const BelongsTo = Base.extend({ + validate(value, ...args) { + if (value) { + if (isPromise(value)) { +- return value.then((model) => this.validate(model, ...args)); ++ return value.then(model => this.validate(model, ...args)); + } + + return get(value, 'validations'); +diff --git a/node_modules/ember-cp-validations/addon/validators/collection.js b/node_modules/ember-cp-validations/addon/validators/collection.js +index 8912928..86afe17 100755 +--- a/node_modules/ember-cp-validations/addon/validators/collection.js ++++ b/node_modules/ember-cp-validations/addon/validators/collection.js +@@ -1,15 +1,6 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- +-import Ember from 'ember'; ++import { get } from '@ember/object'; + import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + +-const { +- get +-} = Ember; +- + /** + * [See All Options](#method_validate) + * +@@ -64,7 +55,9 @@ const Collection = EmberValidator.extend({ + + Collection.reopenClass({ + getDependentsFor(attribute, options) { +- return (options === true || get(options, 'collection') === true) ? [`model.${attribute}.[]`] : []; ++ return options === true || get(options, 'collection') === true ++ ? [`model.${attribute}.[]`] ++ : []; + } + }); + +diff --git a/node_modules/ember-cp-validations/addon/validators/confirmation.js b/node_modules/ember-cp-validations/addon/validators/confirmation.js +index 68409a7..20ddd18 100755 +--- a/node_modules/ember-cp-validations/addon/validators/confirmation.js ++++ b/node_modules/ember-cp-validations/addon/validators/confirmation.js +@@ -1,16 +1,7 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- +-import Ember from 'ember'; ++import { get } from '@ember/object'; ++import { assert } from '@ember/debug'; + import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + +-const { +- get, +- assert +-} = Ember; +- + /** + * [See All Options](#method_validate) + * +@@ -40,7 +31,10 @@ Confirmation.reopenClass({ + getDependentsFor(attribute, options) { + let on = get(options, 'on'); + +- assert(`[validator:confirmation] [${attribute}] 'on' must be a string`, typeof on === 'string'); ++ assert( ++ `[validator:confirmation] [${attribute}] 'on' must be a string`, ++ typeof on === 'string' ++ ); + + return on ? [`model.${on}`] : []; + } +diff --git a/node_modules/ember-cp-validations/addon/validators/date.js b/node_modules/ember-cp-validations/addon/validators/date.js +index 193bf68..07d7910 100755 +--- a/node_modules/ember-cp-validations/addon/validators/date.js ++++ b/node_modules/ember-cp-validations/addon/validators/date.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + + /** +@@ -18,11 +13,10 @@ import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + * + * ```javascript + * validator('date', { +- * after: 'now', ++ * after: '25/12/2019', + * before: '1/1/2020', +- * precision: 'day', +- * format: 'M/D/YYY', +- * errorFormat: 'M/D/YYY' ++ * format: { dateStyle: 'long' }, ++ * errorFormat: { dateStyle: 'long' } + * }) + * ``` + * +diff --git a/node_modules/ember-cp-validations/addon/validators/dependent.js b/node_modules/ember-cp-validations/addon/validators/dependent.js +index e5cad93..3cf2800 100755 +--- a/node_modules/ember-cp-validations/addon/validators/dependent.js ++++ b/node_modules/ember-cp-validations/addon/validators/dependent.js +@@ -1,22 +1,9 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- +-import Ember from 'ember'; ++import { getProperties, get } from '@ember/object'; ++import { assert } from '@ember/debug'; ++import { isPresent, isEmpty, isNone } from '@ember/utils'; ++import { isArray, A } from '@ember/array'; + import Base from 'ember-cp-validations/validators/base'; +- +-const { +- A, +- get, +- getWithDefault, +- getProperties, +- assert, +- isNone, +- isEmpty, +- isPresent, +- isArray +-} = Ember; ++import getWithDefault from '../utils/get-with-default'; + + /** + * [See All Options](#method_validate) +@@ -48,7 +35,10 @@ const Dependent = Base.extend({ + validate(value, options, model, attribute) { + let { on, allowBlank } = getProperties(options, ['on', 'allowBlank']); + +- assert(`[validator:dependent] [${attribute}] option 'on' is required`, isPresent(on)); ++ assert( ++ `[validator:dependent] [${attribute}] option 'on' is required`, ++ isPresent(on) ++ ); + + if (isNone(model)) { + return true; +@@ -58,9 +48,11 @@ const Dependent = Base.extend({ + return true; + } + +- let dependentValidations = getWithDefault(options, 'on', A()).map((dependent) => get(model, `validations.attrs.${dependent}`)); ++ let dependentValidations = getWithDefault(options, 'on', A()).map( ++ dependent => get(model, `validations.attrs.${dependent}`) ++ ); + +- if (!isEmpty(dependentValidations.filter((v) => get(v, 'isTruelyInvalid')))) { ++ if (!isEmpty(dependentValidations.filter(v => get(v, 'isTruelyInvalid')))) { + return this.createErrorMessage('invalid', value, options); + } + +@@ -72,10 +64,13 @@ Dependent.reopenClass({ + getDependentsFor(attribute, options) { + let dependents = get(options, 'on'); + +- assert(`[validator:dependent] [${attribute}] 'on' must be an array`, isArray(dependents)); ++ assert( ++ `[validator:dependent] [${attribute}] 'on' must be an array`, ++ isArray(dependents) ++ ); + + if (!isEmpty(dependents)) { +- return dependents.map((dependent) => `${dependent}.isTruelyValid`); ++ return dependents.map(dependent => `${dependent}.isTruelyValid`); + } + + return []; +diff --git a/node_modules/ember-cp-validations/addon/validators/ds-error.js b/node_modules/ember-cp-validations/addon/validators/ds-error.js +index 3af1bfd..cdd6b12 100755 +--- a/node_modules/ember-cp-validations/addon/validators/ds-error.js ++++ b/node_modules/ember-cp-validations/addon/validators/ds-error.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + import { getPathAndKey } from 'ember-validators/ds-error'; + +diff --git a/node_modules/ember-cp-validations/addon/validators/exclusion.js b/node_modules/ember-cp-validations/addon/validators/exclusion.js +index 4b20a72..a8b5a63 100755 +--- a/node_modules/ember-cp-validations/addon/validators/exclusion.js ++++ b/node_modules/ember-cp-validations/addon/validators/exclusion.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + + /** +diff --git a/node_modules/ember-cp-validations/addon/validators/format.js b/node_modules/ember-cp-validations/addon/validators/format.js +index 32b1530..e0a5b1d 100755 +--- a/node_modules/ember-cp-validations/addon/validators/format.js ++++ b/node_modules/ember-cp-validations/addon/validators/format.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + import { regularExpressions } from 'ember-validators/format'; + +diff --git a/node_modules/ember-cp-validations/addon/validators/has-many.js b/node_modules/ember-cp-validations/addon/validators/has-many.js +index 29c0e81..7ed6dc8 100755 +--- a/node_modules/ember-cp-validations/addon/validators/has-many.js ++++ b/node_modules/ember-cp-validations/addon/validators/has-many.js +@@ -1,10 +1,6 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import Base from 'ember-cp-validations/validators/base'; + import { isPromise } from 'ember-cp-validations/utils/utils'; ++import { get } from '@ember/object'; + + /** + * [See All Options](#method_validate) +@@ -57,10 +53,10 @@ const HasMany = Base.extend({ + validate(value, ...args) { + if (value) { + if (isPromise(value)) { +- return value.then((models) => this.validate(models, ...args)); ++ return value.then(models => this.validate(models, ...args)); + } + +- return value.map((m) => m.get('validations')); ++ return value.map(m => get(m, 'validations')); + } + + return true; +diff --git a/node_modules/ember-cp-validations/addon/validators/inclusion.js b/node_modules/ember-cp-validations/addon/validators/inclusion.js +index 32ec772..6b4f26b 100755 +--- a/node_modules/ember-cp-validations/addon/validators/inclusion.js ++++ b/node_modules/ember-cp-validations/addon/validators/inclusion.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + + /** +diff --git a/node_modules/ember-cp-validations/addon/validators/inline.js b/node_modules/ember-cp-validations/addon/validators/inline.js +new file mode 100755 +index 0000000..74f1f94 +--- /dev/null ++++ b/node_modules/ember-cp-validations/addon/validators/inline.js +@@ -0,0 +1,49 @@ ++import Base from 'ember-cp-validations/validators/base'; ++import { assign } from '@ember/polyfills'; ++import { assert } from '@ember/debug'; ++ ++/** ++ * Accepts a custom `validate` function. ++ * ++ * ## Examples ++ * ++ * ```javascript ++ * validator('inline', { ++ * username: 'offirgolan', ++ * validate(value, options, model, attribute) { ++ * return value === options.username ? ++ * true : ++ * `Username must be ${options.username}`; ++ * } ++ * }); ++ * ``` ++ * ++ * @class Inline ++ * @module Validators ++ * @extends Base ++ */ ++export default Base.extend({ ++ /** ++ * Override the validator's `validate` method with the one that was ++ * passed in via the options. ++ * ++ * @method buildOptions ++ * @param {Object} options ++ * @param {Object} defaultOptions ++ * @param {Object} globalOptions ++ * @return {Object} ++ */ ++ buildOptions(options = {}, ...args) { ++ assert( ++ `[validator:inline] You must pass in a validate function`, ++ options && typeof options.validate === 'function' ++ ); ++ ++ const opts = assign({}, options); ++ ++ this.validate = opts.validate; ++ delete opts.validate; ++ ++ return this._super(opts, ...args); ++ } ++}); +diff --git a/node_modules/ember-cp-validations/addon/validators/length.js b/node_modules/ember-cp-validations/addon/validators/length.js +index 5f1034f..4fbdeb8 100755 +--- a/node_modules/ember-cp-validations/addon/validators/length.js ++++ b/node_modules/ember-cp-validations/addon/validators/length.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + + /** +diff --git a/node_modules/ember-cp-validations/addon/validators/messages.js b/node_modules/ember-cp-validations/addon/validators/messages.js +index ddbcecc..99a2867 100644 +--- a/node_modules/ember-cp-validations/addon/validators/messages.js ++++ b/node_modules/ember-cp-validations/addon/validators/messages.js +@@ -1,8 +1,4 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +-import Ember from 'ember'; ++import EmberObject from '@ember/object'; + import Messages from 'ember-validators/messages'; + + /** +@@ -26,4 +22,4 @@ import Messages from 'ember-validators/messages'; + * @class Messages + * @module Validators + */ +-export default Ember.Object.extend(Messages); ++export default EmberObject.extend(Messages); +diff --git a/node_modules/ember-cp-validations/addon/validators/number.js b/node_modules/ember-cp-validations/addon/validators/number.js +index dd55c0b..7655985 100755 +--- a/node_modules/ember-cp-validations/addon/validators/number.js ++++ b/node_modules/ember-cp-validations/addon/validators/number.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + + /** +diff --git a/node_modules/ember-cp-validations/addon/validators/presence.js b/node_modules/ember-cp-validations/addon/validators/presence.js +index a85b4ed..7a041c6 100755 +--- a/node_modules/ember-cp-validations/addon/validators/presence.js ++++ b/node_modules/ember-cp-validations/addon/validators/presence.js +@@ -1,8 +1,3 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + import EmberValidator from 'ember-cp-validations/-private/ember-validator'; + + /** +diff --git a/node_modules/ember-cp-validations/app/.gitkeep b/node_modules/ember-cp-validations/app/.gitkeep +new file mode 100644 +index 0000000..e69de29 +diff --git a/node_modules/ember-cp-validations/app/validators/inline.js b/node_modules/ember-cp-validations/app/validators/inline.js +new file mode 100644 +index 0000000..471dd23 +--- /dev/null ++++ b/node_modules/ember-cp-validations/app/validators/inline.js +@@ -0,0 +1 @@ ++export { default } from 'ember-cp-validations/validators/inline'; +diff --git a/node_modules/ember-cp-validations/app/validators/messages.js b/node_modules/ember-cp-validations/app/validators/messages.js +index 6a79ced..b6d9e85 100644 +--- a/node_modules/ember-cp-validations/app/validators/messages.js ++++ b/node_modules/ember-cp-validations/app/validators/messages.js +@@ -1,6 +1 @@ +-/** +- * Copyright 2016, Yahoo! Inc. +- * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. +- */ +- + export { default } from 'ember-cp-validations/validators/messages'; +diff --git a/node_modules/ember-cp-validations/htmlbars-plugins/v-get.js b/node_modules/ember-cp-validations/htmlbars-plugins/v-get.js +index ccce69b..7e0dfc4 100644 +--- a/node_modules/ember-cp-validations/htmlbars-plugins/v-get.js ++++ b/node_modules/ember-cp-validations/htmlbars-plugins/v-get.js +@@ -52,7 +52,7 @@ + * {{v-get model 'username' 'message'}} + * + * {{/if}} +- * ++ * + * + * + * ``` +@@ -63,131 +63,134 @@ + + /* eslint-env node */ + +-function VGet(options) { +- this.options = options; +- this.syntax = null; // set by HTMLBars +-} +- +-VGet.prototype.transform = function(ast) { +- var context = this; +- var walker = new this.syntax.Walker(); ++function transform({ syntax }) { ++ function processNode(node) { ++ let type = node.type; ++ node = unwrapNode(node); + +- walker.visit(ast, function(node) { +- if (context.validate(node)) { +- context.processNode(node); ++ // {{v-get model 'username' 'isValid'}} ++ if (type === 'MustacheStatement' && node.path.original === 'v-get') { ++ transformToGet(node); + } +- }); +- +- return ast; +-}; + +-VGet.prototype.validate = function(node) { +- return ['BlockStatement', 'MustacheStatement', 'ElementNode'].indexOf(node.type) > -1; +-}; +- +-VGet.prototype.processNode = function(node) { +- var type = node.type; +- node = unwrapNode(node); +- +- // {{v-get model 'username' 'isValid'}} +- if (type === 'MustacheStatement' && node.path.original === 'v-get') { +- this.transformToGet(node); ++ processNodeParams(node); ++ processNodeHash(node); ++ processNodeAttributes(node); + } + +- this.processNodeParams(node); +- this.processNodeHash(node); +- this.processNodeAttributes(node); +-}; +- +-/** +- * {{#if (v-get model 'username' 'isValid')}} {{/if}} +- * @param {AST.Node} node +- */ +-VGet.prototype.processNodeParams = function(node) { +- if (node.params) { +- for (var i = 0; i < node.params.length; i++) { +- var param = node.params[i]; +- if (param.type === 'SubExpression') { +- if (param.path.original === 'v-get') { +- this.transformToGet(param); +- } else { +- this.processNode(param); ++ /** ++ * {{#if (v-get model 'username' 'isValid')}} {{/if}} ++ * @param {AST.Node} node ++ */ ++ function processNodeParams(node) { ++ if (node.params) { ++ for (let param of node.params) { ++ if (param.type === 'SubExpression') { ++ if (param.path.original === 'v-get') { ++ transformToGet(param); ++ } else { ++ processNode(param); ++ } + } + } + } + } +-}; + +-/** +- * {{x-component prop=(v-get model 'isValid')}} +- * @param {AST.Node} node +- */ +-VGet.prototype.processNodeHash = function(node) { +- if (node.hash && node.hash.pairs) { +- for (var i = 0; i < node.hash.pairs.length; i++) { +- var pair = node.hash.pairs[i]; +- if (pair.value.type === 'SubExpression') { +- if (pair.value.path.original === 'v-get') { +- this.transformToGet(pair.value); +- } else { +- this.processNode(pair.value); ++ /** ++ * {{x-component prop=(v-get model 'isValid')}} ++ * @param {AST.Node} node ++ */ ++ function processNodeHash(node) { ++ if (node.hash && node.hash.pairs) { ++ for (let pair of node.hash.pairs) { ++ if (pair.value.type === 'SubExpression') { ++ if (pair.value.path.original === 'v-get') { ++ transformToGet(pair.value); ++ } else { ++ processNode(pair.value); ++ } + } + } + } + } +-}; + +-/** +- * (node.attributes) +- *
+- * @param {AST.Node} node +- */ +-VGet.prototype.processNodeAttributes = function(node) { +- var i; +- if (node.attributes) { +- for (i = 0; i < node.attributes.length; i++) { +- var attr = node.attributes[i]; +- this.processNode(attr.value); ++ /** ++ * (node.attributes) ++ *
++ * @param {AST.Node} node ++ */ ++ function processNodeAttributes(node) { ++ if (node.attributes) { ++ for (let attr of node.attributes) { ++ processNode(attr.value); ++ } + } +- } + +- if (node.parts) { +- for (i = 0; i < node.parts.length; i++) { +- this.processNode(node.parts[i]); ++ if (node.parts) { ++ for (let part of node.parts) { ++ processNode(part); ++ } + } + } +-}; +- + +-/** +- * Transform (v-get model 'username' 'isValid') to (get (get model.validations.attrs 'username') 'isValid') OR +- * (v-get model 'isValid') to (get model.validations 'isValid') +- * @param {AST.Node} node +- * @return {AST.Node} +- */ +-VGet.prototype.transformToGet = function(node) { +- node = unwrapNode(node); +- var params = node.params; +- var i = 0; +- +- if (params.length < 2) { +- throw new Error('{{v-get}} requires at least two arguments'); +- } +- if (params[0].type !== 'PathExpression') { +- throw new Error('The first argument to {{v-get}} must be a stream'); +- } ++ /** ++ * Transform: ++ * (v-get model 'username' 'isValid') to (get (get (get (get model 'validations') 'attrs') 'username') 'isValid') ++ * OR ++ * (v-get model 'isValid') to (get (get model 'validations') 'isValid') ++ * @param {AST.Node} node ++ * @return {AST.Node} ++ */ ++ function transformToGet(node) { ++ node = unwrapNode(node); ++ let params = node.params; ++ let numParams = params.length; ++ ++ if (numParams < 2) { ++ throw new Error('{{v-get}} requires at least two arguments'); ++ } ++ if (params[0].type !== 'PathExpression') { ++ throw new Error('The first argument to {{v-get}} must be a stream'); ++ } + +- var root = this.syntax.builders.path(params[i++].original + '.validations'); ++ // (get model 'validations') ++ let root = syntax.builders.sexpr(syntax.builders.path('get'), [ ++ params[0], ++ syntax.builders.string('validations') ++ ]); ++ ++ // (get (get (get model 'validations') 'attrs') 'username') ++ if (numParams === 3) { ++ root = syntax.builders.sexpr(syntax.builders.path('get'), [ ++ root, ++ syntax.builders.string('attrs') ++ ]); ++ root = syntax.builders.sexpr(syntax.builders.path('get'), [ ++ root, ++ params[1] ++ ]); ++ } + +- if (params.length === 3) { +- root = this.syntax.builders.path(root.original + '.attrs'); +- root = this.syntax.builders.sexpr(this.syntax.builders.path('get'), [root, params[i++]]); // (get model.validations.attrs 'username') ++ node.path = syntax.builders.path('get'); ++ // (get root 'isValid') ++ node.params = [root, params[numParams - 1]]; + } + +- node.path = this.syntax.builders.path('get'); +- node.params = [root, params[i]]; +- +-}; ++ return { ++ name: 'v-get', ++ visitor: { ++ BlockStatement(node) { ++ processNode(node); ++ }, ++ MustacheStatement(node) { ++ processNode(node); ++ }, ++ ElementNode(node) { ++ processNode(node); ++ } ++ } ++ }; ++} + + // For compatibility with pre- and post-glimmer + function unwrapNode(node) { +@@ -198,4 +201,4 @@ function unwrapNode(node) { + } + } + +-module.exports = VGet; ++module.exports = transform; diff --git a/yarn.lock b/yarn.lock index 6ed4323..5d48e6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -553,7 +553,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-block-scoping@^7.16.0", "@babel/plugin-transform-block-scoping@^7.16.7": +"@babel/plugin-transform-block-scoping@^7.16.0", "@babel/plugin-transform-block-scoping@^7.16.7", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== @@ -972,11 +972,138 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@ember-data/adapter@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-4.1.0.tgz#ce97739c58f96e5f95ef19998058bd5a8b1de206" + integrity sha512-Yl9lwn+ZsUbSZXzXG6a64PrBLesqmSMF1JRF59uTnpIqiMQYUTdWMbYL8GDBUsphjpxUWBP5TxHgyhWSxi2LeA== + dependencies: + "@ember-data/private-build-infra" "4.1.0" + "@ember-data/store" "4.1.0" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + ember-auto-import "^2.2.4" + ember-cli-babel "^7.26.6" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + +"@ember-data/canary-features@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-4.1.0.tgz#715d499650338952b5716456e5f14814916f9dae" + integrity sha512-mrB9d6MfPfVG84TTP7p6A3SAQqBKs87TB0lAIrSdubfLLPfw9TGzv95V9yo7CLnYCER6FkT3/wAcdOAEF8INbA== + dependencies: + ember-cli-babel "^7.26.6" + ember-cli-typescript "^4.1.0" + +"@ember-data/debug@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ember-data/debug/-/debug-4.1.0.tgz#91c8e0d8a0247a8f5492f0c6fe5e6a24a93c2f42" + integrity sha512-c8ftofepCEGzWkJ21IEo690q6Z0zE2ZrAzE+H+kbcOKXGzVHJFJS573nblzL22IRcsIC6kHIHwSZ1abkKIgnIw== + dependencies: + "@ember-data/private-build-infra" "4.1.0" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + ember-auto-import "^2.2.4" + ember-cli-babel "^7.26.6" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + +"@ember-data/model@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-4.1.0.tgz#6f5ad1cd9176b733c6644035ec41764fbf2d1b76" + integrity sha512-Ci1sRrK7cbCUhrejrvDxDxE/oHoQeYmrmyduivtmpWSVXYbn+HbIhQRW0fMpumpeu0I9AteFrH9OJCF8qN/Cig== + dependencies: + "@ember-data/canary-features" "4.1.0" + "@ember-data/private-build-infra" "4.1.0" + "@ember-data/store" "4.1.0" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + ember-auto-import "^2.2.4" + ember-cached-decorator-polyfill "^0.1.4" + ember-cli-babel "^7.26.6" + ember-cli-string-utils "^1.1.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + ember-compatibility-helpers "^1.2.0" + inflection "~1.13.1" + +"@ember-data/private-build-infra@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ember-data/private-build-infra/-/private-build-infra-4.1.0.tgz#3b5d2e5cc794aadc05d0b4d8dca8c89106474129" + integrity sha512-2xunpWRlUXOWCJIOiZ4095VYXaDoWLydHIjalapVlI1+j2ONB6SZy1txXXb/fgbDfbRbH2oTLabcpcdUfBqy8g== + dependencies: + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@ember-data/canary-features" "4.1.0" + "@ember/edition-utils" "^1.2.0" + babel-plugin-debug-macros "^0.3.3" + babel-plugin-filter-imports "^4.0.0" + babel6-plugin-strip-class-callcheck "^6.0.0" + broccoli-debug "^0.6.5" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^3.0.3" + broccoli-merge-trees "^4.2.0" + broccoli-rollup "^5.0.0" + calculate-cache-key-for-tree "^2.0.0" + chalk "^4.0.0" + ember-cli-babel "^7.26.6" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-typescript "^4.1.0" + ember-cli-version-checker "^5.1.1" + esm "^3.2.25" + git-repo-info "^2.1.1" + glob "^7.1.6" + npm-git-info "^1.0.3" + rimraf "^3.0.2" + rsvp "^4.8.5" + semver "^7.1.3" + silent-error "^1.1.1" + +"@ember-data/record-data@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ember-data/record-data/-/record-data-4.1.0.tgz#f8696a1a231dbbec55f7f776070d2204be502cf4" + integrity sha512-vX+QdcI1QJXpi3rTl+hr+6BPXxtnRbcfJd/TZlz78kWfkBYZ3Prxx2VVO89F8i+lTpMC0o+dCHmoQoYfQpyYWg== + dependencies: + "@ember-data/canary-features" "4.1.0" + "@ember-data/private-build-infra" "4.1.0" + "@ember-data/store" "4.1.0" + "@ember/edition-utils" "^1.2.0" + ember-auto-import "^2.2.4" + ember-cli-babel "^7.26.6" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + "@ember-data/rfc395-data@^0.0.4": version "0.0.4" resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== +"@ember-data/serializer@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-4.1.0.tgz#967f96c4357536b29f7898f754d9b8618540d8b0" + integrity sha512-ztu5YSe31wmNvAE9/F6IfyM1VfmBBilUSGQYCt4EONx+4sJLlAbSLvPBPLz2O1n/LquArI6t6XuiE2Og4BAkLA== + dependencies: + "@ember-data/private-build-infra" "4.1.0" + "@ember-data/store" "4.1.0" + ember-auto-import "^2.2.4" + ember-cli-babel "^7.26.6" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^4.1.0" + +"@ember-data/store@4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-4.1.0.tgz#47a5cc0db2feeff8d4dff2a2ebc7eb922fcb30c6" + integrity sha512-BJ6dY54wJzN+N6HVF9xg+XPzQnOT1wRApWqnjvyhHDpWfx1LcCF1ScD0tmuubLhb1tiDrNzrI8EQSNQwqNBzKQ== + dependencies: + "@ember-data/canary-features" "4.1.0" + "@ember-data/private-build-infra" "4.1.0" + "@ember/string" "^3.0.0" + "@glimmer/tracking" "^1.0.4" + ember-auto-import "^2.2.4" + ember-cached-decorator-polyfill "^0.1.4" + ember-cli-babel "^7.26.6" + ember-cli-path-utils "^1.0.0" + ember-cli-typescript "^4.1.0" + "@ember/edition-utils@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.2.0.tgz#a039f542dc14c8e8299c81cd5abba95e2459cfa6" @@ -994,6 +1121,13 @@ mkdirp "^1.0.4" silent-error "^1.1.1" +"@ember/string@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@ember/string/-/string-3.0.0.tgz#e3a3cc7874c9f64eadfdac644d8b1238721ce289" + integrity sha512-T+7QYDp8ItlQseNveK2lL6OsOO5wg7aNQ/M2RpO8cGwM80oZOnr/Y35HmMfu4ejFEc+F1LPegvu7LGfeJOicWA== + dependencies: + ember-cli-babel "^7.26.6" + "@ember/test-helpers@^2.6.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-2.6.0.tgz#d687515c6ab49ba72717fc62046970ef4a72ea9c" @@ -1464,6 +1598,13 @@ "@types/connect" "*" "@types/node" "*" +"@types/broccoli-plugin@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-3.0.0.tgz#290fda2270c47a568edfd0cefab8bb840d8bb7b2" + integrity sha512-f+TcsARR2PovfFRKFdCX0kfH/QoM3ZVD2h1rl2mNvrKO0fq2uBNCBsTU3JanfU4COCt5cXpTfARyUsERlC8vIw== + dependencies: + broccoli-plugin "*" + "@types/chai-as-promised@^7.1.2": version "7.1.4" resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz#caf64e76fb056b8c8ced4b761ed499272b737601" @@ -1900,6 +2041,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" @@ -2477,7 +2623,7 @@ babel-plugin-debug-macros@^0.2.0, babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" -babel-plugin-debug-macros@^0.3.4: +babel-plugin-debug-macros@^0.3.3, babel-plugin-debug-macros@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.4.tgz#22961d0cb851a80654cece807a8b4b73d85c6075" integrity sha512-wfel/vb3pXfwIDZUrkoDrn5FHmlWI96PCJ3UCDv2a86poJ3EQrnArNW5KfHSVJ9IOgxHbo748cQt7sDU+0KCEw== @@ -2932,6 +3078,11 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" +babel6-plugin-strip-class-callcheck@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz#de841c1abebbd39f78de0affb2c9a52ee228fddf" + integrity sha1-3oQcGr6705943gr/ssmlLuIo/d8= + babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -3463,6 +3614,19 @@ broccoli-persistent-filter@^3.1.2: symlink-or-copy "^1.0.1" sync-disk-cache "^2.0.0" +broccoli-plugin@*, broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3, broccoli-plugin@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" + integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-output-wrapper "^3.2.5" + fs-merger "^3.2.1" + promise-map-series "^0.3.0" + quick-temp "^0.1.8" + rimraf "^3.0.2" + symlink-or-copy "^1.3.1" + broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" @@ -3493,18 +3657,20 @@ broccoli-plugin@^2.1.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli-plugin@^4.0.3, broccoli-plugin@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" - integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== +broccoli-rollup@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-5.0.0.tgz#a77b53bcef1b70e988913fee82265c0a4ca530da" + integrity sha512-QdMuXHwsdz/LOS8zu4HP91Sfi4ofimrOXoYP/lrPdRh7lJYD87Lfq4WzzUhGHsxMfzANIEvl/7qVHKD3cFJ4tA== dependencies: - broccoli-node-api "^1.7.0" - broccoli-output-wrapper "^3.2.5" - fs-merger "^3.2.1" - promise-map-series "^0.3.0" - quick-temp "^0.1.8" - rimraf "^3.0.2" - symlink-or-copy "^1.3.1" + "@types/broccoli-plugin" "^3.0.0" + broccoli-plugin "^4.0.7" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.6" + node-modules-path "^1.0.1" + rollup "^2.50.0" + rollup-pluginutils "^2.8.1" + symlink-or-copy "^1.2.0" + walk-sync "^2.2.0" broccoli-slow-trees@^3.0.1, broccoli-slow-trees@^3.1.0: version "3.1.0" @@ -3941,6 +4107,11 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + ci-info@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" @@ -4810,7 +4981,7 @@ ember-auto-import@^1.5.3: walk-sync "^0.3.3" webpack "^4.43.0" -ember-auto-import@^2.2.0, ember-auto-import@^2.3.0: +ember-auto-import@^2.2.0, ember-auto-import@^2.2.4, ember-auto-import@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.3.0.tgz#ffb05e11322ea041d73cddee7c7d804ffe130913" integrity sha512-38fOQ8ix3IQfFZHg99xQh/rJ1JwOhl2egauYXpCmFKdNm45rkRap3HDhkA4JtO532R7KEkaloU9Bj0oEUv520w== @@ -4845,6 +5016,26 @@ ember-auto-import@^2.2.0, ember-auto-import@^2.3.0: typescript-memoize "^1.0.0-alpha.3" walk-sync "^3.0.0" +ember-cache-primitive-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ember-cache-primitive-polyfill/-/ember-cache-primitive-polyfill-1.0.1.tgz#a27075443bd87e5af286c1cd8a7df24e3b9f6715" + integrity sha512-hSPcvIKarA8wad2/b6jDd/eU+OtKmi6uP+iYQbzi5TQpjsqV6b4QdRqrLk7ClSRRKBAtdTuutx+m+X+WlEd2lw== + dependencies: + ember-cli-babel "^7.22.1" + ember-cli-version-checker "^5.1.1" + ember-compatibility-helpers "^1.2.1" + silent-error "^1.1.1" + +ember-cached-decorator-polyfill@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/ember-cached-decorator-polyfill/-/ember-cached-decorator-polyfill-0.1.4.tgz#f1e2c65cc78d0d9c4ac0e047e643af477eb85ace" + integrity sha512-JOK7kBCWsTVCzmCefK4nr9BACDJk0owt9oIUaVt6Q0UtQ4XeAHmoK5kQ/YtDcxQF1ZevHQFdGhsTR3JLaHNJgA== + dependencies: + "@glimmer/tracking" "^1.0.4" + ember-cache-primitive-polyfill "^1.0.1" + ember-cli-babel "^7.21.0" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" @@ -4869,7 +5060,7 @@ ember-cli-babel@^6.6.0, ember-cli-babel@^6.9.2: ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.11, ember-cli-babel@^7.26.6, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.26.11, ember-cli-babel@^7.26.5, ember-cli-babel@^7.26.6, ember-cli-babel@^7.7.3: version "7.26.11" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.11.tgz#50da0fe4dcd99aada499843940fec75076249a9f" integrity sha512-JJYeYjiz/JTn34q7F5DSOjkkZqy8qwFOOxXfE6pe9yEJqWGu4qErKxlz8I22JoVEQ/aBUO+OcKTpmctvykM9YA== @@ -5011,7 +5202,7 @@ ember-cli-sri@^2.1.1: dependencies: broccoli-sri-hash "^2.1.0" -ember-cli-string-utils@^1.1.0: +ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= @@ -5023,6 +5214,13 @@ ember-cli-terser@^4.0.2: dependencies: broccoli-terser-sourcemap "^4.1.0" +ember-cli-test-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" + integrity sha1-7U6WDySel1I8+JHkrtIHLOhFd7Q= + dependencies: + ember-cli-string-utils "^1.0.0" + ember-cli-test-loader@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-3.0.0.tgz#1c036fc48de36155355fcda3266af63f977826f1" @@ -5065,7 +5263,7 @@ ember-cli-typescript@^2.0.2: stagehand "^1.0.0" walk-sync "^1.0.0" -ember-cli-typescript@^4.0.0: +ember-cli-typescript@^4.0.0, ember-cli-typescript@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-4.2.1.tgz#54d08fc90318cc986f3ea562f93ce58a6cc4c24d" integrity sha512-0iKTZ+/wH6UB/VTWKvGuXlmwiE8HSIGcxHamwNhEC5x1mN3z8RfvsFZdQWYUzIWFN2Tek0gmepGRPTwWdBYl/A== @@ -5212,7 +5410,7 @@ ember-cli@~4.1.0: workerpool "^6.1.4" yam "^1.0.0" -ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.1: +ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1: version "1.2.5" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.5.tgz#b8363b1d5b8725afa9a4fe2b2986ac28626c6f23" integrity sha512-7cddkQQp8Rs2Mqrj0xqZ0uO7eC9tBCKyZNcP2iE1RxQqOGPv8fiPkj1TUeidUB/Qe80lstoVXWMEuqqhW7Yy9A== @@ -5236,6 +5434,27 @@ ember-cp-validations@^3.5.6: exists-sync "0.0.4" walk-sync "^0.3.1" +ember-data@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-4.1.0.tgz#282f121f47d62e9a43345367942194b585bcf2a3" + integrity sha512-+58GkcKy7aryVPj+UTSSBVIFIywk1CdiJwcbWR1/xXBF1d4scDxsO2w5mbKYpiGBdPyKeKvK9sJVC5gZTSf8BA== + dependencies: + "@ember-data/adapter" "4.1.0" + "@ember-data/debug" "4.1.0" + "@ember-data/model" "4.1.0" + "@ember-data/private-build-infra" "4.1.0" + "@ember-data/record-data" "4.1.0" + "@ember-data/serializer" "4.1.0" + "@ember-data/store" "4.1.0" + "@ember/edition-utils" "^1.2.0" + "@ember/string" "^3.0.0" + "@glimmer/env" "^0.1.7" + broccoli-merge-trees "^4.2.0" + ember-auto-import "^2.2.4" + ember-cli-babel "^7.26.6" + ember-cli-typescript "^4.1.0" + ember-inflector "^4.0.1" + ember-destroyable-polyfill@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/ember-destroyable-polyfill/-/ember-destroyable-polyfill-2.0.3.tgz#1673ed66609a82268ef270a7d917ebd3647f11e1" @@ -5270,6 +5489,13 @@ ember-getowner-polyfill@^2.2.0: ember-cli-version-checker "^2.1.0" ember-factory-for-polyfill "^1.3.1" +ember-inflector@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-4.0.2.tgz#4494f1a5f61c1aca7702d59d54024cc92211d8ec" + integrity sha512-+oRstEa52mm0jAFzhr51/xtEWpCEykB3SEBr7vUg8YnXUZJ5hKNBppP938q8Zzr9XfJEbzrtDSGjhKwJCJv6FQ== + dependencies: + ember-cli-babel "^7.26.5" + ember-intl@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ember-intl/-/ember-intl-5.7.2.tgz#76d933f974f041448b01247888bc3bcc9261e812" @@ -5808,7 +6034,7 @@ eslint@^8.7.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -esm@^3.2.4: +esm@^3.2.25, esm@^3.2.4: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== @@ -5856,6 +6082,11 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -7185,7 +7416,7 @@ infer-owner@^1.0.3: resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== -inflection@^1.13.1: +inflection@^1.13.1, inflection@~1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.1.tgz#c5cadd80888a90cf84c2e96e340d7edc85d5f0cb" integrity sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA== @@ -7364,6 +7595,13 @@ is-callable@^1.1.4, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-core-module@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" @@ -7602,7 +7840,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -7856,6 +8094,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + leek@0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" @@ -8712,7 +8957,7 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-modules-path@^1.0.0: +node-modules-path@^1.0.0, node-modules-path@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.2.tgz#e3acede9b7baf4bc336e3496b58e5b40d517056e" integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== @@ -8773,6 +9018,11 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== +npm-git-info@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" + integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= + npm-package-arg@^8.1.5: version "8.1.5" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" @@ -8924,6 +9174,14 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -9180,6 +9438,25 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +patch-package@^6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" + integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^2.4.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^2.0.0" + fs-extra "^7.0.1" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.0" + open "^7.4.2" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + path-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" @@ -9399,6 +9676,11 @@ postcss@^8.2.15: picocolors "^1.0.0" source-map-js "^1.0.1" +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -10039,6 +10321,20 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^2.50.0: + version "2.64.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.64.0.tgz#f0f59774e21fbb56de438a37d06a2189632b207a" + integrity sha512-+c+lbw1lexBKSMb1yxGDVfJ+vchJH3qLbmavR+awDinTDA2C5Ug9u7lkOzj62SCu0PKUExsW36tpgW7Fmpn3yQ== + optionalDependencies: + fsevents "~2.3.2" + rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" @@ -10186,7 +10482,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semve resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -10339,6 +10635,11 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"