UI - test console cleanup (#6674)

* add ember-cli-deprecation-workflow

* this._router in routes to quiet deprecation

* mark style bindings as htmlSafe strings

* simplify authenticate service hook with async fn

* don't serialize aliases relationship on entities

* update ember-test-selectors so we can use supportsDataTestProperties

* allow duplicate flash messages because we don't want a log warning

* update ember-concurrency for better error message

* use ember-qunit instead of ember-cli-qunit

* update ember-cli-page-object so we're not using a beta lol

* ignore test-helper jquery context warning

* fix race condition in pgp-file test by using ember-concurrency task and test waiter

* await cli commands

* fail tests if async leakage is detected

* update auth-jwt component and tests to be simpler

* fix linting

* review feedback
This commit is contained in:
Matthew Irish 2019-05-02 22:20:28 -05:00 committed by GitHub
parent d9f855d9a8
commit 93e827fe81
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 343 additions and 199 deletions

View File

@ -198,7 +198,7 @@ export default Component.extend(DEFAULTS, {
let transition = this.router.transitionTo(targetRoute, { queryParams: { namespace } });
// returning this w/then because if we keep it
// in the task, it will get cancelled when the component in un-rendered
return transition.followRedirects().then(() => {
yield transition.followRedirects().then(() => {
if (isRoot) {
this.flashMessages.warning(
'You have logged in with a root token. As a security precaution, this root token will not be stored by your browser and you will need to re-authenticate after the window is closed or refreshed.'

View File

@ -1,7 +1,7 @@
import Ember from 'ember';
import { inject as service } from '@ember/service';
import Component from './outer-html';
import { next, later } from '@ember/runloop';
import { later } from '@ember/runloop';
import { task, timeout, waitForEvent } from 'ember-concurrency';
import { computed } from '@ember/object';
@ -27,18 +27,16 @@ export default Component.extend({
onNamespace() {},
didReceiveAttrs() {
next(() => {
let { oldSelectedAuthPath, selectedAuthPath } = this;
let shouldDebounce = !oldSelectedAuthPath && !selectedAuthPath;
if (oldSelectedAuthPath !== selectedAuthPath) {
this.set('role', null);
this.onRoleName(this.roleName);
this.fetchRole.perform(null, { debounce: false });
} else if (shouldDebounce) {
this.fetchRole.perform(this.roleName);
}
this.set('oldSelectedAuthPath', selectedAuthPath);
});
let { oldSelectedAuthPath, selectedAuthPath } = this;
let shouldDebounce = !oldSelectedAuthPath && !selectedAuthPath;
if (oldSelectedAuthPath !== selectedAuthPath) {
this.set('role', null);
this.onRoleName(this.roleName);
this.fetchRole.perform(null, { debounce: false });
} else if (shouldDebounce) {
this.fetchRole.perform(this.roleName);
}
this.set('oldSelectedAuthPath', selectedAuthPath);
},
// OIDC roles in the JWT/OIDC backend are those with an authUrl,
@ -68,7 +66,9 @@ export default Component.extend({
}
}
this.set('role', role);
}).restartable(),
})
.restartable()
.withTestWaiter(),
handleOIDCError(err) {
this.onLoading(false);

View File

@ -1,5 +1,6 @@
import Component from '@ember/component';
import { set } from '@ember/object';
import { task } from 'ember-concurrency';
const BASE_64_REGEX = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gi;
export default Component.extend({
@ -34,12 +35,12 @@ export default Component.extend({
readFile(file) {
const reader = new FileReader();
reader.onload = () => this.setPGPKey(reader.result, file.name);
reader.onload = () => this.setPGPKey.perform(reader.result, file.name);
// this gives us a base64-encoded string which is important in the onload
reader.readAsDataURL(file);
},
setPGPKey(dataURL, filename) {
setPGPKey: task(function*(dataURL, filename) {
const b64File = dataURL.split(',')[1].trim();
const decoded = atob(b64File).trim();
@ -48,8 +49,8 @@ export default Component.extend({
// If after decoding it's not b64, we want
// the original as it was only encoded when we used `readAsDataURL`.
const fileData = decoded.match(BASE_64_REGEX) ? decoded : b64File;
this.get('onChange')(this.get('index'), { value: fileData, fileName: filename });
},
yield this.get('onChange')(this.get('index'), { value: fileData, fileName: filename });
}).withTestWaiter(),
actions: {
pickedFile(e) {

View File

@ -21,6 +21,8 @@ export function linkParams({ mode, secret, queryParams }) {
export default Component.extend({
tagName: '',
// so that ember-test-selectors doesn't log a warning
supportsDataTestProperties: true,
mode: 'list',
secret: null,

View File

@ -2,6 +2,7 @@ import { inject as service } from '@ember/service';
import Component from '@ember/component';
import { computed } from '@ember/object';
import { FEATURE_MACHINE_STEPS, INIT_STEPS } from 'vault/helpers/wizard-constants';
import { htmlSafe } from '@ember/template';
export default Component.extend({
wizard: service(),
@ -66,25 +67,25 @@ export default Component.extend({
let bar = [];
if (this.currentTutorialProgress) {
bar.push({
style: `width:${this.currentTutorialProgress.percentage}%;`,
style: htmlSafe(`width:${this.currentTutorialProgress.percentage}%;`),
completed: false,
showIcon: true,
});
} else {
if (this.currentFeatureProgress) {
this.completedFeatures.forEach(feature => {
bar.push({ style: 'width:100%;', completed: true, feature: feature, showIcon: true });
bar.push({ style: htmlSafe('width:100%;'), completed: true, feature: feature, showIcon: true });
});
this.wizard.featureList.forEach(feature => {
if (feature === this.currentMachine) {
bar.push({
style: `width:${this.currentFeatureProgress.percentage}%;`,
style: htmlSafe(`width:${this.currentFeatureProgress.percentage}%;`),
completed: this.currentFeatureProgress.percentage == 100 ? true : false,
feature: feature,
showIcon: true,
});
} else {
bar.push({ style: 'width:0%;', completed: false, feature: feature, showIcon: true });
bar.push({ style: htmlSafe('width:0%;'), completed: false, feature: feature, showIcon: true });
}
});
}

View File

@ -2,6 +2,7 @@ import { inject as service } from '@ember/service';
import Component from '@ember/component';
import { computed } from '@ember/object';
import { FEATURE_MACHINE_TIME } from 'vault/helpers/wizard-constants';
import { htmlSafe } from '@ember/template';
export default Component.extend({
wizard: service(),
@ -48,10 +49,10 @@ export default Component.extend({
}),
selectProgress: computed('selectedFeatures', function() {
let bar = this.selectedFeatures.map(feature => {
return { style: 'width:0%;', completed: false, showIcon: true, feature: feature };
return { style: htmlSafe('width:0%;'), completed: false, showIcon: true, feature: feature };
});
if (bar.length === 0) {
bar = [{ style: 'width:0%;', showIcon: false }];
bar = [{ style: htmlSafe('width:0%;'), showIcon: false }];
}
return bar;
}),

View File

@ -2,7 +2,7 @@ import Route from '@ember/routing/route';
export default Route.extend({
renderTemplate() {
let { targetName } = this.router.currentState.routerJs.activeTransition;
let { targetName } = this._router.currentState.routerJs.activeTransition;
let isCallback =
targetName === 'vault.cluster.oidc-callback' || targetName === 'vault.cluster.oidc-callback-namespace';
if (isCallback) {

View File

@ -2,6 +2,8 @@ import DS from 'ember-data';
import IdentitySerializer from './_base';
export default IdentitySerializer.extend(DS.EmbeddedRecordsMixin, {
// we don't need to serialize relationships here
serializeHasMany() {},
attrs: {
aliases: { embedded: 'always' },
},

View File

@ -304,21 +304,14 @@ export default Service.extend({
});
},
authenticate(/*{clusterId, backend, data}*/) {
async authenticate(/*{clusterId, backend, data}*/) {
const [options] = arguments;
const adapter = this.clusterAdapter();
return adapter.authenticate(options).then(resp => {
return this.persistAuthData(options, resp.auth || resp.data, this.get('namespace.path')).then(
authData => {
return this.get('permissions')
.getPaths.perform()
.then(() => {
return authData;
});
}
);
});
let resp = await adapter.authenticate(options);
let authData = await this.persistAuthData(options, resp.auth || resp.data, this.get('namespace.path'));
await this.get('permissions').getPaths.perform();
return authData;
},
deleteCurrentToken() {

View File

@ -1,6 +1,6 @@
<div class="level is-mobile">
<div class="level-left">
<label class="is-label" data-test-pgp-label=true>
<label class="is-label" data-test-pgp-label>
{{#if label}}
{{label}}
{{else}}
@ -11,7 +11,7 @@
<div class="level-right">
<div class="control is-flex">
<input
data-test-text-toggle=true
data-test-text-toggle
id={{concat "useText-" elementId}}
type="checkbox"
name={{concat "useText-" elementId}}

View File

@ -0,0 +1,11 @@
/* global self */
self.deprecationWorkflow = self.deprecationWorkflow || {};
self.deprecationWorkflow.config = {
workflow: [
// ivy-codemirror and ember-radio-button still use send-action
{ handler: 'silence', matchId: 'ember-component.send-action' },
{ handler: 'silence', matchId: 'ember-runtime.deprecate-copy-copyable' },
// ember-cli-page-object uses jquery's this.$() by default - this will change when we remove jquery
{ handler: 'silence', matchId: 'ember-test-helpers.rendering-context.jquery-element' },
],
};

View File

@ -30,7 +30,6 @@ module.exports = function(environment) {
flashMessageDefaults: {
timeout: 7000,
sticky: false,
preventDuplicates: true,
},
};
if (environment === 'development') {
@ -39,26 +38,16 @@ module.exports = function(environment) {
ENV.APP.LOG_TRANSITIONS = true;
// ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
// ENV.APP.LOG_VIEW_LOOKUPS = true;
//ENV['ember-cli-mirage'] = {
//enabled: true
//};
}
if (environment === 'test') {
// Testem prefers this...
ENV.locationType = 'none';
// keep test console output quieter
ENV.APP.LOG_ACTIVE_GENERATION = false;
ENV.APP.LOG_VIEW_LOOKUPS = false;
ENV.APP.rootElement = '#ember-testing';
ENV['ember-cli-mirage'] = {
enabled: false,
};
ENV.APP.autoboot = false;
ENV.flashMessageDefaults.timeout = 50;
}
if (environment !== 'production') {

View File

@ -13,13 +13,15 @@
"build-dev": "ember build",
"lint:hbs": "ember-template-lint .",
"lint:js": "eslint .",
"start": "export VAULT_ADDR=http://localhost:8200; ember server --proxy=$VAULT_ADDR",
"test": "node scripts/start-vault.js & yarn run lint:js && ember test",
"start2": "ember server --proxy=http://localhost:8202 --port=4202",
"test-oss": "yarn run lint:js && yarn run test -f='!enterprise'",
"fmt": "yarn run fmt-js && yarn run fmt-styles",
"fmt-js": "prettier-eslint --single-quote --no-use-tabs --trailing-comma es5 --print-width=110 --write '{app,tests,config,lib}/**/*.js'",
"fmt-styles": "prettier --write app/styles/**/*.*",
"fmt": "yarn run fmt-js && yarn run fmt-styles",
"start": "export VAULT_ADDR=http://localhost:8200; ember server --proxy=$VAULT_ADDR",
"start2": "ember server --proxy=http://localhost:8202 --port=4202",
"test": "node scripts/start-vault.js & yarn run lint:js & ember test",
"test-oss": "yarn run test -f='!enterprise'",
"test-quick": "node scripts/start-vault.js & ember test",
"test-quick-oss": "yarn run test-quick -f='!enterprise'",
"build-storybook": "build-storybook -s ../pkg/web_ui",
"storybook": "start-storybook -p 6006 -s ../pkg/web_ui",
"gen-story-md": "node scripts/gen-story-md.js"
@ -64,13 +66,13 @@
"ember-cli-clipboard": "^0.8.0",
"ember-cli-content-security-policy": "^1.0.0",
"ember-cli-dependency-checker": "^3.0.0",
"ember-cli-deprecation-workflow": "^1.0.1",
"ember-cli-flash": "1.7.1",
"ember-cli-htmlbars": "^3.0.0",
"ember-cli-htmlbars-inline-precompile": "^1.0.3",
"ember-cli-inject-live-reload": "^1.8.2",
"ember-cli-page-object": "1.15.0-beta.3",
"ember-cli-page-object": "^1.15.3",
"ember-cli-pretender": "^1.0.1",
"ember-cli-qunit": "^4.3.2",
"ember-cli-sass": "^9.0.0",
"ember-cli-sri": "meirish/ember-cli-sri#rooturl",
"ember-cli-string-helpers": "^1.5.0",
@ -78,7 +80,7 @@
"ember-cli-uglify": "^2.1.0",
"ember-composable-helpers": "^2.0.3",
"ember-computed-query": "^0.1.1",
"ember-concurrency": "^0.8.14",
"ember-concurrency": "^0.10.0",
"ember-concurrency-test-waiter": "^0.3.1",
"ember-copy": "^1.0.0",
"ember-data": "~3.4.0",
@ -91,12 +93,13 @@
"ember-maybe-import-regenerator": "^0.1.6",
"ember-maybe-in-element": "^0.1.3",
"ember-power-select": "^2.0.12",
"ember-qunit": "^4.4.1",
"ember-radio-button": "^1.1.1",
"ember-resolver": "^5.0.1",
"ember-responsive": "^3.0.0-beta.3",
"ember-sinon": "^1.0.1",
"ember-source": "~3.4.0",
"ember-test-selectors": "^1.0.0",
"ember-test-selectors": "^2.1.0",
"ember-truth-helpers": "^2.1.0",
"escape-string-regexp": "^1.0.5",
"eslint": "^5.16.0",

View File

@ -28,10 +28,7 @@ module('Acceptance | secrets/generic/create', function(hooks) {
test('it creates and can view a secret with the generic backend', async function(assert) {
const path = `generic-${new Date().getTime()}`;
const kvPath = `generic-kv-${new Date().getTime()}`;
cli.consoleInput(`write sys/mounts/${path} type=generic`);
cli.enter();
cli.consoleInput(`write ${path}/foo bar=baz`);
cli.enter();
await cli.runCommands([`write sys/mounts/${path} type=generic`, `write ${path}/foo bar=baz`]);
await listPage.visitRoot({ backend: path });
assert.equal(currentRouteName(), 'vault.cluster.secrets.backend.list-root', 'navigates to the list page');
assert.equal(listPage.secrets.length, 1, 'lists one secret in the backend');
@ -45,13 +42,12 @@ module('Acceptance | secrets/generic/create', function(hooks) {
test('upgrading generic to version 2 lists all existing secrets, and CRUD continues to work', async function(assert) {
const path = `generic-${new Date().getTime()}`;
const kvPath = `generic-kv-${new Date().getTime()}`;
cli.consoleInput(`write sys/mounts/${path} type=generic`);
cli.enter();
cli.consoleInput(`write ${path}/foo bar=baz`);
cli.enter();
// upgrade to version 2 generic mount
cli.consoleInput(`write sys/mounts/${path}/tune options=version=2`);
cli.enter();
await cli.runCommands([
`write sys/mounts/${path} type=generic`,
`write ${path}/foo bar=baz`,
// upgrade to version 2 generic mount
`write sys/mounts/${path}/tune options=version=2`,
]);
await listPage.visitRoot({ backend: path });
assert.equal(currentRouteName(), 'vault.cluster.secrets.backend.list-root', 'navigates to the list page');
assert.equal(listPage.secrets.length, 1, 'lists the old secret in the backend');

View File

@ -1,13 +1,14 @@
import { later, run } from '@ember/runloop';
import { run } from '@ember/runloop';
import EmberObject, { computed } from '@ember/object';
import Evented from '@ember/object/evented';
import Service from '@ember/service';
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render, settled } from '@ember/test-helpers';
import { render, settled, waitUntil } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
import sinon from 'sinon';
import Pretender from 'pretender';
import { resolve } from 'rsvp';
import { create } from 'ember-cli-page-object';
import form from '../../pages/components/auth-jwt';
import { ERROR_WINDOW_CLOSED, ERROR_MISSING_PARAMS } from 'vault/components/auth-jwt';
@ -40,7 +41,7 @@ fakeWindow.reopen({
},
close() {
fakeWindow.prototype.trigger('close');
fakeWindow.proto().trigger('close');
},
});
@ -59,9 +60,9 @@ const routerStub = Service.extend({
const renderIt = async (context, path = 'jwt') => {
let handler = (data, e) => {
if (e && e.preventDefault) e.preventDefault();
return resolve();
};
let fake = fakeWindow.create();
sinon.spy(fake, 'open');
context.set('window', fake);
context.set('handler', sinon.spy(handler));
context.set('roleName', '');
@ -86,6 +87,7 @@ module('Integration | Component | auth jwt', function(hooks) {
setupRenderingTest(hooks);
hooks.beforeEach(function() {
this.openSpy = sinon.spy(fakeWindow.proto(), 'open');
this.owner.register('service:router', routerStub);
this.server = new Pretender(function() {
this.get('/v1/auth/:path/oidc/callback', function() {
@ -121,6 +123,7 @@ module('Integration | Component | auth jwt', function(hooks) {
});
hooks.afterEach(function() {
this.openSpy.restore();
this.server.shutdown();
});
@ -172,22 +175,16 @@ module('Integration | Component | auth jwt', function(hooks) {
this.set('selectedAuthPath', 'foo');
await component.role('test');
component.login();
later(async () => {
run.cancelTimers();
await settled();
let call = this.window.open.getCall(0);
assert.deepEqual(
call.args,
[
'http://example.com',
'vaultOIDCWindow',
'width=500,height=600,resizable,scrollbars=yes,top=0,left=0',
],
'called with expected args'
);
}, 50);
await settled();
await waitUntil(() => {
return this.openSpy.calledOnce;
});
run.cancelTimers();
let call = this.openSpy.getCall(0);
assert.deepEqual(
call.args,
['http://example.com', 'vaultOIDCWindow', 'width=500,height=600,resizable,scrollbars=yes,top=0,left=0'],
'called with expected args'
);
});
test('oidc: it calls error handler when popup is closed', async function(assert) {
@ -195,13 +192,12 @@ module('Integration | Component | auth jwt', function(hooks) {
this.set('selectedAuthPath', 'foo');
await component.role('test');
component.login();
later(async () => {
this.window.close();
await settled();
assert.equal(this.error, ERROR_WINDOW_CLOSED, 'calls onError with error string');
}, 50);
await waitUntil(() => {
return this.openSpy.calledOnce;
});
this.window.close();
await settled();
assert.equal(this.error, ERROR_WINDOW_CLOSED, 'calls onError with error string');
});
test('oidc: storage event fires with wrong key', async function(assert) {
@ -209,12 +205,12 @@ module('Integration | Component | auth jwt', function(hooks) {
this.set('selectedAuthPath', 'foo');
await component.role('test');
component.login();
later(async () => {
run.cancelTimers();
this.window.trigger('storage', { key: 'wrongThing' });
assert.equal(this.window.localStorage.removeItem.callCount, 0, 'never calls removeItem');
}, 50);
await settled();
await waitUntil(() => {
return this.openSpy.calledOnce;
});
this.window.trigger('storage', { key: 'wrongThing' });
run.cancelTimers();
assert.equal(this.window.localStorage.removeItem.callCount, 0, 'never calls removeItem');
});
test('oidc: storage event fires with correct key, wrong params', async function(assert) {
@ -222,13 +218,13 @@ module('Integration | Component | auth jwt', function(hooks) {
this.set('selectedAuthPath', 'foo');
await component.role('test');
component.login();
later(async () => {
this.window.trigger('storage', { key: 'oidcState', newValue: JSON.stringify({}) });
await settled();
assert.equal(this.window.localStorage.removeItem.callCount, 1, 'calls removeItem');
assert.equal(this.error, ERROR_MISSING_PARAMS, 'calls onError with params missing error');
}, 50);
await settled();
await waitUntil(() => {
return this.openSpy.calledOnce;
});
this.window.trigger('storage', { key: 'oidcState', newValue: JSON.stringify({}) });
run.cancelTimers();
assert.equal(this.window.localStorage.removeItem.callCount, 1, 'calls removeItem');
assert.equal(this.error, ERROR_MISSING_PARAMS, 'calls onError with params missing error');
});
test('oidc: storage event fires with correct key, correct params', async function(assert) {
@ -236,20 +232,20 @@ module('Integration | Component | auth jwt', function(hooks) {
this.set('selectedAuthPath', 'foo');
await component.role('test');
component.login();
later(async () => {
this.window.trigger('storage', {
key: 'oidcState',
newValue: JSON.stringify({
path: 'foo',
state: 'state',
code: 'code',
}),
});
await settled();
assert.equal(this.selectedAuth, 'token', 'calls onSelectedAuth with token');
assert.equal(this.token, 'token', 'calls onToken with token');
assert.ok(this.handler.calledOnce, 'calls the onSubmit handler');
}, 50);
await waitUntil(() => {
return this.openSpy.calledOnce;
});
this.window.trigger('storage', {
key: 'oidcState',
newValue: JSON.stringify({
path: 'foo',
state: 'state',
code: 'code',
}),
});
await settled();
assert.equal(this.selectedAuth, 'token', 'calls onSelectedAuth with token');
assert.equal(this.token, 'token', 'calls onToken with token');
assert.ok(this.handler.calledOnce, 'calls the onSubmit handler');
});
});

View File

@ -1,13 +1,13 @@
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render, click, fillIn, findAll, find, triggerEvent, waitUntil } from '@ember/test-helpers';
import { settled, render, click, fillIn, findAll, find, triggerEvent, waitUntil } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
let file;
const fileEvent = () => {
const data = { some: 'content' };
file = new File([JSON.stringify(data, null, 2)], 'file.json', { type: 'application/json' });
return ['change', [file]];
return ['change', { files: [file] }];
};
module('Integration | Component | pgp file', function(hooks) {
@ -81,6 +81,7 @@ module('Integration | Component | pgp file', function(hooks) {
await render(hbs`{{pgp-file index=index key=key onChange=(action change)}}`);
await triggerEvent('[data-test-pgp-file-input]', ...event);
await settled();
await click('[data-test-text-toggle]');
assert.equal(findAll('[data-test-pgp-file-textarea]').length, 1, 'renders the textarea on toggle');
assert.equal(

View File

@ -6,4 +6,6 @@ import './helpers/flash-message';
setApplication(Application.create(config.APP));
start();
start({
setupTestIsolationValidation: true,
});

View File

@ -71,6 +71,17 @@
source-map "^0.5.0"
trim-right "^1.0.1"
"@babel/generator@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041"
integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==
dependencies:
"@babel/types" "^7.4.4"
jsesc "^2.5.1"
lodash "^4.17.11"
source-map "^0.5.0"
trim-right "^1.0.1"
"@babel/helper-annotate-as-pure@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32"
@ -107,6 +118,18 @@
"@babel/helper-replace-supers" "^7.3.4"
"@babel/helper-split-export-declaration" "^7.0.0"
"@babel/helper-create-class-features-plugin@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz#fc3d690af6554cc9efc607364a82d48f58736dba"
integrity sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA==
dependencies:
"@babel/helper-function-name" "^7.1.0"
"@babel/helper-member-expression-to-functions" "^7.0.0"
"@babel/helper-optimise-call-expression" "^7.0.0"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/helper-replace-supers" "^7.4.4"
"@babel/helper-split-export-declaration" "^7.4.4"
"@babel/helper-define-map@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c"
@ -223,6 +246,16 @@
"@babel/traverse" "^7.3.4"
"@babel/types" "^7.3.4"
"@babel/helper-replace-supers@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27"
integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==
dependencies:
"@babel/helper-member-expression-to-functions" "^7.0.0"
"@babel/helper-optimise-call-expression" "^7.0.0"
"@babel/traverse" "^7.4.4"
"@babel/types" "^7.4.4"
"@babel/helper-simple-access@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c"
@ -238,6 +271,13 @@
dependencies:
"@babel/types" "^7.0.0"
"@babel/helper-split-export-declaration@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677"
integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==
dependencies:
"@babel/types" "^7.4.4"
"@babel/helper-wrap-function@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66"
@ -285,6 +325,11 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c"
integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==
"@babel/parser@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6"
integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==
"@babel/plugin-proposal-async-generator-functions@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce"
@ -311,6 +356,23 @@
"@babel/helper-create-class-features-plugin" "^7.3.4"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-proposal-class-properties@^7.3.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz#93a6486eed86d53452ab9bab35e368e9461198ce"
integrity sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg==
dependencies:
"@babel/helper-create-class-features-plugin" "^7.4.4"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-proposal-decorators@^7.3.0":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz#de9b2a1a8ab0196f378e2a82f10b6e2a36f21cc0"
integrity sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw==
dependencies:
"@babel/helper-create-class-features-plugin" "^7.4.4"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-decorators" "^7.2.0"
"@babel/plugin-proposal-json-strings@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e"
@ -391,6 +453,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-decorators@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b"
integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-dynamic-import@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
@ -1047,6 +1116,21 @@
globals "^11.1.0"
lodash "^4.17.11"
"@babel/traverse@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8"
integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==
dependencies:
"@babel/code-frame" "^7.0.0"
"@babel/generator" "^7.4.4"
"@babel/helper-function-name" "^7.1.0"
"@babel/helper-split-export-declaration" "^7.4.4"
"@babel/parser" "^7.4.4"
"@babel/types" "^7.4.4"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.11"
"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3":
version "7.1.3"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d"
@ -1065,6 +1149,15 @@
lodash "^4.17.11"
to-fast-properties "^2.0.0"
"@babel/types@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0"
integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==
dependencies:
esutils "^2.0.2"
lodash "^4.17.11"
to-fast-properties "^2.0.0"
"@ember/jquery@^0.5.2":
version "0.5.2"
resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.5.2.tgz#fe312c03ada0022fa092d23f7cd7e2eb0374b53a"
@ -1097,16 +1190,7 @@
ember-cli-babel "^6.16.0"
ember-compatibility-helpers "^1.0.0"
"@ember/test-helpers@^0.7.18":
version "0.7.25"
resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.25.tgz#b4014c108b40ffaf74f3c4d5918800917541541d"
integrity sha1-tAFMEItA/69088TVkYgAkXVBVB0=
dependencies:
broccoli-funnel "^2.0.1"
ember-cli-babel "^6.12.0"
ember-cli-htmlbars-inline-precompile "^1.0.0"
"@ember/test-helpers@^1.3.1":
"@ember/test-helpers@^1.3.1", "@ember/test-helpers@^1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-1.5.0.tgz#a480181c412778294e317c256d04ca52e63c813a"
integrity sha512-RrS0O3VlDASMsI6v9nxUgO0k8EJGy1nzz/1HgiScbu8LbCpPj4Mp8S82yT/olXA3TShu7c/RfLZHjlN/iRW2OA==
@ -3107,6 +3191,13 @@ babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11:
dependencies:
semver "^5.3.0"
babel-plugin-debug-macros@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0.tgz#0120ac20ce06ccc57bf493b667cf24b85c28da7a"
integrity sha512-Wpmw4TbhR3Eq2t3W51eBAQSdKlr+uAyF0GI4GtPfMCD12Y4cIdpKC9l0RjNTH/P9isFypSqqewMPm7//fnZlNA==
dependencies:
semver "^5.3.0"
babel-plugin-debug-macros@^0.2.0-beta.6:
version "0.2.0-beta.6"
resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0-beta.6.tgz#ecdf6e408d5c863ab21740d7ad7f43f027d2f912"
@ -4396,7 +4487,7 @@ broccoli-merge-trees@^3.0.0:
broccoli-plugin "^1.3.0"
merge-trees "^2.0.0"
broccoli-merge-trees@^3.0.2:
broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d"
integrity sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A==
@ -6795,6 +6886,11 @@ ember-cli-autoprefixer@^0.8.1:
broccoli-autoprefixer "^5.0.0"
lodash "^4.0.0"
ember-cli-babel-plugin-helpers@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac"
integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA==
ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.0.0-beta.9, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0, ember-cli-babel@^6.9.2:
version "6.17.0"
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.0.tgz#1f3e8ed9f4e2338caef6bc2c3d08d3c9928d0ddd"
@ -6903,6 +6999,33 @@ ember-cli-babel@^7.4.3:
ensure-posix-path "^1.0.2"
semver "^5.5.0"
ember-cli-babel@^7.5.0:
version "7.7.3"
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0"
integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg==
dependencies:
"@babel/core" "^7.0.0"
"@babel/plugin-proposal-class-properties" "^7.3.4"
"@babel/plugin-proposal-decorators" "^7.3.0"
"@babel/plugin-transform-modules-amd" "^7.0.0"
"@babel/plugin-transform-runtime" "^7.2.0"
"@babel/polyfill" "^7.0.0"
"@babel/preset-env" "^7.0.0"
"@babel/runtime" "^7.2.0"
amd-name-resolver "^1.2.1"
babel-plugin-debug-macros "^0.3.0"
babel-plugin-ember-modules-api-polyfill "^2.8.0"
babel-plugin-module-resolver "^3.1.1"
broccoli-babel-transpiler "^7.1.2"
broccoli-debug "^0.6.4"
broccoli-funnel "^2.0.1"
broccoli-source "^1.1.0"
clone "^2.1.2"
ember-cli-babel-plugin-helpers "^1.1.0"
ember-cli-version-checker "^2.1.2"
ensure-posix-path "^1.0.2"
semver "^5.5.0"
ember-cli-broccoli-sane-watcher@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.1.1.tgz#1687adada9022de26053fba833dc7dd10f03dd08"
@ -6944,6 +7067,16 @@ ember-cli-dependency-checker@^3.0.0:
resolve "^1.5.0"
semver "^5.3.0"
ember-cli-deprecation-workflow@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ember-cli-deprecation-workflow/-/ember-cli-deprecation-workflow-1.0.1.tgz#3305a6879af7f074216a54963d92491c411ce7e0"
integrity sha512-tns8l4FLz8zmhmNRH7ywihs4XNTTuQysl+POYTpiyjb4zPNKv0cUJBCT/MklYFWBCo/5DcVzabhLODJZcScUfg==
dependencies:
broccoli-funnel "^2.0.1"
broccoli-merge-trees "^3.0.1"
broccoli-plugin "^1.3.1"
ember-debug-handlers-polyfill "^1.1.1"
ember-cli-flash@1.7.1:
version "1.7.1"
resolved "https://registry.yarnpkg.com/ember-cli-flash/-/ember-cli-flash-1.7.1.tgz#0b9d2464d80144df0c65e928b6fc006259ef6a58"
@ -6958,7 +7091,7 @@ ember-cli-get-component-path-option@^1.0.0:
resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771"
integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E=
ember-cli-htmlbars-inline-precompile@^1.0.0, ember-cli-htmlbars-inline-precompile@^1.0.3:
ember-cli-htmlbars-inline-precompile@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.3.tgz#332ff96c06fc522965162f1090d78a615379c3c2"
integrity sha1-My/5bAb8UillFi8QkNeKYVN5w8I=
@ -7052,15 +7185,15 @@ ember-cli-normalize-entity-name@^1.0.0:
dependencies:
silent-error "^1.0.0"
ember-cli-page-object@1.15.0-beta.3:
version "1.15.0-beta.3"
resolved "https://registry.yarnpkg.com/ember-cli-page-object/-/ember-cli-page-object-1.15.0-beta.3.tgz#e41f3a33e35a6717c507b1a4c13fc990950c7d35"
integrity sha512-RuFhCuz32Ww4oguG0DdF4pxrqoxfmE1RMQ3aXw/IyzpAEKe9cPWY7ZZovW7zPKEoeu9hNQ9qRttH/vnlVMGalg==
ember-cli-page-object@^1.15.3:
version "1.15.3"
resolved "https://registry.yarnpkg.com/ember-cli-page-object/-/ember-cli-page-object-1.15.3.tgz#4b1814e270367a455353aeb81019fb8d8c641886"
integrity sha512-wGZqQnsyFHcJilf0xcWa53my/bprtZWHXg7m6wZPbWbnJCXNf1aAouj9uwH77r3PnE+/uYt0MIKMfX3Cnd607g==
dependencies:
broccoli-file-creator "^2.1.1"
broccoli-merge-trees "^2.0.0"
ceibo "~2.0.0"
ember-cli-babel "^6.12.0"
ember-cli-babel "^6.16.0"
ember-cli-node-assets "^0.2.2"
ember-native-dom-helpers "^0.5.3"
jquery "^3.2.1"
@ -7094,14 +7227,6 @@ ember-cli-pretender@^1.0.1:
pretender "^1.4.2"
resolve "^1.2.0"
ember-cli-qunit@^4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.3.2.tgz#cfd89ad3b0dbc28a9c2223d532b52eeade7c602c"
integrity sha1-z9ia07DbwoqcIiPVMrUu6t58YCw=
dependencies:
ember-cli-babel "^6.11.0"
ember-qunit "^3.3.2"
ember-cli-sass@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-9.0.0.tgz#d68e972d6a77b5837face7c03cfd5d1674bb1941"
@ -7192,6 +7317,14 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve
resolve "^1.3.3"
semver "^5.3.0"
ember-cli-version-checker@^3.1.2:
version "3.1.3"
resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c"
integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg==
dependencies:
resolve-package-path "^1.2.6"
semver "^5.6.0"
ember-cli@~3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.5.1.tgz#a1c7295eed935726891d40a81e0cc389f2d15fdf"
@ -7296,6 +7429,15 @@ ember-compatibility-helpers@^1.0.0:
ember-cli-version-checker "^2.1.1"
semver "^5.4.1"
ember-compatibility-helpers@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.0.tgz#feee16c5e9ef1b1f1e53903b241740ad4b01097e"
integrity sha512-pUW4MzJdcaQtwGsErYmitFRs0rlCYBAnunVzlFFUBr4xhjlCjgHJo0b53gFnhTgenNM3d3/NqLarzRhDTjXRTg==
dependencies:
babel-plugin-debug-macros "^0.2.0"
ember-cli-version-checker "^2.1.1"
semver "^5.4.1"
ember-composable-helpers@^2.0.3:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.1.0.tgz#71f75ab2de1c696d21939b5f9dcc62eaf2c947e5"
@ -7318,13 +7460,14 @@ ember-concurrency-test-waiter@^0.3.1:
dependencies:
ember-cli-babel "^6.6.0"
ember-concurrency@^0.8.14:
version "0.8.20"
resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.20.tgz#2c4f84ed3eb86cd0c7be9c2d21dd23f560757ac7"
integrity sha512-pZ0+F6UoGvDWL6boRLoQ0/qrEw3K8CHZcRRswOLdsPIGboYwquPD8pStm6haS7QIaEd+gfYxXYpdGfBo3fIUmg==
ember-concurrency@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.10.0.tgz#9c7c79dca411e01466119f02d7197c0a4ff0df08"
integrity sha512-KhNNkUqnAN0isuAwSHaTJtmY/MdHJogSSAj7lCigzfJn2+21yafQcwzoVqf5LdMOn2+owWYURr1YiwzuOvlGyQ==
dependencies:
babel-core "^6.24.1"
ember-cli-babel "^6.8.2"
ember-compatibility-helpers "^1.2.0"
ember-maybe-import-regenerator "^0.1.5"
ember-concurrency@^0.8.19:
@ -7388,6 +7531,11 @@ ember-data@~3.4.0:
semver "^5.5.0"
silent-error "^1.1.0"
ember-debug-handlers-polyfill@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ember-debug-handlers-polyfill/-/ember-debug-handlers-polyfill-1.1.1.tgz#e9ae0a720271a834221179202367421b580002ef"
integrity sha512-lO7FBAqJjzbL+IjnWhVfQITypPOJmXdZngZR/Vdn513W4g/Q6Sjicao/mDzeDCb48Y70C4Facwk0LjdIpSZkRg==
ember-export-application-global@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.0.tgz#8d6d7619ac8a1a3f8c43003549eb21ebed685bd2"
@ -7469,18 +7617,18 @@ ember-power-select@^2.0.12:
ember-text-measurer "^0.4.0"
ember-truth-helpers "^2.0.0"
ember-qunit@^3.3.2:
version "3.4.1"
resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.4.1.tgz#204a2d39a5d44d494c56bf17cf3fd12f06210359"
integrity sha512-WuWan6duE/HfygQHrgU77okTnt7B3lWcGn+N7NkBXR86pk2s+qxbX9p98uqSc0ISNt2Vg6Opz++RZn+fomHkBw==
ember-qunit@^4.4.1:
version "4.4.1"
resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-4.4.1.tgz#3654cadf9fa7e2287fe7b61fc7f19c3eb06222b5"
integrity sha512-RYyEqn3UpwLri4+lL9sFdDp1uPa0AfN587661iKm7r3kTAzYHxZE7jRsBDIejhgSH2kVSky0+Q9Y7oLULYiM/Q==
dependencies:
"@ember/test-helpers" "^0.7.18"
broccoli-funnel "^2.0.1"
broccoli-merge-trees "^2.0.0"
"@ember/test-helpers" "^1.5.0"
broccoli-funnel "^2.0.2"
broccoli-merge-trees "^3.0.2"
common-tags "^1.4.0"
ember-cli-babel "^6.8.2"
ember-cli-babel "^7.5.0"
ember-cli-test-loader "^2.2.0"
qunit "^2.5.0"
qunit "^2.9.2"
ember-radio-button@^1.1.1:
version "1.2.4"
@ -7592,13 +7740,13 @@ ember-template-lint@^1.0.0-beta.5:
resolve "^1.1.3"
strip-bom "^3.0.0"
ember-test-selectors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-1.0.0.tgz#a2f8cd86f4fb4c320004a2bf0e4c450d41668a21"
integrity sha1-ovjNhvT7TDIABKK/DkxFDUFmiiE=
ember-test-selectors@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-2.1.0.tgz#faebdf06702aaa0bc510d55eb721ce54d2e85793"
integrity sha512-c5HmvefmeABH8hg380TSNZiE9VAK1CBeXWrgyXy+IXHtsew4lZHHw7GnqCAqsakxwvmaMARbAKY9KfSAE91s1g==
dependencies:
ember-cli-babel "^6.8.2"
ember-cli-version-checker "^2.0.0"
ember-cli-version-checker "^3.1.2"
ember-text-measurer@^0.4.0:
version "0.4.1"
@ -8183,11 +8331,6 @@ exenv@^1.2.0:
resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d"
integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=
exists-stat@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529"
integrity sha1-BmDjUlouidnkRhKUQMJy7foktSk=
exists-sync@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879"
@ -8689,7 +8832,7 @@ find-yarn-workspace-root@^1.1.0:
fs-extra "^4.0.3"
micromatch "^3.1.4"
findup-sync@2.0.0, findup-sync@^2.0.0:
findup-sync@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
@ -12822,6 +12965,11 @@ node-version@^1.0.0:
resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d"
integrity sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==
node-watch@0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.6.0.tgz#ab0703b60cd270783698e57a428faa0010ed8fd0"
integrity sha512-XAgTL05z75ptd7JSVejH1a2Dm1zmXYhuDr9l230Qk6Z7/7GPcnAs/UyJJ4ggsXSvWil8iOzwQLW0zuGUvHpG8g==
"nomnom@>= 1.5.x":
version "1.8.1"
resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
@ -14370,18 +14518,16 @@ qunit-dom@^0.7.1:
broccoli-funnel "^2.0.0"
broccoli-merge-trees "^2.0.0"
qunit@^2.5.0:
version "2.6.2"
resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.6.2.tgz#551210c5cf857258a4fe39a7fe15d9e14dfef22c"
integrity sha512-PHbKulmd4rrDhFto7iHicIstDTX7oMRvAcI7loHstvU8J7AOGwzcchONmy+EG4KU8HDk0K90o7vO0GhlYyKlOg==
qunit@^2.9.2:
version "2.9.2"
resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.9.2.tgz#97919440c9c0ae838bcd3c33a2ee42f35c5ef4a0"
integrity sha512-wTOYHnioWHcx5wa85Wl15IE7D6zTZe2CQlsodS14yj7s2FZ3MviRnQluspBZsueIDEO7doiuzKlv05yfky1R7w==
dependencies:
commander "2.12.2"
exists-stat "1.0.0"
findup-sync "2.0.0"
js-reporters "1.2.1"
resolve "1.5.0"
sane "^2.5.2"
walk-sync "0.3.2"
minimatch "3.0.4"
node-watch "0.6.0"
resolve "1.9.0"
qw@~1.0.1:
version "1.0.1"
@ -15314,6 +15460,14 @@ resolve-package-path@^1.0.11:
path-root "^0.1.1"
resolve "^1.10.0"
resolve-package-path@^1.2.6:
version "1.2.7"
resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e"
integrity sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q==
dependencies:
path-root "^0.1.1"
resolve "^1.10.0"
resolve-path@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
@ -15332,12 +15486,12 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==
resolve@1.9.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06"
integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==
dependencies:
path-parse "^1.0.5"
path-parse "^1.0.6"
resolve@^1.1.3, resolve@^1.1.7, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1:
version "1.8.1"
@ -15555,7 +15709,7 @@ samsam@1.3.0, samsam@1.x, samsam@^1.1.3:
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50"
integrity sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==
sane@^2.4.1, sane@^2.5.2:
sane@^2.4.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa"
integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o=
@ -17737,14 +17891,6 @@ walk-back@^3.0.0:
resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-3.0.1.tgz#0c0012694725604960d6c2f75aaf1a1e7d455d35"
integrity sha512-umiNB2qLO731Sxbp6cfZ9pwURJzTnftxE4Gc7hq8n/ehkuXC//s9F65IEIJA2ZytQZ1ZOsm/Fju4IWx0bivkUQ==
walk-sync@0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75"
integrity sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ==
dependencies:
ensure-posix-path "^1.0.0"
matcher-collection "^1.0.0"
walk-sync@^0.2.5, walk-sync@^0.2.7:
version "0.2.7"
resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969"