From afa35298f4484cfc02d85f0a9626e39ac9ec0329 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 12 Mar 2019 16:15:07 -0700 Subject: [PATCH 01/46] Fix deprecations --- ui/package.json | 1 + ui/tests/unit/components/line-chart-test.js | 4 ++- .../unit/components/stats-time-series-test.js | 4 ++- ui/yarn.lock | 33 +++++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/ui/package.json b/ui/package.json index fc431e501c8..ec59307adef 100644 --- a/ui/package.json +++ b/ui/package.json @@ -41,6 +41,7 @@ "ember-cli": "~2.18.2", "ember-cli-babel": "^6.0.0", "ember-cli-dependency-checker": "^2.1.0", + "ember-cli-deprecation-workflow": "^1.0.1", "ember-cli-eslint": "^4.2.3", "ember-cli-funnel": "^0.6.0", "ember-cli-htmlbars": "^2.0.3", diff --git a/ui/tests/unit/components/line-chart-test.js b/ui/tests/unit/components/line-chart-test.js index fda7021f162..ba0be6f3614 100644 --- a/ui/tests/unit/components/line-chart-test.js +++ b/ui/tests/unit/components/line-chart-test.js @@ -1,7 +1,9 @@ import { test, moduleForComponent } from 'ember-qunit'; import d3Format from 'd3-format'; -moduleForComponent('line-chart', 'Unit | Component | line-chart'); +moduleForComponent('line-chart', 'Unit | Component | line-chart', { + unit: true, +}); const data = [ { foo: 1, bar: 100 }, diff --git a/ui/tests/unit/components/stats-time-series-test.js b/ui/tests/unit/components/stats-time-series-test.js index d9c661c7c6d..8913a51f468 100644 --- a/ui/tests/unit/components/stats-time-series-test.js +++ b/ui/tests/unit/components/stats-time-series-test.js @@ -3,7 +3,9 @@ import moment from 'moment'; import d3Format from 'd3-format'; import d3TimeFormat from 'd3-time-format'; -moduleForComponent('stats-time-series', 'Unit | Component | stats-time-series'); +moduleForComponent('stats-time-series', 'Unit | Component | stats-time-series', { + unit: true, +}); const ts = (offset, resolution = 'm') => moment() diff --git a/ui/yarn.lock b/ui/yarn.lock index 34ea0650db1..5dc9d42489a 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1873,6 +1873,14 @@ broccoli-merge-trees@^3.0.0: broccoli-plugin "^1.3.0" merge-trees "^2.0.0" +broccoli-merge-trees@^3.0.1: + 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== + dependencies: + broccoli-plugin "^1.3.0" + merge-trees "^2.0.0" + broccoli-middleware@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" @@ -1920,6 +1928,16 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-plugin@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" + integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" + broccoli-replace@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" @@ -3477,6 +3495,16 @@ ember-cli-dependency-checker@^2.1.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-eslint@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598" @@ -3958,6 +3986,11 @@ ember-data@~2.18.2: semver "^5.1.0" silent-error "^1.0.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" From 71bcfaa0aafc21b64590e4b82633e2986604c32d Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 12 Mar 2019 16:42:47 -0700 Subject: [PATCH 02/46] Upgrade to Ember 3.0 --- ui/.eslintrc.js | 19 ++ ui/config/targets.js | 13 +- ui/package.json | 7 +- ui/tests/helpers/.gitkeep | 0 ui/tests/helpers/destroy-app.js | 8 - ui/tests/helpers/module-for-acceptance.js | 36 --- ui/tests/helpers/start-app.js | 21 -- ui/yarn.lock | 323 +++++++++++----------- 8 files changed, 196 insertions(+), 231 deletions(-) create mode 100644 ui/tests/helpers/.gitkeep delete mode 100644 ui/tests/helpers/destroy-app.js delete mode 100644 ui/tests/helpers/module-for-acceptance.js delete mode 100644 ui/tests/helpers/start-app.js diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js index d4f4d42a068..764d6dd4696 100644 --- a/ui/.eslintrc.js +++ b/ui/.eslintrc.js @@ -26,4 +26,23 @@ module.exports = { }, ], }, + overrides: [ + // node files + { + files: [ + 'ember-cli-build.js', + 'testem.js', + 'config/**/*.js', + 'lib/*/index.js' + ], + parserOptions: { + sourceType: 'script', + ecmaVersion: 2015 + }, + env: { + browser: false, + node: true + } + } + ] }; diff --git a/ui/config/targets.js b/ui/config/targets.js index 547445947d3..f14319316df 100644 --- a/ui/config/targets.js +++ b/ui/config/targets.js @@ -1,5 +1,14 @@ -/* eslint-env node */ +'use strict'; + +const browsers = ['last 1 Chrome versions', 'last 1 Firefox versions', 'last 1 Safari versions']; + +const isCI = !!process.env.CI; +const isProduction = process.env.EMBER_ENV === 'production'; + +if (isCI || isProduction) { + browsers.push('ie 11'); +} module.exports = { - browsers: ['ie 9', 'last 1 Chrome versions', 'last 1 Firefox versions', 'last 1 Safari versions'], + browsers, }; diff --git a/ui/package.json b/ui/package.json index ec59307adef..08c1405b012 100644 --- a/ui/package.json +++ b/ui/package.json @@ -38,7 +38,7 @@ "d3-transition": "^1.1.0", "ember-ajax": "^3.0.0", "ember-auto-import": "^1.0.1", - "ember-cli": "~2.18.2", + "ember-cli": "~3.0.4", "ember-cli-babel": "^6.0.0", "ember-cli-dependency-checker": "^2.1.0", "ember-cli-deprecation-workflow": "^1.0.1", @@ -58,20 +58,21 @@ "ember-cli-uglify": "^2.0.0", "ember-composable-helpers": "^2.0.3", "ember-concurrency": "^0.8.12", - "ember-data": "~2.18.2", + "ember-data": "~3.0.0", "ember-data-model-fragments": "^2.14.0", "ember-export-application-global": "^2.0.0", "ember-fetch": "^3.4.3", "ember-freestyle": "~0.6.2", "ember-inline-svg": "^0.1.11", "ember-load-initializers": "^1.0.0", + "ember-maybe-import-regenerator": "^0.1.6", "ember-moment": "^7.5.0", "ember-native-dom-helpers": "^0.5.4", "ember-power-select": "^1.10.4", "ember-resolver": "^4.5.0", "ember-responsive": "^3.0.0", "ember-sinon": "^1.0.1", - "ember-source": "~2.18.2", + "ember-source": "~3.0.0", "ember-test-selectors": "^0.3.8", "ember-truth-helpers": "^2.0.0", "ember-welcome-page": "^3.0.0", diff --git a/ui/tests/helpers/.gitkeep b/ui/tests/helpers/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ui/tests/helpers/destroy-app.js b/ui/tests/helpers/destroy-app.js deleted file mode 100644 index 28dec908e56..00000000000 --- a/ui/tests/helpers/destroy-app.js +++ /dev/null @@ -1,8 +0,0 @@ -import { run } from '@ember/runloop'; - -export default function destroyApp(application) { - run(application, 'destroy'); - if (window.server) { - window.server.shutdown(); - } -} diff --git a/ui/tests/helpers/module-for-acceptance.js b/ui/tests/helpers/module-for-acceptance.js deleted file mode 100644 index e18770ee4d6..00000000000 --- a/ui/tests/helpers/module-for-acceptance.js +++ /dev/null @@ -1,36 +0,0 @@ -import { Promise } from 'rsvp'; -import { module } from 'qunit'; -import startApp from '../helpers/start-app'; -import destroyApp from '../helpers/destroy-app'; - -export default function(name, options = {}) { - module(name, { - beforeEach() { - // Also clear local storage (a side effect of namespaces, regions, and tokens) - window.localStorage.clear(); - - this.application = startApp(); - - if (options.beforeEach) { - return options.beforeEach.apply(this, arguments); - } - }, - - afterEach() { - let afterEach = options.afterEach && options.afterEach.apply(this, arguments); - return Promise.resolve(afterEach).then(() => destroyApp(this.application)); - }, - - after() { - if (options.after) { - return options.after.apply(this, arguments); - } - }, - - before() { - if (options.before) { - return options.before.apply(this, arguments); - } - }, - }); -} diff --git a/ui/tests/helpers/start-app.js b/ui/tests/helpers/start-app.js deleted file mode 100644 index 496f7190a8e..00000000000 --- a/ui/tests/helpers/start-app.js +++ /dev/null @@ -1,21 +0,0 @@ -import { run } from '@ember/runloop'; -import { merge } from '@ember/polyfills'; -import Application from '../../app'; -import config from '../../config/environment'; -import registerPowerSelectHelpers from 'ember-power-select/test-support/helpers'; -import registerCodeMirrorHelpers from 'nomad-ui/tests/helpers/codemirror'; - -registerPowerSelectHelpers(); -registerCodeMirrorHelpers(); - -export default function startApp(attrs) { - let attributes = merge({}, config.APP); - attributes = merge(attributes, attrs); // use defaults, but you can override; - - return run(() => { - let application = Application.create(attributes); - application.setupForTesting(); - application.injectTestHelpers(); - return application; - }); -} diff --git a/ui/yarn.lock b/ui/yarn.lock index 5dc9d42489a..06750e1a3e5 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -347,6 +347,13 @@ ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: dependencies: color-convert "^1.9.0" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" @@ -1619,13 +1626,6 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: rsvp "^3.5.0" workerpool "^2.2.1" -broccoli-brocfile-loader@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" - integrity sha1-LoYCHIBcNP/I0povtyHPJz6Bnks= - dependencies: - findup-sync "^0.4.2" - broccoli-builder@^0.18.8: version "0.18.10" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.10.tgz#9767e0061ff5b5e6eb1619d1a972ef2c7fd07631" @@ -1881,13 +1881,13 @@ broccoli-merge-trees@^3.0.1: broccoli-plugin "^1.3.0" merge-trees "^2.0.0" -broccoli-middleware@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.0.0.tgz#92f4e1fb9a791ea986245a7077f35cc648dab097" - integrity sha1-kvTh+5p5HqmGJFpwd/NcxkjasJc= +broccoli-middleware@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.2.1.tgz#a21f255f8bfe5a21c2f0fbf2417addd9d24c9436" + integrity sha1-oh8lX4v+WiHC8PvyQXrd2dJMlDY= dependencies: handlebars "^4.0.4" - mime "^1.2.11" + mime-types "^2.1.18" broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.2, broccoli-persistent-filter@^1.4.3: version "1.4.3" @@ -2362,7 +2362,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== @@ -2371,6 +2371,15 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chalk@^2.3.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" @@ -2507,20 +2516,10 @@ cli-spinners@^0.1.2: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" integrity sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw= -cli-spinners@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" - integrity sha1-8YR7FohE2RemceudFH499JfJDQY= - -cli-table2@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" - integrity sha1-LR738hig54biFFQFYtS9F3/jLZc= - dependencies: - lodash "^3.10.1" - string-width "^1.0.1" - optionalDependencies: - colors "^1.1.2" +cli-spinners@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== cli-table@^0.3.1: version "0.3.1" @@ -2565,6 +2564,11 @@ clone@^0.2.0: resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8= +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + clone@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" @@ -2622,7 +2626,7 @@ colors@1.0.3, colors@1.0.x: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.1.2, colors@~1.1.2: +colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= @@ -2773,15 +2777,17 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -console-ui@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.0.1.tgz#56d0721ebcc44e6c9c3de02f355f898aba41ea79" - integrity sha1-VtByHrzETmycPeAvNV+JirpB6nk= +console-ui@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.2.3.tgz#134b92e632f2c0088f78e52b20f1ca22a95b9a91" + integrity sha512-aZm49rntsv264Fw/DM56Z2ehLg1DDxrqof2jFcZOgC03S0nRGSYFIVPx5TbGssrgBhgCvGBY+9mmk0+t/nWXEA== dependencies: chalk "^2.1.0" inquirer "^2" - ora "^1.3.0" + json-stable-stringify "^1.0.1" + ora "^2.0.0" through "^2.3.8" + user-info "^1.0.0" consolidate@^0.14.0: version "0.14.5" @@ -2862,11 +2868,6 @@ core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= -core-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" - integrity sha1-htY5GHM8+doaWq5ynmLAqI5mrQo= - core-object@^3.1.3: version "3.1.5" resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" @@ -3197,6 +3198,13 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -3527,11 +3535,6 @@ 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-get-dependency-depth@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz#e0afecf82a2d52f00f28ab468295281aec368d11" - integrity sha1-4K/s+CotUvAPKKtGgpUoGuw2jRE= - ember-cli-htmlbars-inline-precompile@^1.0.0, ember-cli-htmlbars-inline-precompile@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.2.tgz#5b544f664d5d9911f08cd979c5f70d8cb0ca2add" @@ -3579,29 +3582,6 @@ ember-cli-is-package-missing@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390" integrity sha1-bmGEyvuSY13ZPKbJRrEEKS1OM5A= -ember-cli-legacy-blueprints@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ember-cli-legacy-blueprints/-/ember-cli-legacy-blueprints-0.2.1.tgz#480f37cb83f1eda2d46bbc7d07c59ea2e8ce9b84" - integrity sha1-SA83y4Px7aLUa7x9B8WeoujOm4Q= - dependencies: - chalk "^2.3.0" - ember-cli-get-component-path-option "^1.0.0" - ember-cli-get-dependency-depth "^1.0.0" - ember-cli-is-package-missing "^1.0.0" - ember-cli-lodash-subset "^2.0.1" - ember-cli-normalize-entity-name "^1.0.0" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.0.0" - ember-cli-test-info "^1.0.0" - ember-cli-valid-component-name "^1.0.0" - ember-cli-version-checker "^2.1.0" - ember-router-generator "^1.0.0" - exists-sync "0.0.3" - fs-extra "^4.0.0" - inflection "^1.7.1" - rsvp "^4.7.0" - silent-error "^1.0.0" - ember-cli-lodash-subset@^1.0.7: version "1.0.12" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" @@ -3831,17 +3811,16 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: resolve "^1.3.3" semver "^5.3.0" -ember-cli@~2.18.2: - version "2.18.2" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-2.18.2.tgz#bb15313a15139a85248a86d203643f918ba40f57" - integrity sha1-uxUxOhUTmoUkiobSA2Q/kYukD1c= +ember-cli@~3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.0.4.tgz#89275dd59994c64fa0ed5dcec24c83cd2935320b" + integrity sha512-c006otAzpUYzh0+BrwxW1cXnWE37EZxrlws2t+AqwiJKv/rETJY4uZYRSekUNoK1Xqb27zK9JtzgOyKuNJelYw== dependencies: amd-name-resolver "1.0.0" babel-plugin-transform-es2015-modules-amd "^6.24.0" bower-config "^1.3.0" bower-endpoint-parser "0.2.2" broccoli-babel-transpiler "^6.0.0" - broccoli-brocfile-loader "^0.18.0" broccoli-builder "^0.18.8" broccoli-concat "^3.2.2" broccoli-config-loader "^1.0.0" @@ -3850,7 +3829,7 @@ ember-cli@~2.18.2: broccoli-funnel "^2.0.0" broccoli-funnel-reducer "^1.0.0" broccoli-merge-trees "^2.0.0" - broccoli-middleware "^1.0.0" + broccoli-middleware "^1.2.1" broccoli-source "^1.1.0" broccoli-stew "^1.2.0" calculate-cache-key-for-tree "^1.0.0" @@ -3859,18 +3838,16 @@ ember-cli@~2.18.2: clean-base-url "^1.0.0" compression "^1.4.4" configstore "^3.0.0" - console-ui "^2.0.0" + console-ui "^2.1.0" core-object "^3.1.3" dag-map "^2.0.2" diff "^3.2.0" ember-cli-broccoli-sane-watcher "^2.0.4" ember-cli-is-package-missing "^1.0.0" - ember-cli-legacy-blueprints "^0.2.0" ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" ember-cli-preprocess-registry "^3.1.0" ember-cli-string-utils "^1.0.0" - ember-try "^0.2.15" ensure-posix-path "^1.0.2" execa "^0.8.0" exists-sync "0.0.4" @@ -3919,6 +3896,7 @@ ember-cli@~2.18.2: uuid "^3.0.0" validate-npm-package-name "^3.0.0" walk-sync "^0.3.0" + watch-detector "^0.1.0" yam "0.0.22" ember-composable-helpers@^2.0.3: @@ -3951,10 +3929,10 @@ ember-data-model-fragments@^2.14.0: git-repo-info "^1.4.1" npm-git-info "^1.0.3" -ember-data@~2.18.2: - version "2.18.2" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-2.18.2.tgz#3c6e99c9aed77ef8945451c39f39865f370f3db4" - integrity sha512-84c7lw8l6oRFUC0VYVXDZHsiqkz6VM2xJNU7saTUWc/gfwh/JNRgQSPWi8QbzDhbTFp5BIQM2xApRbRW4Bp7bA== +ember-data@~3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.0.4.tgz#d66473727a87ea85a8561263d949cea89775172f" + integrity sha512-EMvYvp5Wly3y1TV+Vo81Uj2JNvQle8p9CnMyfSFEo4Q0f+8USnlmn/88HInTMrAW8uIAsvCHfJjari1z3UhdEw== dependencies: amd-name-resolver "0.0.7" babel-plugin-ember-modules-api-polyfill "^1.4.2" @@ -4111,7 +4089,7 @@ ember-macro-helpers@^0.17.0: ember-cli-test-info "^1.0.0" ember-weakmap "^3.0.0" -ember-maybe-import-regenerator@^0.1.5: +ember-maybe-import-regenerator@^0.1.5, ember-maybe-import-regenerator@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz#35d41828afa6d6a59bc0da3ce47f34c573d776ca" integrity sha1-NdQYKK+m1qWbwNo85H80xXPXdso= @@ -4193,7 +4171,7 @@ ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== -ember-router-generator@^1.0.0, ember-router-generator@^1.2.3: +ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" integrity sha1-jtLKhv8yM2MSD8FCeBkeno8TFe4= @@ -4218,10 +4196,10 @@ ember-sinon@^1.0.1: ember-cli-babel "^6.3.0" sinon "^3.2.1" -ember-source@~2.18.2: - version "2.18.2" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.18.2.tgz#75d00eef5488bfe504044b025c752ba924eaf87f" - integrity sha1-ddAO71SIv+UEBEsCXHUrqSTq+H8= +ember-source@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.0.0.tgz#51811cae98d2ceec53bcfbaa876d02b2b5b2159f" + integrity sha1-UYEcrpjSzuxTvPuqh20CsrWyFZ8= dependencies: broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" @@ -4230,7 +4208,6 @@ ember-source@~2.18.2: ember-cli-normalize-entity-name "^1.0.0" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" ember-cli-valid-component-name "^1.0.0" ember-cli-version-checker "^2.1.0" ember-router-generator "^1.2.3" @@ -4261,34 +4238,6 @@ ember-truth-helpers@^2.0.0: dependencies: ember-cli-babel "^6.8.2" -ember-try-config@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-2.2.0.tgz#6be0af6c71949813e02ac793564fddbf8336b807" - integrity sha1-a+CvbHGUmBPgKseTVk/dv4M2uAc= - dependencies: - lodash "^4.6.1" - node-fetch "^1.3.3" - rsvp "^3.2.1" - semver "^5.1.0" - -ember-try@^0.2.15: - version "0.2.22" - resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-0.2.22.tgz#3989e9c013c1d5c209ec97f5dfcf4234e594d5e2" - integrity sha512-5NKqlKCGWqTUWAA61/dchIFKG2loqEBcHHI4ZbCHToKdK82NTzWkifxryhmwzFE0c9MomvQ3Rza7yxVD5C9rMw== - dependencies: - chalk "^1.0.0" - cli-table2 "^0.2.0" - core-object "^1.1.0" - debug "^2.2.0" - ember-try-config "^2.2.0" - extend "^3.0.0" - fs-extra "^0.26.0" - promise-map-series "^0.2.1" - resolve "^1.1.6" - rimraf "^2.3.2" - rsvp "^3.0.17" - semver "^5.1.0" - ember-weakmap@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/ember-weakmap/-/ember-weakmap-3.1.1.tgz#2ae6e0080b5b80cf0d108f7752dc69ea9603dbd7" @@ -4325,13 +4274,6 @@ encodeurl@~1.0.1: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" integrity sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA= -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= - dependencies: - iconv-lite "~0.4.13" - end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -4635,6 +4577,15 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +exec-file-sync@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/exec-file-sync/-/exec-file-sync-2.0.2.tgz#58d441db46e40de6d1f30de5be022785bd89e328" + integrity sha1-WNRB20bkDebR8w3lvgInhb2J4yg= + dependencies: + is-obj "^1.0.0" + object-assign "^4.0.1" + spawn-sync "^1.0.11" + exec-sh@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" @@ -5010,7 +4961,7 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" -findup-sync@0.4.3, findup-sync@^0.4.2: +findup-sync@0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" integrity sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI= @@ -5129,17 +5080,6 @@ fs-extra@^0.24.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^0.26.0: - version "0.26.7" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" - integrity sha1-muH92UiXeY7at20JGM9C0MMYT6k= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -5528,6 +5468,11 @@ has-flag@^2.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -5725,7 +5670,7 @@ husky@^0.14.3: normalize-path "^1.0.0" strip-indent "^2.0.0" -iconv-lite@^0.4.17, iconv-lite@^0.4.5, iconv-lite@~0.4.13: +iconv-lite@^0.4.17, iconv-lite@^0.4.5: version "0.4.18" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" integrity sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA== @@ -5796,7 +5741,7 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= -inflection@^1.12.0, inflection@^1.7.0, inflection@^1.7.1, inflection@^1.8.0: +inflection@^1.12.0, inflection@^1.7.0, inflection@^1.8.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= @@ -6151,7 +6096,7 @@ is-resolvable@^1.0.0: dependencies: tryit "^1.0.1" -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -7097,12 +7042,12 @@ lodash.values@~2.3.0: dependencies: lodash.keys "~2.3.0" -lodash@^3.10.0, lodash@^3.10.1, lodash@^3.9.3: +lodash@^3.10.0, lodash@^3.9.3: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@~4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= @@ -7126,6 +7071,13 @@ log-symbols@^2.0.0: dependencies: chalk "^2.0.1" +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + log-update@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" @@ -7326,7 +7278,7 @@ memory-streams@^0.1.0: dependencies: readable-stream "~1.0.2" -meow@^3.7.0: +meow@^3.4.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= @@ -7433,6 +7385,11 @@ mime-db@~1.29.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" integrity sha1-SNJtI1WJZRcErFkWygYAGRQmaHg= +mime-db@~1.38.0: + version "1.38.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" + integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== + mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.7: version "2.1.16" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" @@ -7440,16 +7397,18 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, dependencies: mime-db "~1.29.0" +mime-types@^2.1.18: + version "2.1.22" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" + integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== + dependencies: + mime-db "~1.38.0" + mime@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" integrity sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM= -mime@^1.2.11: - version "1.4.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.0.tgz#69e9e0db51d44f2a3b56e48b7817d7d137f1a343" - integrity sha512-n9ChLv77+QQEapYz8lV+rIZAW3HhAPW2CXnzb1GN5uMkuczshwvkW7XPsbzU0ZQN3sP47Er2KVkp2p3KyqZKSQ== - mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" @@ -7688,14 +7647,6 @@ nise@^1.0.1: path-to-regexp "^1.7.0" text-encoding "^0.6.4" -node-fetch@^1.3.3: - version "1.7.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.2.tgz#c54e9aac57e432875233525f3c891c4159ffefd7" - integrity sha512-xZZUq2yDhKMIn/UgG5q//IZSNLJIwW2QxS14CNH5spuiXkITM2pUitjdq58yLSaU7m4M0wBNaM2Gh/ggY4YJig== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - node-fetch@^2.0.0-alpha.9: version "2.0.0-alpha.9" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.0.0-alpha.9.tgz#990c0634f510f76449a0d6f6eaec96b22f273628" @@ -8051,15 +8002,17 @@ ora@^0.2.3: cli-spinners "^0.1.2" object-assign "^4.0.1" -ora@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-1.3.0.tgz#80078dd2b92a934af66a3ad72a5b910694ede51a" - integrity sha1-gAeN0rkqk0r2ajrXKluRBpTt5Ro= +ora@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" + integrity sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA== dependencies: - chalk "^1.1.1" + chalk "^2.3.1" cli-cursor "^2.1.0" - cli-spinners "^1.0.0" - log-symbols "^1.0.2" + cli-spinners "^1.1.0" + log-symbols "^2.2.0" + strip-ansi "^4.0.0" + wcwidth "^1.0.1" os-browserify@^0.3.0: version "0.3.0" @@ -8221,6 +8174,13 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +passwd-user@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/passwd-user/-/passwd-user-1.2.1.tgz#a01a5dc639ef007dc56364b8178569080ad3a7b8" + integrity sha1-oBpdxjnvAH3FY2S4F4VpCArTp7g= + dependencies: + exec-file-sync "^2.0.0" + path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" @@ -8991,7 +8951,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" integrity sha1-wjOOxkPfeht/5cVPqG9XQopV8z0= @@ -9525,7 +9485,7 @@ spawn-args@^0.2.0: resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" integrity sha1-+30L0dcP1DFr2ePew4nmX51jYbs= -spawn-sync@^1.0.15: +spawn-sync@^1.0.11, spawn-sync@^1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= @@ -9822,6 +9782,13 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + svgo@^0.6.3: version "0.6.6" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.6.6.tgz#b340889036f20f9b447543077d0f5573ed044c08" @@ -10338,11 +10305,27 @@ user-home@^1.1.1: resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= +user-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/user-info/-/user-info-1.0.0.tgz#81c82b7ed63e674c2475667653413b3c76fde239" + integrity sha1-gcgrftY+Z0wkdWZ2U0E7PHb94jk= + dependencies: + os-homedir "^1.0.1" + passwd-user "^1.2.1" + username "^1.0.1" + username-sync@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" integrity sha1-HN6H7vz5S4gimE2Ti6K3l0Jtrh8= +username@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/username/-/username-1.0.1.tgz#e1f72295e3e58e06f002c6327ce06897a99cd67f" + integrity sha1-4fcilePljgbwAsYyfOBol6mc1n8= + dependencies: + meow "^3.4.0" + util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -10444,6 +10427,17 @@ walker@1.x, walker@~1.0.5: dependencies: makeerror "1.0.x" +watch-detector@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/watch-detector/-/watch-detector-0.1.0.tgz#e37b410d149e2a8bf263a4f8b71e2f667633dbf8" + integrity sha512-vfzMMfpjQc88xjETwl2HuE6PjEuxCBeyC4bQmqrHrofdfYWi/4mEJklYbNgSzpqM9PxubsiPIrE5SZ1FDyiQ2w== + dependencies: + heimdalljs-logger "^0.1.9" + quick-temp "^0.1.8" + rsvp "^4.7.0" + semver "^5.4.1" + silent-error "^1.1.0" + watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" @@ -10466,6 +10460,13 @@ watchpack@^1.5.0: graceful-fs "^4.1.2" neo-async "^2.5.0" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + webpack-sources@^1.0.1, webpack-sources@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" From b70b04241cb5ecc8bb5fea409369538a141b32bb Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 12 Mar 2019 16:50:57 -0700 Subject: [PATCH 03/46] Fix eslint error and add lint script to package.json --- ui/config/environment.js | 4 ++-- ui/package.json | 16 ++++------------ 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/ui/config/environment.js b/ui/config/environment.js index b2dc57f61e1..1ae693c2429 100644 --- a/ui/config/environment.js +++ b/ui/config/environment.js @@ -61,8 +61,8 @@ module.exports = function(environment) { }; } - if (environment === 'production') { - } + // if (environment === 'production') { + // } return ENV; }; diff --git a/ui/package.json b/ui/package.json index 08c1405b012..d51fe36828c 100644 --- a/ui/package.json +++ b/ui/package.json @@ -11,17 +11,12 @@ "build": "./node_modules/ember-cli/bin/ember build -prod", "start": "./node_modules/ember-cli/bin/ember server", "test": "./node_modules/ember-cli/bin/ember test", + "lint:js": "eslint .", "precommit": "lint-staged" }, "lint-staged": { - "{app,tests,config,lib,mirage}/**/*.js": [ - "prettier --write", - "git add" - ], - "app/styles/**/*.*": [ - "prettier --write", - "git add" - ] + "{app,tests,config,lib,mirage}/**/*.js": ["prettier --write", "git add"], + "app/styles/**/*.*": ["prettier --write", "git add"] }, "devDependencies": { "babel-plugin-transform-object-rest-spread": "^6.26.0", @@ -92,10 +87,7 @@ }, "private": true, "ember-addon": { - "paths": [ - "lib/bulma", - "lib/calendar" - ] + "paths": ["lib/bulma", "lib/calendar"] }, "dependencies": { "lru_map": "^0.3.3" From a0e8eef7b5503054e9652558eb467cb7a086f6c0 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 12 Mar 2019 17:01:31 -0700 Subject: [PATCH 04/46] Modules codemod + prettier --- ui/package.json | 5 ++--- ui/tests/integration/list-table-test.js | 5 +---- ui/tests/unit/helpers/format-bytes-test.js | 4 +--- ui/tests/unit/models/task-group-test.js | 4 +--- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/ui/package.json b/ui/package.json index d51fe36828c..9903a75966c 100644 --- a/ui/package.json +++ b/ui/package.json @@ -11,12 +11,11 @@ "build": "./node_modules/ember-cli/bin/ember build -prod", "start": "./node_modules/ember-cli/bin/ember server", "test": "./node_modules/ember-cli/bin/ember test", - "lint:js": "eslint .", "precommit": "lint-staged" }, "lint-staged": { - "{app,tests,config,lib,mirage}/**/*.js": ["prettier --write", "git add"], - "app/styles/**/*.*": ["prettier --write", "git add"] + "'{app,tests,config,lib,mirage}/**/*.js'": ["prettier --write", "git add"], + "'app/styles/**/*.*'": ["prettier --write", "git add"] }, "devDependencies": { "babel-plugin-transform-object-rest-spread": "^6.26.0", diff --git a/ui/tests/integration/list-table-test.js b/ui/tests/integration/list-table-test.js index d399f87f896..7f4d74f6a64 100644 --- a/ui/tests/integration/list-table-test.js +++ b/ui/tests/integration/list-table-test.js @@ -90,7 +90,4 @@ test('component exposes a tbody contextual component', function(assert) { // Ember doesn't support query params (or controllers or routes) in integration tests, // so sorting links can only be tested in acceptance tests. // Leaving this test here for posterity. -skip( - 'sort-by creates links using the appropriate links given sort property and sort descending', - function() {} -); +skip('sort-by creates links using the appropriate links given sort property and sort descending', function() {}); diff --git a/ui/tests/unit/helpers/format-bytes-test.js b/ui/tests/unit/helpers/format-bytes-test.js index d33eff5ff7b..510cb788477 100644 --- a/ui/tests/unit/helpers/format-bytes-test.js +++ b/ui/tests/unit/helpers/format-bytes-test.js @@ -25,9 +25,7 @@ test('formats 1024 * 1024 <= x < 1024 * 1024 * 1024 as MiB', function(assert) { assert.equal(formatBytes([128974848]), '123 MiB'); }); -test('formats x > 1024 * 1024 * 1024 as MiB, since it is the highest allowed unit', function( - assert -) { +test('formats x > 1024 * 1024 * 1024 as MiB, since it is the highest allowed unit', function(assert) { assert.equal(formatBytes([1024 * 1024 * 1024]), '1024 MiB'); assert.equal(formatBytes([1024 * 1024 * 1024 * 4]), '4096 MiB'); }); diff --git a/ui/tests/unit/models/task-group-test.js b/ui/tests/unit/models/task-group-test.js index 7f7014bcd37..0e6117e685e 100644 --- a/ui/tests/unit/models/task-group-test.js +++ b/ui/tests/unit/models/task-group-test.js @@ -7,9 +7,7 @@ moduleForModel('task-group', 'Unit | Model | task-group', { needs: ['model:task', 'model:task-group-summary'], }); -test("should expose reserved resource stats as aggregates of each task's reserved resources", function( - assert -) { +test("should expose reserved resource stats as aggregates of each task's reserved resources", function(assert) { const taskGroup = this.subject({ name: 'group-example', tasks: [ From 90278bff0402866d9fdba235bf913a3222cd9fe6 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 12 Mar 2019 17:04:16 -0700 Subject: [PATCH 05/46] Ember QUnit Codemod --- ui/tests/acceptance/allocation-detail-test.js | 208 ++--- .../acceptance/application-errors-test.js | 65 +- ui/tests/acceptance/client-detail-test.js | 353 ++++---- ui/tests/acceptance/clients-list-test.js | 417 ++++----- ui/tests/acceptance/job-allocations-test.js | 87 +- ui/tests/acceptance/job-definition-test.js | 82 +- ui/tests/acceptance/job-deployments-test.js | 284 +++--- ui/tests/acceptance/job-detail-test.js | 35 +- ui/tests/acceptance/job-evaluations-test.js | 38 +- ui/tests/acceptance/job-run-test.js | 48 +- ui/tests/acceptance/job-versions-test.js | 44 +- ui/tests/acceptance/jobs-list-test.js | 545 ++++++------ ui/tests/acceptance/namespaces-test.js | 70 +- ui/tests/acceptance/regions-test.js | 136 +-- ui/tests/acceptance/server-detail-test.js | 62 +- ui/tests/acceptance/servers-list-test.js | 56 +- ui/tests/acceptance/task-detail-test.js | 272 +++--- ui/tests/acceptance/task-group-detail-test.js | 222 +++-- ui/tests/acceptance/task-logs-test.js | 36 +- ui/tests/acceptance/token-test.js | 209 ++--- ui/tests/helpers/module-for-adapter.js | 3 +- ui/tests/helpers/module-for-job.js | 4 +- ui/tests/helpers/module-for-serializer.js | 3 +- ui/tests/integration/allocation-row-test.js | 303 +++---- ui/tests/integration/app-breadcrumbs-test.js | 112 +-- ui/tests/integration/attributes-table-test.js | 132 +-- ui/tests/integration/job-diff-test.js | 358 ++++---- ui/tests/integration/job-editor-test.js | 781 ++++++++-------- ui/tests/integration/job-page/helpers.js | 14 +- .../integration/job-page/parts/body-test.js | 145 +-- .../job-page/parts/children-test.js | 323 +++---- .../job-page/parts/latest-deployment-test.js | 329 ++++--- .../job-page/parts/placement-failures-test.js | 125 ++- .../job-page/parts/summary-test.js | 463 +++++----- .../job-page/parts/task-groups-test.js | 285 +++--- .../integration/job-page/periodic-test.js | 313 +++---- ui/tests/integration/job-page/service-test.js | 453 +++++----- ui/tests/integration/list-pagination-test.js | 444 ++++----- ui/tests/integration/list-table-test.js | 162 ++-- .../integration/multi-select-dropdown-test.js | 517 +++++------ ui/tests/integration/page-layout-test.js | 115 +-- .../integration/placement-failure-test.js | 254 +++--- ui/tests/integration/primary-metric-test.js | 321 +++---- .../reschedule-event-timeline-test.js | 347 ++++---- ui/tests/integration/task-log-test.js | 309 ++++--- ui/tests/integration/two-step-button-test.js | 223 ++--- ui/tests/unit/adapters/job-test.js | 44 +- ui/tests/unit/adapters/node-test.js | 8 +- ui/tests/unit/components/line-chart-test.js | 247 +++--- .../unit/components/stats-time-series-test.js | 239 ++--- ui/tests/unit/helpers/format-bytes-test.js | 48 +- ui/tests/unit/mixins/searchable-test.js | 403 +++++---- ui/tests/unit/models/job-test.js | 217 ++--- ui/tests/unit/models/task-group-test.js | 109 +-- ui/tests/unit/serializers/allocation-test.js | 2 +- ui/tests/unit/serializers/deployment-test.js | 2 +- ui/tests/unit/serializers/evaluation-test.js | 2 +- ui/tests/unit/serializers/job-plan-test.js | 2 +- ui/tests/unit/serializers/job-summary-test.js | 2 +- ui/tests/unit/serializers/job-test.js | 2 +- ui/tests/unit/serializers/node-test.js | 6 +- ui/tests/unit/services/breadcrumbs-test.js | 167 ++-- .../services/stats-trackers-registry-test.js | 252 +++--- ui/tests/unit/services/token-test.js | 83 +- .../utils/allocation-stats-tracker-test.js | 839 +++++++++--------- .../behaviors/stats-tracker-frame-missing.js | 16 +- ui/tests/unit/utils/format-duration-test.js | 56 +- ui/tests/unit/utils/log-test.js | 171 ++-- .../unit/utils/node-stats-tracker-test.js | 409 ++++----- ui/tests/unit/utils/rolling-array-test.js | 156 ++-- 70 files changed, 6638 insertions(+), 6951 deletions(-) diff --git a/ui/tests/acceptance/allocation-detail-test.js b/ui/tests/acceptance/allocation-detail-test.js index 5569ae53152..0dde63a1de6 100644 --- a/ui/tests/acceptance/allocation-detail-test.js +++ b/ui/tests/acceptance/allocation-detail-test.js @@ -1,7 +1,7 @@ import { assign } from '@ember/polyfills'; import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import Allocation from 'nomad-ui/tests/pages/allocations/detail'; import moment from 'moment'; @@ -9,8 +9,10 @@ let job; let node; let allocation; -moduleForAcceptance('Acceptance | allocation detail', { - beforeEach() { +module('Acceptance | allocation detail', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); node = server.create('node'); @@ -33,138 +35,118 @@ moduleForAcceptance('Acceptance | allocation detail', { }); Allocation.visit({ id: allocation.id }); - }, -}); + }); -test('/allocation/:id should name the allocation and link to the corresponding job and node', function(assert) { - assert.ok(Allocation.title.includes(allocation.name), 'Allocation name is in the heading'); - assert.equal(Allocation.details.job, job.name, 'Job name is in the subheading'); - assert.equal( - Allocation.details.client, - node.id.split('-')[0], - 'Node short id is in the subheading' - ); + test('/allocation/:id should name the allocation and link to the corresponding job and node', function(assert) { + assert.ok(Allocation.title.includes(allocation.name), 'Allocation name is in the heading'); + assert.equal(Allocation.details.job, job.name, 'Job name is in the subheading'); + assert.equal( + Allocation.details.client, + node.id.split('-')[0], + 'Node short id is in the subheading' + ); - andThen(() => { Allocation.details.visitJob(); - }); - andThen(() => { assert.equal(currentURL(), `/jobs/${job.id}`, 'Job link navigates to the job'); - }); - Allocation.visit({ id: allocation.id }); + Allocation.visit({ id: allocation.id }); - andThen(() => { Allocation.details.visitClient(); - }); - andThen(() => { assert.equal(currentURL(), `/clients/${node.id}`, 'Client link navigates to the client'); }); -}); - -test('/allocation/:id should include resource utilization graphs', function(assert) { - assert.equal(Allocation.resourceCharts.length, 2, 'Two resource utilization graphs'); - assert.equal(Allocation.resourceCharts.objectAt(0).name, 'CPU', 'First chart is CPU'); - assert.equal(Allocation.resourceCharts.objectAt(1).name, 'Memory', 'Second chart is Memory'); -}); -test('/allocation/:id should list all tasks for the allocation', function(assert) { - assert.equal( - Allocation.tasks.length, - server.db.taskStates.where({ allocationId: allocation.id }).length, - 'Table lists all tasks' - ); - assert.notOk(Allocation.isEmpty, 'Task table empty state is not shown'); -}); + test('/allocation/:id should include resource utilization graphs', function(assert) { + assert.equal(Allocation.resourceCharts.length, 2, 'Two resource utilization graphs'); + assert.equal(Allocation.resourceCharts.objectAt(0).name, 'CPU', 'First chart is CPU'); + assert.equal(Allocation.resourceCharts.objectAt(1).name, 'Memory', 'Second chart is Memory'); + }); -test('each task row should list high-level information for the task', function(assert) { - const task = server.db.taskStates.where({ allocationId: allocation.id }).sortBy('name')[0]; - const taskResources = allocation.taskResourcesIds - .map(id => server.db.taskResources.find(id)) - .sortBy('name')[0]; - const reservedPorts = taskResources.resources.Networks[0].ReservedPorts; - const dynamicPorts = taskResources.resources.Networks[0].DynamicPorts; - const taskRow = Allocation.tasks.objectAt(0); - const events = server.db.taskEvents.where({ taskStateId: task.id }); - const event = events[events.length - 1]; - - assert.equal(taskRow.name, task.name, 'Name'); - assert.equal(taskRow.state, task.state, 'State'); - assert.equal(taskRow.message, event.displayMessage, 'Event Message'); - assert.equal( - taskRow.time, - moment(event.time / 1000000).format("MMM DD, 'YY HH:mm:ss ZZ"), - 'Event Time' - ); - - assert.ok(reservedPorts.length, 'The task has reserved ports'); - assert.ok(dynamicPorts.length, 'The task has dynamic ports'); - - const addressesText = taskRow.ports; - reservedPorts.forEach(port => { - assert.ok(addressesText.includes(port.Label), `Found label ${port.Label}`); - assert.ok(addressesText.includes(port.Value), `Found value ${port.Value}`); + test('/allocation/:id should list all tasks for the allocation', function(assert) { + assert.equal( + Allocation.tasks.length, + server.db.taskStates.where({ allocationId: allocation.id }).length, + 'Table lists all tasks' + ); + assert.notOk(Allocation.isEmpty, 'Task table empty state is not shown'); }); - dynamicPorts.forEach(port => { - assert.ok(addressesText.includes(port.Label), `Found label ${port.Label}`); - assert.ok(addressesText.includes(port.Value), `Found value ${port.Value}`); + + test('each task row should list high-level information for the task', function(assert) { + const task = server.db.taskStates.where({ allocationId: allocation.id }).sortBy('name')[0]; + const taskResources = allocation.taskResourcesIds + .map(id => server.db.taskResources.find(id)) + .sortBy('name')[0]; + const reservedPorts = taskResources.resources.Networks[0].ReservedPorts; + const dynamicPorts = taskResources.resources.Networks[0].DynamicPorts; + const taskRow = Allocation.tasks.objectAt(0); + const events = server.db.taskEvents.where({ taskStateId: task.id }); + const event = events[events.length - 1]; + + assert.equal(taskRow.name, task.name, 'Name'); + assert.equal(taskRow.state, task.state, 'State'); + assert.equal(taskRow.message, event.displayMessage, 'Event Message'); + assert.equal( + taskRow.time, + moment(event.time / 1000000).format("MMM DD, 'YY HH:mm:ss ZZ"), + 'Event Time' + ); + + assert.ok(reservedPorts.length, 'The task has reserved ports'); + assert.ok(dynamicPorts.length, 'The task has dynamic ports'); + + const addressesText = taskRow.ports; + reservedPorts.forEach(port => { + assert.ok(addressesText.includes(port.Label), `Found label ${port.Label}`); + assert.ok(addressesText.includes(port.Value), `Found value ${port.Value}`); + }); + dynamicPorts.forEach(port => { + assert.ok(addressesText.includes(port.Label), `Found label ${port.Label}`); + assert.ok(addressesText.includes(port.Value), `Found value ${port.Value}`); + }); }); -}); -test('each task row should link to the task detail page', function(assert) { - const task = server.db.taskStates.where({ allocationId: allocation.id }).sortBy('name')[0]; + test('each task row should link to the task detail page', function(assert) { + const task = server.db.taskStates.where({ allocationId: allocation.id }).sortBy('name')[0]; - Allocation.tasks.objectAt(0).clickLink(); + Allocation.tasks.objectAt(0).clickLink(); - andThen(() => { assert.equal( currentURL(), `/allocations/${allocation.id}/${task.name}`, 'Task name in task row links to task detail' ); - }); - andThen(() => { Allocation.visit({ id: allocation.id }); - }); - andThen(() => { Allocation.tasks.objectAt(0).clickRow(); - }); - andThen(() => { assert.equal( currentURL(), `/allocations/${allocation.id}/${task.name}`, 'Task row links to task detail' ); }); -}); -test('tasks with an unhealthy driver have a warning icon', function(assert) { - assert.ok(Allocation.firstUnhealthyTask().hasUnhealthyDriver, 'Warning is shown'); -}); + test('tasks with an unhealthy driver have a warning icon', function(assert) { + assert.ok(Allocation.firstUnhealthyTask().hasUnhealthyDriver, 'Warning is shown'); + }); -test('when there are no tasks, an empty state is shown', function(assert) { - // Make sure the allocation is pending in order to ensure there are no tasks - allocation = server.create('allocation', 'withTaskWithPorts', { clientStatus: 'pending' }); - Allocation.visit({ id: allocation.id }); + test('when there are no tasks, an empty state is shown', function(assert) { + // Make sure the allocation is pending in order to ensure there are no tasks + allocation = server.create('allocation', 'withTaskWithPorts', { clientStatus: 'pending' }); + Allocation.visit({ id: allocation.id }); - andThen(() => { assert.ok(Allocation.isEmpty, 'Task table empty state is shown'); }); -}); -test('when the allocation has not been rescheduled, the reschedule events section is not rendered', function(assert) { - assert.notOk(Allocation.hasRescheduleEvents, 'Reschedule Events section exists'); -}); + test('when the allocation has not been rescheduled, the reschedule events section is not rendered', function(assert) { + assert.notOk(Allocation.hasRescheduleEvents, 'Reschedule Events section exists'); + }); -test('when the allocation is not found, an error message is shown, but the URL persists', function(assert) { - Allocation.visit({ id: 'not-a-real-allocation' }); + test('when the allocation is not found, an error message is shown, but the URL persists', function(assert) { + Allocation.visit({ id: 'not-a-real-allocation' }); - andThen(() => { assert.equal( server.pretender.handledRequests.findBy('status', 404).url, '/v1/allocation/not-a-real-allocation', @@ -176,8 +158,10 @@ test('when the allocation is not found, an error message is shown, but the URL p }); }); -moduleForAcceptance('Acceptance | allocation detail (rescheduled)', { - beforeEach() { +module('Acceptance | allocation detail (rescheduled)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); node = server.create('node'); @@ -185,15 +169,17 @@ moduleForAcceptance('Acceptance | allocation detail (rescheduled)', { allocation = server.create('allocation', 'rescheduled'); Allocation.visit({ id: allocation.id }); - }, -}); + }); -test('when the allocation has been rescheduled, the reschedule events section is rendered', function(assert) { - assert.ok(Allocation.hasRescheduleEvents, 'Reschedule Events section exists'); + test('when the allocation has been rescheduled, the reschedule events section is rendered', function(assert) { + assert.ok(Allocation.hasRescheduleEvents, 'Reschedule Events section exists'); + }); }); -moduleForAcceptance('Acceptance | allocation detail (not running)', { - beforeEach() { +module('Acceptance | allocation detail (not running)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); node = server.create('node'); @@ -201,14 +187,14 @@ moduleForAcceptance('Acceptance | allocation detail (not running)', { allocation = server.create('allocation', { clientStatus: 'pending' }); Allocation.visit({ id: allocation.id }); - }, -}); + }); -test('when the allocation is not running, the utilization graphs are replaced by an empty message', function(assert) { - assert.equal(Allocation.resourceCharts.length, 0, 'No resource charts'); - assert.equal( - Allocation.resourceEmptyMessage, - "Allocation isn't running", - 'Empty message is appropriate' - ); + test('when the allocation is not running, the utilization graphs are replaced by an empty message', function(assert) { + assert.equal(Allocation.resourceCharts.length, 0, 'No resource charts'); + assert.equal( + Allocation.resourceEmptyMessage, + "Allocation isn't running", + 'Empty message is appropriate' + ); + }); }); diff --git a/ui/tests/acceptance/application-errors-test.js b/ui/tests/acceptance/application-errors-test.js index 266375c522b..aefa11449c7 100644 --- a/ui/tests/acceptance/application-errors-test.js +++ b/ui/tests/acceptance/application-errors-test.js @@ -1,64 +1,52 @@ -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; -import { test } from 'qunit'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; import Job from 'nomad-ui/tests/pages/jobs/detail'; -moduleForAcceptance('Acceptance | application errors ', { - beforeEach() { +module('Acceptance | application errors ', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); server.create('node'); server.create('job'); - }, -}); + }); -test('transitioning away from an error page resets the global error', function(assert) { - server.pretender.get('/v1/nodes', () => [500, {}, null]); + test('transitioning away from an error page resets the global error', function(assert) { + server.pretender.get('/v1/nodes', () => [500, {}, null]); - ClientsList.visit(); + ClientsList.visit(); - andThen(() => { assert.ok(ClientsList.error.isPresent, 'Application has errored'); - }); - JobsList.visit(); + JobsList.visit(); - andThen(() => { assert.notOk(JobsList.error.isPresent, 'Application is no longer in an error state'); }); -}); -test('the 403 error page links to the ACL tokens page', function(assert) { - const job = server.db.jobs[0]; + test('the 403 error page links to the ACL tokens page', function(assert) { + const job = server.db.jobs[0]; - server.pretender.get(`/v1/job/${job.id}`, () => [403, {}, null]); + server.pretender.get(`/v1/job/${job.id}`, () => [403, {}, null]); - Job.visit({ id: job.id }); + Job.visit({ id: job.id }); - andThen(() => { assert.ok(Job.error.isPresent, 'Error message is shown'); assert.equal(Job.error.title, 'Not Authorized', 'Error message is for 403'); - }); - - andThen(() => { Job.error.seekHelp(); - }); - - andThen(() => { assert.equal( currentURL(), '/settings/tokens', 'Error message contains a link to the tokens page' ); }); -}); -test('the no leader error state gets its own error message', function(assert) { - server.pretender.get('/v1/jobs', () => [500, {}, 'No cluster leader']); + test('the no leader error state gets its own error message', function(assert) { + server.pretender.get('/v1/jobs', () => [500, {}, 'No cluster leader']); - JobsList.visit(); + JobsList.visit(); - andThen(() => { assert.ok(JobsList.error.isPresent, 'An error is shown'); assert.equal( JobsList.error.title, @@ -66,28 +54,17 @@ test('the no leader error state gets its own error message', function(assert) { 'The error is specifically for the lack of a cluster leader' ); }); -}); -test('error pages include links to the jobs and clients pages', function(assert) { - visit('/a/non-existent/page'); + test('error pages include links to the jobs and clients pages', async function(assert) { + await visit('/a/non-existent/page'); - andThen(() => { assert.ok(JobsList.error.isPresent, 'An error is shown'); JobsList.error.gotoJobs(); - }); - - andThen(() => { assert.equal(currentURL(), '/jobs', 'Now on the jobs page'); assert.notOk(JobsList.error.isPresent, 'The error is gone now'); - visit('/a/non-existent/page'); - }); - - andThen(() => { + await visit('/a/non-existent/page'); assert.ok(JobsList.error.isPresent, 'An error is shown'); JobsList.error.gotoClients(); - }); - - andThen(() => { assert.equal(currentURL(), '/clients', 'Now on the clients page'); assert.notOk(JobsList.error.isPresent, 'The error is gone now'); }); diff --git a/ui/tests/acceptance/client-detail-test.js b/ui/tests/acceptance/client-detail-test.js index edcd133c20f..e95c62fcb07 100644 --- a/ui/tests/acceptance/client-detail-test.js +++ b/ui/tests/acceptance/client-detail-test.js @@ -1,7 +1,7 @@ import { assign } from '@ember/polyfills'; import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import { formatBytes } from 'nomad-ui/helpers/format-bytes'; import formatDuration from 'nomad-ui/utils/format-duration'; import moment from 'moment'; @@ -11,8 +11,10 @@ import Jobs from 'nomad-ui/tests/pages/jobs/list'; let node; -moduleForAcceptance('Acceptance | client detail', { - beforeEach() { +module('Acceptance | client detail', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('node', 'forceIPv4', { schedulingEligibility: 'eligible' }); node = server.db.nodes[0]; @@ -20,13 +22,11 @@ moduleForAcceptance('Acceptance | client detail', { server.create('agent'); server.create('job', { createAllocations: false }); server.createList('allocation', 3, { nodeId: node.id, clientStatus: 'running' }); - }, -}); + }); -test('/clients/:id should have a breadcrumb trail linking back to clients', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id should have a breadcrumb trail linking back to clients', function(assert) { + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.equal( ClientDetail.breadcrumbFor('clients.index').text, 'Clients', @@ -37,21 +37,13 @@ test('/clients/:id should have a breadcrumb trail linking back to clients', func node.id.split('-')[0], 'Second breadcrumb says the node short id' ); - }); - - andThen(() => { ClientDetail.breadcrumbFor('clients.index').visit(); - }); - - andThen(() => { assert.equal(currentURL(), '/clients', 'First breadcrumb links back to clients'); }); -}); -test('/clients/:id should list immediate details for the node in the title', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id should list immediate details for the node in the title', function(assert) { + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.ok(ClientDetail.title.includes(node.name), 'Title includes name'); assert.ok(ClientDetail.title.includes(node.id), 'Title includes id'); assert.equal( @@ -60,12 +52,10 @@ test('/clients/:id should list immediate details for the node in the title', fun 'Title includes status light' ); }); -}); -test('/clients/:id should list additional detail for the node below the title', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id should list additional detail for the node below the title', function(assert) { + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.ok( ClientDetail.statusDefinition.includes(node.status), 'Status is in additional details' @@ -91,51 +81,45 @@ test('/clients/:id should list additional detail for the node below the title', 'Datacenter is in additional details' ); }); -}); -test('/clients/:id should include resource utilization graphs', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id should include resource utilization graphs', function(assert) { + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.equal(ClientDetail.resourceCharts.length, 2, 'Two resource utilization graphs'); assert.equal(ClientDetail.resourceCharts.objectAt(0).name, 'CPU', 'First chart is CPU'); assert.equal(ClientDetail.resourceCharts.objectAt(1).name, 'Memory', 'Second chart is Memory'); }); -}); -test('/clients/:id should list all allocations on the node', function(assert) { - const allocationsCount = server.db.allocations.where({ nodeId: node.id }).length; + test('/clients/:id should list all allocations on the node', function(assert) { + const allocationsCount = server.db.allocations.where({ nodeId: node.id }).length; - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.equal( ClientDetail.allocations.length, allocationsCount, `Allocations table lists all ${allocationsCount} associated allocations` ); }); -}); -test('each allocation should have high-level details for the allocation', function(assert) { - const allocation = server.db.allocations - .where({ nodeId: node.id }) - .sortBy('modifyIndex') - .reverse()[0]; + test('each allocation should have high-level details for the allocation', function(assert) { + const allocation = server.db.allocations + .where({ nodeId: node.id }) + .sortBy('modifyIndex') + .reverse()[0]; - const allocStats = server.db.clientAllocationStats.find(allocation.id); - const taskGroup = server.db.taskGroups.findBy({ - name: allocation.taskGroup, - jobId: allocation.jobId, - }); + const allocStats = server.db.clientAllocationStats.find(allocation.id); + const taskGroup = server.db.taskGroups.findBy({ + name: allocation.taskGroup, + jobId: allocation.jobId, + }); - const tasks = taskGroup.taskIds.map(id => server.db.tasks.find(id)); - const cpuUsed = tasks.reduce((sum, task) => sum + task.Resources.CPU, 0); - const memoryUsed = tasks.reduce((sum, task) => sum + task.Resources.MemoryMB, 0); + const tasks = taskGroup.taskIds.map(id => server.db.tasks.find(id)); + const cpuUsed = tasks.reduce((sum, task) => sum + task.Resources.CPU, 0); + const memoryUsed = tasks.reduce((sum, task) => sum + task.Resources.MemoryMB, 0); - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { const allocationRow = ClientDetail.allocations.objectAt(0); assert.equal(allocationRow.shortId, allocation.id.split('-')[0], 'Allocation short ID'); @@ -174,26 +158,24 @@ test('each allocation should have high-level details for the allocation', functi 'Detailed memory information is in a tooltip' ); }); -}); -test('each allocation should show job information even if the job is incomplete and already in the store', function(assert) { - // First, visit clients to load the allocations for each visible node. - // Don't load the job belongsTo of the allocation! Leave it unfulfilled. + test('each allocation should show job information even if the job is incomplete and already in the store', function(assert) { + // First, visit clients to load the allocations for each visible node. + // Don't load the job belongsTo of the allocation! Leave it unfulfilled. - Clients.visit(); + Clients.visit(); - // Then, visit jobs to load all jobs, which should implicitly fulfill - // the job belongsTo of each allocation pointed at each job. + // Then, visit jobs to load all jobs, which should implicitly fulfill + // the job belongsTo of each allocation pointed at each job. - Jobs.visit(); + Jobs.visit(); - // Finally, visit a node to assert that the job name and task group name are - // present. This will require reloading the job, since task groups aren't a - // part of the jobs list response. + // Finally, visit a node to assert that the job name and task group name are + // present. This will require reloading the job, since task groups aren't a + // part of the jobs list response. - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { const allocationRow = ClientDetail.allocations.objectAt(0); const allocation = server.db.allocations .where({ nodeId: node.id }) @@ -203,62 +185,50 @@ test('each allocation should show job information even if the job is incomplete assert.equal(allocationRow.job, server.db.jobs.find(allocation.jobId).name, 'Job name'); assert.ok(allocationRow.taskGroup.includes(allocation.taskGroup), 'Task group name'); }); -}); -test('each allocation should link to the allocation detail page', function(assert) { - const allocation = server.db.allocations - .where({ nodeId: node.id }) - .sortBy('modifyIndex') - .reverse()[0]; + test('each allocation should link to the allocation detail page', function(assert) { + const allocation = server.db.allocations + .where({ nodeId: node.id }) + .sortBy('modifyIndex') + .reverse()[0]; - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { ClientDetail.allocations.objectAt(0).visit(); - }); - andThen(() => { assert.equal( currentURL(), `/allocations/${allocation.id}`, 'Allocation rows link to allocation detail pages' ); }); -}); -test('each allocation should link to the job the allocation belongs to', function(assert) { - ClientDetail.visit({ id: node.id }); + test('each allocation should link to the job the allocation belongs to', function(assert) { + ClientDetail.visit({ id: node.id }); - const allocation = server.db.allocations.where({ nodeId: node.id })[0]; - const job = server.db.jobs.find(allocation.jobId); + const allocation = server.db.allocations.where({ nodeId: node.id })[0]; + const job = server.db.jobs.find(allocation.jobId); - andThen(() => { ClientDetail.allocations.objectAt(0).visitJob(); - }); - andThen(() => { assert.equal( currentURL(), `/jobs/${job.id}`, 'Allocation rows link to the job detail page for the allocation' ); }); -}); -test('/clients/:id should list all attributes for the node', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id should list all attributes for the node', function(assert) { + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.ok(ClientDetail.attributesTable, 'Attributes table is on the page'); }); -}); -test('/clients/:id lists all meta attributes', function(assert) { - node = server.create('node', 'forceIPv4', 'withMeta'); + test('/clients/:id lists all meta attributes', function(assert) { + node = server.create('node', 'forceIPv4', 'withMeta'); - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.ok(ClientDetail.metaTable, 'Meta attributes table is on the page'); assert.notOk(ClientDetail.emptyMetaMessage, 'Meta attributes is not empty'); @@ -275,21 +245,17 @@ test('/clients/:id lists all meta attributes', function(assert) { 'Meta attributes for the node are bound to the attributes table' ); }); -}); -test('/clients/:id shows an empty message when there is no meta data', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id shows an empty message when there is no meta data', function(assert) { + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.notOk(ClientDetail.metaTable, 'Meta attributes table is not on the page'); assert.ok(ClientDetail.emptyMetaMessage, 'Meta attributes is empty'); }); -}); -test('when the node is not found, an error message is shown, but the URL persists', function(assert) { - ClientDetail.visit({ id: 'not-a-real-node' }); + test('when the node is not found, an error message is shown, but the URL persists', function(assert) { + ClientDetail.visit({ id: 'not-a-real-node' }); - andThen(() => { assert.equal( server.pretender.handledRequests.findBy('status', 404).url, '/v1/node/not-a-real-node', @@ -299,25 +265,21 @@ test('when the node is not found, an error message is shown, but the URL persist assert.ok(ClientDetail.error.isShown, 'Error message is shown'); assert.equal(ClientDetail.error.title, 'Not Found', 'Error message is for 404'); }); -}); -test('/clients/:id shows the recent events list', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id shows the recent events list', function(assert) { + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.ok(ClientDetail.hasEvents, 'Client events section exists'); }); -}); -test('each node event shows basic node event information', function(assert) { - const event = server.db.nodeEvents - .where({ nodeId: node.id }) - .sortBy('time') - .reverse()[0]; + test('each node event shows basic node event information', function(assert) { + const event = server.db.nodeEvents + .where({ nodeId: node.id }) + .sortBy('time') + .reverse()[0]; - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { const eventRow = ClientDetail.events.objectAt(0); assert.equal( eventRow.time, @@ -327,29 +289,27 @@ test('each node event shows basic node event information', function(assert) { assert.equal(eventRow.subsystem, event.subsystem, 'Event subsystem'); assert.equal(eventRow.message, event.message, 'Event message'); }); -}); -test('/clients/:id shows the driver status of every driver for the node', function(assert) { - // Set the drivers up so health and detection is well tested - const nodeDrivers = node.drivers; - const undetectedDriver = 'raw_exec'; + test('/clients/:id shows the driver status of every driver for the node', function(assert) { + // Set the drivers up so health and detection is well tested + const nodeDrivers = node.drivers; + const undetectedDriver = 'raw_exec'; - Object.values(nodeDrivers).forEach(driver => { - driver.Detected = true; - }); + Object.values(nodeDrivers).forEach(driver => { + driver.Detected = true; + }); - nodeDrivers[undetectedDriver].Detected = false; - node.drivers = nodeDrivers; + nodeDrivers[undetectedDriver].Detected = false; + node.drivers = nodeDrivers; - const drivers = Object.keys(node.drivers) - .map(driverName => assign({ Name: driverName }, node.drivers[driverName])) - .sortBy('Name'); + const drivers = Object.keys(node.drivers) + .map(driverName => assign({ Name: driverName }, node.drivers[driverName])) + .sortBy('Name'); - assert.ok(drivers.length > 0, 'Node has drivers'); + assert.ok(drivers.length > 0, 'Node has drivers'); - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { drivers.forEach((driver, index) => { const driverHead = ClientDetail.driverHeads.objectAt(index); @@ -383,31 +343,26 @@ test('/clients/:id shows the driver status of every driver for the node', functi } }); }); -}); -test('each driver can be opened to see a message and attributes', function(assert) { - // Only detected drivers can be expanded - const nodeDrivers = node.drivers; - Object.values(nodeDrivers).forEach(driver => { - driver.Detected = true; - }); - node.drivers = nodeDrivers; + test('each driver can be opened to see a message and attributes', function(assert) { + // Only detected drivers can be expanded + const nodeDrivers = node.drivers; + Object.values(nodeDrivers).forEach(driver => { + driver.Detected = true; + }); + node.drivers = nodeDrivers; - const driver = Object.keys(node.drivers) - .map(driverName => assign({ Name: driverName }, node.drivers[driverName])) - .sortBy('Name')[0]; + const driver = Object.keys(node.drivers) + .map(driverName => assign({ Name: driverName }, node.drivers[driverName])) + .sortBy('Name')[0]; - ClientDetail.visit({ id: node.id }); - const driverHead = ClientDetail.driverHeads.objectAt(0); - const driverBody = ClientDetail.driverBodies.objectAt(0); + ClientDetail.visit({ id: node.id }); + const driverHead = ClientDetail.driverHeads.objectAt(0); + const driverBody = ClientDetail.driverBodies.objectAt(0); - andThen(() => { assert.notOk(driverBody.descriptionIsShown, 'Driver health description is not shown'); assert.notOk(driverBody.attributesAreShown, 'Driver attributes section is not shown'); driverHead.toggle(); - }); - - andThen(() => { assert.equal( driverBody.description, driver.HealthDescription, @@ -415,41 +370,37 @@ test('each driver can be opened to see a message and attributes', function(asser ); assert.ok(driverBody.attributesAreShown, 'Driver attributes section is now shown'); }); -}); -test('the status light indicates when the node is ineligible for scheduling', function(assert) { - node = server.create('node', { - schedulingEligibility: 'ineligible', - }); + test('the status light indicates when the node is ineligible for scheduling', function(assert) { + node = server.create('node', { + schedulingEligibility: 'ineligible', + }); - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.equal( ClientDetail.statusLight.objectAt(0).id, 'ineligible', 'Title status light is in the ineligible state' ); }); -}); -test('when the node has a drain strategy with a positive deadline, the drain stategy section prints the duration', function(assert) { - const deadline = 5400000000000; // 1.5 hours in nanoseconds - const forceDeadline = moment().add(1, 'd'); - - node = server.create('node', { - drain: true, - schedulingEligibility: 'ineligible', - drainStrategy: { - Deadline: deadline, - ForceDeadline: forceDeadline.toISOString(), - IgnoreSystemJobs: false, - }, - }); + test('when the node has a drain strategy with a positive deadline, the drain stategy section prints the duration', function(assert) { + const deadline = 5400000000000; // 1.5 hours in nanoseconds + const forceDeadline = moment().add(1, 'd'); + + node = server.create('node', { + drain: true, + schedulingEligibility: 'ineligible', + drainStrategy: { + Deadline: deadline, + ForceDeadline: forceDeadline.toISOString(), + IgnoreSystemJobs: false, + }, + }); - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.ok( ClientDetail.drain.deadline.includes(formatDuration(deadline)), 'Deadline is shown in a human formatted way' @@ -470,24 +421,22 @@ test('when the node has a drain strategy with a positive deadline, the drain sta 'Ignore System Jobs state is shown' ); }); -}); -test('when the node has a drain stategy with no deadline, the drain stategy section mentions that and omits the force deadline', function(assert) { - const deadline = 0; - - node = server.create('node', { - drain: true, - schedulingEligibility: 'ineligible', - drainStrategy: { - Deadline: deadline, - ForceDeadline: '0001-01-01T00:00:00Z', // null as a date - IgnoreSystemJobs: true, - }, - }); + test('when the node has a drain stategy with no deadline, the drain stategy section mentions that and omits the force deadline', function(assert) { + const deadline = 0; + + node = server.create('node', { + drain: true, + schedulingEligibility: 'ineligible', + drainStrategy: { + Deadline: deadline, + ForceDeadline: '0001-01-01T00:00:00Z', // null as a date + IgnoreSystemJobs: true, + }, + }); - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.ok( ClientDetail.drain.deadline.includes('No deadline'), 'The value for Deadline is "no deadline"' @@ -503,24 +452,22 @@ test('when the node has a drain stategy with no deadline, the drain stategy sect 'Ignore System Jobs state is shown' ); }); -}); -test('when the node has a drain stategy with a negative deadline, the drain strategy section shows the force badge', function(assert) { - const deadline = -1; - - node = server.create('node', { - drain: true, - schedulingEligibility: 'ineligible', - drainStrategy: { - Deadline: deadline, - ForceDeadline: '0001-01-01T00:00:00Z', // null as a date - IgnoreSystemJobs: false, - }, - }); + test('when the node has a drain stategy with a negative deadline, the drain strategy section shows the force badge', function(assert) { + const deadline = -1; + + node = server.create('node', { + drain: true, + schedulingEligibility: 'ineligible', + drainStrategy: { + Deadline: deadline, + ForceDeadline: '0001-01-01T00:00:00Z', // null as a date + IgnoreSystemJobs: false, + }, + }); - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.equal(ClientDetail.drain.badgeLabel, 'Forced Drain', 'Forced Drain badge is described'); assert.ok(ClientDetail.drain.badgeIsDangerous, 'Forced Drain is shown in a red badge'); @@ -536,8 +483,10 @@ test('when the node has a drain stategy with a negative deadline, the drain stra }); }); -moduleForAcceptance('Acceptance | client detail (multi-namespace)', { - beforeEach() { +module('Acceptance | client detail (multi-namespace)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('node', 'forceIPv4', { schedulingEligibility: 'eligible' }); node = server.db.nodes[0]; @@ -557,15 +506,13 @@ moduleForAcceptance('Acceptance | client detail (multi-namespace)', { jobId: 'job-2', clientStatus: 'running', }); - }, -}); + }); -test('when the node has allocations on different namespaces, the associated jobs are fetched correctly', function(assert) { - window.localStorage.nomadActiveNamespace = 'other-namespace'; + test('when the node has allocations on different namespaces, the associated jobs are fetched correctly', function(assert) { + window.localStorage.nomadActiveNamespace = 'other-namespace'; - ClientDetail.visit({ id: node.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { assert.equal( ClientDetail.allocations.length, server.db.allocations.length, diff --git a/ui/tests/acceptance/clients-list-test.js b/ui/tests/acceptance/clients-list-test.js index 1b46e0a4551..ceb6ea2e5ba 100644 --- a/ui/tests/acceptance/clients-list-test.js +++ b/ui/tests/acceptance/clients-list-test.js @@ -1,6 +1,6 @@ import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; function minimumSetup() { @@ -8,19 +8,19 @@ function minimumSetup() { server.createList('agent', 1); } -moduleForAcceptance('Acceptance | clients list'); +module('Acceptance | clients list', function(hooks) { + setupApplicationTest(hooks); -test('/clients should list one page of clients', function(assert) { - // Make sure to make more nodes than 1 page to assert that pagination is working - const nodesCount = 10; - const pageSize = 8; + test('/clients should list one page of clients', function(assert) { + // Make sure to make more nodes than 1 page to assert that pagination is working + const nodesCount = 10; + const pageSize = 8; - server.createList('node', nodesCount); - server.createList('agent', 1); + server.createList('node', nodesCount); + server.createList('agent', 1); - ClientsList.visit(); + ClientsList.visit(); - andThen(() => { assert.equal(ClientsList.nodes.length, pageSize); assert.ok(ClientsList.hasPagination, 'Pagination found on the page'); @@ -30,15 +30,13 @@ test('/clients should list one page of clients', function(assert) { assert.equal(node.id, sortedNodes[index].id.split('-')[0], 'Clients are ordered'); }); }); -}); -test('each client record should show high-level info of the client', function(assert) { - minimumSetup(); - const node = server.db.nodes[0]; + test('each client record should show high-level info of the client', function(assert) { + minimumSetup(); + const node = server.db.nodes[0]; - ClientsList.visit(); + ClientsList.visit(); - andThen(() => { const nodeRow = ClientsList.nodes.objectAt(0); const allocations = server.db.allocations.where({ nodeId: node.id }); @@ -51,279 +49,252 @@ test('each client record should show high-level info of the client', function(as assert.equal(nodeRow.datacenter, node.datacenter, 'Datacenter'); assert.equal(nodeRow.allocations, allocations.length, '# Allocations'); }); -}); -test('each client should link to the client detail page', function(assert) { - minimumSetup(); - const node = server.db.nodes[0]; + test('each client should link to the client detail page', function(assert) { + minimumSetup(); + const node = server.db.nodes[0]; - ClientsList.visit(); + ClientsList.visit(); - andThen(() => { ClientsList.nodes.objectAt(0).clickRow(); - }); - andThen(() => { assert.equal(currentURL(), `/clients/${node.id}`); }); -}); -test('when there are no clients, there is an empty message', function(assert) { - server.createList('agent', 1); + test('when there are no clients, there is an empty message', function(assert) { + server.createList('agent', 1); - ClientsList.visit(); + ClientsList.visit(); - andThen(() => { assert.ok(ClientsList.isEmpty); assert.equal(ClientsList.empty.headline, 'No Clients'); }); -}); -test('when there are clients, but no matches for a search term, there is an empty message', function(assert) { - server.createList('agent', 1); - server.create('node', { name: 'node' }); + test('when there are clients, but no matches for a search term, there is an empty message', function(assert) { + server.createList('agent', 1); + server.create('node', { name: 'node' }); - ClientsList.visit(); + ClientsList.visit(); - andThen(() => { ClientsList.search('client'); - }); - - andThen(() => { assert.ok(ClientsList.isEmpty); assert.equal(ClientsList.empty.headline, 'No Matches'); }); -}); -test('when accessing clients is forbidden, show a message with a link to the tokens page', function(assert) { - server.create('agent'); - server.create('node', { name: 'node' }); - server.pretender.get('/v1/nodes', () => [403, {}, null]); + test('when accessing clients is forbidden, show a message with a link to the tokens page', function(assert) { + server.create('agent'); + server.create('node', { name: 'node' }); + server.pretender.get('/v1/nodes', () => [403, {}, null]); - ClientsList.visit(); + ClientsList.visit(); - andThen(() => { assert.equal(ClientsList.error.title, 'Not Authorized'); - }); - andThen(() => { ClientsList.error.seekHelp(); - }); - andThen(() => { assert.equal(currentURL(), '/settings/tokens'); }); -}); -testFacet('Class', { - facet: ClientsList.facets.class, - paramName: 'class', - expectedOptions(nodes) { - return Array.from(new Set(nodes.mapBy('nodeClass'))).sort(); - }, - beforeEach() { - server.create('agent'); - server.createList('node', 2, { nodeClass: 'nc-one' }); - server.createList('node', 2, { nodeClass: 'nc-two' }); - server.createList('node', 2, { nodeClass: 'nc-three' }); - ClientsList.visit(); - }, - filter: (node, selection) => selection.includes(node.nodeClass), -}); + testFacet('Class', { + facet: ClientsList.facets.class, + paramName: 'class', + expectedOptions(nodes) { + return Array.from(new Set(nodes.mapBy('nodeClass'))).sort(); + }, + beforeEach() { + server.create('agent'); + server.createList('node', 2, { nodeClass: 'nc-one' }); + server.createList('node', 2, { nodeClass: 'nc-two' }); + server.createList('node', 2, { nodeClass: 'nc-three' }); + ClientsList.visit(); + }, + filter: (node, selection) => selection.includes(node.nodeClass), + }); -testFacet('Status', { - facet: ClientsList.facets.status, - paramName: 'status', - expectedOptions: ['Initializing', 'Ready', 'Down'], - beforeEach() { - server.create('agent'); - server.createList('node', 2, { status: 'initializing' }); - server.createList('node', 2, { status: 'ready' }); - server.createList('node', 2, { status: 'down' }); - ClientsList.visit(); - }, - filter: (node, selection) => selection.includes(node.status), -}); + testFacet('Status', { + facet: ClientsList.facets.status, + paramName: 'status', + expectedOptions: ['Initializing', 'Ready', 'Down'], + beforeEach() { + server.create('agent'); + server.createList('node', 2, { status: 'initializing' }); + server.createList('node', 2, { status: 'ready' }); + server.createList('node', 2, { status: 'down' }); + ClientsList.visit(); + }, + filter: (node, selection) => selection.includes(node.status), + }); -testFacet('Datacenters', { - facet: ClientsList.facets.datacenter, - paramName: 'dc', - expectedOptions(nodes) { - return Array.from(new Set(nodes.mapBy('datacenter'))).sort(); - }, - beforeEach() { - server.create('agent'); - server.createList('node', 2, { datacenter: 'pdx-1' }); - server.createList('node', 2, { datacenter: 'nyc-1' }); - server.createList('node', 2, { datacenter: 'ams-1' }); - ClientsList.visit(); - }, - filter: (node, selection) => selection.includes(node.datacenter), -}); + testFacet('Datacenters', { + facet: ClientsList.facets.datacenter, + paramName: 'dc', + expectedOptions(nodes) { + return Array.from(new Set(nodes.mapBy('datacenter'))).sort(); + }, + beforeEach() { + server.create('agent'); + server.createList('node', 2, { datacenter: 'pdx-1' }); + server.createList('node', 2, { datacenter: 'nyc-1' }); + server.createList('node', 2, { datacenter: 'ams-1' }); + ClientsList.visit(); + }, + filter: (node, selection) => selection.includes(node.datacenter), + }); -testFacet('Flags', { - facet: ClientsList.facets.flags, - paramName: 'flags', - expectedOptions: ['Ineligible', 'Draining'], - beforeEach() { - server.create('agent'); - server.createList('node', 2, { schedulingEligibility: 'eligible', drain: false }); - server.createList('node', 2, { schedulingEligibility: 'ineligible', drain: false }); - server.createList('node', 2, { schedulingEligibility: 'ineligible', drain: true }); - ClientsList.visit(); - }, - filter: (node, selection) => { - if (selection.includes('draining') && !node.drain) return false; - if (selection.includes('ineligible') && node.schedulingEligibility === 'eligible') return false; - return true; - }, -}); + testFacet('Flags', { + facet: ClientsList.facets.flags, + paramName: 'flags', + expectedOptions: ['Ineligible', 'Draining'], + beforeEach() { + server.create('agent'); + server.createList('node', 2, { schedulingEligibility: 'eligible', drain: false }); + server.createList('node', 2, { schedulingEligibility: 'ineligible', drain: false }); + server.createList('node', 2, { schedulingEligibility: 'ineligible', drain: true }); + ClientsList.visit(); + }, + filter: (node, selection) => { + if (selection.includes('draining') && !node.drain) return false; + if (selection.includes('ineligible') && node.schedulingEligibility === 'eligible') return false; + return true; + }, + }); -test('when the facet selections result in no matches, the empty state states why', function(assert) { - server.create('agent'); - server.createList('node', 2, { status: 'ready' }); + test('when the facet selections result in no matches, the empty state states why', function(assert) { + server.create('agent'); + server.createList('node', 2, { status: 'ready' }); - ClientsList.visit(); + ClientsList.visit(); - andThen(() => { ClientsList.facets.status.toggle(); - }); - - andThen(() => { ClientsList.facets.status.options.objectAt(0).toggle(); - }); - - andThen(() => { assert.ok(ClientsList.isEmpty, 'There is an empty message'); assert.equal(ClientsList.empty.headline, 'No Matches', 'The message is appropriate'); }); -}); -test('the clients list is immediately filtered based on query params', function(assert) { - server.create('agent'); - server.create('node', { nodeClass: 'omg-large' }); - server.create('node', { nodeClass: 'wtf-tiny' }); + test('the clients list is immediately filtered based on query params', function(assert) { + server.create('agent'); + server.create('node', { nodeClass: 'omg-large' }); + server.create('node', { nodeClass: 'wtf-tiny' }); - ClientsList.visit({ class: JSON.stringify(['wtf-tiny']) }); + ClientsList.visit({ class: JSON.stringify(['wtf-tiny']) }); - andThen(() => { assert.equal(ClientsList.nodes.length, 1, 'Only one client shown due to query param'); }); -}); -function testFacet(label, { facet, paramName, beforeEach, filter, expectedOptions }) { - test(`the ${label} facet has the correct options`, function(assert) { - beforeEach(); + function testFacet(label, { facet, paramName, beforeEach, filter, expectedOptions }) { + test(`the ${label} facet has the correct options`, function(assert) { + beforeEach(); - andThen(() => { - facet.toggle(); - }); + andThen(() => { + facet.toggle(); + }); - andThen(() => { - let expectation; - if (typeof expectedOptions === 'function') { - expectation = expectedOptions(server.db.nodes); - } else { - expectation = expectedOptions; - } - - assert.deepEqual( - facet.options.map(option => option.label.trim()), - expectation, - 'Options for facet are as expected' - ); + andThen(() => { + let expectation; + if (typeof expectedOptions === 'function') { + expectation = expectedOptions(server.db.nodes); + } else { + expectation = expectedOptions; + } + + assert.deepEqual( + facet.options.map(option => option.label.trim()), + expectation, + 'Options for facet are as expected' + ); + }); }); - }); - test(`the ${label} facet filters the nodes list by ${label}`, function(assert) { - let option; + test(`the ${label} facet filters the nodes list by ${label}`, function(assert) { + let option; - beforeEach(); - - andThen(() => { - facet.toggle(); - }); + beforeEach(); - andThen(() => { - option = facet.options.objectAt(0); - option.toggle(); - }); + andThen(() => { + facet.toggle(); + }); - andThen(() => { - const selection = [option.key]; - const expectedNodes = server.db.nodes - .filter(node => filter(node, selection)) - .sortBy('modifyIndex') - .reverse(); + andThen(() => { + option = facet.options.objectAt(0); + option.toggle(); + }); - ClientsList.nodes.forEach((node, index) => { - assert.equal( - node.id, - expectedNodes[index].id.split('-')[0], - `Node at ${index} is ${expectedNodes[index].id}` - ); + andThen(() => { + const selection = [option.key]; + const expectedNodes = server.db.nodes + .filter(node => filter(node, selection)) + .sortBy('modifyIndex') + .reverse(); + + ClientsList.nodes.forEach((node, index) => { + assert.equal( + node.id, + expectedNodes[index].id.split('-')[0], + `Node at ${index} is ${expectedNodes[index].id}` + ); + }); }); }); - }); - - test(`selecting multiple options in the ${label} facet results in a broader search`, function(assert) { - const selection = []; - beforeEach(); + test(`selecting multiple options in the ${label} facet results in a broader search`, function(assert) { + const selection = []; - andThen(() => { - facet.toggle(); - }); + beforeEach(); - andThen(() => { - const option1 = facet.options.objectAt(0); - const option2 = facet.options.objectAt(1); - option1.toggle(); - selection.push(option1.key); - option2.toggle(); - selection.push(option2.key); - }); + andThen(() => { + facet.toggle(); + }); - andThen(() => { - const expectedNodes = server.db.nodes - .filter(node => filter(node, selection)) - .sortBy('modifyIndex') - .reverse(); + andThen(() => { + const option1 = facet.options.objectAt(0); + const option2 = facet.options.objectAt(1); + option1.toggle(); + selection.push(option1.key); + option2.toggle(); + selection.push(option2.key); + }); - ClientsList.nodes.forEach((node, index) => { - assert.equal( - node.id, - expectedNodes[index].id.split('-')[0], - `Node at ${index} is ${expectedNodes[index].id}` - ); + andThen(() => { + const expectedNodes = server.db.nodes + .filter(node => filter(node, selection)) + .sortBy('modifyIndex') + .reverse(); + + ClientsList.nodes.forEach((node, index) => { + assert.equal( + node.id, + expectedNodes[index].id.split('-')[0], + `Node at ${index} is ${expectedNodes[index].id}` + ); + }); }); }); - }); - test(`selecting options in the ${label} facet updates the ${paramName} query param`, function(assert) { - const selection = []; + test(`selecting options in the ${label} facet updates the ${paramName} query param`, function(assert) { + const selection = []; - beforeEach(); + beforeEach(); - andThen(() => { - facet.toggle(); - }); + andThen(() => { + facet.toggle(); + }); - andThen(() => { - const option1 = facet.options.objectAt(0); - const option2 = facet.options.objectAt(1); - option1.toggle(); - selection.push(option1.key); - option2.toggle(); - selection.push(option2.key); - }); + andThen(() => { + const option1 = facet.options.objectAt(0); + const option2 = facet.options.objectAt(1); + option1.toggle(); + selection.push(option1.key); + option2.toggle(); + selection.push(option2.key); + }); - andThen(() => { - assert.equal( - currentURL(), - `/clients?${paramName}=${encodeURIComponent(JSON.stringify(selection))}`, - 'URL has the correct query param key and value' - ); + andThen(() => { + assert.equal( + currentURL(), + `/clients?${paramName}=${encodeURIComponent(JSON.stringify(selection))}`, + 'URL has the correct query param key and value' + ); + }); }); - }); -} + } +}); diff --git a/ui/tests/acceptance/job-allocations-test.js b/ui/tests/acceptance/job-allocations-test.js index cf58acc2ad6..652cfd45442 100644 --- a/ui/tests/acceptance/job-allocations-test.js +++ b/ui/tests/acceptance/job-allocations-test.js @@ -1,5 +1,5 @@ -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import Allocations from 'nomad-ui/tests/pages/jobs/job/allocations'; let job; @@ -15,21 +15,21 @@ const makeSearchAllocations = server => { }); }; -moduleForAcceptance('Acceptance | job allocations', { - beforeEach() { +module('Acceptance | job allocations', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('node'); job = server.create('job', { noFailedPlacements: true, createAllocations: false }); - }, -}); + }); -test('lists all allocations for the job', function(assert) { - server.createList('allocation', Allocations.pageSize - 1); - allocations = server.schema.allocations.where({ jobId: job.id }).models; + test('lists all allocations for the job', function(assert) { + server.createList('allocation', Allocations.pageSize - 1); + allocations = server.schema.allocations.where({ jobId: job.id }).models; - Allocations.visit({ id: job.id }); + Allocations.visit({ id: job.id }); - andThen(() => { assert.equal( Allocations.allocations.length, Allocations.pageSize - 1, @@ -43,62 +43,49 @@ test('lists all allocations for the job', function(assert) { assert.equal(allocation.shortId, shortId, `Allocation ${index} is ${shortId}`); }); }); -}); -test('allocations table is sortable', function(assert) { - server.createList('allocation', Allocations.pageSize - 1); - allocations = server.schema.allocations.where({ jobId: job.id }).models; + test('allocations table is sortable', function(assert) { + server.createList('allocation', Allocations.pageSize - 1); + allocations = server.schema.allocations.where({ jobId: job.id }).models; - Allocations.visit({ id: job.id }); + Allocations.visit({ id: job.id }); - andThen(() => { Allocations.sortBy('taskGroupName'); - andThen(() => { + assert.equal( + currentURL(), + `/jobs/${job.id}/allocations?sort=taskGroupName`, + 'the URL persists the sort parameter' + ); + const sortedAllocations = allocations.sortBy('taskGroup').reverse(); + Allocations.allocations.forEach((allocation, index) => { + const shortId = sortedAllocations[index].id.split('-')[0]; assert.equal( - currentURL(), - `/jobs/${job.id}/allocations?sort=taskGroupName`, - 'the URL persists the sort parameter' + allocation.shortId, + shortId, + `Allocation ${index} is ${shortId} with task group ${sortedAllocations[index].taskGroup}` ); - const sortedAllocations = allocations.sortBy('taskGroup').reverse(); - Allocations.allocations.forEach((allocation, index) => { - const shortId = sortedAllocations[index].id.split('-')[0]; - assert.equal( - allocation.shortId, - shortId, - `Allocation ${index} is ${shortId} with task group ${sortedAllocations[index].taskGroup}` - ); - }); }); }); -}); -test('allocations table is searchable', function(assert) { - makeSearchAllocations(server); + test('allocations table is searchable', function(assert) { + makeSearchAllocations(server); - allocations = server.schema.allocations.where({ jobId: job.id }).models; - Allocations.visit({ id: job.id }); + allocations = server.schema.allocations.where({ jobId: job.id }).models; + Allocations.visit({ id: job.id }); - andThen(() => { Allocations.search('ffffff'); - }); - andThen(() => { assert.equal(Allocations.allocations.length, 5, 'List is filtered by search term'); }); -}); -test('when a search yields no results, the search box remains', function(assert) { - makeSearchAllocations(server); + test('when a search yields no results, the search box remains', function(assert) { + makeSearchAllocations(server); - allocations = server.schema.allocations.where({ jobId: job.id }).models; - Allocations.visit({ id: job.id }); + allocations = server.schema.allocations.where({ jobId: job.id }).models; + Allocations.visit({ id: job.id }); - andThen(() => { Allocations.search('^nothing will ever match this long regex$'); - }); - - andThen(() => { assert.equal( Allocations.emptyState.headline, 'No Matches', @@ -107,12 +94,10 @@ test('when a search yields no results, the search box remains', function(assert) assert.ok(Allocations.hasSearchBox, 'Search box is still shown'); }); -}); -test('when the job for the allocations is not found, an error message is shown, but the URL persists', function(assert) { - Allocations.visit({ id: 'not-a-real-job' }); + test('when the job for the allocations is not found, an error message is shown, but the URL persists', function(assert) { + Allocations.visit({ id: 'not-a-real-job' }); - andThen(() => { assert.equal( server.pretender.handledRequests.findBy('status', 404).url, '/v1/job/not-a-real-job', diff --git a/ui/tests/acceptance/job-definition-test.js b/ui/tests/acceptance/job-definition-test.js index 18dbb3982a2..881886c4ee4 100644 --- a/ui/tests/acceptance/job-definition-test.js +++ b/ui/tests/acceptance/job-definition-test.js @@ -1,92 +1,78 @@ import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import Definition from 'nomad-ui/tests/pages/jobs/job/definition'; let job; -moduleForAcceptance('Acceptance | job definition', { - beforeEach() { +module('Acceptance | job definition', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('node'); server.create('job'); job = server.db.jobs[0]; Definition.visit({ id: job.id }); - }, -}); + }); -test('visiting /jobs/:job_id/definition', function(assert) { - assert.equal(currentURL(), `/jobs/${job.id}/definition`); -}); + test('visiting /jobs/:job_id/definition', function(assert) { + assert.equal(currentURL(), `/jobs/${job.id}/definition`); + }); -test('the job definition page contains a json viewer component', function(assert) { - assert.ok(Definition.jsonViewer, 'JSON viewer found'); -}); + test('the job definition page contains a json viewer component', function(assert) { + assert.ok(Definition.jsonViewer, 'JSON viewer found'); + }); -test('the job definition page requests the job to display in an unmutated form', function(assert) { - const jobURL = `/v1/job/${job.id}`; - const jobRequests = server.pretender.handledRequests - .map(req => req.url.split('?')[0]) - .filter(url => url === jobURL); - assert.ok(jobRequests.length === 2, 'Two requests for the job were made'); -}); + test('the job definition page requests the job to display in an unmutated form', function(assert) { + const jobURL = `/v1/job/${job.id}`; + const jobRequests = server.pretender.handledRequests + .map(req => req.url.split('?')[0]) + .filter(url => url === jobURL); + assert.ok(jobRequests.length === 2, 'Two requests for the job were made'); + }); -test('the job definition can be edited', function(assert) { - assert.notOk(Definition.editor.isPresent, 'Editor is not shown on load'); + test('the job definition can be edited', function(assert) { + assert.notOk(Definition.editor.isPresent, 'Editor is not shown on load'); - Definition.edit(); + Definition.edit(); - andThen(() => { assert.ok(Definition.editor.isPresent, 'Editor is shown after clicking edit'); assert.notOk(Definition.jsonViewer, 'Editor replaces the JSON viewer'); }); -}); -test('when in editing mode, the action can be canceled, showing the read-only definition again', function(assert) { - Definition.edit(); + test('when in editing mode, the action can be canceled, showing the read-only definition again', function(assert) { + Definition.edit(); - andThen(() => { Definition.editor.cancelEditing(); - }); - - andThen(() => { assert.ok(Definition.jsonViewer, 'The JSON Viewer is back'); assert.notOk(Definition.editor.isPresent, 'The editor is gone'); }); -}); -test('when in editing mode, the editor is prepopulated with the job definition', function(assert) { - const requests = server.pretender.handledRequests; - const jobDefinition = requests.findBy('url', `/v1/job/${job.id}`).responseText; - const formattedJobDefinition = JSON.stringify(JSON.parse(jobDefinition), null, 2); + test('when in editing mode, the editor is prepopulated with the job definition', function(assert) { + const requests = server.pretender.handledRequests; + const jobDefinition = requests.findBy('url', `/v1/job/${job.id}`).responseText; + const formattedJobDefinition = JSON.stringify(JSON.parse(jobDefinition), null, 2); - Definition.edit(); + Definition.edit(); - andThen(() => { assert.equal( Definition.editor.editor.contents, formattedJobDefinition, 'The editor already has the job definition in it' ); }); -}); -test('when changes are submitted, the site redirects to the job overview page', function(assert) { - Definition.edit(); + test('when changes are submitted, the site redirects to the job overview page', function(assert) { + Definition.edit(); - andThen(() => { Definition.editor.plan(); Definition.editor.run(); - }); - - andThen(() => { assert.equal(currentURL(), `/jobs/${job.id}`, 'Now on the job overview page'); }); -}); -test('when the job for the definition is not found, an error message is shown, but the URL persists', function(assert) { - Definition.visit({ id: 'not-a-real-job' }); + test('when the job for the definition is not found, an error message is shown, but the URL persists', function(assert) { + Definition.visit({ id: 'not-a-real-job' }); - andThen(() => { assert.equal( server.pretender.handledRequests.findBy('status', 404).url, '/v1/job/not-a-real-job', diff --git a/ui/tests/acceptance/job-deployments-test.js b/ui/tests/acceptance/job-deployments-test.js index b3395dfcc62..7166cc2b4ef 100644 --- a/ui/tests/acceptance/job-deployments-test.js +++ b/ui/tests/acceptance/job-deployments-test.js @@ -1,7 +1,7 @@ import { get } from '@ember/object'; -import { test } from 'qunit'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import moment from 'moment'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; import Deployments from 'nomad-ui/tests/pages/jobs/job/deployments'; const sum = (list, key, getter = a => a) => @@ -11,8 +11,10 @@ let job; let deployments; let sortedDeployments; -moduleForAcceptance('Acceptance | job deployments', { - beforeEach() { +module('Acceptance | job deployments', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('node'); job = server.create('job'); deployments = server.schema.deployments.where({ jobId: job.id }); @@ -26,25 +28,21 @@ moduleForAcceptance('Acceptance | job deployments', { } return 0; }); - }, -}); + }); -test('/jobs/:id/deployments should list all job deployments', function(assert) { - Deployments.visit({ id: job.id }); + test('/jobs/:id/deployments should list all job deployments', function(assert) { + Deployments.visit({ id: job.id }); - andThen(() => { assert.ok( Deployments.deployments.length, deployments.length, 'Each deployment gets a row in the timeline' ); }); -}); -test('each deployment mentions the deployment shortId, status, version, and time since it was submitted', function(assert) { - Deployments.visit({ id: job.id }); + test('each deployment mentions the deployment shortId, status, version, and time since it was submitted', function(assert) { + Deployments.visit({ id: job.id }); - andThen(() => { const deployment = sortedDeployments.models[0]; const version = server.db.jobVersions.findBy({ jobId: deployment.jobId, @@ -64,54 +62,46 @@ test('each deployment mentions the deployment shortId, status, version, and time 'Submit time ago' ); }); -}); -test('when the deployment is running and needs promotion, the deployment item says so', function(assert) { - // Ensure the deployment needs deployment - const deployment = sortedDeployments.models[0]; - const taskGroupSummary = deployment.deploymentTaskGroupSummaryIds.map(id => - server.schema.deploymentTaskGroupSummaries.find(id) - )[0]; + test('when the deployment is running and needs promotion, the deployment item says so', function(assert) { + // Ensure the deployment needs deployment + const deployment = sortedDeployments.models[0]; + const taskGroupSummary = deployment.deploymentTaskGroupSummaryIds.map(id => + server.schema.deploymentTaskGroupSummaries.find(id) + )[0]; - deployment.update('status', 'running'); - deployment.save(); + deployment.update('status', 'running'); + deployment.save(); - taskGroupSummary.update({ - desiredCanaries: 1, - placedCanaries: [], - promoted: false, - }); + taskGroupSummary.update({ + desiredCanaries: 1, + placedCanaries: [], + promoted: false, + }); - taskGroupSummary.save(); + taskGroupSummary.save(); - Deployments.visit({ id: job.id }); + Deployments.visit({ id: job.id }); - andThen(() => { const deploymentRow = Deployments.deployments.objectAt(0); assert.ok(deploymentRow.promotionIsRequired, 'Requires Promotion badge found'); }); -}); -test('each deployment item can be opened to show details', function(assert) { - Deployments.visit({ id: job.id }); + test('each deployment item can be opened to show details', function(assert) { + Deployments.visit({ id: job.id }); - andThen(() => { const deploymentRow = Deployments.deployments.objectAt(0); assert.notOk(deploymentRow.hasDetails, 'No deployment body'); deploymentRow.toggle(); - andThen(() => { - assert.ok(deploymentRow.hasDetails, 'Deployment body found'); - }); + assert.ok(deploymentRow.hasDetails, 'Deployment body found'); }); -}); -test('when open, a deployment shows the deployment metrics', function(assert) { - Deployments.visit({ id: job.id }); + test('when open, a deployment shows the deployment metrics', function(assert) { + Deployments.visit({ id: job.id }); - andThen(() => { const deployment = sortedDeployments.models[0]; const deploymentRow = Deployments.deployments.objectAt(0); const taskGroupSummaries = deployment.deploymentTaskGroupSummaryIds.map(id => @@ -120,53 +110,49 @@ test('when open, a deployment shows the deployment metrics', function(assert) { deploymentRow.toggle(); - andThen(() => { - assert.equal( - deploymentRow.metricFor('canaries').text, - `${sum(taskGroupSummaries, 'placedCanaries', a => a.length)} / ${sum( - taskGroupSummaries, - 'desiredCanaries' - )}`, - 'Canaries, both places and desired, are in the metrics' - ); - - assert.equal( - deploymentRow.metricFor('placed').text, - sum(taskGroupSummaries, 'placedAllocs'), - 'Placed allocs aggregates across task groups' - ); - - assert.equal( - deploymentRow.metricFor('desired').text, - sum(taskGroupSummaries, 'desiredTotal'), - 'Desired allocs aggregates across task groups' - ); - - assert.equal( - deploymentRow.metricFor('healthy').text, - sum(taskGroupSummaries, 'healthyAllocs'), - 'Healthy allocs aggregates across task groups' - ); - - assert.equal( - deploymentRow.metricFor('unhealthy').text, - sum(taskGroupSummaries, 'unhealthyAllocs'), - 'Unhealthy allocs aggregates across task groups' - ); - - assert.equal( - deploymentRow.notification, - deployment.statusDescription, - 'Status description is in the metrics block' - ); - }); + assert.equal( + deploymentRow.metricFor('canaries').text, + `${sum(taskGroupSummaries, 'placedCanaries', a => a.length)} / ${sum( + taskGroupSummaries, + 'desiredCanaries' + )}`, + 'Canaries, both places and desired, are in the metrics' + ); + + assert.equal( + deploymentRow.metricFor('placed').text, + sum(taskGroupSummaries, 'placedAllocs'), + 'Placed allocs aggregates across task groups' + ); + + assert.equal( + deploymentRow.metricFor('desired').text, + sum(taskGroupSummaries, 'desiredTotal'), + 'Desired allocs aggregates across task groups' + ); + + assert.equal( + deploymentRow.metricFor('healthy').text, + sum(taskGroupSummaries, 'healthyAllocs'), + 'Healthy allocs aggregates across task groups' + ); + + assert.equal( + deploymentRow.metricFor('unhealthy').text, + sum(taskGroupSummaries, 'unhealthyAllocs'), + 'Unhealthy allocs aggregates across task groups' + ); + + assert.equal( + deploymentRow.notification, + deployment.statusDescription, + 'Status description is in the metrics block' + ); }); -}); -test('when open, a deployment shows a list of all task groups and their respective stats', function(assert) { - Deployments.visit({ id: job.id }); + test('when open, a deployment shows a list of all task groups and their respective stats', function(assert) { + Deployments.visit({ id: job.id }); - andThen(() => { const deployment = sortedDeployments.models[0]; const deploymentRow = Deployments.deployments.objectAt(0); const taskGroupSummaries = deployment.deploymentTaskGroupSummaryIds.map(id => @@ -175,46 +161,42 @@ test('when open, a deployment shows a list of all task groups and their respecti deploymentRow.toggle(); - andThen(() => { - assert.ok(deploymentRow.hasTaskGroups, 'Task groups found'); - - assert.equal( - deploymentRow.taskGroups.length, - taskGroupSummaries.length, - 'One row per task group' - ); - - const taskGroup = taskGroupSummaries[0]; - const taskGroupRow = deploymentRow.taskGroups.objectAt(0); - - assert.equal(taskGroupRow.name, taskGroup.name, 'Name'); - assert.equal(taskGroupRow.promotion, promotionTestForTaskGroup(taskGroup), 'Needs Promotion'); - assert.equal(taskGroupRow.autoRevert, taskGroup.autoRevert ? 'Yes' : 'No', 'Auto Revert'); - assert.equal( - taskGroupRow.canaries, - `${taskGroup.placedCanaries.length} / ${taskGroup.desiredCanaries}`, - 'Canaries' - ); - assert.equal( - taskGroupRow.allocs, - `${taskGroup.placedAllocs} / ${taskGroup.desiredTotal}`, - 'Allocs' - ); - assert.equal(taskGroupRow.healthy, taskGroup.healthyAllocs, 'Healthy Allocs'); - assert.equal(taskGroupRow.unhealthy, taskGroup.unhealthyAllocs, 'Unhealthy Allocs'); - assert.equal( - taskGroupRow.progress, - moment(taskGroup.requireProgressBy).format("MMM DD, 'YY HH:mm:ss ZZ"), - 'Progress By' - ); - }); + assert.ok(deploymentRow.hasTaskGroups, 'Task groups found'); + + assert.equal( + deploymentRow.taskGroups.length, + taskGroupSummaries.length, + 'One row per task group' + ); + + const taskGroup = taskGroupSummaries[0]; + const taskGroupRow = deploymentRow.taskGroups.objectAt(0); + + assert.equal(taskGroupRow.name, taskGroup.name, 'Name'); + assert.equal(taskGroupRow.promotion, promotionTestForTaskGroup(taskGroup), 'Needs Promotion'); + assert.equal(taskGroupRow.autoRevert, taskGroup.autoRevert ? 'Yes' : 'No', 'Auto Revert'); + assert.equal( + taskGroupRow.canaries, + `${taskGroup.placedCanaries.length} / ${taskGroup.desiredCanaries}`, + 'Canaries' + ); + assert.equal( + taskGroupRow.allocs, + `${taskGroup.placedAllocs} / ${taskGroup.desiredTotal}`, + 'Allocs' + ); + assert.equal(taskGroupRow.healthy, taskGroup.healthyAllocs, 'Healthy Allocs'); + assert.equal(taskGroupRow.unhealthy, taskGroup.unhealthyAllocs, 'Unhealthy Allocs'); + assert.equal( + taskGroupRow.progress, + moment(taskGroup.requireProgressBy).format("MMM DD, 'YY HH:mm:ss ZZ"), + 'Progress By' + ); }); -}); -test('when open, a deployment shows a list of all allocations for the deployment', function(assert) { - Deployments.visit({ id: job.id }); + test('when open, a deployment shows a list of all allocations for the deployment', function(assert) { + Deployments.visit({ id: job.id }); - andThen(() => { const deployment = sortedDeployments.models[0]; const deploymentRow = Deployments.deployments.objectAt(0); @@ -224,23 +206,19 @@ test('when open, a deployment shows a list of all allocations for the deployment deploymentRow.toggle(); - andThen(() => { - assert.ok(deploymentRow.hasAllocations, 'Allocations found'); + assert.ok(deploymentRow.hasAllocations, 'Allocations found'); - assert.equal(deploymentRow.allocations.length, allocations.length, 'One row per allocation'); + assert.equal(deploymentRow.allocations.length, allocations.length, 'One row per allocation'); - const allocation = allocations[0]; - const allocationRow = deploymentRow.allocations.objectAt(0); + const allocation = allocations[0]; + const allocationRow = deploymentRow.allocations.objectAt(0); - assert.equal(allocationRow.shortId, allocation.id.split('-')[0], 'Allocation is as expected'); - }); + assert.equal(allocationRow.shortId, allocation.id.split('-')[0], 'Allocation is as expected'); }); -}); -test('when the job for the deployments is not found, an error message is shown, but the URL persists', function(assert) { - Deployments.visit({ id: 'not-a-real-job' }); + test('when the job for the deployments is not found, an error message is shown, but the URL persists', function(assert) { + Deployments.visit({ id: 'not-a-real-job' }); - andThen(() => { assert.equal( server.pretender.handledRequests.findBy('status', 404).url, '/v1/job/not-a-real-job', @@ -250,25 +228,25 @@ test('when the job for the deployments is not found, an error message is shown, assert.ok(Deployments.error.isPresent, 'Error message is shown'); assert.equal(Deployments.error.title, 'Not Found', 'Error message is for 404'); }); -}); -function classForStatus(status) { - const classMap = { - running: 'is-running', - successful: 'is-primary', - paused: 'is-light', - failed: 'is-error', - cancelled: 'is-cancelled', - }; - - return classMap[status] || 'is-dark'; -} - -function promotionTestForTaskGroup(taskGroup) { - if (taskGroup.desiredCanaries > 0 && taskGroup.promoted === false) { - return 'Yes'; - } else if (taskGroup.desiredCanaries > 0) { - return 'No'; + function classForStatus(status) { + const classMap = { + running: 'is-running', + successful: 'is-primary', + paused: 'is-light', + failed: 'is-error', + cancelled: 'is-cancelled', + }; + + return classMap[status] || 'is-dark'; } - return 'N/A'; -} + + function promotionTestForTaskGroup(taskGroup) { + if (taskGroup.desiredCanaries > 0 && taskGroup.promoted === false) { + return 'Yes'; + } else if (taskGroup.desiredCanaries > 0) { + return 'No'; + } + return 'N/A'; + } +}); diff --git a/ui/tests/acceptance/job-detail-test.js b/ui/tests/acceptance/job-detail-test.js index 6b79f1bf669..06525e847bc 100644 --- a/ui/tests/acceptance/job-detail-test.js +++ b/ui/tests/acceptance/job-detail-test.js @@ -1,6 +1,6 @@ import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import moduleForJob from 'nomad-ui/tests/helpers/module-for-job'; import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; @@ -60,37 +60,32 @@ test('when the job is not found, an error message is shown, but the URL persists }); }); -moduleForAcceptance('Acceptance | job detail (with namespaces)', { - beforeEach() { +module('Acceptance | job detail (with namespaces)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.createList('namespace', 2); server.create('node'); job = server.create('job', { type: 'service', namespaceId: server.db.namespaces[1].name }); server.createList('job', 3, { namespaceId: server.db.namespaces[0].name }); - }, -}); + }); -test('when there are namespaces, the job detail page states the namespace for the job', function(assert) { - const namespace = server.db.namespaces.find(job.namespaceId); - JobDetail.visit({ id: job.id, namespace: namespace.name }); + test('when there are namespaces, the job detail page states the namespace for the job', function(assert) { + const namespace = server.db.namespaces.find(job.namespaceId); + JobDetail.visit({ id: job.id, namespace: namespace.name }); - andThen(() => { assert.ok(JobDetail.statFor('namespace').text, 'Namespace included in stats'); }); -}); -test('when switching namespaces, the app redirects to /jobs with the new namespace', function(assert) { - const namespace = server.db.namespaces.find(job.namespaceId); - const otherNamespace = server.db.namespaces.toArray().find(ns => ns !== namespace).name; - const label = otherNamespace === 'default' ? 'Default Namespace' : otherNamespace; + test('when switching namespaces, the app redirects to /jobs with the new namespace', function(assert) { + const namespace = server.db.namespaces.find(job.namespaceId); + const otherNamespace = server.db.namespaces.toArray().find(ns => ns !== namespace).name; + const label = otherNamespace === 'default' ? 'Default Namespace' : otherNamespace; - JobDetail.visit({ id: job.id, namespace: namespace.name }); + JobDetail.visit({ id: job.id, namespace: namespace.name }); - andThen(() => { // TODO: Migrate to Page Objects selectChoose('[data-test-namespace-switcher]', label); - }); - - andThen(() => { assert.equal(currentURL().split('?')[0], '/jobs', 'Navigated to /jobs'); const jobs = server.db.jobs diff --git a/ui/tests/acceptance/job-evaluations-test.js b/ui/tests/acceptance/job-evaluations-test.js index 271896914ad..8cb7d1fc81a 100644 --- a/ui/tests/acceptance/job-evaluations-test.js +++ b/ui/tests/acceptance/job-evaluations-test.js @@ -1,34 +1,34 @@ -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import Evaluations from 'nomad-ui/tests/pages/jobs/job/evaluations'; let job; let evaluations; -moduleForAcceptance('Acceptance | job evaluations', { - beforeEach() { +module('Acceptance | job evaluations', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { job = server.create('job', { noFailedPlacements: true, createAllocations: false }); evaluations = server.db.evaluations.where({ jobId: job.id }); Evaluations.visit({ id: job.id }); - }, -}); + }); -test('lists all evaluations for the job', function(assert) { - assert.equal(Evaluations.evaluations.length, evaluations.length, 'All evaluations are listed'); + test('lists all evaluations for the job', function(assert) { + assert.equal(Evaluations.evaluations.length, evaluations.length, 'All evaluations are listed'); - const sortedEvaluations = evaluations.sortBy('modifyIndex').reverse(); + const sortedEvaluations = evaluations.sortBy('modifyIndex').reverse(); - Evaluations.evaluations.forEach((evaluation, index) => { - const shortId = sortedEvaluations[index].id.split('-')[0]; - assert.equal(evaluation.id, shortId, `Evaluation ${index} is ${shortId}`); + Evaluations.evaluations.forEach((evaluation, index) => { + const shortId = sortedEvaluations[index].id.split('-')[0]; + assert.equal(evaluation.id, shortId, `Evaluation ${index} is ${shortId}`); + }); }); -}); -test('evaluations table is sortable', function(assert) { - Evaluations.sortBy('priority'); + test('evaluations table is sortable', function(assert) { + Evaluations.sortBy('priority'); - andThen(() => { assert.equal( currentURL(), `/jobs/${job.id}/evaluations?sort=priority`, @@ -44,12 +44,10 @@ test('evaluations table is sortable', function(assert) { ); }); }); -}); -test('when the job for the evaluations is not found, an error message is shown, but the URL persists', function(assert) { - Evaluations.visit({ id: 'not-a-real-job' }); + test('when the job for the evaluations is not found, an error message is shown, but the URL persists', function(assert) { + Evaluations.visit({ id: 'not-a-real-job' }); - andThen(() => { assert.equal( server.pretender.handledRequests.findBy('status', 404).url, '/v1/job/not-a-real-job', diff --git a/ui/tests/acceptance/job-run-test.js b/ui/tests/acceptance/job-run-test.js index 8d9f9904761..a89ca661403 100644 --- a/ui/tests/acceptance/job-run-test.js +++ b/ui/tests/acceptance/job-run-test.js @@ -1,7 +1,7 @@ import { assign } from '@ember/polyfills'; import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import JobRun from 'nomad-ui/tests/pages/jobs/run'; const newJobName = 'new-job'; @@ -35,60 +35,46 @@ const jsonJob = overrides => { ); }; -moduleForAcceptance('Acceptance | job run', { - beforeEach() { +module('Acceptance | job run', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { // Required for placing allocations (a result of creating jobs) server.create('node'); - }, -}); + }); -test('visiting /jobs/run', function(assert) { - JobRun.visit(); + test('visiting /jobs/run', function(assert) { + JobRun.visit(); - andThen(() => { assert.equal(currentURL(), '/jobs/run'); }); -}); -test('when submitting a job, the site redirects to the new job overview page', function(assert) { - const spec = jsonJob(); + test('when submitting a job, the site redirects to the new job overview page', function(assert) { + const spec = jsonJob(); - JobRun.visit(); + JobRun.visit(); - andThen(() => { JobRun.editor.editor.fillIn(spec); JobRun.editor.plan(); - }); - - andThen(() => { JobRun.editor.run(); - }); - andThen(() => { assert.equal( currentURL(), `/jobs/${newJobName}`, `Redirected to the job overview page for ${newJobName}` ); }); -}); -test('when submitting a job to a different namespace, the redirect to the job overview page takes namespace into account', function(assert) { - const newNamespace = 'second-namespace'; + test('when submitting a job to a different namespace, the redirect to the job overview page takes namespace into account', function(assert) { + const newNamespace = 'second-namespace'; - server.create('namespace', { id: newNamespace }); - const spec = jsonJob({ Namespace: newNamespace }); + server.create('namespace', { id: newNamespace }); + const spec = jsonJob({ Namespace: newNamespace }); - JobRun.visit(); + JobRun.visit(); - andThen(() => { JobRun.editor.editor.fillIn(spec); JobRun.editor.plan(); - }); - - andThen(() => { JobRun.editor.run(); - }); - andThen(() => { assert.equal( currentURL(), `/jobs/${newJobName}?namespace=${newNamespace}`, diff --git a/ui/tests/acceptance/job-versions-test.js b/ui/tests/acceptance/job-versions-test.js index 2fb505e46e7..ece4daf62e6 100644 --- a/ui/tests/acceptance/job-versions-test.js +++ b/ui/tests/acceptance/job-versions-test.js @@ -1,40 +1,40 @@ -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import Versions from 'nomad-ui/tests/pages/jobs/job/versions'; import moment from 'moment'; let job; let versions; -moduleForAcceptance('Acceptance | job versions', { - beforeEach() { +module('Acceptance | job versions', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { job = server.create('job', { createAllocations: false }); versions = server.db.jobVersions.where({ jobId: job.id }); Versions.visit({ id: job.id }); - }, -}); + }); -test('/jobs/:id/versions should list all job versions', function(assert) { - assert.ok(Versions.versions.length, versions.length, 'Each version gets a row in the timeline'); -}); + test('/jobs/:id/versions should list all job versions', function(assert) { + assert.ok(Versions.versions.length, versions.length, 'Each version gets a row in the timeline'); + }); -test('each version mentions the version number, the stability, and the submitted time', function(assert) { - const version = versions.sortBy('submitTime').reverse()[0]; - const formattedSubmitTime = moment(version.submitTime / 1000000).format( - "MMM DD, 'YY HH:mm:ss ZZ" - ); - const versionRow = Versions.versions.objectAt(0); + test('each version mentions the version number, the stability, and the submitted time', function(assert) { + const version = versions.sortBy('submitTime').reverse()[0]; + const formattedSubmitTime = moment(version.submitTime / 1000000).format( + "MMM DD, 'YY HH:mm:ss ZZ" + ); + const versionRow = Versions.versions.objectAt(0); - assert.ok(versionRow.text.includes(`Version #${version.version}`), 'Version #'); - assert.equal(versionRow.stability, version.stable.toString(), 'Stability'); - assert.equal(versionRow.submitTime, formattedSubmitTime, 'Submit time'); -}); + assert.ok(versionRow.text.includes(`Version #${version.version}`), 'Version #'); + assert.equal(versionRow.stability, version.stable.toString(), 'Stability'); + assert.equal(versionRow.submitTime, formattedSubmitTime, 'Submit time'); + }); -test('when the job for the versions is not found, an error message is shown, but the URL persists', function(assert) { - Versions.visit({ id: 'not-a-real-job' }); + test('when the job for the versions is not found, an error message is shown, but the URL persists', function(assert) { + Versions.visit({ id: 'not-a-real-job' }); - andThen(() => { assert.equal( server.pretender.handledRequests.findBy('status', 404).url, '/v1/job/not-a-real-job', diff --git a/ui/tests/acceptance/jobs-list-test.js b/ui/tests/acceptance/jobs-list-test.js index 7dfdd0e1e1f..91ecbae559c 100644 --- a/ui/tests/acceptance/jobs-list-test.js +++ b/ui/tests/acceptance/jobs-list-test.js @@ -1,46 +1,42 @@ import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; -moduleForAcceptance('Acceptance | jobs list', { - beforeEach() { +module('Acceptance | jobs list', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { // Required for placing allocations (a result of creating jobs) server.create('node'); - }, -}); + }); -test('visiting /jobs', function(assert) { - JobsList.visit(); + test('visiting /jobs', function(assert) { + JobsList.visit(); - andThen(() => { assert.equal(currentURL(), '/jobs'); }); -}); -test('/jobs should list the first page of jobs sorted by modify index', function(assert) { - const jobsCount = JobsList.pageSize + 1; - server.createList('job', jobsCount, { createAllocations: false }); + test('/jobs should list the first page of jobs sorted by modify index', function(assert) { + const jobsCount = JobsList.pageSize + 1; + server.createList('job', jobsCount, { createAllocations: false }); - JobsList.visit(); + JobsList.visit(); - andThen(() => { const sortedJobs = server.db.jobs.sortBy('modifyIndex').reverse(); assert.equal(JobsList.jobs.length, JobsList.pageSize); JobsList.jobs.forEach((job, index) => { assert.equal(job.name, sortedJobs[index].name, 'Jobs are ordered'); }); }); -}); -test('each job row should contain information about the job', function(assert) { - server.createList('job', 2); - const job = server.db.jobs.sortBy('modifyIndex').reverse()[0]; - const taskGroups = server.db.taskGroups.where({ jobId: job.id }); + test('each job row should contain information about the job', function(assert) { + server.createList('job', 2); + const job = server.db.jobs.sortBy('modifyIndex').reverse()[0]; + const taskGroups = server.db.taskGroups.where({ jobId: job.id }); - JobsList.visit(); + JobsList.visit(); - andThen(() => { const jobRow = JobsList.jobs.objectAt(0); assert.equal(jobRow.name, job.name, 'Name'); @@ -48,380 +44,333 @@ test('each job row should contain information about the job', function(assert) { assert.equal(jobRow.status, job.status, 'Status'); assert.equal(jobRow.type, typeForJob(job), 'Type'); assert.equal(jobRow.priority, job.priority, 'Priority'); - andThen(() => { - assert.equal(jobRow.taskGroups, taskGroups.length, '# Groups'); - }); + assert.equal(jobRow.taskGroups, taskGroups.length, '# Groups'); }); -}); -test('each job row should link to the corresponding job', function(assert) { - server.create('job'); - const job = server.db.jobs[0]; + test('each job row should link to the corresponding job', function(assert) { + server.create('job'); + const job = server.db.jobs[0]; - JobsList.visit(); + JobsList.visit(); - andThen(() => { JobsList.jobs.objectAt(0).clickName(); - }); - andThen(() => { assert.equal(currentURL(), `/jobs/${job.id}`); }); -}); -test('the new job button transitions to the new job page', function(assert) { - JobsList.visit(); + test('the new job button transitions to the new job page', function(assert) { + JobsList.visit(); - andThen(() => { JobsList.runJob(); - }); - andThen(() => { assert.equal(currentURL(), '/jobs/run'); }); -}); -test('when there are no jobs, there is an empty message', function(assert) { - JobsList.visit(); + test('when there are no jobs, there is an empty message', function(assert) { + JobsList.visit(); - andThen(() => { assert.ok(JobsList.isEmpty, 'There is an empty message'); assert.equal(JobsList.emptyState.headline, 'No Jobs', 'The message is appropriate'); }); -}); -test('when there are jobs, but no matches for a search result, there is an empty message', function(assert) { - server.create('job', { name: 'cat 1' }); - server.create('job', { name: 'cat 2' }); + test('when there are jobs, but no matches for a search result, there is an empty message', function(assert) { + server.create('job', { name: 'cat 1' }); + server.create('job', { name: 'cat 2' }); - JobsList.visit(); + JobsList.visit(); - andThen(() => { JobsList.search('dog'); - }); - - andThen(() => { assert.ok(JobsList.isEmpty, 'The empty message is shown'); assert.equal(JobsList.emptyState.headline, 'No Matches', 'The message is appropriate'); }); -}); -test('searching resets the current page', function(assert) { - server.createList('job', JobsList.pageSize + 1, { createAllocations: false }); - JobsList.visit(); + test('searching resets the current page', function(assert) { + server.createList('job', JobsList.pageSize + 1, { createAllocations: false }); + JobsList.visit(); - andThen(() => { JobsList.nextPage(); - }); - - andThen(() => { assert.equal(currentURL(), '/jobs?page=2', 'Page query param captures page=2'); JobsList.search('foobar'); - }); - - andThen(() => { assert.equal(currentURL(), '/jobs?search=foobar', 'No page query param'); }); -}); -test('when the namespace query param is set, only matching jobs are shown and the namespace value is forwarded to app state', function(assert) { - server.createList('namespace', 2); - const job1 = server.create('job', { namespaceId: server.db.namespaces[0].id }); - const job2 = server.create('job', { namespaceId: server.db.namespaces[1].id }); + test('when the namespace query param is set, only matching jobs are shown and the namespace value is forwarded to app state', function(assert) { + server.createList('namespace', 2); + const job1 = server.create('job', { namespaceId: server.db.namespaces[0].id }); + const job2 = server.create('job', { namespaceId: server.db.namespaces[1].id }); - JobsList.visit(); + JobsList.visit(); - andThen(() => { assert.equal(JobsList.jobs.length, 1, 'One job in the default namespace'); assert.equal(JobsList.jobs.objectAt(0).name, job1.name, 'The correct job is shown'); - }); - const secondNamespace = server.db.namespaces[1]; - JobsList.visit({ namespace: secondNamespace.id }); + const secondNamespace = server.db.namespaces[1]; + JobsList.visit({ namespace: secondNamespace.id }); - andThen(() => { assert.equal(JobsList.jobs.length, 1, `One job in the ${secondNamespace.name} namespace`); assert.equal(JobsList.jobs.objectAt(0).name, job2.name, 'The correct job is shown'); }); -}); -test('when accessing jobs is forbidden, show a message with a link to the tokens page', function(assert) { - server.pretender.get('/v1/jobs', () => [403, {}, null]); + test('when accessing jobs is forbidden, show a message with a link to the tokens page', function(assert) { + server.pretender.get('/v1/jobs', () => [403, {}, null]); - JobsList.visit(); + JobsList.visit(); - andThen(() => { assert.equal(JobsList.error.title, 'Not Authorized'); - }); - andThen(() => { JobsList.error.seekHelp(); - }); - andThen(() => { assert.equal(currentURL(), '/settings/tokens'); }); -}); -function typeForJob(job) { - return job.periodic ? 'periodic' : job.parameterized ? 'parameterized' : job.type; -} + function typeForJob(job) { + return job.periodic ? 'periodic' : job.parameterized ? 'parameterized' : job.type; + } -test('the jobs list page has appropriate faceted search options', function(assert) { - JobsList.visit(); + test('the jobs list page has appropriate faceted search options', function(assert) { + JobsList.visit(); - andThen(() => { assert.ok(JobsList.facets.type.isPresent, 'Type facet found'); assert.ok(JobsList.facets.status.isPresent, 'Status facet found'); assert.ok(JobsList.facets.datacenter.isPresent, 'Datacenter facet found'); assert.ok(JobsList.facets.prefix.isPresent, 'Prefix facet found'); }); -}); -testFacet('Type', { - facet: JobsList.facets.type, - paramName: 'type', - expectedOptions: ['Batch', 'Parameterized', 'Periodic', 'Service', 'System'], - beforeEach() { - server.createList('job', 2, { createAllocations: false, type: 'batch' }); - server.createList('job', 2, { - createAllocations: false, - type: 'batch', - periodic: true, - childrenCount: 0, - }); - server.createList('job', 2, { - createAllocations: false, - type: 'batch', - parameterized: true, - childrenCount: 0, - }); - server.createList('job', 2, { createAllocations: false, type: 'service' }); - JobsList.visit(); - }, - filter(job, selection) { - let displayType = job.type; - if (job.parameterized) displayType = 'parameterized'; - if (job.periodic) displayType = 'periodic'; - return selection.includes(displayType); - }, -}); + testFacet('Type', { + facet: JobsList.facets.type, + paramName: 'type', + expectedOptions: ['Batch', 'Parameterized', 'Periodic', 'Service', 'System'], + beforeEach() { + server.createList('job', 2, { createAllocations: false, type: 'batch' }); + server.createList('job', 2, { + createAllocations: false, + type: 'batch', + periodic: true, + childrenCount: 0, + }); + server.createList('job', 2, { + createAllocations: false, + type: 'batch', + parameterized: true, + childrenCount: 0, + }); + server.createList('job', 2, { createAllocations: false, type: 'service' }); + JobsList.visit(); + }, + filter(job, selection) { + let displayType = job.type; + if (job.parameterized) displayType = 'parameterized'; + if (job.periodic) displayType = 'periodic'; + return selection.includes(displayType); + }, + }); -testFacet('Status', { - facet: JobsList.facets.status, - paramName: 'status', - expectedOptions: ['Pending', 'Running', 'Dead'], - beforeEach() { - server.createList('job', 2, { status: 'pending', createAllocations: false, childrenCount: 0 }); - server.createList('job', 2, { status: 'running', createAllocations: false, childrenCount: 0 }); - server.createList('job', 2, { status: 'dead', createAllocations: false, childrenCount: 0 }); - JobsList.visit(); - }, - filter: (job, selection) => selection.includes(job.status), -}); + testFacet('Status', { + facet: JobsList.facets.status, + paramName: 'status', + expectedOptions: ['Pending', 'Running', 'Dead'], + beforeEach() { + server.createList('job', 2, { status: 'pending', createAllocations: false, childrenCount: 0 }); + server.createList('job', 2, { status: 'running', createAllocations: false, childrenCount: 0 }); + server.createList('job', 2, { status: 'dead', createAllocations: false, childrenCount: 0 }); + JobsList.visit(); + }, + filter: (job, selection) => selection.includes(job.status), + }); -testFacet('Datacenter', { - facet: JobsList.facets.datacenter, - paramName: 'dc', - expectedOptions(jobs) { - const allDatacenters = new Set( - jobs.mapBy('datacenters').reduce((acc, val) => acc.concat(val), []) - ); - return Array.from(allDatacenters).sort(); - }, - beforeEach() { - server.create('job', { - datacenters: ['pdx', 'lax'], - createAllocations: false, - childrenCount: 0, - }); - server.create('job', { - datacenters: ['pdx', 'ord'], - createAllocations: false, - childrenCount: 0, - }); - server.create('job', { - datacenters: ['lax', 'jfk'], - createAllocations: false, - childrenCount: 0, - }); - server.create('job', { - datacenters: ['jfk', 'dfw'], - createAllocations: false, - childrenCount: 0, - }); - server.create('job', { datacenters: ['pdx'], createAllocations: false, childrenCount: 0 }); - JobsList.visit(); - }, - filter: (job, selection) => job.datacenters.find(dc => selection.includes(dc)), -}); + testFacet('Datacenter', { + facet: JobsList.facets.datacenter, + paramName: 'dc', + expectedOptions(jobs) { + const allDatacenters = new Set( + jobs.mapBy('datacenters').reduce((acc, val) => acc.concat(val), []) + ); + return Array.from(allDatacenters).sort(); + }, + beforeEach() { + server.create('job', { + datacenters: ['pdx', 'lax'], + createAllocations: false, + childrenCount: 0, + }); + server.create('job', { + datacenters: ['pdx', 'ord'], + createAllocations: false, + childrenCount: 0, + }); + server.create('job', { + datacenters: ['lax', 'jfk'], + createAllocations: false, + childrenCount: 0, + }); + server.create('job', { + datacenters: ['jfk', 'dfw'], + createAllocations: false, + childrenCount: 0, + }); + server.create('job', { datacenters: ['pdx'], createAllocations: false, childrenCount: 0 }); + JobsList.visit(); + }, + filter: (job, selection) => job.datacenters.find(dc => selection.includes(dc)), + }); -testFacet('Prefix', { - facet: JobsList.facets.prefix, - paramName: 'prefix', - expectedOptions: ['hashi (3)', 'nmd (2)', 'pre (2)'], - beforeEach() { - [ - 'pre-one', - 'hashi-one', - 'nmd-one', - 'one-alone', - 'pre-two', - 'hashi-two', - 'hashi-three', - 'nmd-two', - 'noprefix', - ].forEach(name => { - server.create('job', { name, createAllocations: false, childrenCount: 0 }); - }); - JobsList.visit(); - }, - filter: (job, selection) => selection.find(prefix => job.name.startsWith(prefix)), -}); + testFacet('Prefix', { + facet: JobsList.facets.prefix, + paramName: 'prefix', + expectedOptions: ['hashi (3)', 'nmd (2)', 'pre (2)'], + beforeEach() { + [ + 'pre-one', + 'hashi-one', + 'nmd-one', + 'one-alone', + 'pre-two', + 'hashi-two', + 'hashi-three', + 'nmd-two', + 'noprefix', + ].forEach(name => { + server.create('job', { name, createAllocations: false, childrenCount: 0 }); + }); + JobsList.visit(); + }, + filter: (job, selection) => selection.find(prefix => job.name.startsWith(prefix)), + }); -test('when the facet selections result in no matches, the empty state states why', function(assert) { - server.createList('job', 2, { status: 'pending', createAllocations: false, childrenCount: 0 }); + test('when the facet selections result in no matches, the empty state states why', function(assert) { + server.createList('job', 2, { status: 'pending', createAllocations: false, childrenCount: 0 }); - JobsList.visit(); + JobsList.visit(); - andThen(() => { JobsList.facets.status.toggle(); - }); - - andThen(() => { JobsList.facets.status.options.objectAt(1).toggle(); - }); - - andThen(() => { assert.ok(JobsList.isEmpty, 'There is an empty message'); assert.equal(JobsList.emptyState.headline, 'No Matches', 'The message is appropriate'); }); -}); -test('the jobs list is immediately filtered based on query params', function(assert) { - server.create('job', { type: 'batch', createAllocations: false }); - server.create('job', { type: 'service', createAllocations: false }); + test('the jobs list is immediately filtered based on query params', function(assert) { + server.create('job', { type: 'batch', createAllocations: false }); + server.create('job', { type: 'service', createAllocations: false }); - JobsList.visit({ type: JSON.stringify(['batch']) }); + JobsList.visit({ type: JSON.stringify(['batch']) }); - andThen(() => { assert.equal(JobsList.jobs.length, 1, 'Only one job shown due to query param'); }); -}); -function testFacet(label, { facet, paramName, beforeEach, filter, expectedOptions }) { - test(`the ${label} facet has the correct options`, function(assert) { - beforeEach(); + function testFacet(label, { facet, paramName, beforeEach, filter, expectedOptions }) { + test(`the ${label} facet has the correct options`, function(assert) { + beforeEach(); - andThen(() => { - facet.toggle(); - }); + andThen(() => { + facet.toggle(); + }); - andThen(() => { - let expectation; - if (typeof expectedOptions === 'function') { - expectation = expectedOptions(server.db.jobs); - } else { - expectation = expectedOptions; - } - - assert.deepEqual( - facet.options.map(option => option.label.trim()), - expectation, - 'Options for facet are as expected' - ); + andThen(() => { + let expectation; + if (typeof expectedOptions === 'function') { + expectation = expectedOptions(server.db.jobs); + } else { + expectation = expectedOptions; + } + + assert.deepEqual( + facet.options.map(option => option.label.trim()), + expectation, + 'Options for facet are as expected' + ); + }); }); - }); - test(`the ${label} facet filters the jobs list by ${label}`, function(assert) { - let option; + test(`the ${label} facet filters the jobs list by ${label}`, function(assert) { + let option; - beforeEach(); + beforeEach(); - andThen(() => { - facet.toggle(); - }); - - andThen(() => { - option = facet.options.objectAt(0); - option.toggle(); - }); + andThen(() => { + facet.toggle(); + }); - andThen(() => { - const selection = [option.key]; - const expectedJobs = server.db.jobs - .filter(job => filter(job, selection)) - .sortBy('modifyIndex') - .reverse(); + andThen(() => { + option = facet.options.objectAt(0); + option.toggle(); + }); - JobsList.jobs.forEach((job, index) => { - assert.equal( - job.id, - expectedJobs[index].id, - `Job at ${index} is ${expectedJobs[index].id}` - ); + andThen(() => { + const selection = [option.key]; + const expectedJobs = server.db.jobs + .filter(job => filter(job, selection)) + .sortBy('modifyIndex') + .reverse(); + + JobsList.jobs.forEach((job, index) => { + assert.equal( + job.id, + expectedJobs[index].id, + `Job at ${index} is ${expectedJobs[index].id}` + ); + }); }); }); - }); - - test(`selecting multiple options in the ${label} facet results in a broader search`, function(assert) { - const selection = []; - beforeEach(); + test(`selecting multiple options in the ${label} facet results in a broader search`, function(assert) { + const selection = []; - andThen(() => { - facet.toggle(); - }); + beforeEach(); - andThen(() => { - const option1 = facet.options.objectAt(0); - const option2 = facet.options.objectAt(1); - option1.toggle(); - selection.push(option1.key); - option2.toggle(); - selection.push(option2.key); - }); + andThen(() => { + facet.toggle(); + }); - andThen(() => { - const expectedJobs = server.db.jobs - .filter(job => filter(job, selection)) - .sortBy('modifyIndex') - .reverse(); + andThen(() => { + const option1 = facet.options.objectAt(0); + const option2 = facet.options.objectAt(1); + option1.toggle(); + selection.push(option1.key); + option2.toggle(); + selection.push(option2.key); + }); - JobsList.jobs.forEach((job, index) => { - assert.equal( - job.id, - expectedJobs[index].id, - `Job at ${index} is ${expectedJobs[index].id}` - ); + andThen(() => { + const expectedJobs = server.db.jobs + .filter(job => filter(job, selection)) + .sortBy('modifyIndex') + .reverse(); + + JobsList.jobs.forEach((job, index) => { + assert.equal( + job.id, + expectedJobs[index].id, + `Job at ${index} is ${expectedJobs[index].id}` + ); + }); }); }); - }); - test(`selecting options in the ${label} facet updates the ${paramName} query param`, function(assert) { - const selection = []; + test(`selecting options in the ${label} facet updates the ${paramName} query param`, function(assert) { + const selection = []; - beforeEach(); + beforeEach(); - andThen(() => { - facet.toggle(); - }); + andThen(() => { + facet.toggle(); + }); - andThen(() => { - const option1 = facet.options.objectAt(0); - const option2 = facet.options.objectAt(1); - option1.toggle(); - selection.push(option1.key); - option2.toggle(); - selection.push(option2.key); - }); + andThen(() => { + const option1 = facet.options.objectAt(0); + const option2 = facet.options.objectAt(1); + option1.toggle(); + selection.push(option1.key); + option2.toggle(); + selection.push(option2.key); + }); - andThen(() => { - assert.equal( - currentURL(), - `/jobs?${paramName}=${encodeURIComponent(JSON.stringify(selection))}`, - 'URL has the correct query param key and value' - ); + andThen(() => { + assert.equal( + currentURL(), + `/jobs?${paramName}=${encodeURIComponent(JSON.stringify(selection))}`, + 'URL has the correct query param key and value' + ); + }); }); - }); -} + } +}); diff --git a/ui/tests/acceptance/namespaces-test.js b/ui/tests/acceptance/namespaces-test.js index 3d91992eaab..f5ebc5e1ebc 100644 --- a/ui/tests/acceptance/namespaces-test.js +++ b/ui/tests/acceptance/namespaces-test.js @@ -1,55 +1,47 @@ -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; -moduleForAcceptance('Acceptance | namespaces (disabled)', { - beforeEach() { +module('Acceptance | namespaces (disabled)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); server.create('node'); server.createList('job', 5); - }, -}); + }); -test('the namespace switcher is not in the gutter menu', function(assert) { - JobsList.visit(); + test('the namespace switcher is not in the gutter menu', function(assert) { + JobsList.visit(); - andThen(() => { assert.notOk(JobsList.namespaceSwitcher.isPresent, 'No namespace switcher found'); }); -}); -test('the jobs request is made with no query params', function(assert) { - JobsList.visit(); + test('the jobs request is made with no query params', function(assert) { + JobsList.visit(); - andThen(() => { const request = server.pretender.handledRequests.findBy('url', '/v1/jobs'); assert.equal(request.queryParams.namespace, undefined, 'No namespace query param'); }); }); -moduleForAcceptance('Acceptance | namespaces (enabled)', { - beforeEach() { +module('Acceptance | namespaces (enabled)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.createList('namespace', 3); server.create('agent'); server.create('node'); server.createList('job', 5); - }, -}); + }); -test('the namespace switcher lists all namespaces', function(assert) { - const namespaces = server.db.namespaces; + test('the namespace switcher lists all namespaces', function(assert) { + const namespaces = server.db.namespaces; - JobsList.visit(); + JobsList.visit(); - andThen(() => { assert.ok(JobsList.namespaceSwitcher.isPresent, 'Namespace switcher found'); - }); - - andThen(() => { JobsList.namespaceSwitcher.open(); - }); - - andThen(() => { // TODO this selector should be scoped to only the namespace switcher options, // but ember-wormhole makes that difficult. assert.equal( @@ -72,29 +64,25 @@ test('the namespace switcher lists all namespaces', function(assert) { assert.equal(option.label, namespace.name, `index ${index}: ${namespace.name}`); }); }); -}); -test('changing the namespace sets the namespace in localStorage', function(assert) { - const namespace = server.db.namespaces[1]; + test('changing the namespace sets the namespace in localStorage', function(assert) { + const namespace = server.db.namespaces[1]; - JobsList.visit(); + JobsList.visit(); - selectChoose('[data-test-namespace-switcher]', namespace.name); - andThen(() => { + selectChoose('[data-test-namespace-switcher]', namespace.name); assert.equal( window.localStorage.nomadActiveNamespace, namespace.id, 'Active namespace was set' ); }); -}); -test('changing the namespace refreshes the jobs list when on the jobs page', function(assert) { - const namespace = server.db.namespaces[1]; + test('changing the namespace refreshes the jobs list when on the jobs page', function(assert) { + const namespace = server.db.namespaces[1]; - JobsList.visit(); + JobsList.visit(); - andThen(() => { const requests = server.pretender.handledRequests.filter(req => req.url.startsWith('/v1/jobs')); assert.equal(requests.length, 1, 'First request to jobs'); assert.equal( @@ -102,12 +90,10 @@ test('changing the namespace refreshes the jobs list when on the jobs page', fun undefined, 'Namespace query param is defaulted to "default"/undefined' ); - }); - // TODO: handle this with Page Objects - selectChoose('[data-test-namespace-switcher]', namespace.name); + // TODO: handle this with Page Objects + selectChoose('[data-test-namespace-switcher]', namespace.name); - andThen(() => { const requests = server.pretender.handledRequests.filter(req => req.url.startsWith('/v1/jobs')); assert.equal(requests.length, 2, 'Second request to jobs'); assert.equal( diff --git a/ui/tests/acceptance/regions-test.js b/ui/tests/acceptance/regions-test.js index 2a392eed13c..95256966d84 100644 --- a/ui/tests/acceptance/regions-test.js +++ b/ui/tests/acceptance/regions-test.js @@ -1,142 +1,108 @@ -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; import PageLayout from 'nomad-ui/tests/pages/layout'; import Allocation from 'nomad-ui/tests/pages/allocations/detail'; -moduleForAcceptance('Acceptance | regions (only one)', { - beforeEach() { +module('Acceptance | regions (only one)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); server.create('node'); server.createList('job', 5); - }, -}); + }); -test('when there is only one region, the region switcher is not shown in the nav bar', function(assert) { - server.create('region', { id: 'global' }); + test('when there is only one region, the region switcher is not shown in the nav bar', function(assert) { + server.create('region', { id: 'global' }); - andThen(() => { JobsList.visit(); - }); - andThen(() => { assert.notOk(PageLayout.navbar.regionSwitcher.isPresent, 'No region switcher'); }); -}); -test('when the only region is not named "global", the region switcher still is not shown', function(assert) { - server.create('region', { id: 'some-region' }); + test('when the only region is not named "global", the region switcher still is not shown', function(assert) { + server.create('region', { id: 'some-region' }); - andThen(() => { JobsList.visit(); - }); - andThen(() => { assert.notOk(PageLayout.navbar.regionSwitcher.isPresent, 'No region switcher'); }); -}); -test('pages do not include the region query param', function(assert) { - let jobId; + test('pages do not include the region query param', function(assert) { + let jobId; - server.create('region', { id: 'global' }); + server.create('region', { id: 'global' }); - andThen(() => { JobsList.visit(); - }); - andThen(() => { assert.equal(currentURL(), '/jobs', 'No region query param'); - }); - andThen(() => { jobId = JobsList.jobs.objectAt(0).id; JobsList.jobs.objectAt(0).clickRow(); - }); - andThen(() => { assert.equal(currentURL(), `/jobs/${jobId}`, 'No region query param'); - }); - andThen(() => { ClientsList.visit(); - }); - andThen(() => { assert.equal(currentURL(), '/clients', 'No region query param'); }); -}); -test('api requests do not include the region query param', function(assert) { - server.create('region', { id: 'global' }); + test('api requests do not include the region query param', function(assert) { + server.create('region', { id: 'global' }); - andThen(() => { JobsList.visit(); - }); - andThen(() => { JobsList.jobs.objectAt(0).clickRow(); - }); - andThen(() => { PageLayout.gutter.visitClients(); - }); - andThen(() => { PageLayout.gutter.visitServers(); - }); - andThen(() => { server.pretender.handledRequests.forEach(req => { assert.notOk(req.url.includes('region='), req.url); }); }); }); -moduleForAcceptance('Acceptance | regions (many)', { - beforeEach() { +module('Acceptance | regions (many)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); server.create('node'); server.createList('job', 5); server.create('region', { id: 'global' }); server.create('region', { id: 'region-2' }); - }, -}); + }); -test('the region switcher is rendered in the nav bar', function(assert) { - JobsList.visit(); + test('the region switcher is rendered in the nav bar', function(assert) { + JobsList.visit(); - andThen(() => { assert.ok(PageLayout.navbar.regionSwitcher.isPresent, 'Region switcher is shown'); }); -}); -test('when on the default region, pages do not include the region query param', function(assert) { - JobsList.visit(); + test('when on the default region, pages do not include the region query param', function(assert) { + JobsList.visit(); - andThen(() => { assert.equal(currentURL(), '/jobs', 'No region query param'); assert.equal(window.localStorage.nomadActiveRegion, 'global', 'Region in localStorage'); }); -}); -test('switching regions sets localStorage and the region query param', function(assert) { - const newRegion = server.db.regions[1].id; + test('switching regions sets localStorage and the region query param', function(assert) { + const newRegion = server.db.regions[1].id; - JobsList.visit(); + JobsList.visit(); - selectChoose('[data-test-region-switcher]', newRegion); + selectChoose('[data-test-region-switcher]', newRegion); - andThen(() => { assert.ok( currentURL().includes(`region=${newRegion}`), 'New region is the region query param value' ); assert.equal(window.localStorage.nomadActiveRegion, newRegion, 'New region in localStorage'); }); -}); -test('switching regions to the default region, unsets the region query param', function(assert) { - const startingRegion = server.db.regions[1].id; - const defaultRegion = server.db.regions[0].id; + test('switching regions to the default region, unsets the region query param', function(assert) { + const startingRegion = server.db.regions[1].id; + const defaultRegion = server.db.regions[0].id; - JobsList.visit({ region: startingRegion }); + JobsList.visit({ region: startingRegion }); - selectChoose('[data-test-region-switcher]', defaultRegion); + selectChoose('[data-test-region-switcher]', defaultRegion); - andThen(() => { assert.notOk(currentURL().includes('region='), 'No region query param for the default region'); assert.equal( window.localStorage.nomadActiveRegion, @@ -144,26 +110,22 @@ test('switching regions to the default region, unsets the region query param', f 'New region in localStorage' ); }); -}); -test('switching regions on deep pages redirects to the application root', function(assert) { - const newRegion = server.db.regions[1].id; + test('switching regions on deep pages redirects to the application root', function(assert) { + const newRegion = server.db.regions[1].id; - Allocation.visit({ id: server.db.allocations[0].id }); + Allocation.visit({ id: server.db.allocations[0].id }); - selectChoose('[data-test-region-switcher]', newRegion); + selectChoose('[data-test-region-switcher]', newRegion); - andThen(() => { assert.ok(currentURL().includes('/jobs?'), 'Back at the jobs page'); }); -}); -test('navigating directly to a page with the region query param sets the application to that region', function(assert) { - const allocation = server.db.allocations[0]; - const region = server.db.regions[1].id; - Allocation.visit({ id: allocation.id, region }); + test('navigating directly to a page with the region query param sets the application to that region', function(assert) { + const allocation = server.db.allocations[0]; + const region = server.db.regions[1].id; + Allocation.visit({ id: allocation.id, region }); - andThen(() => { assert.equal( currentURL(), `/allocations/${allocation.id}?region=${region}`, @@ -175,23 +137,15 @@ test('navigating directly to a page with the region query param sets the applica 'Region is also set in localStorage from a detail page' ); }); -}); -test('when the region is not the default region, all api requests include the region query param', function(assert) { - const region = server.db.regions[1].id; + test('when the region is not the default region, all api requests include the region query param', function(assert) { + const region = server.db.regions[1].id; - JobsList.visit({ region }); + JobsList.visit({ region }); - andThen(() => { JobsList.jobs.objectAt(0).clickRow(); - }); - andThen(() => { PageLayout.gutter.visitClients(); - }); - andThen(() => { PageLayout.gutter.visitServers(); - }); - andThen(() => { const [regionsRequest, defaultRegionRequest, ...appRequests] = server.pretender.handledRequests; assert.notOk( diff --git a/ui/tests/acceptance/server-detail-test.js b/ui/tests/acceptance/server-detail-test.js index 28183e5202a..098c41adc64 100644 --- a/ui/tests/acceptance/server-detail-test.js +++ b/ui/tests/acceptance/server-detail-test.js @@ -1,50 +1,50 @@ import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import ServerDetail from 'nomad-ui/tests/pages/servers/detail'; let agent; -moduleForAcceptance('Acceptance | server detail', { - beforeEach() { +module('Acceptance | server detail', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.createList('agent', 3); agent = server.db.agents[0]; ServerDetail.visit({ name: agent.name }); - }, -}); - -test('visiting /servers/:server_name', function(assert) { - assert.equal(currentURL(), `/servers/${encodeURIComponent(agent.name)}`); -}); + }); -test('the server detail page should list all tags for the server', function(assert) { - const tags = Object.keys(agent.tags) - .map(name => ({ name, value: agent.tags[name] })) - .sortBy('name'); + test('visiting /servers/:server_name', function(assert) { + assert.equal(currentURL(), `/servers/${encodeURIComponent(agent.name)}`); + }); - assert.equal(ServerDetail.tags.length, tags.length, '# of tags'); - ServerDetail.tags.forEach((tagRow, index) => { - const tag = tags[index]; - assert.equal(tagRow.name, tag.name, `Label: ${tag.name}`); - assert.equal(tagRow.value, tag.value, `Value: ${tag.value}`); + test('the server detail page should list all tags for the server', function(assert) { + const tags = Object.keys(agent.tags) + .map(name => ({ name, value: agent.tags[name] })) + .sortBy('name'); + + assert.equal(ServerDetail.tags.length, tags.length, '# of tags'); + ServerDetail.tags.forEach((tagRow, index) => { + const tag = tags[index]; + assert.equal(tagRow.name, tag.name, `Label: ${tag.name}`); + assert.equal(tagRow.value, tag.value, `Value: ${tag.value}`); + }); }); -}); -test('the list of servers from /servers should still be present', function(assert) { - assert.equal(ServerDetail.servers.length, server.db.agents.length, '# of servers'); -}); + test('the list of servers from /servers should still be present', function(assert) { + assert.equal(ServerDetail.servers.length, server.db.agents.length, '# of servers'); + }); -test('the active server should be denoted in the table', function(assert) { - const activeServers = ServerDetail.servers.filter(server => server.isActive); + test('the active server should be denoted in the table', function(assert) { + const activeServers = ServerDetail.servers.filter(server => server.isActive); - assert.equal(activeServers.length, 1, 'Only one active server'); - assert.equal(ServerDetail.activeServer.name, agent.name, 'Active server matches current route'); -}); + assert.equal(activeServers.length, 1, 'Only one active server'); + assert.equal(ServerDetail.activeServer.name, agent.name, 'Active server matches current route'); + }); -test('when the server is not found, an error message is shown, but the URL persists', function(assert) { - ServerDetail.visit({ name: 'not-a-real-server' }); + test('when the server is not found, an error message is shown, but the URL persists', function(assert) { + ServerDetail.visit({ name: 'not-a-real-server' }); - andThen(() => { assert.equal(currentURL(), '/servers/not-a-real-server', 'The URL persists'); assert.equal(ServerDetail.error.title, 'Not Found', 'Error message is for 404'); }); diff --git a/ui/tests/acceptance/servers-list-test.js b/ui/tests/acceptance/servers-list-test.js index c8630191b06..7acd79ecea5 100644 --- a/ui/tests/acceptance/servers-list-test.js +++ b/ui/tests/acceptance/servers-list-test.js @@ -1,6 +1,6 @@ import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import { findLeader } from '../../mirage/config'; import ServersList from 'nomad-ui/tests/pages/servers/list'; @@ -18,33 +18,31 @@ const agentSort = leader => (a, b) => { return 0; }; -moduleForAcceptance('Acceptance | servers list'); +module('Acceptance | servers list', function(hooks) { + setupApplicationTest(hooks); -test('/servers should list all servers', function(assert) { - server.createList('node', 1); - server.createList('agent', 10); + test('/servers should list all servers', function(assert) { + server.createList('node', 1); + server.createList('agent', 10); - const leader = findLeader(server.schema); - const sortedAgents = server.db.agents.sort(agentSort(leader)).reverse(); + const leader = findLeader(server.schema); + const sortedAgents = server.db.agents.sort(agentSort(leader)).reverse(); - ServersList.visit(); + ServersList.visit(); - andThen(() => { assert.equal(ServersList.servers.length, ServersList.pageSize, 'List is stopped at pageSize'); ServersList.servers.forEach((server, index) => { assert.equal(server.name, sortedAgents[index].name, 'Servers are ordered'); }); }); -}); -test('each server should show high-level info of the server', function(assert) { - minimumSetup(); - const agent = server.db.agents[0]; + test('each server should show high-level info of the server', function(assert) { + minimumSetup(); + const agent = server.db.agents[0]; - ServersList.visit(); + ServersList.visit(); - andThen(() => { const agentRow = ServersList.servers.objectAt(0); assert.equal(agentRow.name, agent.name, 'Name'); @@ -54,38 +52,28 @@ test('each server should show high-level info of the server', function(assert) { assert.equal(agentRow.serfPort, agent.serf_port, 'Serf Port'); assert.equal(agentRow.datacenter, agent.tags.dc, 'Datacenter'); }); -}); -test('each server should link to the server detail page', function(assert) { - minimumSetup(); - const agent = server.db.agents[0]; + test('each server should link to the server detail page', function(assert) { + minimumSetup(); + const agent = server.db.agents[0]; - ServersList.visit(); + ServersList.visit(); - andThen(() => { ServersList.servers.objectAt(0).clickRow(); - }); - andThen(() => { assert.equal(currentURL(), `/servers/${agent.name}`, 'Now at the server detail page'); }); -}); -test('when accessing servers is forbidden, show a message with a link to the tokens page', function(assert) { - server.create('agent'); - server.pretender.get('/v1/agent/members', () => [403, {}, null]); + test('when accessing servers is forbidden, show a message with a link to the tokens page', function(assert) { + server.create('agent'); + server.pretender.get('/v1/agent/members', () => [403, {}, null]); - ServersList.visit(); + ServersList.visit(); - andThen(() => { assert.equal(ServersList.error.title, 'Not Authorized'); - }); - andThen(() => { ServersList.error.seekHelp(); - }); - andThen(() => { assert.equal(currentURL(), '/settings/tokens'); }); }); diff --git a/ui/tests/acceptance/task-detail-test.js b/ui/tests/acceptance/task-detail-test.js index 4dbef254e1b..db59ece7ecd 100644 --- a/ui/tests/acceptance/task-detail-test.js +++ b/ui/tests/acceptance/task-detail-test.js @@ -1,14 +1,16 @@ import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import Task from 'nomad-ui/tests/pages/allocations/task/detail'; import moment from 'moment'; let allocation; let task; -moduleForAcceptance('Acceptance | task detail', { - beforeEach() { +module('Acceptance | task detail', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); server.create('node'); server.create('job', { createAllocations: false }); @@ -16,143 +18,121 @@ moduleForAcceptance('Acceptance | task detail', { task = server.db.taskStates.where({ allocationId: allocation.id })[0]; Task.visit({ id: allocation.id, name: task.name }); - }, -}); + }); -test('/allocation/:id/:task_name should name the task and list high-level task information', function(assert) { - assert.ok(Task.title.includes(task.name), 'Task name'); - assert.ok(Task.state.includes(task.state), 'Task state'); + test('/allocation/:id/:task_name should name the task and list high-level task information', function(assert) { + assert.ok(Task.title.includes(task.name), 'Task name'); + assert.ok(Task.state.includes(task.state), 'Task state'); - assert.ok( - Task.startedAt.includes(moment(task.startedAt).format("MMM DD, 'YY HH:mm:ss ZZ")), - 'Task started at' - ); -}); + assert.ok( + Task.startedAt.includes(moment(task.startedAt).format("MMM DD, 'YY HH:mm:ss ZZ")), + 'Task started at' + ); + }); + + test('breadcrumbs match jobs / job / task group / allocation / task', function(assert) { + const { jobId, taskGroup } = allocation; + const job = server.db.jobs.find(jobId); + + const shortId = allocation.id.split('-')[0]; + + assert.equal(Task.breadcrumbFor('jobs.index').text, 'Jobs', 'Jobs is the first breadcrumb'); + assert.equal(Task.breadcrumbFor('jobs.job.index').text, job.name, 'Job is the second breadcrumb'); + assert.equal( + Task.breadcrumbFor('jobs.job.task-group').text, + taskGroup, + 'Task Group is the third breadcrumb' + ); + assert.equal( + Task.breadcrumbFor('allocations.allocation').text, + shortId, + 'Allocation short id is the fourth breadcrumb' + ); + assert.equal( + Task.breadcrumbFor('allocations.allocation.task').text, + task.name, + 'Task name is the fifth breadcrumb' + ); -test('breadcrumbs match jobs / job / task group / allocation / task', function(assert) { - const { jobId, taskGroup } = allocation; - const job = server.db.jobs.find(jobId); - - const shortId = allocation.id.split('-')[0]; - - assert.equal(Task.breadcrumbFor('jobs.index').text, 'Jobs', 'Jobs is the first breadcrumb'); - assert.equal(Task.breadcrumbFor('jobs.job.index').text, job.name, 'Job is the second breadcrumb'); - assert.equal( - Task.breadcrumbFor('jobs.job.task-group').text, - taskGroup, - 'Task Group is the third breadcrumb' - ); - assert.equal( - Task.breadcrumbFor('allocations.allocation').text, - shortId, - 'Allocation short id is the fourth breadcrumb' - ); - assert.equal( - Task.breadcrumbFor('allocations.allocation.task').text, - task.name, - 'Task name is the fifth breadcrumb' - ); - - Task.breadcrumbFor('jobs.index').visit(); - andThen(() => { + Task.breadcrumbFor('jobs.index').visit(); assert.equal(currentURL(), '/jobs', 'Jobs breadcrumb links correctly'); - }); - andThen(() => { Task.visit({ id: allocation.id, name: task.name }); - }); - andThen(() => { Task.breadcrumbFor('jobs.job.index').visit(); - }); - andThen(() => { assert.equal(currentURL(), `/jobs/${job.id}`, 'Job breadcrumb links correctly'); - }); - andThen(() => { Task.visit({ id: allocation.id, name: task.name }); - }); - andThen(() => { Task.breadcrumbFor('jobs.job.task-group').visit(); - }); - andThen(() => { assert.equal( currentURL(), `/jobs/${job.id}/${taskGroup}`, 'Task Group breadcrumb links correctly' ); - }); - andThen(() => { Task.visit({ id: allocation.id, name: task.name }); - }); - andThen(() => { Task.breadcrumbFor('allocations.allocation').visit(); - }); - andThen(() => { assert.equal( currentURL(), `/allocations/${allocation.id}`, 'Allocations breadcrumb links correctly' ); }); -}); -test('/allocation/:id/:task_name should include resource utilization graphs', function(assert) { - assert.equal(Task.resourceCharts.length, 2, 'Two resource utilization graphs'); - assert.equal(Task.resourceCharts.objectAt(0).name, 'CPU', 'First chart is CPU'); - assert.equal(Task.resourceCharts.objectAt(1).name, 'Memory', 'Second chart is Memory'); -}); + test('/allocation/:id/:task_name should include resource utilization graphs', function(assert) { + assert.equal(Task.resourceCharts.length, 2, 'Two resource utilization graphs'); + assert.equal(Task.resourceCharts.objectAt(0).name, 'CPU', 'First chart is CPU'); + assert.equal(Task.resourceCharts.objectAt(1).name, 'Memory', 'Second chart is Memory'); + }); -test('the addresses table lists all reserved and dynamic ports', function(assert) { - const taskResources = allocation.taskResourcesIds - .map(id => server.db.taskResources.find(id)) - .find(resources => resources.name === task.name); - const reservedPorts = taskResources.resources.Networks[0].ReservedPorts; - const dynamicPorts = taskResources.resources.Networks[0].DynamicPorts; - const addresses = reservedPorts.concat(dynamicPorts); + test('the addresses table lists all reserved and dynamic ports', function(assert) { + const taskResources = allocation.taskResourcesIds + .map(id => server.db.taskResources.find(id)) + .find(resources => resources.name === task.name); + const reservedPorts = taskResources.resources.Networks[0].ReservedPorts; + const dynamicPorts = taskResources.resources.Networks[0].DynamicPorts; + const addresses = reservedPorts.concat(dynamicPorts); - assert.equal(Task.addresses.length, addresses.length, 'All addresses are listed'); -}); + assert.equal(Task.addresses.length, addresses.length, 'All addresses are listed'); + }); -test('each address row shows the label and value of the address', function(assert) { - const taskResources = allocation.taskResourcesIds - .map(id => server.db.taskResources.find(id)) - .findBy('name', task.name); - const networkAddress = taskResources.resources.Networks[0].IP; - const reservedPorts = taskResources.resources.Networks[0].ReservedPorts; - const dynamicPorts = taskResources.resources.Networks[0].DynamicPorts; - const address = reservedPorts.concat(dynamicPorts).sortBy('Label')[0]; - - const addressRow = Task.addresses.objectAt(0); - assert.equal( - addressRow.isDynamic, - reservedPorts.includes(address) ? 'No' : 'Yes', - 'Dynamic port is denoted as such' - ); - assert.equal(addressRow.name, address.Label, 'Label'); - assert.equal(addressRow.address, `${networkAddress}:${address.Value}`, 'Value'); -}); + test('each address row shows the label and value of the address', function(assert) { + const taskResources = allocation.taskResourcesIds + .map(id => server.db.taskResources.find(id)) + .findBy('name', task.name); + const networkAddress = taskResources.resources.Networks[0].IP; + const reservedPorts = taskResources.resources.Networks[0].ReservedPorts; + const dynamicPorts = taskResources.resources.Networks[0].DynamicPorts; + const address = reservedPorts.concat(dynamicPorts).sortBy('Label')[0]; -test('the events table lists all recent events', function(assert) { - const events = server.db.taskEvents.where({ taskStateId: task.id }); + const addressRow = Task.addresses.objectAt(0); + assert.equal( + addressRow.isDynamic, + reservedPorts.includes(address) ? 'No' : 'Yes', + 'Dynamic port is denoted as such' + ); + assert.equal(addressRow.name, address.Label, 'Label'); + assert.equal(addressRow.address, `${networkAddress}:${address.Value}`, 'Value'); + }); - assert.equal(Task.events.length, events.length, `Lists ${events.length} events`); -}); + test('the events table lists all recent events', function(assert) { + const events = server.db.taskEvents.where({ taskStateId: task.id }); -test('each recent event should list the time, type, and description of the event', function(assert) { - const event = server.db.taskEvents.where({ taskStateId: task.id })[0]; - const recentEvent = Task.events.objectAt(Task.events.length - 1); - - assert.equal( - recentEvent.time, - moment(event.time / 1000000).format("MMM DD, 'YY HH:mm:ss ZZ"), - 'Event timestamp' - ); - assert.equal(recentEvent.type, event.type, 'Event type'); - assert.equal(recentEvent.message, event.displayMessage, 'Event message'); -}); + assert.equal(Task.events.length, events.length, `Lists ${events.length} events`); + }); + + test('each recent event should list the time, type, and description of the event', function(assert) { + const event = server.db.taskEvents.where({ taskStateId: task.id })[0]; + const recentEvent = Task.events.objectAt(Task.events.length - 1); + + assert.equal( + recentEvent.time, + moment(event.time / 1000000).format("MMM DD, 'YY HH:mm:ss ZZ"), + 'Event timestamp' + ); + assert.equal(recentEvent.type, event.type, 'Event type'); + assert.equal(recentEvent.message, event.displayMessage, 'Event message'); + }); -test('when the allocation is not found, the application errors', function(assert) { - Task.visit({ id: 'not-a-real-allocation', name: task.name }); + test('when the allocation is not found, the application errors', function(assert) { + Task.visit({ id: 'not-a-real-allocation', name: task.name }); - andThen(() => { assert.equal( server.pretender.handledRequests.findBy('status', 404).url, '/v1/allocation/not-a-real-allocation', @@ -166,12 +146,10 @@ test('when the allocation is not found, the application errors', function(assert assert.ok(Task.error.isPresent, 'Error message is shown'); assert.equal(Task.error.title, 'Not Found', 'Error message is for 404'); }); -}); -test('when the allocation is found but the task is not, the application errors', function(assert) { - Task.visit({ id: allocation.id, name: 'not-a-real-task-name' }); + test('when the allocation is found but the task is not, the application errors', function(assert) { + Task.visit({ id: allocation.id, name: 'not-a-real-task-name' }); - andThen(() => { assert.ok( server.pretender.handledRequests .filterBy('status', 200) @@ -189,8 +167,10 @@ test('when the allocation is found but the task is not, the application errors', }); }); -moduleForAcceptance('Acceptance | task detail (no addresses)', { - beforeEach() { +module('Acceptance | task detail (no addresses)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); server.create('node'); server.create('job'); @@ -198,15 +178,17 @@ moduleForAcceptance('Acceptance | task detail (no addresses)', { task = server.db.taskStates.where({ allocationId: allocation.id })[0]; Task.visit({ id: allocation.id, name: task.name }); - }, -}); + }); -test('when the task has no addresses, the addresses table is not shown', function(assert) { - assert.notOk(Task.hasAddresses, 'No addresses table'); + test('when the task has no addresses, the addresses table is not shown', function(assert) { + assert.notOk(Task.hasAddresses, 'No addresses table'); + }); }); -moduleForAcceptance('Acceptance | task detail (different namespace)', { - beforeEach() { +module('Acceptance | task detail (different namespace)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); server.create('node'); server.create('namespace'); @@ -216,54 +198,34 @@ moduleForAcceptance('Acceptance | task detail (different namespace)', { task = server.db.taskStates.where({ allocationId: allocation.id })[0]; Task.visit({ id: allocation.id, name: task.name }); - }, -}); + }); -test('breadcrumbs match jobs / job / task group / allocation / task', function(assert) { - const { jobId, taskGroup } = allocation; - const job = server.db.jobs.find(jobId); + test('breadcrumbs match jobs / job / task group / allocation / task', function(assert) { + const { jobId, taskGroup } = allocation; + const job = server.db.jobs.find(jobId); - Task.breadcrumbFor('jobs.index').visit(); - andThen(() => { + Task.breadcrumbFor('jobs.index').visit(); assert.equal( currentURL(), '/jobs?namespace=other-namespace', 'Jobs breadcrumb links correctly' ); - }); - andThen(() => { Task.visit({ id: allocation.id, name: task.name }); - }); - andThen(() => { Task.breadcrumbFor('jobs.job.index').visit(); - }); - andThen(() => { assert.equal( currentURL(), `/jobs/${job.id}?namespace=other-namespace`, 'Job breadcrumb links correctly' ); - }); - andThen(() => { Task.visit({ id: allocation.id, name: task.name }); - }); - andThen(() => { Task.breadcrumbFor('jobs.job.task-group').visit(); - }); - andThen(() => { assert.equal( currentURL(), `/jobs/${job.id}/${taskGroup}?namespace=other-namespace`, 'Task Group breadcrumb links correctly' ); - }); - andThen(() => { Task.visit({ id: allocation.id, name: task.name }); - }); - andThen(() => { Task.breadcrumbFor('allocations.allocation').visit(); - }); - andThen(() => { assert.equal( currentURL(), `/allocations/${allocation.id}`, @@ -272,8 +234,10 @@ test('breadcrumbs match jobs / job / task group / allocation / task', function(a }); }); -moduleForAcceptance('Acceptance | task detail (not running)', { - beforeEach() { +module('Acceptance | task detail (not running)', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); server.create('node'); server.create('namespace'); @@ -283,10 +247,10 @@ moduleForAcceptance('Acceptance | task detail (not running)', { task = server.db.taskStates.where({ allocationId: allocation.id })[0]; Task.visit({ id: allocation.id, name: task.name }); - }, -}); + }); -test('when the allocation for a task is not running, the resource utilization graphs are replaced by an empty message', function(assert) { - assert.equal(Task.resourceCharts.length, 0, 'No resource charts'); - assert.equal(Task.resourceEmptyMessage, "Task isn't running", 'Empty message is appropriate'); + test('when the allocation for a task is not running, the resource utilization graphs are replaced by an empty message', function(assert) { + assert.equal(Task.resourceCharts.length, 0, 'No resource charts'); + assert.equal(Task.resourceEmptyMessage, "Task isn't running", 'Empty message is appropriate'); + }); }); diff --git a/ui/tests/acceptance/task-group-detail-test.js b/ui/tests/acceptance/task-group-detail-test.js index 957a3b113cb..65e8f492674 100644 --- a/ui/tests/acceptance/task-group-detail-test.js +++ b/ui/tests/acceptance/task-group-detail-test.js @@ -1,6 +1,6 @@ import { currentURL } from 'ember-native-dom-helpers'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import { formatBytes } from 'nomad-ui/helpers/format-bytes'; import TaskGroup from 'nomad-ui/tests/pages/jobs/job/task-group'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; @@ -13,8 +13,10 @@ let allocations; const sum = (total, n) => total + n; -moduleForAcceptance('Acceptance | task group detail', { - beforeEach() { +module('Acceptance | task group detail', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); server.create('node', 'forceIPv4'); @@ -58,75 +60,69 @@ moduleForAcceptance('Acceptance | task group detail', { }); TaskGroup.visit({ id: job.id, name: taskGroup.name }); - }, -}); + }); -test('/jobs/:id/:task-group should list high-level metrics for the allocation', function(assert) { - const totalCPU = tasks.mapBy('Resources.CPU').reduce(sum, 0); - const totalMemory = tasks.mapBy('Resources.MemoryMB').reduce(sum, 0); - const totalDisk = taskGroup.ephemeralDisk.SizeMB; - - assert.equal(TaskGroup.tasksCount, `# Tasks ${tasks.length}`, '# Tasks'); - assert.equal( - TaskGroup.cpu, - `Reserved CPU ${totalCPU} MHz`, - 'Aggregated CPU reservation for all tasks' - ); - assert.equal( - TaskGroup.mem, - `Reserved Memory ${totalMemory} MiB`, - 'Aggregated Memory reservation for all tasks' - ); - assert.equal( - TaskGroup.disk, - `Reserved Disk ${totalDisk} MiB`, - 'Aggregated Disk reservation for all tasks' - ); -}); + test('/jobs/:id/:task-group should list high-level metrics for the allocation', function(assert) { + const totalCPU = tasks.mapBy('Resources.CPU').reduce(sum, 0); + const totalMemory = tasks.mapBy('Resources.MemoryMB').reduce(sum, 0); + const totalDisk = taskGroup.ephemeralDisk.SizeMB; -test('/jobs/:id/:task-group should have breadcrumbs for job and jobs', function(assert) { - assert.equal(TaskGroup.breadcrumbFor('jobs.index').text, 'Jobs', 'First breadcrumb says jobs'); - assert.equal( - TaskGroup.breadcrumbFor('jobs.job.index').text, - job.name, - 'Second breadcrumb says the job name' - ); - assert.equal( - TaskGroup.breadcrumbFor('jobs.job.task-group').text, - taskGroup.name, - 'Third breadcrumb says the job name' - ); -}); + assert.equal(TaskGroup.tasksCount, `# Tasks ${tasks.length}`, '# Tasks'); + assert.equal( + TaskGroup.cpu, + `Reserved CPU ${totalCPU} MHz`, + 'Aggregated CPU reservation for all tasks' + ); + assert.equal( + TaskGroup.mem, + `Reserved Memory ${totalMemory} MiB`, + 'Aggregated Memory reservation for all tasks' + ); + assert.equal( + TaskGroup.disk, + `Reserved Disk ${totalDisk} MiB`, + 'Aggregated Disk reservation for all tasks' + ); + }); -test('/jobs/:id/:task-group first breadcrumb should link to jobs', function(assert) { - TaskGroup.breadcrumbFor('jobs.index').visit(); - andThen(() => { + test('/jobs/:id/:task-group should have breadcrumbs for job and jobs', function(assert) { + assert.equal(TaskGroup.breadcrumbFor('jobs.index').text, 'Jobs', 'First breadcrumb says jobs'); + assert.equal( + TaskGroup.breadcrumbFor('jobs.job.index').text, + job.name, + 'Second breadcrumb says the job name' + ); + assert.equal( + TaskGroup.breadcrumbFor('jobs.job.task-group').text, + taskGroup.name, + 'Third breadcrumb says the job name' + ); + }); + + test('/jobs/:id/:task-group first breadcrumb should link to jobs', function(assert) { + TaskGroup.breadcrumbFor('jobs.index').visit(); assert.equal(currentURL(), '/jobs', 'First breadcrumb links back to jobs'); }); -}); -test('/jobs/:id/:task-group second breadcrumb should link to the job for the task group', function(assert) { - TaskGroup.breadcrumbFor('jobs.job.index').visit(); - andThen(() => { + test('/jobs/:id/:task-group second breadcrumb should link to the job for the task group', function(assert) { + TaskGroup.breadcrumbFor('jobs.job.index').visit(); assert.equal( currentURL(), `/jobs/${job.id}`, 'Second breadcrumb links back to the job for the task group' ); }); -}); -test('/jobs/:id/:task-group should list one page of allocations for the task group', function(assert) { - server.createList('allocation', TaskGroup.pageSize, { - jobId: job.id, - taskGroup: taskGroup.name, - clientStatus: 'running', - }); + test('/jobs/:id/:task-group should list one page of allocations for the task group', function(assert) { + server.createList('allocation', TaskGroup.pageSize, { + jobId: job.id, + taskGroup: taskGroup.name, + clientStatus: 'running', + }); - JobsList.visit(); - TaskGroup.visit({ id: job.id, name: taskGroup.name }); + JobsList.visit(); + TaskGroup.visit({ id: job.id, name: taskGroup.name }); - andThen(() => { assert.ok( server.db.allocations.where({ jobId: job.id }).length > TaskGroup.pageSize, 'There are enough allocations to invoke pagination' @@ -138,13 +134,11 @@ test('/jobs/:id/:task-group should list one page of allocations for the task gro 'All allocations for the task group' ); }); -}); -test('each allocation should show basic information about the allocation', function(assert) { - const allocation = allocations.sortBy('modifyIndex').reverse()[0]; - const allocationRow = TaskGroup.allocations.objectAt(0); + test('each allocation should show basic information about the allocation', function(assert) { + const allocation = allocations.sortBy('modifyIndex').reverse()[0]; + const allocationRow = TaskGroup.allocations.objectAt(0); - andThen(() => { assert.equal(allocationRow.shortId, allocation.id.split('-')[0], 'Allocation short id'); assert.equal( allocationRow.createTime, @@ -163,54 +157,50 @@ test('each allocation should show basic information about the allocation', funct server.db.nodes.find(allocation.nodeId).id.split('-')[0], 'Node ID' ); - }); - allocationRow.visitClient(); + allocationRow.visitClient(); - andThen(() => { assert.equal(currentURL(), `/clients/${allocation.nodeId}`, 'Node links to node page'); }); -}); -test('each allocation should show stats about the allocation', function(assert) { - const allocation = allocations.sortBy('name')[0]; - const allocationRow = TaskGroup.allocations.objectAt(0); - - const allocStats = server.db.clientAllocationStats.find(allocation.id); - const tasks = taskGroup.taskIds.map(id => server.db.tasks.find(id)); - - const cpuUsed = tasks.reduce((sum, task) => sum + task.Resources.CPU, 0); - const memoryUsed = tasks.reduce((sum, task) => sum + task.Resources.MemoryMB, 0); - - assert.equal( - allocationRow.cpu, - Math.floor(allocStats.resourceUsage.CpuStats.TotalTicks) / cpuUsed, - 'CPU %' - ); - - assert.equal( - allocationRow.cpuTooltip, - `${Math.floor(allocStats.resourceUsage.CpuStats.TotalTicks)} / ${cpuUsed} MHz`, - 'Detailed CPU information is in a tooltip' - ); - - assert.equal( - allocationRow.mem, - allocStats.resourceUsage.MemoryStats.RSS / 1024 / 1024 / memoryUsed, - 'Memory used' - ); - - assert.equal( - allocationRow.memTooltip, - `${formatBytes([allocStats.resourceUsage.MemoryStats.RSS])} / ${memoryUsed} MiB`, - 'Detailed memory information is in a tooltip' - ); -}); + test('each allocation should show stats about the allocation', function(assert) { + const allocation = allocations.sortBy('name')[0]; + const allocationRow = TaskGroup.allocations.objectAt(0); + + const allocStats = server.db.clientAllocationStats.find(allocation.id); + const tasks = taskGroup.taskIds.map(id => server.db.tasks.find(id)); + + const cpuUsed = tasks.reduce((sum, task) => sum + task.Resources.CPU, 0); + const memoryUsed = tasks.reduce((sum, task) => sum + task.Resources.MemoryMB, 0); + + assert.equal( + allocationRow.cpu, + Math.floor(allocStats.resourceUsage.CpuStats.TotalTicks) / cpuUsed, + 'CPU %' + ); + + assert.equal( + allocationRow.cpuTooltip, + `${Math.floor(allocStats.resourceUsage.CpuStats.TotalTicks)} / ${cpuUsed} MHz`, + 'Detailed CPU information is in a tooltip' + ); + + assert.equal( + allocationRow.mem, + allocStats.resourceUsage.MemoryStats.RSS / 1024 / 1024 / memoryUsed, + 'Memory used' + ); + + assert.equal( + allocationRow.memTooltip, + `${formatBytes([allocStats.resourceUsage.MemoryStats.RSS])} / ${memoryUsed} MiB`, + 'Detailed memory information is in a tooltip' + ); + }); -test('when the allocation search has no matches, there is an empty message', function(assert) { - TaskGroup.search('zzzzzz'); + test('when the allocation search has no matches, there is an empty message', function(assert) { + TaskGroup.search('zzzzzz'); - andThen(() => { assert.ok(TaskGroup.isEmpty, 'Empty state is shown'); assert.equal( TaskGroup.emptyState.headline, @@ -218,20 +208,18 @@ test('when the allocation search has no matches, there is an empty message', fun 'Empty state has an appropriate message' ); }); -}); -test('when the allocation has reschedule events, the allocation row is denoted with an icon', function(assert) { - const rescheduleRow = TaskGroup.allocationFor(allocations[0].id); - const normalRow = TaskGroup.allocationFor(allocations[1].id); + test('when the allocation has reschedule events, the allocation row is denoted with an icon', function(assert) { + const rescheduleRow = TaskGroup.allocationFor(allocations[0].id); + const normalRow = TaskGroup.allocationFor(allocations[1].id); - assert.ok(rescheduleRow.rescheduled, 'Reschedule row has a reschedule icon'); - assert.notOk(normalRow.rescheduled, 'Normal row has no reschedule icon'); -}); + assert.ok(rescheduleRow.rescheduled, 'Reschedule row has a reschedule icon'); + assert.notOk(normalRow.rescheduled, 'Normal row has no reschedule icon'); + }); -test('when the job for the task group is not found, an error message is shown, but the URL persists', function(assert) { - TaskGroup.visit({ id: 'not-a-real-job', name: 'not-a-real-task-group' }); + test('when the job for the task group is not found, an error message is shown, but the URL persists', function(assert) { + TaskGroup.visit({ id: 'not-a-real-job', name: 'not-a-real-task-group' }); - andThen(() => { assert.equal( server.pretender.handledRequests.findBy('status', 404).url, '/v1/job/not-a-real-job', @@ -241,12 +229,10 @@ test('when the job for the task group is not found, an error message is shown, b assert.ok(TaskGroup.error.isPresent, 'Error message is shown'); assert.equal(TaskGroup.error.title, 'Not Found', 'Error message is for 404'); }); -}); -test('when the task group is not found on the job, an error message is shown, but the URL persists', function(assert) { - TaskGroup.visit({ id: job.id, name: 'not-a-real-task-group' }); + test('when the task group is not found on the job, an error message is shown, but the URL persists', function(assert) { + TaskGroup.visit({ id: job.id, name: 'not-a-real-task-group' }); - andThen(() => { assert.ok( server.pretender.handledRequests .filterBy('status', 200) diff --git a/ui/tests/acceptance/task-logs-test.js b/ui/tests/acceptance/task-logs-test.js index 69058792c3b..7286f12fcb0 100644 --- a/ui/tests/acceptance/task-logs-test.js +++ b/ui/tests/acceptance/task-logs-test.js @@ -1,13 +1,15 @@ import { run } from '@ember/runloop'; -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import TaskLogs from 'nomad-ui/tests/pages/allocations/task/logs'; let allocation; let task; -moduleForAcceptance('Acceptance | task logs', { - beforeEach() { +module('Acceptance | task logs', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); server.create('node', 'forceIPv4'); const job = server.create('job', { createAllocations: false }); @@ -17,19 +19,19 @@ moduleForAcceptance('Acceptance | task logs', { run.later(run, run.cancelTimers, 1000); TaskLogs.visit({ id: allocation.id, name: task.name }); - }, -}); + }); -test('/allocation/:id/:task_name/logs should have a log component', function(assert) { - assert.equal(currentURL(), `/allocations/${allocation.id}/${task.name}/logs`, 'No redirect'); - assert.ok(TaskLogs.hasTaskLog, 'Task log component found'); -}); + test('/allocation/:id/:task_name/logs should have a log component', function(assert) { + assert.equal(currentURL(), `/allocations/${allocation.id}/${task.name}/logs`, 'No redirect'); + assert.ok(TaskLogs.hasTaskLog, 'Task log component found'); + }); -test('the stdout log immediately starts streaming', function(assert) { - const node = server.db.nodes.find(allocation.nodeId); - const logUrlRegex = new RegExp(`${node.httpAddr}/v1/client/fs/logs/${allocation.id}`); - assert.ok( - server.pretender.handledRequests.filter(req => logUrlRegex.test(req.url)).length, - 'Log requests were made' - ); + test('the stdout log immediately starts streaming', function(assert) { + const node = server.db.nodes.find(allocation.nodeId); + const logUrlRegex = new RegExp(`${node.httpAddr}/v1/client/fs/logs/${allocation.id}`); + assert.ok( + server.pretender.handledRequests.filter(req => logUrlRegex.test(req.url)).length, + 'Log requests were made' + ); + }); }); diff --git a/ui/tests/acceptance/token-test.js b/ui/tests/acceptance/token-test.js index 86c2845caed..85910505c5d 100644 --- a/ui/tests/acceptance/token-test.js +++ b/ui/tests/acceptance/token-test.js @@ -1,6 +1,6 @@ import { find } from 'ember-native-dom-helpers'; -import { test, skip } from 'ember-qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, skip, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import Tokens from 'nomad-ui/tests/pages/settings/tokens'; import Jobs from 'nomad-ui/tests/pages/jobs/list'; import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; @@ -11,173 +11,152 @@ let node; let managementToken; let clientToken; -moduleForAcceptance('Acceptance | tokens', { - beforeEach() { +module('Acceptance | tokens', function(hooks) { + setupApplicationTest(hooks); + + hooks.beforeEach(function() { server.create('agent'); node = server.create('node'); job = server.create('job'); managementToken = server.create('token'); clientToken = server.create('token'); - }, -}); + }); -test('the token form sets the token in local storage', function(assert) { - const { secretId } = managementToken; + test('the token form sets the token in local storage', function(assert) { + const { secretId } = managementToken; - Tokens.visit(); + Tokens.visit(); - andThen(() => { assert.ok(window.localStorage.nomadTokenSecret == null, 'No token secret set'); Tokens.secret(secretId).submit(); - andThen(() => { - assert.equal(window.localStorage.nomadTokenSecret, secretId, 'Token secret was set'); - }); + assert.equal(window.localStorage.nomadTokenSecret, secretId, 'Token secret was set'); }); -}); -// TODO: unskip once store.unloadAll reliably waits for in-flight requests to settle -skip('the X-Nomad-Token header gets sent with requests once it is set', function(assert) { - const { secretId } = managementToken; - let requestPosition = 0; + // TODO: unskip once store.unloadAll reliably waits for in-flight requests to settle + skip('the X-Nomad-Token header gets sent with requests once it is set', function(assert) { + const { secretId } = managementToken; + let requestPosition = 0; - JobDetail.visit({ id: job.id }); - ClientDetail.visit({ id: node.id }); + JobDetail.visit({ id: job.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { - assert.ok(server.pretender.handledRequests.length > 1, 'Requests have been made'); + andThen(() => { + assert.ok(server.pretender.handledRequests.length > 1, 'Requests have been made'); - server.pretender.handledRequests.forEach(req => { - assert.notOk(getHeader(req, 'X-Nomad-Token'), `No token for ${req.url}`); - }); + server.pretender.handledRequests.forEach(req => { + assert.notOk(getHeader(req, 'X-Nomad-Token'), `No token for ${req.url}`); + }); - requestPosition = server.pretender.handledRequests.length; - }); + requestPosition = server.pretender.handledRequests.length; + }); - Tokens.visit(); + Tokens.visit(); - andThen(() => { - Tokens.secret(secretId).submit(); - }); + andThen(() => { + Tokens.secret(secretId).submit(); + }); - JobDetail.visit({ id: job.id }); - ClientDetail.visit({ id: node.id }); + JobDetail.visit({ id: job.id }); + ClientDetail.visit({ id: node.id }); - andThen(() => { - const newRequests = server.pretender.handledRequests.slice(requestPosition); - assert.ok(newRequests.length > 1, 'New requests have been made'); + andThen(() => { + const newRequests = server.pretender.handledRequests.slice(requestPosition); + assert.ok(newRequests.length > 1, 'New requests have been made'); - // Cross-origin requests can't have a token - newRequests.forEach(req => { - assert.equal(getHeader(req, 'X-Nomad-Token'), secretId, `Token set for ${req.url}`); + // Cross-origin requests can't have a token + newRequests.forEach(req => { + assert.equal(getHeader(req, 'X-Nomad-Token'), secretId, `Token set for ${req.url}`); + }); }); }); -}); -test('an error message is shown when authenticating a token fails', function(assert) { - const { secretId } = managementToken; - const bogusSecret = 'this-is-not-the-secret'; - assert.notEqual( - secretId, - bogusSecret, - 'bogus secret is not somehow coincidentally equal to the real secret' - ); + test('an error message is shown when authenticating a token fails', function(assert) { + const { secretId } = managementToken; + const bogusSecret = 'this-is-not-the-secret'; + assert.notEqual( + secretId, + bogusSecret, + 'bogus secret is not somehow coincidentally equal to the real secret' + ); - Tokens.visit(); + Tokens.visit(); - andThen(() => { Tokens.secret(bogusSecret).submit(); - andThen(() => { - assert.ok( - window.localStorage.nomadTokenSecret == null, - 'Token secret is discarded on failure' - ); - assert.ok(Tokens.errorMessage, 'Token error message is shown'); - assert.notOk(Tokens.successMessage, 'Token success message is not shown'); - assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); - }); + assert.ok( + window.localStorage.nomadTokenSecret == null, + 'Token secret is discarded on failure' + ); + assert.ok(Tokens.errorMessage, 'Token error message is shown'); + assert.notOk(Tokens.successMessage, 'Token success message is not shown'); + assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); }); -}); -test('a success message and a special management token message are shown when authenticating succeeds', function(assert) { - const { secretId } = managementToken; + test('a success message and a special management token message are shown when authenticating succeeds', function(assert) { + const { secretId } = managementToken; - Tokens.visit(); + Tokens.visit(); - andThen(() => { Tokens.secret(secretId).submit(); - andThen(() => { - assert.ok(Tokens.successMessage, 'Token success message is shown'); - assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); - assert.ok(Tokens.managementMessage, 'Token management message is shown'); - assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); - }); + assert.ok(Tokens.successMessage, 'Token success message is shown'); + assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); + assert.ok(Tokens.managementMessage, 'Token management message is shown'); + assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); }); -}); -test('a success message and associated policies are shown when authenticating succeeds', function(assert) { - const { secretId } = clientToken; - const policy = clientToken.policies.models[0]; - policy.update('description', 'Make sure there is a description'); + test('a success message and associated policies are shown when authenticating succeeds', function(assert) { + const { secretId } = clientToken; + const policy = clientToken.policies.models[0]; + policy.update('description', 'Make sure there is a description'); - Tokens.visit(); + Tokens.visit(); - andThen(() => { Tokens.secret(secretId).submit(); - andThen(() => { - assert.ok(Tokens.successMessage, 'Token success message is shown'); - assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); - assert.notOk(Tokens.managementMessage, 'Token management message is not shown'); - assert.equal( - Tokens.policies.length, - clientToken.policies.length, - 'Each policy associated with the token is listed' - ); - - const policyElement = Tokens.policies.objectAt(0); - - assert.equal(policyElement.name, policy.name, 'Policy Name'); - assert.equal(policyElement.description, policy.description, 'Policy Description'); - assert.equal(policyElement.rules, policy.rules, 'Policy Rules'); - }); + assert.ok(Tokens.successMessage, 'Token success message is shown'); + assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); + assert.notOk(Tokens.managementMessage, 'Token management message is not shown'); + assert.equal( + Tokens.policies.length, + clientToken.policies.length, + 'Each policy associated with the token is listed' + ); + + const policyElement = Tokens.policies.objectAt(0); + + assert.equal(policyElement.name, policy.name, 'Policy Name'); + assert.equal(policyElement.description, policy.description, 'Policy Description'); + assert.equal(policyElement.rules, policy.rules, 'Policy Rules'); }); -}); -test('setting a token clears the store', function(assert) { - const { secretId } = clientToken; + test('setting a token clears the store', function(assert) { + const { secretId } = clientToken; - Jobs.visit(); + Jobs.visit(); - andThen(() => { assert.ok(find('.job-row'), 'Jobs found'); - }); - Tokens.visit(); + Tokens.visit(); - andThen(() => { Tokens.secret(secretId).submit(); - }); - // Don't return jobs from the API the second time around - andThen(() => { server.pretender.get('/v1/jobs', function() { return [200, {}, '[]']; }); - }); - Jobs.visit(); + Jobs.visit(); - // If jobs are lingering in the store, they would show up - assert.notOk(find('[data-test-job-row]'), 'No jobs found'); -}); + // If jobs are lingering in the store, they would show up + assert.notOk(find('[data-test-job-row]'), 'No jobs found'); + }); -function getHeader({ requestHeaders }, name) { - // Headers are case-insensitive, but object property look up is not - return ( - requestHeaders[name] || requestHeaders[name.toLowerCase()] || requestHeaders[name.toUpperCase()] - ); -} + function getHeader({ requestHeaders }, name) { + // Headers are case-insensitive, but object property look up is not + return ( + requestHeaders[name] || requestHeaders[name.toLowerCase()] || requestHeaders[name.toUpperCase()] + ); + } +}); diff --git a/ui/tests/helpers/module-for-adapter.js b/ui/tests/helpers/module-for-adapter.js index 9601b1d0acd..19ba121b528 100644 --- a/ui/tests/helpers/module-for-adapter.js +++ b/ui/tests/helpers/module-for-adapter.js @@ -1,5 +1,6 @@ import { getOwner } from '@ember/application'; -import { moduleForModel } from 'ember-qunit'; +import { module } from 'qunit'; +import { setupTest } from 'ember-qunit'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; export default function(modelName, description, options = { needs: [] }) { diff --git a/ui/tests/helpers/module-for-job.js b/ui/tests/helpers/module-for-job.js index 46989416219..3e1b3bcc159 100644 --- a/ui/tests/helpers/module-for-job.js +++ b/ui/tests/helpers/module-for-job.js @@ -1,5 +1,5 @@ -import { test } from 'qunit'; -import moduleForAcceptance from 'nomad-ui/tests/helpers/module-for-acceptance'; +import { module, test } from 'qunit'; +import { setupApplicationTest } from 'ember-qunit'; import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; export default function moduleForJob(title, context, jobFactory, additionalTests) { diff --git a/ui/tests/helpers/module-for-serializer.js b/ui/tests/helpers/module-for-serializer.js index 50f6e41e3f6..436d1ac86a8 100644 --- a/ui/tests/helpers/module-for-serializer.js +++ b/ui/tests/helpers/module-for-serializer.js @@ -1,5 +1,6 @@ import { getOwner } from '@ember/application'; -import { moduleForModel } from 'ember-qunit'; +import { module } from 'qunit'; +import { setupTest } from 'ember-qunit'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; export default function(modelName, description, options = { needs: [] }) { diff --git a/ui/tests/integration/allocation-row-test.js b/ui/tests/integration/allocation-row-test.js index a2204f62118..5ffaa541575 100644 --- a/ui/tests/integration/allocation-row-test.js +++ b/ui/tests/integration/allocation-row-test.js @@ -1,6 +1,7 @@ import { getOwner } from '@ember/application'; -import { test, moduleForComponent } from 'ember-qunit'; -import wait from 'ember-test-helpers/wait'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; import generateResources from '../../mirage/data/generate-resources'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; @@ -9,179 +10,181 @@ import Response from 'ember-cli-mirage/response'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; import { Promise, resolve } from 'rsvp'; -moduleForComponent('allocation-row', 'Integration | Component | allocation row', { - integration: true, - beforeEach() { - fragmentSerializerInitializer(getOwner(this)); - this.store = getOwner(this).lookup('service:store'); +module('Integration | Component | allocation row', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { + fragmentSerializerInitializer(this.owner); + this.store = this.owner.lookup('service:store'); this.server = startMirage(); this.server.create('namespace'); this.server.create('node'); this.server.create('job', { createAllocations: false }); - }, - afterEach() { - this.server.shutdown(); - }, -}); + }); -test('Allocation row polls for stats, even when it errors or has an invalid response', function(assert) { - const component = this; - - let currentFrame = 0; - let frames = [ - JSON.stringify({ ResourceUsage: generateResources() }), - JSON.stringify({ ResourceUsage: generateResources() }), - null, - 'Valid JSON', - JSON.stringify({ ResourceUsage: generateResources() }), - ]; - - this.server.get('/client/allocation/:id/stats', function() { - const response = frames[++currentFrame]; - - // Disable polling to stop the EC task in the component - if (currentFrame >= frames.length) { - component.set('enablePolling', false); - } - - if (response) { - return response; - } - return new Response(500, {}, ''); + hooks.afterEach(function() { + this.server.shutdown(); }); - this.server.create('allocation', { clientStatus: 'running' }); - this.store.findAll('allocation'); + test('Allocation row polls for stats, even when it errors or has an invalid response', function(assert) { + const component = this; + + let currentFrame = 0; + let frames = [ + JSON.stringify({ ResourceUsage: generateResources() }), + JSON.stringify({ ResourceUsage: generateResources() }), + null, + 'Valid JSON', + JSON.stringify({ ResourceUsage: generateResources() }), + ]; + + this.server.get('/client/allocation/:id/stats', function() { + const response = frames[++currentFrame]; + + // Disable polling to stop the EC task in the component + if (currentFrame >= frames.length) { + component.set('enablePolling', false); + } + + if (response) { + return response; + } + return new Response(500, {}, ''); + }); + + this.server.create('allocation', { clientStatus: 'running' }); + this.store.findAll('allocation'); + + let allocation; - let allocation; + return settled() + .then(async () => { + allocation = this.store.peekAll('allocation').get('firstObject'); - return wait() - .then(() => { - allocation = this.store.peekAll('allocation').get('firstObject'); + this.setProperties({ + allocation, + context: 'job', + enablePolling: true, + }); - this.setProperties({ - allocation, - context: 'job', - enablePolling: true, + await render(hbs` + {{allocation-row + allocation=allocation + context=context + enablePolling=enablePolling}} + `); + return settled(); + }) + .then(() => { + assert.equal( + this.server.pretender.handledRequests.filterBy( + 'url', + `/v1/client/allocation/${allocation.get('id')}/stats` + ).length, + frames.length, + 'Requests continue to be made after malformed responses and server errors' + ); }); + }); - this.render(hbs` - {{allocation-row - allocation=allocation - context=context - enablePolling=enablePolling}} - `); - return wait(); - }) - .then(() => { - assert.equal( - this.server.pretender.handledRequests.filterBy( - 'url', - `/v1/client/allocation/${allocation.get('id')}/stats` - ).length, - frames.length, - 'Requests continue to be made after malformed responses and server errors' - ); + test('Allocation row shows warning when it requires drivers that are unhealthy on the node it is running on', function(assert) { + const node = this.server.schema.nodes.first(); + const drivers = node.drivers; + Object.values(drivers).forEach(driver => { + driver.Healthy = false; + driver.Detected = true; }); -}); + node.update({ drivers }); -test('Allocation row shows warning when it requires drivers that are unhealthy on the node it is running on', function(assert) { - const node = this.server.schema.nodes.first(); - const drivers = node.drivers; - Object.values(drivers).forEach(driver => { - driver.Healthy = false; - driver.Detected = true; - }); - node.update({ drivers }); + this.server.create('allocation', { clientStatus: 'running' }); + this.store.findAll('job'); + this.store.findAll('node'); + this.store.findAll('allocation'); - this.server.create('allocation', { clientStatus: 'running' }); - this.store.findAll('job'); - this.store.findAll('node'); - this.store.findAll('allocation'); + let allocation; - let allocation; + return settled() + .then(async () => { + allocation = this.store.peekAll('allocation').get('firstObject'); - return wait() - .then(() => { - allocation = this.store.peekAll('allocation').get('firstObject'); + this.setProperties({ + allocation, + context: 'job', + }); - this.setProperties({ - allocation, - context: 'job', + await render(hbs` + {{allocation-row + allocation=allocation + context=context}} + `); + return settled(); + }) + .then(() => { + assert.ok(find('[data-test-icon="unhealthy-driver"]'), 'Unhealthy driver icon is shown'); }); + }); - this.render(hbs` - {{allocation-row - allocation=allocation - context=context}} - `); - return wait(); - }) - .then(() => { - assert.ok(find('[data-test-icon="unhealthy-driver"]'), 'Unhealthy driver icon is shown'); + test('when an allocation is not running, the utilization graphs are omitted', function(assert) { + this.setProperties({ + context: 'job', + enablePolling: false, }); -}); - -test('when an allocation is not running, the utilization graphs are omitted', function(assert) { - this.setProperties({ - context: 'job', - enablePolling: false, - }); - // All non-running statuses need to be tested - ['pending', 'complete', 'failed', 'lost'].forEach(clientStatus => - this.server.create('allocation', { clientStatus }) - ); - - this.store.findAll('allocation'); - - return wait().then(() => { - const allocations = this.store.peekAll('allocation'); - return waitForEach( - allocations.map(allocation => () => { - this.set('allocation', allocation); - this.render(hbs` - {{allocation-row - allocation=allocation - context=context - enablePolling=enablePolling}} - `); - return wait().then(() => { - const status = allocation.get('clientStatus'); - assert.notOk(find('[data-test-cpu] .inline-chart'), `No CPU chart for ${status}`); - assert.notOk(find('[data-test-mem] .inline-chart'), `No Mem chart for ${status}`); - }); - }) + // All non-running statuses need to be tested + ['pending', 'complete', 'failed', 'lost'].forEach(clientStatus => + this.server.create('allocation', { clientStatus }) ); - }); -}); -// A way to loop over asynchronous code. Can be replaced by async/await in the future. -const waitForEach = fns => { - let i = 0; - let done = () => {}; - - // This function is asynchronous and needs to return a promise - const pending = new Promise(resolve => { - done = resolve; + this.store.findAll('allocation'); + + return settled().then(() => { + const allocations = this.store.peekAll('allocation'); + return waitForEach( + allocations.map(allocation => async () => { + this.set('allocation', allocation); + await render(hbs` + {{allocation-row + allocation=allocation + context=context + enablePolling=enablePolling}} + `); + return settled().then(() => { + const status = allocation.get('clientStatus'); + assert.notOk(find('[data-test-cpu] .inline-chart'), `No CPU chart for ${status}`); + assert.notOk(find('[data-test-mem] .inline-chart'), `No Mem chart for ${status}`); + }); + }) + ); + }); }); - const step = () => { - // The waitForEach promise and this recursive loop are done once - // all functions have been called. - if (i >= fns.length) { - done(); - return; - } - // Call the current function - const promise = fns[i]() || resolve(true); - // Increment the function position - i++; - // Wait for async behaviors to settle and repeat - promise.then(() => wait()).then(step); - }; + // A way to loop over asynchronous code. Can be replaced by async/await in the future. + const waitForEach = fns => { + let i = 0; + let done = () => {}; - step(); + // This function is asynchronous and needs to return a promise + const pending = new Promise(resolve => { + done = resolve; + }); - return pending; -}; + const step = () => { + // The waitForEach promise and this recursive loop are done once + // all functions have been called. + if (i >= fns.length) { + done(); + return; + } + // Call the current function + const promise = fns[i]() || resolve(true); + // Increment the function position + i++; + // Wait for async behaviors to settle and repeat + promise.then(() => settled()).then(step); + }; + + step(); + + return pending; + }; +}); diff --git a/ui/tests/integration/app-breadcrumbs-test.js b/ui/tests/integration/app-breadcrumbs-test.js index c046791613e..10b167e4c98 100644 --- a/ui/tests/integration/app-breadcrumbs-test.js +++ b/ui/tests/integration/app-breadcrumbs-test.js @@ -1,85 +1,87 @@ import Service from '@ember/service'; import { getOwner } from '@ember/application'; import RSVP from 'rsvp'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { findAll } from 'ember-native-dom-helpers'; -import wait from 'ember-test-helpers/wait'; import hbs from 'htmlbars-inline-precompile'; import PromiseObject from 'nomad-ui/utils/classes/promise-object'; -moduleForComponent('app-breadcrumbs', 'Integration | Component | app breadcrumbs', { - integration: true, - beforeEach() { +module('Integration | Component | app breadcrumbs', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { const mockBreadcrumbs = Service.extend({ breadcrumbs: [], }); - this.register('service:breadcrumbs', mockBreadcrumbs); - this.breadcrumbs = getOwner(this).lookup('service:breadcrumbs'); - }, -}); - -const commonCrumbs = [{ label: 'One', args: ['one'] }, { label: 'Two', args: ['two'] }]; - -const template = hbs` - {{app-breadcrumbs}} -`; - -test('breadcrumbs comes from the breadcrumbs service', function(assert) { - this.breadcrumbs.set('breadcrumbs', commonCrumbs); - - this.render(template); + this.owner.register('service:breadcrumbs', mockBreadcrumbs); + this.breadcrumbs = this.owner.lookup('service:breadcrumbs'); + }); - assert.equal( - findAll('[data-test-breadcrumb]').length, - commonCrumbs.length, - 'The number of crumbs matches the crumbs from the service' - ); -}); + const commonCrumbs = [{ label: 'One', args: ['one'] }, { label: 'Two', args: ['two'] }]; -test('every breadcrumb is rendered correctly', function(assert) { - this.breadcrumbs.set('breadcrumbs', commonCrumbs); + const template = hbs` + {{app-breadcrumbs}} + `; - this.render(template); + test('breadcrumbs comes from the breadcrumbs service', async function(assert) { + this.breadcrumbs.set('breadcrumbs', commonCrumbs); - const renderedCrumbs = findAll('[data-test-breadcrumb]'); + await render(template); - renderedCrumbs.forEach((crumb, index) => { assert.equal( - crumb.textContent.trim(), - commonCrumbs[index].label, - `Crumb ${index} is ${commonCrumbs[index].label}` + findAll('[data-test-breadcrumb]').length, + commonCrumbs.length, + 'The number of crumbs matches the crumbs from the service' ); }); -}); -test('when breadcrumbs are pending promises, an ellipsis is rendered', function(assert) { - let resolvePromise; - const promise = new RSVP.Promise(resolve => { - resolvePromise = resolve; - }); + test('every breadcrumb is rendered correctly', async function(assert) { + this.breadcrumbs.set('breadcrumbs', commonCrumbs); - this.breadcrumbs.set('breadcrumbs', [ - { label: 'One', args: ['one'] }, - PromiseObject.create({ promise }), - { label: 'Three', args: ['three'] }, - ]); + await render(template); - this.render(template); + const renderedCrumbs = findAll('[data-test-breadcrumb]'); - assert.equal( - findAll('[data-test-breadcrumb]')[1].textContent.trim(), - '…', - 'Promise breadcrumb is in a loading state' - ); + renderedCrumbs.forEach((crumb, index) => { + assert.equal( + crumb.textContent.trim(), + commonCrumbs[index].label, + `Crumb ${index} is ${commonCrumbs[index].label}` + ); + }); + }); + + test('when breadcrumbs are pending promises, an ellipsis is rendered', async function(assert) { + let resolvePromise; + const promise = new RSVP.Promise(resolve => { + resolvePromise = resolve; + }); - resolvePromise({ label: 'Two', args: ['two'] }); + this.breadcrumbs.set('breadcrumbs', [ + { label: 'One', args: ['one'] }, + PromiseObject.create({ promise }), + { label: 'Three', args: ['three'] }, + ]); + + await render(template); - return wait().then(() => { assert.equal( findAll('[data-test-breadcrumb]')[1].textContent.trim(), - 'Two', - 'Promise breadcrumb has resolved and now renders Two' + '…', + 'Promise breadcrumb is in a loading state' ); + + resolvePromise({ label: 'Two', args: ['two'] }); + + return settled().then(() => { + assert.equal( + findAll('[data-test-breadcrumb]')[1].textContent.trim(), + 'Two', + 'Promise breadcrumb has resolved and now renders Two' + ); + }); }); }); diff --git a/ui/tests/integration/attributes-table-test.js b/ui/tests/integration/attributes-table-test.js index b7f59464c4a..626a2c7b7a2 100644 --- a/ui/tests/integration/attributes-table-test.js +++ b/ui/tests/integration/attributes-table-test.js @@ -1,83 +1,85 @@ import { find, findAll } from 'ember-native-dom-helpers'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; import flat from 'flat'; const { flatten } = flat; -moduleForComponent('attributes-table', 'Integration | Component | attributes table', { - integration: true, -}); +module('Integration | Component | attributes table', function(hooks) { + setupRenderingTest(hooks); -const commonAttributes = { - key: 'value', - nested: { - props: 'are', - supported: 'just', - fine: null, - }, - so: { - are: { - deeply: { - nested: 'properties', - like: 'these ones', + const commonAttributes = { + key: 'value', + nested: { + props: 'are', + supported: 'just', + fine: null, + }, + so: { + are: { + deeply: { + nested: 'properties', + like: 'these ones', + }, }, }, - }, -}; + }; -test('should render a row for each key/value pair in a deep object', function(assert) { - this.set('attributes', commonAttributes); - this.render(hbs`{{attributes-table attributes=attributes}}`); + test('should render a row for each key/value pair in a deep object', async function(assert) { + this.set('attributes', commonAttributes); + await render(hbs`{{attributes-table attributes=attributes}}`); - const rowsCount = Object.keys(flatten(commonAttributes)).length; - assert.equal( - this.$('[data-test-attributes-section]').has('[data-test-value]').length, - rowsCount, - `Table has ${rowsCount} rows with values` - ); -}); + const rowsCount = Object.keys(flatten(commonAttributes)).length; + assert.equal( + this.$('[data-test-attributes-section]').has('[data-test-value]').length, + rowsCount, + `Table has ${rowsCount} rows with values` + ); + }); -test('should render the full path of key/value pair from the root of the object', function(assert) { - this.set('attributes', commonAttributes); - this.render(hbs`{{attributes-table attributes=attributes}}`); + test('should render the full path of key/value pair from the root of the object', async function(assert) { + this.set('attributes', commonAttributes); + await render(hbs`{{attributes-table attributes=attributes}}`); - assert.equal(find('[data-test-key]').textContent.trim(), 'key', 'Row renders the key'); - assert.equal(find('[data-test-value]').textContent.trim(), 'value', 'Row renders the value'); + assert.equal(find('[data-test-key]').textContent.trim(), 'key', 'Row renders the key'); + assert.equal(find('[data-test-value]').textContent.trim(), 'value', 'Row renders the value'); - const deepRow = findAll('[data-test-attributes-section]')[8]; - assert.equal( - deepRow.querySelector('[data-test-key]').textContent.trim(), - 'so.are.deeply.nested', - 'Complex row renders the full path to the key' - ); - assert.equal( - deepRow.querySelector('[data-test-prefix]').textContent.trim(), - 'so.are.deeply.', - 'The prefix is faded to put emphasis on the attribute' - ); - assert.equal(deepRow.querySelector('[data-test-value]').textContent.trim(), 'properties'); -}); + const deepRow = findAll('[data-test-attributes-section]')[8]; + assert.equal( + deepRow.querySelector('[data-test-key]').textContent.trim(), + 'so.are.deeply.nested', + 'Complex row renders the full path to the key' + ); + assert.equal( + deepRow.querySelector('[data-test-prefix]').textContent.trim(), + 'so.are.deeply.', + 'The prefix is faded to put emphasis on the attribute' + ); + assert.equal(deepRow.querySelector('[data-test-value]').textContent.trim(), 'properties'); + }); -test('should render a row for key/value pairs even when the value is another object', function(assert) { - this.set('attributes', commonAttributes); - this.render(hbs`{{attributes-table attributes=attributes}}`); + test('should render a row for key/value pairs even when the value is another object', async function(assert) { + this.set('attributes', commonAttributes); + await render(hbs`{{attributes-table attributes=attributes}}`); - const countOfParentRows = countOfParentKeys(commonAttributes); - assert.equal( - findAll('[data-test-heading]').length, - countOfParentRows, - 'Each key for a nested object gets a row with no value' - ); -}); + const countOfParentRows = countOfParentKeys(commonAttributes); + assert.equal( + findAll('[data-test-heading]').length, + countOfParentRows, + 'Each key for a nested object gets a row with no value' + ); + }); -function countOfParentKeys(obj) { - return Object.keys(obj).reduce((count, key) => { - const value = obj[key]; - return isObject(value) ? count + 1 + countOfParentKeys(value) : count; - }, 0); -} + function countOfParentKeys(obj) { + return Object.keys(obj).reduce((count, key) => { + const value = obj[key]; + return isObject(value) ? count + 1 + countOfParentKeys(value) : count; + }, 0); + } -function isObject(value) { - return !Array.isArray(value) && value != null && typeof value === 'object'; -} + function isObject(value) { + return !Array.isArray(value) && value != null && typeof value === 'object'; + } +}); diff --git a/ui/tests/integration/job-diff-test.js b/ui/tests/integration/job-diff-test.js index d311ca4f235..b958a26d721 100644 --- a/ui/tests/integration/job-diff-test.js +++ b/ui/tests/integration/job-diff-test.js @@ -1,195 +1,197 @@ import { findAll, find } from 'ember-native-dom-helpers'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; import cleanWhitespace from '../utils/clean-whitespace'; -moduleForComponent('job-diff', 'Integration | Component | job diff', { - integration: true, -}); +module('Integration | Component | job diff', function(hooks) { + setupRenderingTest(hooks); -const commonTemplate = hbs` -
-
- {{job-diff diff=diff}} + const commonTemplate = hbs` +
+
+ {{job-diff diff=diff}} +
-
-`; - -test('job field diffs', function(assert) { - this.set('diff', { - ID: 'test-case-1', - Type: 'Edited', - Objects: null, - Fields: [ - field('Removed Field', 'deleted', 12), - field('Added Field', 'added', 'Foobar'), - field('Edited Field', 'edited', 512, 256), - ], - }); + `; - this.render(commonTemplate); + test('job field diffs', async function(assert) { + this.set('diff', { + ID: 'test-case-1', + Type: 'Edited', + Objects: null, + Fields: [ + field('Removed Field', 'deleted', 12), + field('Added Field', 'added', 'Foobar'), + field('Edited Field', 'edited', 512, 256), + ], + }); - assert.equal( - findAll('[data-test-diff-section-label]').length, - 5, - 'A section label for each line, plus one for the group' - ); - assert.equal( - cleanWhitespace( - find('[data-test-diff-section-label="field"][data-test-diff-field="added"]').textContent - ), - '+ Added Field: "Foobar"', - 'Added field is rendered correctly' - ); - assert.equal( - cleanWhitespace( - find('[data-test-diff-section-label="field"][data-test-diff-field="edited"]').textContent - ), - '+/- Edited Field: "256" => "512"', - 'Edited field is rendered correctly' - ); - assert.equal( - cleanWhitespace( - find('[data-test-diff-section-label="field"][data-test-diff-field="deleted"]').textContent - ), - '- Removed Field: "12"', - 'Removed field is rendered correctly' - ); -}); + await render(commonTemplate); -test('job object diffs', function(assert) { - this.set('diff', { - ID: 'test-case-2', - Type: 'Edited', - Objects: [ - { - Name: 'ComplexProperty', - Type: 'Edited', - Objects: null, - Fields: [ - field('Prop 1', 'added', 'prop-1-value'), - field('Prop 2', 'none', 'prop-2-is-the-same'), - field('Prop 3', 'edited', 'new value', 'some old value'), - field('Prop 4', 'deleted', 'delete me'), - ], - }, - { - Name: 'DeepConfiguration', - Type: 'Added', - Objects: [ - { - Name: 'VP Props', - Type: 'Added', - Objects: null, - Fields: [ - field('Engineering', 'added', 'Regina Phalange'), - field('Customer Support', 'added', 'Jerome Hendricks'), - field('HR', 'added', 'Jack Blue'), - field('Sales', 'added', 'Maria Lopez'), - ], - }, - ], - Fields: [field('Executive Prop', 'added', 'in charge')], - }, - { - Name: 'DatedStuff', - Type: 'Deleted', - Objects: null, - Fields: [field('Deprecated', 'deleted', 'useless')], - }, - ], - Fields: null, + assert.equal( + findAll('[data-test-diff-section-label]').length, + 5, + 'A section label for each line, plus one for the group' + ); + assert.equal( + cleanWhitespace( + find('[data-test-diff-section-label="field"][data-test-diff-field="added"]').textContent + ), + '+ Added Field: "Foobar"', + 'Added field is rendered correctly' + ); + assert.equal( + cleanWhitespace( + find('[data-test-diff-section-label="field"][data-test-diff-field="edited"]').textContent + ), + '+/- Edited Field: "256" => "512"', + 'Edited field is rendered correctly' + ); + assert.equal( + cleanWhitespace( + find('[data-test-diff-section-label="field"][data-test-diff-field="deleted"]').textContent + ), + '- Removed Field: "12"', + 'Removed field is rendered correctly' + ); }); - this.render(commonTemplate); + test('job object diffs', async function(assert) { + this.set('diff', { + ID: 'test-case-2', + Type: 'Edited', + Objects: [ + { + Name: 'ComplexProperty', + Type: 'Edited', + Objects: null, + Fields: [ + field('Prop 1', 'added', 'prop-1-value'), + field('Prop 2', 'none', 'prop-2-is-the-same'), + field('Prop 3', 'edited', 'new value', 'some old value'), + field('Prop 4', 'deleted', 'delete me'), + ], + }, + { + Name: 'DeepConfiguration', + Type: 'Added', + Objects: [ + { + Name: 'VP Props', + Type: 'Added', + Objects: null, + Fields: [ + field('Engineering', 'added', 'Regina Phalange'), + field('Customer Support', 'added', 'Jerome Hendricks'), + field('HR', 'added', 'Jack Blue'), + field('Sales', 'added', 'Maria Lopez'), + ], + }, + ], + Fields: [field('Executive Prop', 'added', 'in charge')], + }, + { + Name: 'DatedStuff', + Type: 'Deleted', + Objects: null, + Fields: [field('Deprecated', 'deleted', 'useless')], + }, + ], + Fields: null, + }); - assert.ok( - cleanWhitespace( - find('[data-test-diff-section-label="object"][data-test-diff-field="added"]').textContent - ).startsWith('+ DeepConfiguration {'), - 'Added object starts with a JSON block' - ); - assert.ok( - cleanWhitespace( - find('[data-test-diff-section-label="object"][data-test-diff-field="edited"]').textContent - ).startsWith('+/- ComplexProperty {'), - 'Edited object starts with a JSON block' - ); - assert.ok( - cleanWhitespace( - find('[data-test-diff-section-label="object"][data-test-diff-field="deleted"]').textContent - ).startsWith('- DatedStuff {'), - 'Removed object starts with a JSON block' - ); + await render(commonTemplate); - assert.ok( - cleanWhitespace( - find('[data-test-diff-section-label="object"][data-test-diff-field="added"]').textContent - ).endsWith('}'), - 'Added object ends the JSON block' - ); - assert.ok( - cleanWhitespace( - find('[data-test-diff-section-label="object"][data-test-diff-field="edited"]').textContent - ).endsWith('}'), - 'Edited object starts with a JSON block' - ); - assert.ok( - cleanWhitespace( - find('[data-test-diff-section-label="object"][data-test-diff-field="deleted"]').textContent - ).endsWith('}'), - 'Removed object ends the JSON block' - ); + assert.ok( + cleanWhitespace( + find('[data-test-diff-section-label="object"][data-test-diff-field="added"]').textContent + ).startsWith('+ DeepConfiguration {'), + 'Added object starts with a JSON block' + ); + assert.ok( + cleanWhitespace( + find('[data-test-diff-section-label="object"][data-test-diff-field="edited"]').textContent + ).startsWith('+/- ComplexProperty {'), + 'Edited object starts with a JSON block' + ); + assert.ok( + cleanWhitespace( + find('[data-test-diff-section-label="object"][data-test-diff-field="deleted"]').textContent + ).startsWith('- DatedStuff {'), + 'Removed object starts with a JSON block' + ); - assert.equal( - findAll( - '[data-test-diff-section-label="object"][data-test-diff-field="added"] > [data-test-diff-section-label]' - ).length, - this.get('diff').Objects[1].Objects.length + this.get('diff').Objects[1].Fields.length, - 'Edited block contains each nested field and object' - ); + assert.ok( + cleanWhitespace( + find('[data-test-diff-section-label="object"][data-test-diff-field="added"]').textContent + ).endsWith('}'), + 'Added object ends the JSON block' + ); + assert.ok( + cleanWhitespace( + find('[data-test-diff-section-label="object"][data-test-diff-field="edited"]').textContent + ).endsWith('}'), + 'Edited object starts with a JSON block' + ); + assert.ok( + cleanWhitespace( + find('[data-test-diff-section-label="object"][data-test-diff-field="deleted"]').textContent + ).endsWith('}'), + 'Removed object ends the JSON block' + ); - assert.equal( - findAll( - '[data-test-diff-section-label="object"][data-test-diff-field="added"] [data-test-diff-section-label="object"] [data-test-diff-section-label="field"]' - ).length, - this.get('diff').Objects[1].Objects[0].Fields.length, - 'Objects within objects are rendered' - ); -}); + assert.equal( + findAll( + '[data-test-diff-section-label="object"][data-test-diff-field="added"] > [data-test-diff-section-label]' + ).length, + this.get('diff').Objects[1].Objects.length + this.get('diff').Objects[1].Fields.length, + 'Edited block contains each nested field and object' + ); + + assert.equal( + findAll( + '[data-test-diff-section-label="object"][data-test-diff-field="added"] [data-test-diff-section-label="object"] [data-test-diff-section-label="field"]' + ).length, + this.get('diff').Objects[1].Objects[0].Fields.length, + 'Objects within objects are rendered' + ); + }); -function field(name, type, newVal, oldVal) { - switch (type) { - case 'added': - return { - Annotations: null, - New: newVal, - Old: '', - Type: 'Added', - Name: name, - }; - case 'deleted': - return { - Annotations: null, - New: '', - Old: newVal, - Type: 'Deleted', - Name: name, - }; - case 'edited': - return { - Annotations: null, - New: newVal, - Old: oldVal, - Type: 'Edited', - Name: name, - }; + function field(name, type, newVal, oldVal) { + switch (type) { + case 'added': + return { + Annotations: null, + New: newVal, + Old: '', + Type: 'Added', + Name: name, + }; + case 'deleted': + return { + Annotations: null, + New: '', + Old: newVal, + Type: 'Deleted', + Name: name, + }; + case 'edited': + return { + Annotations: null, + New: newVal, + Old: oldVal, + Type: 'Edited', + Name: name, + }; + } + return { + Annotations: null, + New: newVal, + Old: oldVal, + Type: 'None', + Name: name, + }; } - return { - Annotations: null, - New: newVal, - Old: oldVal, - Type: 'None', - Name: name, - }; -} +}); diff --git a/ui/tests/integration/job-editor-test.js b/ui/tests/integration/job-editor-test.js index 9513a650e54..4dd75508b66 100644 --- a/ui/tests/integration/job-editor-test.js +++ b/ui/tests/integration/job-editor-test.js @@ -1,8 +1,9 @@ import { getOwner } from '@ember/application'; import { assign } from '@ember/polyfills'; import { run } from '@ember/runloop'; -import { test, moduleForComponent } from 'ember-qunit'; -import wait from 'ember-test-helpers/wait'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { settled } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; import { create } from 'ember-cli-page-object'; import sinon from 'sinon'; @@ -13,480 +14,482 @@ import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initialize const Editor = create(jobEditor()); -moduleForComponent('job-editor', 'Integration | Component | job-editor', { - integration: true, - beforeEach() { +module('Integration | Component | job-editor', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { window.localStorage.clear(); - fragmentSerializerInitializer(getOwner(this)); + fragmentSerializerInitializer(this.owner); // Normally getCodeMirrorInstance is a registered test helper, // but those registered test helpers only work in acceptance tests. window._getCodeMirrorInstance = window.getCodeMirrorInstance; - window.getCodeMirrorInstance = getCodeMirrorInstance(getOwner(this)); + window.getCodeMirrorInstance = getCodeMirrorInstance(this.owner); - this.store = getOwner(this).lookup('service:store'); + this.store = this.owner.lookup('service:store'); this.server = startMirage(); // Required for placing allocations (a result of creating jobs) this.server.create('node'); Editor.setContext(this); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); Editor.removeContext(); window.getCodeMirrorInstance = window._getCodeMirrorInstance; delete window._getCodeMirrorInstance; - }, -}); - -const newJobName = 'new-job'; -const newJobTaskGroupName = 'redis'; -const jsonJob = overrides => { - return JSON.stringify( - assign( - {}, - { - Name: newJobName, - Namespace: 'default', - Datacenters: ['dc1'], - Priority: 50, - TaskGroups: [ - { - Name: newJobTaskGroupName, - Tasks: [ - { - Name: 'redis', - Driver: 'docker', - }, - ], - }, - ], - }, - overrides - ), - null, - 2 - ); -}; - -const hclJob = () => ` -job "${newJobName}" { - namespace = "default" - datacenters = ["dc1"] - - task "${newJobTaskGroupName}" { - driver = "docker" - } -} -`; - -const commonTemplate = hbs` - {{job-editor - job=job - context=context - onSubmit=onSubmit}} -`; - -const cancelableTemplate = hbs` - {{job-editor - job=job - context=context - cancelable=true - onSubmit=onSubmit - onCancel=onCancel}} -`; - -const renderNewJob = (component, job) => () => { - component.setProperties({ job, onSubmit: sinon.spy(), context: 'new' }); - component.render(commonTemplate); - return wait(); -}; - -const renderEditJob = (component, job) => () => { - component.setProperties({ job, onSubmit: sinon.spy(), onCancel: sinon.spy(), context: 'edit' }); - component.render(cancelableTemplate); -}; - -const planJob = spec => () => { - Editor.editor.fillIn(spec); - return wait().then(() => { - Editor.plan(); - return wait(); }); -}; -test('the default state is an editor with an explanation popup', function(assert) { - let job; - run(() => { - job = this.store.createRecord('job'); - }); + const newJobName = 'new-job'; + const newJobTaskGroupName = 'redis'; + const jsonJob = overrides => { + return JSON.stringify( + assign( + {}, + { + Name: newJobName, + Namespace: 'default', + Datacenters: ['dc1'], + Priority: 50, + TaskGroups: [ + { + Name: newJobTaskGroupName, + Tasks: [ + { + Name: 'redis', + Driver: 'docker', + }, + ], + }, + ], + }, + overrides + ), + null, + 2 + ); + }; + + const hclJob = () => ` + job "${newJobName}" { + namespace = "default" + datacenters = ["dc1"] + + task "${newJobTaskGroupName}" { + driver = "docker" + } + } + `; + + const commonTemplate = hbs` + {{job-editor + job=job + context=context + onSubmit=onSubmit}} + `; + + const cancelableTemplate = hbs` + {{job-editor + job=job + context=context + cancelable=true + onSubmit=onSubmit + onCancel=onCancel}} + `; + + const renderNewJob = (component, job) => () => { + component.setProperties({ job, onSubmit: sinon.spy(), context: 'new' }); + component.render(commonTemplate); + return settled(); + }; + + const renderEditJob = (component, job) => () => { + component.setProperties({ job, onSubmit: sinon.spy(), onCancel: sinon.spy(), context: 'edit' }); + component.render(cancelableTemplate); + }; + + const planJob = spec => () => { + Editor.editor.fillIn(spec); + return settled().then(() => { + Editor.plan(); + return settled(); + }); + }; - return wait() - .then(renderNewJob(this, job)) - .then(() => { - assert.ok(Editor.editorHelp.isPresent, 'Editor explanation popup is present'); - assert.ok(Editor.editor.isPresent, 'Editor is present'); + test('the default state is an editor with an explanation popup', function(assert) { + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('the explanation popup can be dismissed', function(assert) { - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(() => { + assert.ok(Editor.editorHelp.isPresent, 'Editor explanation popup is present'); + assert.ok(Editor.editor.isPresent, 'Editor is present'); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(() => { - Editor.editorHelp.dismiss(); - return wait(); - }) - .then(() => { - assert.notOk(Editor.editorHelp.isPresent, 'Editor explanation popup is gone'); - assert.equal( - window.localStorage.nomadMessageJobEditor, - 'false', - 'Dismissal is persisted in localStorage' - ); + test('the explanation popup can be dismissed', function(assert) { + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); - -test('the explanation popup is not shown once the dismissal state is set in localStorage', function(assert) { - window.localStorage.nomadMessageJobEditor = 'false'; - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(() => { + Editor.editorHelp.dismiss(); + return settled(); + }) + .then(() => { + assert.notOk(Editor.editorHelp.isPresent, 'Editor explanation popup is gone'); + assert.equal( + window.localStorage.nomadMessageJobEditor, + 'false', + 'Dismissal is persisted in localStorage' + ); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(() => { - assert.notOk(Editor.editorHelp.isPresent, 'Editor explanation popup is gone'); + test('the explanation popup is not shown once the dismissal state is set in localStorage', function(assert) { + window.localStorage.nomadMessageJobEditor = 'false'; + + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('submitting a json job skips the parse endpoint', function(assert) { - const spec = jsonJob(); - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(() => { + assert.notOk(Editor.editorHelp.isPresent, 'Editor explanation popup is gone'); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - const requests = this.server.pretender.handledRequests.mapBy('url'); - assert.notOk(requests.includes('/v1/jobs/parse'), 'JSON job spec is not parsed'); - assert.ok(requests.includes(`/v1/job/${newJobName}/plan`), 'JSON job spec is still planned'); + test('submitting a json job skips the parse endpoint', function(assert) { + const spec = jsonJob(); + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('submitting an hcl job requires the parse endpoint', function(assert) { - const spec = hclJob(); - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + const requests = this.server.pretender.handledRequests.mapBy('url'); + assert.notOk(requests.includes('/v1/jobs/parse'), 'JSON job spec is not parsed'); + assert.ok(requests.includes(`/v1/job/${newJobName}/plan`), 'JSON job spec is still planned'); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - const requests = this.server.pretender.handledRequests.mapBy('url'); - assert.ok(requests.includes('/v1/jobs/parse'), 'HCL job spec is parsed first'); - assert.ok(requests.includes(`/v1/job/${newJobName}/plan`), 'HCL job spec is planned'); - assert.ok( - requests.indexOf('/v1/jobs/parse') < requests.indexOf(`/v1/job/${newJobName}/plan`), - 'Parse comes before Plan' - ); + test('submitting an hcl job requires the parse endpoint', function(assert) { + const spec = hclJob(); + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('when a job is successfully parsed and planned, the plan is shown to the user', function(assert) { - const spec = hclJob(); - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + const requests = this.server.pretender.handledRequests.mapBy('url'); + assert.ok(requests.includes('/v1/jobs/parse'), 'HCL job spec is parsed first'); + assert.ok(requests.includes(`/v1/job/${newJobName}/plan`), 'HCL job spec is planned'); + assert.ok( + requests.indexOf('/v1/jobs/parse') < requests.indexOf(`/v1/job/${newJobName}/plan`), + 'Parse comes before Plan' + ); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - assert.ok(Editor.planOutput, 'The plan is outputted'); - assert.notOk(Editor.editor.isPresent, 'The editor is replaced with the plan output'); - assert.ok(Editor.planHelp.isPresent, 'The plan explanation popup is shown'); + test('when a job is successfully parsed and planned, the plan is shown to the user', function(assert) { + const spec = hclJob(); + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('from the plan screen, the cancel button goes back to the editor with the job still in tact', function(assert) { - const spec = hclJob(); - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + assert.ok(Editor.planOutput, 'The plan is outputted'); + assert.notOk(Editor.editor.isPresent, 'The editor is replaced with the plan output'); + assert.ok(Editor.planHelp.isPresent, 'The plan explanation popup is shown'); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - Editor.cancel(); - return wait(); - }) - .then(() => { - assert.ok(Editor.editor.isPresent, 'The editor is shown again'); - assert.equal( - Editor.editor.contents, - spec, - 'The spec that was planned is still in the editor' - ); + test('from the plan screen, the cancel button goes back to the editor with the job still in tact', function(assert) { + const spec = hclJob(); + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('when parse fails, the parse error message is shown', function(assert) { - const spec = hclJob(); - const errorMessage = 'Parse Failed!! :o'; - - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + Editor.cancel(); + return settled(); + }) + .then(() => { + assert.ok(Editor.editor.isPresent, 'The editor is shown again'); + assert.equal( + Editor.editor.contents, + spec, + 'The spec that was planned is still in the editor' + ); + }); }); - this.server.pretender.post('/v1/jobs/parse', () => [400, {}, errorMessage]); - - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - assert.notOk(Editor.planError.isPresent, 'Plan error is not shown'); - assert.notOk(Editor.runError.isPresent, 'Run error is not shown'); - - assert.ok(Editor.parseError.isPresent, 'Parse error is shown'); - assert.equal( - Editor.parseError.message, - errorMessage, - 'The error message from the server is shown in the error in the UI' - ); - }); -}); + test('when parse fails, the parse error message is shown', function(assert) { + const spec = hclJob(); + const errorMessage = 'Parse Failed!! :o'; -test('when plan fails, the plan error message is shown', function(assert) { - const spec = hclJob(); - const errorMessage = 'Plan Failed!! :o'; + let job; + run(() => { + job = this.store.createRecord('job'); + }); - let job; - run(() => { - job = this.store.createRecord('job'); + this.server.pretender.post('/v1/jobs/parse', () => [400, {}, errorMessage]); + + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + assert.notOk(Editor.planError.isPresent, 'Plan error is not shown'); + assert.notOk(Editor.runError.isPresent, 'Run error is not shown'); + + assert.ok(Editor.parseError.isPresent, 'Parse error is shown'); + assert.equal( + Editor.parseError.message, + errorMessage, + 'The error message from the server is shown in the error in the UI' + ); + }); }); - this.server.pretender.post(`/v1/job/${newJobName}/plan`, () => [400, {}, errorMessage]); - - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - assert.notOk(Editor.parseError.isPresent, 'Parse error is not shown'); - assert.notOk(Editor.runError.isPresent, 'Run error is not shown'); - - assert.ok(Editor.planError.isPresent, 'Plan error is shown'); - assert.equal( - Editor.planError.message, - errorMessage, - 'The error message from the server is shown in the error in the UI' - ); - }); -}); + test('when plan fails, the plan error message is shown', function(assert) { + const spec = hclJob(); + const errorMessage = 'Plan Failed!! :o'; -test('when run fails, the run error message is shown', function(assert) { - const spec = hclJob(); - const errorMessage = 'Run Failed!! :o'; + let job; + run(() => { + job = this.store.createRecord('job'); + }); - let job; - run(() => { - job = this.store.createRecord('job'); + this.server.pretender.post(`/v1/job/${newJobName}/plan`, () => [400, {}, errorMessage]); + + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + assert.notOk(Editor.parseError.isPresent, 'Parse error is not shown'); + assert.notOk(Editor.runError.isPresent, 'Run error is not shown'); + + assert.ok(Editor.planError.isPresent, 'Plan error is shown'); + assert.equal( + Editor.planError.message, + errorMessage, + 'The error message from the server is shown in the error in the UI' + ); + }); }); - this.server.pretender.post('/v1/jobs', () => [400, {}, errorMessage]); - - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - Editor.run(); - return wait(); - }) - .then(() => { - assert.notOk(Editor.planError.isPresent, 'Plan error is not shown'); - assert.notOk(Editor.parseError.isPresent, 'Parse error is not shown'); - - assert.ok(Editor.runError.isPresent, 'Run error is shown'); - assert.equal( - Editor.runError.message, - errorMessage, - 'The error message from the server is shown in the error in the UI' - ); + test('when run fails, the run error message is shown', function(assert) { + const spec = hclJob(); + const errorMessage = 'Run Failed!! :o'; + + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('when the scheduler dry-run has warnings, the warnings are shown to the user', function(assert) { - const spec = jsonJob({ Unschedulable: true }); - let job; - run(() => { - job = this.store.createRecord('job'); + this.server.pretender.post('/v1/jobs', () => [400, {}, errorMessage]); + + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + Editor.run(); + return settled(); + }) + .then(() => { + assert.notOk(Editor.planError.isPresent, 'Plan error is not shown'); + assert.notOk(Editor.parseError.isPresent, 'Parse error is not shown'); + + assert.ok(Editor.runError.isPresent, 'Run error is shown'); + assert.equal( + Editor.runError.message, + errorMessage, + 'The error message from the server is shown in the error in the UI' + ); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - assert.ok( - Editor.dryRunMessage.errored, - 'The scheduler dry-run message is in the warning state' - ); - assert.notOk( - Editor.dryRunMessage.succeeded, - 'The success message is not shown in addition to the warning message' - ); - assert.ok( - Editor.dryRunMessage.body.includes(newJobTaskGroupName), - 'The scheduler dry-run message includes the warning from send back by the API' - ); + test('when the scheduler dry-run has warnings, the warnings are shown to the user', function(assert) { + const spec = jsonJob({ Unschedulable: true }); + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('when the scheduler dry-run has no warnings, a success message is shown to the user', function(assert) { - const spec = hclJob(); - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + assert.ok( + Editor.dryRunMessage.errored, + 'The scheduler dry-run message is in the warning state' + ); + assert.notOk( + Editor.dryRunMessage.succeeded, + 'The success message is not shown in addition to the warning message' + ); + assert.ok( + Editor.dryRunMessage.body.includes(newJobTaskGroupName), + 'The scheduler dry-run message includes the warning from send back by the API' + ); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - assert.ok( - Editor.dryRunMessage.succeeded, - 'The scheduler dry-run message is in the success state' - ); - assert.notOk( - Editor.dryRunMessage.errored, - 'The warning message is not shown in addition to the success message' - ); + test('when the scheduler dry-run has no warnings, a success message is shown to the user', function(assert) { + const spec = hclJob(); + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('when a job is submitted in the edit context, a POST request is made to the update job endpoint', function(assert) { - const spec = hclJob(); - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + assert.ok( + Editor.dryRunMessage.succeeded, + 'The scheduler dry-run message is in the success state' + ); + assert.notOk( + Editor.dryRunMessage.errored, + 'The warning message is not shown in addition to the success message' + ); + }); }); - return wait() - .then(renderEditJob(this, job)) - .then(planJob(spec)) - .then(() => { - Editor.run(); - }) - .then(() => { - const requests = this.server.pretender.handledRequests - .filterBy('method', 'POST') - .mapBy('url'); - assert.ok(requests.includes(`/v1/job/${newJobName}`), 'A request was made to job update'); - assert.notOk(requests.includes('/v1/jobs'), 'A request was not made to job create'); + test('when a job is submitted in the edit context, a POST request is made to the update job endpoint', function(assert) { + const spec = hclJob(); + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('when a job is submitted in the new context, a POST request is made to the create job endpoint', function(assert) { - const spec = hclJob(); - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderEditJob(this, job)) + .then(planJob(spec)) + .then(() => { + Editor.run(); + }) + .then(() => { + const requests = this.server.pretender.handledRequests + .filterBy('method', 'POST') + .mapBy('url'); + assert.ok(requests.includes(`/v1/job/${newJobName}`), 'A request was made to job update'); + assert.notOk(requests.includes('/v1/jobs'), 'A request was not made to job create'); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - Editor.run(); - }) - .then(() => { - const requests = this.server.pretender.handledRequests - .filterBy('method', 'POST') - .mapBy('url'); - assert.ok(requests.includes('/v1/jobs'), 'A request was made to job create'); - assert.notOk( - requests.includes(`/v1/job/${newJobName}`), - 'A request was not made to job update' - ); + test('when a job is submitted in the new context, a POST request is made to the create job endpoint', function(assert) { + const spec = hclJob(); + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('when a job is successfully submitted, the onSubmit hook is called', function(assert) { - const spec = hclJob(); - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + Editor.run(); + }) + .then(() => { + const requests = this.server.pretender.handledRequests + .filterBy('method', 'POST') + .mapBy('url'); + assert.ok(requests.includes('/v1/jobs'), 'A request was made to job create'); + assert.notOk( + requests.includes(`/v1/job/${newJobName}`), + 'A request was not made to job update' + ); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - Editor.run(); - return wait(); - }) - .then(() => { - assert.ok( - this.get('onSubmit').calledWith(newJobName, 'default'), - 'The onSubmit hook was called with the correct arguments' - ); + test('when a job is successfully submitted, the onSubmit hook is called', function(assert) { + const spec = hclJob(); + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('when the job-editor cancelable flag is false, there is no cancel button in the header', function(assert) { - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(planJob(spec)) + .then(() => { + Editor.run(); + return settled(); + }) + .then(() => { + assert.ok( + this.get('onSubmit').calledWith(newJobName, 'default'), + 'The onSubmit hook was called with the correct arguments' + ); + }); }); - return wait() - .then(renderNewJob(this, job)) - .then(() => { - assert.notOk(Editor.cancelEditingIsAvailable, 'No way to cancel editing'); + test('when the job-editor cancelable flag is false, there is no cancel button in the header', function(assert) { + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('when the job-editor cancelable flag is true, there is a cancel button in the header', function(assert) { - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderNewJob(this, job)) + .then(() => { + assert.notOk(Editor.cancelEditingIsAvailable, 'No way to cancel editing'); + }); }); - return wait() - .then(renderEditJob(this, job)) - .then(() => { - assert.ok(Editor.cancelEditingIsAvailable, 'Cancel editing button exists'); + test('when the job-editor cancelable flag is true, there is a cancel button in the header', function(assert) { + let job; + run(() => { + job = this.store.createRecord('job'); }); -}); -test('when the job-editor cancel button is clicked, the onCancel hook is called', function(assert) { - let job; - run(() => { - job = this.store.createRecord('job'); + return settled() + .then(renderEditJob(this, job)) + .then(() => { + assert.ok(Editor.cancelEditingIsAvailable, 'Cancel editing button exists'); + }); }); - return wait() - .then(renderEditJob(this, job)) - .then(() => { - Editor.cancelEditing(); - }) - .then(() => { - assert.ok(this.get('onCancel').calledOnce, 'The onCancel hook was called'); + test('when the job-editor cancel button is clicked, the onCancel hook is called', function(assert) { + let job; + run(() => { + job = this.store.createRecord('job'); }); + + return settled() + .then(renderEditJob(this, job)) + .then(() => { + Editor.cancelEditing(); + }) + .then(() => { + assert.ok(this.get('onCancel').calledOnce, 'The onCancel hook was called'); + }); + }); }); diff --git a/ui/tests/integration/job-page/helpers.js b/ui/tests/integration/job-page/helpers.js index 21deb51b17e..5e33703dfb3 100644 --- a/ui/tests/integration/job-page/helpers.js +++ b/ui/tests/integration/job-page/helpers.js @@ -1,5 +1,5 @@ import { click, find } from 'ember-native-dom-helpers'; -import wait from 'ember-test-helpers/wait'; +import { settled } from '@ember/test-helpers'; export function jobURL(job, path = '') { const id = job.get('plainId'); @@ -13,17 +13,17 @@ export function jobURL(job, path = '') { export function stopJob() { click('[data-test-stop] [data-test-idle-button]'); - return wait().then(() => { + return settled().then(() => { click('[data-test-stop] [data-test-confirm-button]'); - return wait(); + return settled(); }); } export function startJob() { click('[data-test-start] [data-test-idle-button]'); - return wait().then(() => { + return settled().then(() => { click('[data-test-start] [data-test-confirm-button]'); - return wait(); + return settled(); }); } @@ -53,7 +53,7 @@ export function expectError(assert, title) { click('[data-test-job-error-close]'); assert.notOk(find('[data-test-job-error-title]'), 'Error message is dismissable'); - return wait(); + return settled(); }; } @@ -67,5 +67,5 @@ export function expectDeleteRequest(assert, server, job) { 'DELETE URL was made correctly' ); - return wait(); + return settled(); } diff --git a/ui/tests/integration/job-page/parts/body-test.js b/ui/tests/integration/job-page/parts/body-test.js index 6189dce66b2..3225366f2ce 100644 --- a/ui/tests/integration/job-page/parts/body-test.js +++ b/ui/tests/integration/job-page/parts/body-test.js @@ -1,105 +1,108 @@ import { run } from '@ember/runloop'; import { getOwner } from '@ember/application'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { find, findAll } from 'ember-native-dom-helpers'; -import wait from 'ember-test-helpers/wait'; import hbs from 'htmlbars-inline-precompile'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; -moduleForComponent('job-page/parts/body', 'Integration | Component | job-page/parts/body', { - integration: true, - beforeEach() { +module('Integration | Component | job-page/parts/body', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { window.localStorage.clear(); this.server = startMirage(); this.server.createList('namespace', 3); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); window.localStorage.clear(); - }, -}); + }); -test('includes a subnav for the job', function(assert) { - this.set('job', {}); + test('includes a subnav for the job', async function(assert) { + this.set('job', {}); - this.render(hbs` - {{#job-page/parts/body job=job}} -
Inner content
- {{/job-page/parts/body}} - `); + await render(hbs` + {{#job-page/parts/body job=job}} +
Inner content
+ {{/job-page/parts/body}} + `); - return wait().then(() => { - assert.ok(find('[data-test-subnav="job"]'), 'Job subnav is rendered'); + return settled().then(() => { + assert.ok(find('[data-test-subnav="job"]'), 'Job subnav is rendered'); + }); }); -}); -test('the subnav includes the deployments link when the job is a service', function(assert) { - const store = getOwner(this).lookup('service:store'); - let job; + test('the subnav includes the deployments link when the job is a service', async function(assert) { + const store = this.owner.lookup('service:store'); + let job; - run(() => { - job = store.createRecord('job', { - id: 'service-job', - type: 'service', + run(() => { + job = store.createRecord('job', { + id: 'service-job', + type: 'service', + }); }); - }); - this.set('job', job); + this.set('job', job); - this.render(hbs` - {{#job-page/parts/body job=job}} -
Inner content
- {{/job-page/parts/body}} - `); + await render(hbs` + {{#job-page/parts/body job=job}} +
Inner content
+ {{/job-page/parts/body}} + `); - return wait().then(() => { - const subnavLabels = findAll('[data-test-tab]').map(anchor => anchor.textContent); - assert.ok(subnavLabels.some(label => label === 'Definition'), 'Definition link'); - assert.ok(subnavLabels.some(label => label === 'Versions'), 'Versions link'); - assert.ok(subnavLabels.some(label => label === 'Deployments'), 'Deployments link'); + return settled().then(() => { + const subnavLabels = findAll('[data-test-tab]').map(anchor => anchor.textContent); + assert.ok(subnavLabels.some(label => label === 'Definition'), 'Definition link'); + assert.ok(subnavLabels.some(label => label === 'Versions'), 'Versions link'); + assert.ok(subnavLabels.some(label => label === 'Deployments'), 'Deployments link'); + }); }); -}); -test('the subnav does not include the deployments link when the job is not a service', function(assert) { - const store = getOwner(this).lookup('service:store'); - let job; + test('the subnav does not include the deployments link when the job is not a service', async function(assert) { + const store = this.owner.lookup('service:store'); + let job; - run(() => { - job = store.createRecord('job', { - id: 'batch-job', - type: 'batch', + run(() => { + job = store.createRecord('job', { + id: 'batch-job', + type: 'batch', + }); }); - }); - this.set('job', job); + this.set('job', job); - this.render(hbs` - {{#job-page/parts/body job=job}} -
Inner content
- {{/job-page/parts/body}} - `); + await render(hbs` + {{#job-page/parts/body job=job}} +
Inner content
+ {{/job-page/parts/body}} + `); - return wait().then(() => { - const subnavLabels = findAll('[data-test-tab]').map(anchor => anchor.textContent); - assert.ok(subnavLabels.some(label => label === 'Definition'), 'Definition link'); - assert.ok(subnavLabels.some(label => label === 'Versions'), 'Versions link'); - assert.notOk(subnavLabels.some(label => label === 'Deployments'), 'Deployments link'); + return settled().then(() => { + const subnavLabels = findAll('[data-test-tab]').map(anchor => anchor.textContent); + assert.ok(subnavLabels.some(label => label === 'Definition'), 'Definition link'); + assert.ok(subnavLabels.some(label => label === 'Versions'), 'Versions link'); + assert.notOk(subnavLabels.some(label => label === 'Deployments'), 'Deployments link'); + }); }); -}); -test('body yields content to a section after the subnav', function(assert) { - this.set('job', {}); + test('body yields content to a section after the subnav', async function(assert) { + this.set('job', {}); - this.render(hbs` - {{#job-page/parts/body job=job}} -
Inner content
- {{/job-page/parts/body}} - `); + await render(hbs` + {{#job-page/parts/body job=job}} +
Inner content
+ {{/job-page/parts/body}} + `); - return wait().then(() => { - assert.ok( - find('[data-test-subnav="job"] + .section > .inner-content'), - 'Content is rendered immediately after the subnav' - ); + return settled().then(() => { + assert.ok( + find('[data-test-subnav="job"] + .section > .inner-content'), + 'Content is rendered immediately after the subnav' + ); + }); }); }); diff --git a/ui/tests/integration/job-page/parts/children-test.js b/ui/tests/integration/job-page/parts/children-test.js index 06fb9bcdcb7..74c6d37eb35 100644 --- a/ui/tests/integration/job-page/parts/children-test.js +++ b/ui/tests/integration/job-page/parts/children-test.js @@ -2,207 +2,210 @@ import { getOwner } from '@ember/application'; import { assign } from '@ember/polyfills'; import { run } from '@ember/runloop'; import hbs from 'htmlbars-inline-precompile'; -import wait from 'ember-test-helpers/wait'; import { findAll, find, click } from 'ember-native-dom-helpers'; import sinon from 'sinon'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; -moduleForComponent('job-page/parts/children', 'Integration | Component | job-page/parts/children', { - integration: true, - beforeEach() { +module('Integration | Component | job-page/parts/children', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { window.localStorage.clear(); - this.store = getOwner(this).lookup('service:store'); + this.store = this.owner.lookup('service:store'); this.server = startMirage(); this.server.create('namespace'); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); window.localStorage.clear(); - }, -}); - -const props = (job, options = {}) => - assign( - { - job, - sortProperty: 'name', - sortDescending: true, - currentPage: 1, - gotoJob: () => {}, - }, - options - ); - -test('lists each child', function(assert) { - let parent; - - this.server.create('job', 'periodic', { - id: 'parent', - childrenCount: 3, - createAllocations: false, }); - this.store.findAll('job'); + const props = (job, options = {}) => + assign( + { + job, + sortProperty: 'name', + sortDescending: true, + currentPage: 1, + gotoJob: () => {}, + }, + options + ); - return wait().then(() => { - run(() => { - parent = this.store.peekAll('job').findBy('plainId', 'parent'); - }); + test('lists each child', function(assert) { + let parent; - this.setProperties(props(parent)); - - this.render(hbs` - {{job-page/parts/children - job=job - sortProperty=sortProperty - sortDescending=sortDescending - currentPage=currentPage - gotoJob=gotoJob}} - `); - - return wait().then(() => { - assert.equal( - findAll('[data-test-job-name]').length, - parent.get('children.length'), - 'A row for each child' - ); + this.server.create('job', 'periodic', { + id: 'parent', + childrenCount: 3, + createAllocations: false, }); - }); -}); -test('eventually paginates', function(assert) { - let parent; + this.store.findAll('job'); - this.server.create('job', 'periodic', { - id: 'parent', - childrenCount: 11, - createAllocations: false, - }); + return settled().then(async () => { + run(() => { + parent = this.store.peekAll('job').findBy('plainId', 'parent'); + }); - this.store.findAll('job'); + this.setProperties(props(parent)); - return wait().then(() => { - run(() => { - parent = this.store.peekAll('job').findBy('plainId', 'parent'); - }); + await render(hbs` + {{job-page/parts/children + job=job + sortProperty=sortProperty + sortDescending=sortDescending + currentPage=currentPage + gotoJob=gotoJob}} + `); - this.setProperties(props(parent)); - - this.render(hbs` - {{job-page/parts/children - job=job - sortProperty=sortProperty - sortDescending=sortDescending - currentPage=currentPage - gotoJob=gotoJob}} - `); - - return wait().then(() => { - const childrenCount = parent.get('children.length'); - assert.ok(childrenCount > 10, 'Parent has more children than one page size'); - assert.equal(findAll('[data-test-job-name]').length, 10, 'Table length maxes out at 10'); - assert.ok(find('.pagination-next'), 'Next button is rendered'); - - assert.ok( - new RegExp(`1.10.+?${childrenCount}`).test(find('.pagination-numbers').textContent.trim()) - ); + return settled().then(() => { + assert.equal( + findAll('[data-test-job-name]').length, + parent.get('children.length'), + 'A row for each child' + ); + }); }); }); -}); - -test('is sorted based on the sortProperty and sortDescending properties', function(assert) { - let parent; - - this.server.create('job', 'periodic', { - id: 'parent', - childrenCount: 3, - createAllocations: false, - }); - this.store.findAll('job'); + test('eventually paginates', function(assert) { + let parent; - return wait().then(() => { - run(() => { - parent = this.store.peekAll('job').findBy('plainId', 'parent'); + this.server.create('job', 'periodic', { + id: 'parent', + childrenCount: 11, + createAllocations: false, }); - this.setProperties(props(parent)); + this.store.findAll('job'); - this.render(hbs` - {{job-page/parts/children - job=job - sortProperty=sortProperty - sortDescending=sortDescending - currentPage=currentPage - gotoJob=gotoJob}} - `); - - return wait().then(() => { - const sortedChildren = parent.get('children').sortBy('name'); - const childRows = findAll('[data-test-job-name]'); - - sortedChildren.reverse().forEach((child, index) => { - assert.equal( - childRows[index].textContent.trim(), - child.get('name'), - `Child ${index} is ${child.get('name')}` - ); + return settled().then(async () => { + run(() => { + parent = this.store.peekAll('job').findBy('plainId', 'parent'); }); - this.set('sortDescending', false); - - sortedChildren.forEach((child, index) => { - assert.equal( - childRows[index].textContent.trim(), - child.get('name'), - `Child ${index} is ${child.get('name')}` + this.setProperties(props(parent)); + + await render(hbs` + {{job-page/parts/children + job=job + sortProperty=sortProperty + sortDescending=sortDescending + currentPage=currentPage + gotoJob=gotoJob}} + `); + + return settled().then(() => { + const childrenCount = parent.get('children.length'); + assert.ok(childrenCount > 10, 'Parent has more children than one page size'); + assert.equal(findAll('[data-test-job-name]').length, 10, 'Table length maxes out at 10'); + assert.ok(find('.pagination-next'), 'Next button is rendered'); + + assert.ok( + new RegExp(`1.10.+?${childrenCount}`).test(find('.pagination-numbers').textContent.trim()) ); }); - - return wait(); }); }); -}); -test('gotoJob is called when a job row is clicked', function(assert) { - let parent; - const gotoJobSpy = sinon.spy(); + test('is sorted based on the sortProperty and sortDescending properties', function(assert) { + let parent; + + this.server.create('job', 'periodic', { + id: 'parent', + childrenCount: 3, + createAllocations: false, + }); + + this.store.findAll('job'); - this.server.create('job', 'periodic', { - id: 'parent', - childrenCount: 1, - createAllocations: false, + return settled().then(async () => { + run(() => { + parent = this.store.peekAll('job').findBy('plainId', 'parent'); + }); + + this.setProperties(props(parent)); + + await render(hbs` + {{job-page/parts/children + job=job + sortProperty=sortProperty + sortDescending=sortDescending + currentPage=currentPage + gotoJob=gotoJob}} + `); + + return settled().then(() => { + const sortedChildren = parent.get('children').sortBy('name'); + const childRows = findAll('[data-test-job-name]'); + + sortedChildren.reverse().forEach((child, index) => { + assert.equal( + childRows[index].textContent.trim(), + child.get('name'), + `Child ${index} is ${child.get('name')}` + ); + }); + + this.set('sortDescending', false); + + sortedChildren.forEach((child, index) => { + assert.equal( + childRows[index].textContent.trim(), + child.get('name'), + `Child ${index} is ${child.get('name')}` + ); + }); + + return settled(); + }); + }); }); - this.store.findAll('job'); + test('gotoJob is called when a job row is clicked', function(assert) { + let parent; + const gotoJobSpy = sinon.spy(); - return wait().then(() => { - run(() => { - parent = this.store.peekAll('job').findBy('plainId', 'parent'); + this.server.create('job', 'periodic', { + id: 'parent', + childrenCount: 1, + createAllocations: false, }); - this.setProperties( - props(parent, { - gotoJob: gotoJobSpy, - }) - ); + this.store.findAll('job'); - this.render(hbs` - {{job-page/parts/children - job=job - sortProperty=sortProperty - sortDescending=sortDescending - currentPage=currentPage - gotoJob=gotoJob}} - `); - - return wait().then(() => { - click('tr.job-row'); - assert.ok( - gotoJobSpy.withArgs(parent.get('children.firstObject')).calledOnce, - 'Clicking the job row calls the gotoJob action' + return settled().then(async () => { + run(() => { + parent = this.store.peekAll('job').findBy('plainId', 'parent'); + }); + + this.setProperties( + props(parent, { + gotoJob: gotoJobSpy, + }) ); + + await render(hbs` + {{job-page/parts/children + job=job + sortProperty=sortProperty + sortDescending=sortDescending + currentPage=currentPage + gotoJob=gotoJob}} + `); + + return settled().then(() => { + click('tr.job-row'); + assert.ok( + gotoJobSpy.withArgs(parent.get('children.firstObject')).calledOnce, + 'Clicking the job row calls the gotoJob action' + ); + }); }); }); }); diff --git a/ui/tests/integration/job-page/parts/latest-deployment-test.js b/ui/tests/integration/job-page/parts/latest-deployment-test.js index f1d11038d0d..5b036e9e2c2 100644 --- a/ui/tests/integration/job-page/parts/latest-deployment-test.js +++ b/ui/tests/integration/job-page/parts/latest-deployment-test.js @@ -1,201 +1,200 @@ import { getOwner } from '@ember/application'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { click, find } from 'ember-native-dom-helpers'; -import wait from 'ember-test-helpers/wait'; import hbs from 'htmlbars-inline-precompile'; import moment from 'moment'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; -moduleForComponent( - 'job-page/parts/latest-deployment', - 'Integration | Component | job-page/parts/latest-deployment', - { - integration: true, - beforeEach() { - fragmentSerializerInitializer(getOwner(this)); - window.localStorage.clear(); - this.store = getOwner(this).lookup('service:store'); - this.server = startMirage(); - this.server.create('namespace'); - }, - afterEach() { - this.server.shutdown(); - window.localStorage.clear(); - }, - } -); - -test('there is no latest deployment section when the job has no deployments', function(assert) { - this.server.create('job', { - type: 'service', - noDeployments: true, - createAllocations: false, - }); +module('Integration | Component | job-page/parts/latest-deployment', function(hooks) { + setupRenderingTest(hooks); - this.store.findAll('job'); + hooks.beforeEach(function() { + fragmentSerializerInitializer(this.owner); + window.localStorage.clear(); + this.store = this.owner.lookup('service:store'); + this.server = startMirage(); + this.server.create('namespace'); + }); - return wait().then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); - this.render(hbs` - {{job-page/parts/latest-deployment job=job}}) - `); + hooks.afterEach(function() { + this.server.shutdown(); + window.localStorage.clear(); + }); - return wait().then(() => { - assert.notOk(find('[data-test-active-deployment]'), 'No active deployment'); + test('there is no latest deployment section when the job has no deployments', function(assert) { + this.server.create('job', { + type: 'service', + noDeployments: true, + createAllocations: false, }); - }); -}); -test('the latest deployment section shows up for the currently running deployment', function(assert) { - this.server.create('job', { type: 'service', createAllocations: false, activeDeployment: true }); - - this.store.findAll('job'); - - return wait().then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); - this.render(hbs` - {{job-page/parts/latest-deployment job=job}} - `); - - return wait().then(() => { - const deployment = this.get('job.latestDeployment'); - const version = deployment.get('version'); - - assert.ok(find('[data-test-active-deployment]'), 'Active deployment'); - assert.ok( - find('[data-test-active-deployment]').classList.contains('is-info'), - 'Running deployment gets the is-info class' - ); - assert.equal( - find('[data-test-active-deployment-stat="id"]').textContent.trim(), - deployment.get('shortId'), - 'The active deployment is the most recent running deployment' - ); - - assert.equal( - find('[data-test-active-deployment-stat="submit-time"]').textContent.trim(), - moment(version.get('submitTime')).fromNow(), - 'Time since the job was submitted is in the active deployment header' - ); - - assert.equal( - find('[data-test-deployment-metric="canaries"]').textContent.trim(), - `${deployment.get('placedCanaries')} / ${deployment.get('desiredCanaries')}`, - 'Canaries, both places and desired, are in the metrics' - ); - - assert.equal( - find('[data-test-deployment-metric="placed"]').textContent.trim(), - deployment.get('placedAllocs'), - 'Placed allocs aggregates across task groups' - ); - - assert.equal( - find('[data-test-deployment-metric="desired"]').textContent.trim(), - deployment.get('desiredTotal'), - 'Desired allocs aggregates across task groups' - ); - - assert.equal( - find('[data-test-deployment-metric="healthy"]').textContent.trim(), - deployment.get('healthyAllocs'), - 'Healthy allocs aggregates across task groups' - ); - - assert.equal( - find('[data-test-deployment-metric="unhealthy"]').textContent.trim(), - deployment.get('unhealthyAllocs'), - 'Unhealthy allocs aggregates across task groups' - ); - - assert.equal( - find('[data-test-deployment-notification]').textContent.trim(), - deployment.get('statusDescription'), - 'Status description is in the metrics block' - ); + this.store.findAll('job'); + + return settled().then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); + await render(hbs` + {{job-page/parts/latest-deployment job=job}}) + `); + + return settled().then(() => { + assert.notOk(find('[data-test-active-deployment]'), 'No active deployment'); + }); }); }); -}); -test('when there is no running deployment, the latest deployment section shows up for the last deployment', function(assert) { - this.server.create('job', { - type: 'service', - createAllocations: false, - noActiveDeployment: true, - }); + test('the latest deployment section shows up for the currently running deployment', function(assert) { + this.server.create('job', { type: 'service', createAllocations: false, activeDeployment: true }); - this.store.findAll('job'); + this.store.findAll('job'); - return wait().then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); - this.render(hbs` - {{job-page/parts/latest-deployment job=job}} - `); + return settled().then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); + await render(hbs` + {{job-page/parts/latest-deployment job=job}} + `); - return wait().then(() => { - assert.ok(find('[data-test-active-deployment]'), 'Active deployment'); - assert.notOk( - find('[data-test-active-deployment]').classList.contains('is-info'), - 'Non-running deployment does not get the is-info class' - ); - }); - }); -}); + return settled().then(() => { + const deployment = this.get('job.latestDeployment'); + const version = deployment.get('version'); -test('the latest deployment section can be expanded to show task groups and allocations', function(assert) { - this.server.create('node'); - this.server.create('job', { type: 'service', activeDeployment: true }); + assert.ok(find('[data-test-active-deployment]'), 'Active deployment'); + assert.ok( + find('[data-test-active-deployment]').classList.contains('is-info'), + 'Running deployment gets the is-info class' + ); + assert.equal( + find('[data-test-active-deployment-stat="id"]').textContent.trim(), + deployment.get('shortId'), + 'The active deployment is the most recent running deployment' + ); - this.store.findAll('job'); + assert.equal( + find('[data-test-active-deployment-stat="submit-time"]').textContent.trim(), + moment(version.get('submitTime')).fromNow(), + 'Time since the job was submitted is in the active deployment header' + ); - return wait().then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); - this.render(hbs` - {{job-page/parts/latest-deployment job=job}} - `); + assert.equal( + find('[data-test-deployment-metric="canaries"]').textContent.trim(), + `${deployment.get('placedCanaries')} / ${deployment.get('desiredCanaries')}`, + 'Canaries, both places and desired, are in the metrics' + ); - return wait().then(() => { - assert.notOk(find('[data-test-deployment-task-groups]'), 'Task groups not found'); - assert.notOk(find('[data-test-deployment-allocations]'), 'Allocations not found'); + assert.equal( + find('[data-test-deployment-metric="placed"]').textContent.trim(), + deployment.get('placedAllocs'), + 'Placed allocs aggregates across task groups' + ); - click('[data-test-deployment-toggle-details]'); + assert.equal( + find('[data-test-deployment-metric="desired"]').textContent.trim(), + deployment.get('desiredTotal'), + 'Desired allocs aggregates across task groups' + ); - return wait().then(() => { - assert.ok(find('[data-test-deployment-task-groups]'), 'Task groups found'); - assert.ok(find('[data-test-deployment-allocations]'), 'Allocations found'); + assert.equal( + find('[data-test-deployment-metric="healthy"]').textContent.trim(), + deployment.get('healthyAllocs'), + 'Healthy allocs aggregates across task groups' + ); + + assert.equal( + find('[data-test-deployment-metric="unhealthy"]').textContent.trim(), + deployment.get('unhealthyAllocs'), + 'Unhealthy allocs aggregates across task groups' + ); + + assert.equal( + find('[data-test-deployment-notification]').textContent.trim(), + deployment.get('statusDescription'), + 'Status description is in the metrics block' + ); }); }); }); -}); -test('each task group in the expanded task group section shows task group details', function(assert) { - this.server.create('node'); - this.server.create('job', { type: 'service', activeDeployment: true }); + test('when there is no running deployment, the latest deployment section shows up for the last deployment', function(assert) { + this.server.create('job', { + type: 'service', + createAllocations: false, + noActiveDeployment: true, + }); + + this.store.findAll('job'); + + return settled().then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); + await render(hbs` + {{job-page/parts/latest-deployment job=job}} + `); + + return settled().then(() => { + assert.ok(find('[data-test-active-deployment]'), 'Active deployment'); + assert.notOk( + find('[data-test-active-deployment]').classList.contains('is-info'), + 'Non-running deployment does not get the is-info class' + ); + }); + }); + }); + + test('the latest deployment section can be expanded to show task groups and allocations', function(assert) { + this.server.create('node'); + this.server.create('job', { type: 'service', activeDeployment: true }); - this.store.findAll('job'); + this.store.findAll('job'); - return wait().then(() => { - const job = this.store.peekAll('job').get('firstObject'); + return settled().then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); + await render(hbs` + {{job-page/parts/latest-deployment job=job}} + `); - this.set('job', job); - this.render(hbs` - {{job-page/parts/latest-deployment job=job}} - `); + return settled().then(() => { + assert.notOk(find('[data-test-deployment-task-groups]'), 'Task groups not found'); + assert.notOk(find('[data-test-deployment-allocations]'), 'Allocations not found'); - return wait() - .then(() => { click('[data-test-deployment-toggle-details]'); - return wait(); - }) - .then(() => { - const task = job.get('runningDeployment.taskGroupSummaries.firstObject'); - const findForTaskGroup = selector => find(`[data-test-deployment-task-group-${selector}]`); - assert.equal(findForTaskGroup('name').textContent.trim(), task.get('name')); - assert.equal( - findForTaskGroup('progress-deadline').textContent.trim(), - moment(task.get('requireProgressBy')).format("MMM DD, 'YY HH:mm:ss ZZ") - ); + + return settled().then(() => { + assert.ok(find('[data-test-deployment-task-groups]'), 'Task groups found'); + assert.ok(find('[data-test-deployment-allocations]'), 'Allocations found'); + }); }); + }); + }); + + test('each task group in the expanded task group section shows task group details', function(assert) { + this.server.create('node'); + this.server.create('job', { type: 'service', activeDeployment: true }); + + this.store.findAll('job'); + + return settled().then(async () => { + const job = this.store.peekAll('job').get('firstObject'); + + this.set('job', job); + await render(hbs` + {{job-page/parts/latest-deployment job=job}} + `); + + return settled() + .then(() => { + click('[data-test-deployment-toggle-details]'); + return settled(); + }) + .then(() => { + const task = job.get('runningDeployment.taskGroupSummaries.firstObject'); + const findForTaskGroup = selector => find(`[data-test-deployment-task-group-${selector}]`); + assert.equal(findForTaskGroup('name').textContent.trim(), task.get('name')); + assert.equal( + findForTaskGroup('progress-deadline').textContent.trim(), + moment(task.get('requireProgressBy')).format("MMM DD, 'YY HH:mm:ss ZZ") + ); + }); + }); }); }); diff --git a/ui/tests/integration/job-page/parts/placement-failures-test.js b/ui/tests/integration/job-page/parts/placement-failures-test.js index 844e51c5b42..162645d5679 100644 --- a/ui/tests/integration/job-page/parts/placement-failures-test.js +++ b/ui/tests/integration/job-page/parts/placement-failures-test.js @@ -1,90 +1,89 @@ import { getOwner } from '@ember/application'; import { run } from '@ember/runloop'; import hbs from 'htmlbars-inline-precompile'; -import wait from 'ember-test-helpers/wait'; import { findAll, find } from 'ember-native-dom-helpers'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; -moduleForComponent( - 'job-page/parts/placement-failures', - 'Integration | Component | job-page/parts/placement-failures', - { - integration: true, - beforeEach() { - fragmentSerializerInitializer(getOwner(this)); - window.localStorage.clear(); - this.store = getOwner(this).lookup('service:store'); - this.server = startMirage(); - this.server.create('namespace'); - }, - afterEach() { - this.server.shutdown(); - window.localStorage.clear(); - }, - } -); +module('Integration | Component | job-page/parts/placement-failures', function(hooks) { + setupRenderingTest(hooks); -test('when the job has placement failures, they are called out', function(assert) { - this.server.create('job', { failedPlacements: true, createAllocations: false }); - this.store.findAll('job').then(jobs => { - jobs.forEach(job => job.reload()); + hooks.beforeEach(function() { + fragmentSerializerInitializer(this.owner); + window.localStorage.clear(); + this.store = this.owner.lookup('service:store'); + this.server = startMirage(); + this.server.create('namespace'); }); - return wait().then(() => { - run(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); + hooks.afterEach(function() { + this.server.shutdown(); + window.localStorage.clear(); + }); + + test('when the job has placement failures, they are called out', function(assert) { + this.server.create('job', { failedPlacements: true, createAllocations: false }); + this.store.findAll('job').then(jobs => { + jobs.forEach(job => job.reload()); }); - this.render(hbs` - {{job-page/parts/placement-failures job=job}}) - `); + return settled().then(async () => { + run(() => { + this.set('job', this.store.peekAll('job').get('firstObject')); + }); - return wait().then(() => { - const failedEvaluation = this.get('job.evaluations') - .filterBy('hasPlacementFailures') - .sortBy('modifyIndex') - .reverse() - .get('firstObject'); - const failedTGAllocs = failedEvaluation.get('failedTGAllocs'); + await render(hbs` + {{job-page/parts/placement-failures job=job}}) + `); - assert.ok(find('[data-test-placement-failures]'), 'Placement failures section found'); + return settled().then(() => { + const failedEvaluation = this.get('job.evaluations') + .filterBy('hasPlacementFailures') + .sortBy('modifyIndex') + .reverse() + .get('firstObject'); + const failedTGAllocs = failedEvaluation.get('failedTGAllocs'); - const taskGroupLabels = findAll('[data-test-placement-failure-task-group]').map(title => - title.textContent.trim() - ); + assert.ok(find('[data-test-placement-failures]'), 'Placement failures section found'); - failedTGAllocs.forEach(alloc => { - const name = alloc.get('name'); - assert.ok( - taskGroupLabels.find(label => label.includes(name)), - `${name} included in placement failures list` - ); - assert.ok( - taskGroupLabels.find(label => label.includes(alloc.get('coalescedFailures') + 1)), - 'The number of unplaced allocs = CoalescedFailures + 1' + const taskGroupLabels = findAll('[data-test-placement-failure-task-group]').map(title => + title.textContent.trim() ); + + failedTGAllocs.forEach(alloc => { + const name = alloc.get('name'); + assert.ok( + taskGroupLabels.find(label => label.includes(name)), + `${name} included in placement failures list` + ); + assert.ok( + taskGroupLabels.find(label => label.includes(alloc.get('coalescedFailures') + 1)), + 'The number of unplaced allocs = CoalescedFailures + 1' + ); + }); }); }); }); -}); -test('when the job has no placement failures, the placement failures section is gone', function(assert) { - this.server.create('job', { noFailedPlacements: true, createAllocations: false }); - this.store.findAll('job'); + test('when the job has no placement failures, the placement failures section is gone', function(assert) { + this.server.create('job', { noFailedPlacements: true, createAllocations: false }); + this.store.findAll('job'); - return wait().then(() => { - run(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); - }); + return settled().then(async () => { + run(() => { + this.set('job', this.store.peekAll('job').get('firstObject')); + }); - this.render(hbs` - {{job-page/parts/placement-failures job=job}}) - `); + await render(hbs` + {{job-page/parts/placement-failures job=job}}) + `); - return wait().then(() => { - assert.notOk(find('[data-test-placement-failures]'), 'Placement failures section not found'); + return settled().then(() => { + assert.notOk(find('[data-test-placement-failures]'), 'Placement failures section not found'); + }); }); }); }); diff --git a/ui/tests/integration/job-page/parts/summary-test.js b/ui/tests/integration/job-page/parts/summary-test.js index 1a35441ed76..8a82b70e8cf 100644 --- a/ui/tests/integration/job-page/parts/summary-test.js +++ b/ui/tests/integration/job-page/parts/summary-test.js @@ -1,281 +1,284 @@ import { getOwner } from '@ember/application'; import hbs from 'htmlbars-inline-precompile'; -import wait from 'ember-test-helpers/wait'; import { find, click } from 'ember-native-dom-helpers'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; -moduleForComponent('job-page/parts/summary', 'Integration | Component | job-page/parts/summary', { - integration: true, - beforeEach() { - fragmentSerializerInitializer(getOwner(this)); +module('Integration | Component | job-page/parts/summary', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { + fragmentSerializerInitializer(this.owner); window.localStorage.clear(); - this.store = getOwner(this).lookup('service:store'); + this.store = this.owner.lookup('service:store'); this.server = startMirage(); this.server.create('namespace'); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); window.localStorage.clear(); - }, -}); - -test('jobs with children use the children diagram', function(assert) { - this.server.create('job', 'periodic', { - createAllocations: false, }); - this.store.findAll('job'); + test('jobs with children use the children diagram', function(assert) { + this.server.create('job', 'periodic', { + createAllocations: false, + }); + + this.store.findAll('job'); - return wait().then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); + return settled().then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); - this.render(hbs` - {{job-page/parts/summary job=job}} - `); + await render(hbs` + {{job-page/parts/summary job=job}} + `); - return wait().then(() => { - assert.ok(find('[data-test-children-status-bar]'), 'Children status bar found'); - assert.notOk(find('[data-test-allocation-status-bar]'), 'Allocation status bar not found'); + return settled().then(() => { + assert.ok(find('[data-test-children-status-bar]'), 'Children status bar found'); + assert.notOk(find('[data-test-allocation-status-bar]'), 'Allocation status bar not found'); + }); }); }); -}); -test('jobs without children use the allocations diagram', function(assert) { - this.server.create('job', { - createAllocations: false, - }); + test('jobs without children use the allocations diagram', function(assert) { + this.server.create('job', { + createAllocations: false, + }); - this.store.findAll('job'); + this.store.findAll('job'); - return wait().then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); + return settled().then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); - this.render(hbs` - {{job-page/parts/summary job=job}} - `); + await render(hbs` + {{job-page/parts/summary job=job}} + `); - return wait().then(() => { - assert.ok(find('[data-test-allocation-status-bar]'), 'Allocation status bar found'); - assert.notOk(find('[data-test-children-status-bar]'), 'Children status bar not found'); + return settled().then(() => { + assert.ok(find('[data-test-allocation-status-bar]'), 'Allocation status bar found'); + assert.notOk(find('[data-test-children-status-bar]'), 'Children status bar not found'); + }); }); }); -}); - -test('the allocations diagram lists all allocation status figures', function(assert) { - this.server.create('job', { - createAllocations: false, - }); - this.store.findAll('job'); - - return wait().then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); - - this.render(hbs` - {{job-page/parts/summary job=job}} - `); - - return wait().then(() => { - assert.equal( - find('[data-test-legend-value="queued"]').textContent, - this.get('job.queuedAllocs'), - `${this.get('job.queuedAllocs')} are queued` - ); - - assert.equal( - find('[data-test-legend-value="starting"]').textContent, - this.get('job.startingAllocs'), - `${this.get('job.startingAllocs')} are starting` - ); - - assert.equal( - find('[data-test-legend-value="running"]').textContent, - this.get('job.runningAllocs'), - `${this.get('job.runningAllocs')} are running` - ); - - assert.equal( - find('[data-test-legend-value="complete"]').textContent, - this.get('job.completeAllocs'), - `${this.get('job.completeAllocs')} are complete` - ); - - assert.equal( - find('[data-test-legend-value="failed"]').textContent, - this.get('job.failedAllocs'), - `${this.get('job.failedAllocs')} are failed` - ); - - assert.equal( - find('[data-test-legend-value="lost"]').textContent, - this.get('job.lostAllocs'), - `${this.get('job.lostAllocs')} are lost` - ); + test('the allocations diagram lists all allocation status figures', function(assert) { + this.server.create('job', { + createAllocations: false, }); - }); -}); -test('the children diagram lists all children status figures', function(assert) { - this.server.create('job', 'periodic', { - createAllocations: false, - }); + this.store.findAll('job'); + + return settled().then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); - this.store.findAll('job'); - - return wait().then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); - - this.render(hbs` - {{job-page/parts/summary job=job}} - `); - - return wait().then(() => { - assert.equal( - find('[data-test-legend-value="queued"]').textContent, - this.get('job.pendingChildren'), - `${this.get('job.pendingChildren')} are pending` - ); - - assert.equal( - find('[data-test-legend-value="running"]').textContent, - this.get('job.runningChildren'), - `${this.get('job.runningChildren')} are running` - ); - - assert.equal( - find('[data-test-legend-value="complete"]').textContent, - this.get('job.deadChildren'), - `${this.get('job.deadChildren')} are dead` - ); + await render(hbs` + {{job-page/parts/summary job=job}} + `); + + return settled().then(() => { + assert.equal( + find('[data-test-legend-value="queued"]').textContent, + this.get('job.queuedAllocs'), + `${this.get('job.queuedAllocs')} are queued` + ); + + assert.equal( + find('[data-test-legend-value="starting"]').textContent, + this.get('job.startingAllocs'), + `${this.get('job.startingAllocs')} are starting` + ); + + assert.equal( + find('[data-test-legend-value="running"]').textContent, + this.get('job.runningAllocs'), + `${this.get('job.runningAllocs')} are running` + ); + + assert.equal( + find('[data-test-legend-value="complete"]').textContent, + this.get('job.completeAllocs'), + `${this.get('job.completeAllocs')} are complete` + ); + + assert.equal( + find('[data-test-legend-value="failed"]').textContent, + this.get('job.failedAllocs'), + `${this.get('job.failedAllocs')} are failed` + ); + + assert.equal( + find('[data-test-legend-value="lost"]').textContent, + this.get('job.lostAllocs'), + `${this.get('job.lostAllocs')} are lost` + ); + }); }); }); -}); -test('the summary block can be collapsed', function(assert) { - this.server.create('job', { - createAllocations: false, - }); + test('the children diagram lists all children status figures', function(assert) { + this.server.create('job', 'periodic', { + createAllocations: false, + }); - this.store.findAll('job'); + this.store.findAll('job'); - return wait() - .then(() => { + return settled().then(async () => { this.set('job', this.store.peekAll('job').get('firstObject')); - this.render(hbs` - {{job-page/parts/summary job=job}} - `); - - return wait(); - }) - .then(() => { - click('[data-test-accordion-toggle]'); - return wait(); - }) - .then(() => { - assert.notOk(find('[data-test-accordion-body]'), 'No accordion body'); - assert.notOk(find('[data-test-legend]'), 'No legend'); + await render(hbs` + {{job-page/parts/summary job=job}} + `); + + return settled().then(() => { + assert.equal( + find('[data-test-legend-value="queued"]').textContent, + this.get('job.pendingChildren'), + `${this.get('job.pendingChildren')} are pending` + ); + + assert.equal( + find('[data-test-legend-value="running"]').textContent, + this.get('job.runningChildren'), + `${this.get('job.runningChildren')} are running` + ); + + assert.equal( + find('[data-test-legend-value="complete"]').textContent, + this.get('job.deadChildren'), + `${this.get('job.deadChildren')} are dead` + ); + }); }); -}); - -test('when collapsed, the summary block includes an inline version of the chart', function(assert) { - this.server.create('job', { - createAllocations: false, }); - this.store.findAll('job'); - - return wait() - .then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); - - this.render(hbs` - {{job-page/parts/summary job=job}} - `); - - return wait(); - }) - .then(() => { - click('[data-test-accordion-toggle]'); - return wait(); - }) - .then(() => { - assert.ok(find('[data-test-allocation-status-bar]'), 'Allocation bar still existed'); - assert.ok( - find('.inline-chart [data-test-allocation-status-bar]'), - 'Allocation bar is rendered in an inline-chart container' - ); + test('the summary block can be collapsed', function(assert) { + this.server.create('job', { + createAllocations: false, }); -}); -test('the collapsed/expanded state is persisted to localStorage', function(assert) { - this.server.create('job', { - createAllocations: false, + this.store.findAll('job'); + + return settled() + .then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); + + await render(hbs` + {{job-page/parts/summary job=job}} + `); + + return settled(); + }) + .then(() => { + click('[data-test-accordion-toggle]'); + return settled(); + }) + .then(() => { + assert.notOk(find('[data-test-accordion-body]'), 'No accordion body'); + assert.notOk(find('[data-test-legend]'), 'No legend'); + }); }); - this.store.findAll('job'); - - return wait() - .then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); - - this.render(hbs` - {{job-page/parts/summary job=job}} - `); - - return wait(); - }) - .then(() => { - assert.notOk(window.localStorage.nomadExpandJobSummary, 'No value in localStorage yet'); - click('[data-test-accordion-toggle]'); - return wait(); - }) - .then(() => { - assert.equal( - window.localStorage.nomadExpandJobSummary, - 'false', - 'Value is stored for the collapsed state' - ); + test('when collapsed, the summary block includes an inline version of the chart', function(assert) { + this.server.create('job', { + createAllocations: false, }); -}); -test('the collapsed/expanded state from localStorage is used for the initial state when available', function(assert) { - this.server.create('job', { - createAllocations: false, + this.store.findAll('job'); + + return settled() + .then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); + + await render(hbs` + {{job-page/parts/summary job=job}} + `); + + return settled(); + }) + .then(() => { + click('[data-test-accordion-toggle]'); + return settled(); + }) + .then(() => { + assert.ok(find('[data-test-allocation-status-bar]'), 'Allocation bar still existed'); + assert.ok( + find('.inline-chart [data-test-allocation-status-bar]'), + 'Allocation bar is rendered in an inline-chart container' + ); + }); }); - this.store.findAll('job'); - - window.localStorage.nomadExpandJobSummary = 'false'; + test('the collapsed/expanded state is persisted to localStorage', function(assert) { + this.server.create('job', { + createAllocations: false, + }); - return wait() - .then(() => { - this.set('job', this.store.peekAll('job').get('firstObject')); + this.store.findAll('job'); + + return settled() + .then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); + + await render(hbs` + {{job-page/parts/summary job=job}} + `); + + return settled(); + }) + .then(() => { + assert.notOk(window.localStorage.nomadExpandJobSummary, 'No value in localStorage yet'); + click('[data-test-accordion-toggle]'); + return settled(); + }) + .then(() => { + assert.equal( + window.localStorage.nomadExpandJobSummary, + 'false', + 'Value is stored for the collapsed state' + ); + }); + }); - this.render(hbs` - {{job-page/parts/summary job=job}} - `); - - return wait(); - }) - .then(() => { - assert.ok(find('[data-test-allocation-status-bar]'), 'Allocation bar still existed'); - assert.ok( - find('.inline-chart [data-test-allocation-status-bar]'), - 'Allocation bar is rendered in an inline-chart container' - ); - - click('[data-test-accordion-toggle]'); - return wait(); - }) - .then(() => { - assert.equal( - window.localStorage.nomadExpandJobSummary, - 'true', - 'localStorage value still toggles' - ); - assert.ok(find('[data-test-accordion-body]'), 'Summary still expands'); + test('the collapsed/expanded state from localStorage is used for the initial state when available', function(assert) { + this.server.create('job', { + createAllocations: false, }); + + this.store.findAll('job'); + + window.localStorage.nomadExpandJobSummary = 'false'; + + return settled() + .then(async () => { + this.set('job', this.store.peekAll('job').get('firstObject')); + + await render(hbs` + {{job-page/parts/summary job=job}} + `); + + return settled(); + }) + .then(() => { + assert.ok(find('[data-test-allocation-status-bar]'), 'Allocation bar still existed'); + assert.ok( + find('.inline-chart [data-test-allocation-status-bar]'), + 'Allocation bar is rendered in an inline-chart container' + ); + + click('[data-test-accordion-toggle]'); + return settled(); + }) + .then(() => { + assert.equal( + window.localStorage.nomadExpandJobSummary, + 'true', + 'localStorage value still toggles' + ); + assert.ok(find('[data-test-accordion-body]'), 'Summary still expands'); + }); + }); }); diff --git a/ui/tests/integration/job-page/parts/task-groups-test.js b/ui/tests/integration/job-page/parts/task-groups-test.js index f9ac811f84f..bf4c0fefda0 100644 --- a/ui/tests/integration/job-page/parts/task-groups-test.js +++ b/ui/tests/integration/job-page/parts/task-groups-test.js @@ -1,170 +1,169 @@ import { getOwner } from '@ember/application'; import { assign } from '@ember/polyfills'; import hbs from 'htmlbars-inline-precompile'; -import wait from 'ember-test-helpers/wait'; import { click, findAll, find } from 'ember-native-dom-helpers'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import sinon from 'sinon'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; -moduleForComponent( - 'job-page/parts/task-groups', - 'Integration | Component | job-page/parts/task-groups', - { - integration: true, - beforeEach() { - fragmentSerializerInitializer(getOwner(this)); - window.localStorage.clear(); - this.store = getOwner(this).lookup('service:store'); - this.server = startMirage(); - this.server.create('namespace'); - }, - afterEach() { - this.server.shutdown(); - }, - } -); - -const props = (job, options = {}) => - assign( - { - job, - sortProperty: 'name', - sortDescending: true, - gotoTaskGroup: () => {}, - }, - options - ); - -test('the job detail page should list all task groups', function(assert) { - this.server.create('job', { - createAllocations: false, +module('Integration | Component | job-page/parts/task-groups', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { + fragmentSerializerInitializer(this.owner); + window.localStorage.clear(); + this.store = this.owner.lookup('service:store'); + this.server = startMirage(); + this.server.create('namespace'); }); - this.store.findAll('job').then(jobs => { - jobs.forEach(job => job.reload()); + hooks.afterEach(function() { + this.server.shutdown(); }); - return wait().then(() => { - const job = this.store.peekAll('job').get('firstObject'); - this.setProperties(props(job)); - - this.render(hbs` - {{job-page/parts/task-groups - job=job - sortProperty=sortProperty - sortDescending=sortDescending - gotoTaskGroup=gotoTaskGroup}} - `); - - return wait().then(() => { - assert.equal( - findAll('[data-test-task-group]').length, - job.get('taskGroups.length'), - 'One row per task group' - ); + const props = (job, options = {}) => + assign( + { + job, + sortProperty: 'name', + sortDescending: true, + gotoTaskGroup: () => {}, + }, + options + ); + + test('the job detail page should list all task groups', function(assert) { + this.server.create('job', { + createAllocations: false, }); - }); -}); -test('each row in the task group table should show basic information about the task group', function(assert) { - this.server.create('job', { - createAllocations: false, - }); + this.store.findAll('job').then(jobs => { + jobs.forEach(job => job.reload()); + }); - this.store.findAll('job').then(jobs => { - jobs.forEach(job => job.reload()); + return settled().then(async () => { + const job = this.store.peekAll('job').get('firstObject'); + this.setProperties(props(job)); + + await render(hbs` + {{job-page/parts/task-groups + job=job + sortProperty=sortProperty + sortDescending=sortDescending + gotoTaskGroup=gotoTaskGroup}} + `); + + return settled().then(() => { + assert.equal( + findAll('[data-test-task-group]').length, + job.get('taskGroups.length'), + 'One row per task group' + ); + }); + }); }); - return wait().then(() => { - const job = this.store.peekAll('job').get('firstObject'); - const taskGroup = job - .get('taskGroups') - .sortBy('name') - .reverse() - .get('firstObject'); - - this.setProperties(props(job)); - - this.render(hbs` - {{job-page/parts/task-groups - job=job - sortProperty=sortProperty - sortDescending=sortDescending - gotoTaskGroup=gotoTaskGroup}} - `); - - return wait().then(() => { - const taskGroupRow = find('[data-test-task-group]'); - - assert.equal( - taskGroupRow.querySelector('[data-test-task-group-name]').textContent.trim(), - taskGroup.get('name'), - 'Name' - ); - assert.equal( - taskGroupRow.querySelector('[data-test-task-group-count]').textContent.trim(), - taskGroup.get('count'), - 'Count' - ); - assert.equal( - taskGroupRow.querySelector('[data-test-task-group-cpu]').textContent.trim(), - `${taskGroup.get('reservedCPU')} MHz`, - 'Reserved CPU' - ); - assert.equal( - taskGroupRow.querySelector('[data-test-task-group-mem]').textContent.trim(), - `${taskGroup.get('reservedMemory')} MiB`, - 'Reserved Memory' - ); - assert.equal( - taskGroupRow.querySelector('[data-test-task-group-disk]').textContent.trim(), - `${taskGroup.get('reservedEphemeralDisk')} MiB`, - 'Reserved Disk' - ); + test('each row in the task group table should show basic information about the task group', function(assert) { + this.server.create('job', { + createAllocations: false, }); - }); -}); -test('gotoTaskGroup is called when task group rows are clicked', function(assert) { - this.server.create('job', { - createAllocations: false, - }); + this.store.findAll('job').then(jobs => { + jobs.forEach(job => job.reload()); + }); - this.store.findAll('job').then(jobs => { - jobs.forEach(job => job.reload()); + return settled().then(async () => { + const job = this.store.peekAll('job').get('firstObject'); + const taskGroup = job + .get('taskGroups') + .sortBy('name') + .reverse() + .get('firstObject'); + + this.setProperties(props(job)); + + await render(hbs` + {{job-page/parts/task-groups + job=job + sortProperty=sortProperty + sortDescending=sortDescending + gotoTaskGroup=gotoTaskGroup}} + `); + + return settled().then(() => { + const taskGroupRow = find('[data-test-task-group]'); + + assert.equal( + taskGroupRow.querySelector('[data-test-task-group-name]').textContent.trim(), + taskGroup.get('name'), + 'Name' + ); + assert.equal( + taskGroupRow.querySelector('[data-test-task-group-count]').textContent.trim(), + taskGroup.get('count'), + 'Count' + ); + assert.equal( + taskGroupRow.querySelector('[data-test-task-group-cpu]').textContent.trim(), + `${taskGroup.get('reservedCPU')} MHz`, + 'Reserved CPU' + ); + assert.equal( + taskGroupRow.querySelector('[data-test-task-group-mem]').textContent.trim(), + `${taskGroup.get('reservedMemory')} MiB`, + 'Reserved Memory' + ); + assert.equal( + taskGroupRow.querySelector('[data-test-task-group-disk]').textContent.trim(), + `${taskGroup.get('reservedEphemeralDisk')} MiB`, + 'Reserved Disk' + ); + }); + }); }); - return wait().then(() => { - const taskGroupSpy = sinon.spy(); - const job = this.store.peekAll('job').get('firstObject'); - const taskGroup = job - .get('taskGroups') - .sortBy('name') - .reverse() - .get('firstObject'); - - this.setProperties( - props(job, { - gotoTaskGroup: taskGroupSpy, - }) - ); + test('gotoTaskGroup is called when task group rows are clicked', function(assert) { + this.server.create('job', { + createAllocations: false, + }); - this.render(hbs` - {{job-page/parts/task-groups - job=job - sortProperty=sortProperty - sortDescending=sortDescending - gotoTaskGroup=gotoTaskGroup}} - `); - - return wait().then(() => { - click('[data-test-task-group]'); - assert.ok( - taskGroupSpy.withArgs(taskGroup).calledOnce, - 'Clicking the task group row calls the gotoTaskGroup action' + this.store.findAll('job').then(jobs => { + jobs.forEach(job => job.reload()); + }); + + return settled().then(async () => { + const taskGroupSpy = sinon.spy(); + const job = this.store.peekAll('job').get('firstObject'); + const taskGroup = job + .get('taskGroups') + .sortBy('name') + .reverse() + .get('firstObject'); + + this.setProperties( + props(job, { + gotoTaskGroup: taskGroupSpy, + }) ); + + await render(hbs` + {{job-page/parts/task-groups + job=job + sortProperty=sortProperty + sortDescending=sortDescending + gotoTaskGroup=gotoTaskGroup}} + `); + + return settled().then(() => { + click('[data-test-task-group]'); + assert.ok( + taskGroupSpy.withArgs(taskGroup).calledOnce, + 'Clicking the task group row calls the gotoTaskGroup action' + ); + }); }); }); }); diff --git a/ui/tests/integration/job-page/periodic-test.js b/ui/tests/integration/job-page/periodic-test.js index 0908447f9d0..cf992dd49e6 100644 --- a/ui/tests/integration/job-page/periodic-test.js +++ b/ui/tests/integration/job-page/periodic-test.js @@ -1,7 +1,8 @@ import { getOwner } from '@ember/application'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { click, find, findAll } from 'ember-native-dom-helpers'; -import wait from 'ember-test-helpers/wait'; import hbs from 'htmlbars-inline-precompile'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import { @@ -13,212 +14,214 @@ import { expectStartRequest, } from './helpers'; -moduleForComponent('job-page/periodic', 'Integration | Component | job-page/periodic', { - integration: true, - beforeEach() { +module('Integration | Component | job-page/periodic', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { window.localStorage.clear(); - this.store = getOwner(this).lookup('service:store'); + this.store = this.owner.lookup('service:store'); this.server = startMirage(); this.server.create('namespace'); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); window.localStorage.clear(); - }, -}); + }); -const commonTemplate = hbs` - {{job-page/periodic - job=job - sortProperty=sortProperty - sortDescending=sortDescending - currentPage=currentPage - gotoJob=gotoJob}} -`; - -const commonProperties = job => ({ - job, - sortProperty: 'name', - sortDescending: true, - currentPage: 1, - gotoJob: () => {}, -}); + const commonTemplate = hbs` + {{job-page/periodic + job=job + sortProperty=sortProperty + sortDescending=sortDescending + currentPage=currentPage + gotoJob=gotoJob}} + `; + + const commonProperties = job => ({ + job, + sortProperty: 'name', + sortDescending: true, + currentPage: 1, + gotoJob: () => {}, + }); -test('Clicking Force Launch launches a new periodic child job', function(assert) { - const childrenCount = 3; + test('Clicking Force Launch launches a new periodic child job', function(assert) { + const childrenCount = 3; - this.server.create('job', 'periodic', { - id: 'parent', - childrenCount, - createAllocations: false, - }); + this.server.create('job', 'periodic', { + id: 'parent', + childrenCount, + createAllocations: false, + }); - this.store.findAll('job'); + this.store.findAll('job'); - return wait().then(() => { - const job = this.store.peekAll('job').findBy('plainId', 'parent'); + return settled().then(async () => { + const job = this.store.peekAll('job').findBy('plainId', 'parent'); - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + this.setProperties(commonProperties(job)); + await render(commonTemplate); - return wait().then(() => { - const currentJobCount = server.db.jobs.length; + return settled().then(() => { + const currentJobCount = server.db.jobs.length; - assert.equal( - findAll('[data-test-job-name]').length, - childrenCount, - 'The new periodic job launch is in the children list' - ); + assert.equal( + findAll('[data-test-job-name]').length, + childrenCount, + 'The new periodic job launch is in the children list' + ); - click('[data-test-force-launch]'); + click('[data-test-force-launch]'); - return wait().then(() => { - const expectedURL = jobURL(job, '/periodic/force'); + return settled().then(() => { + const expectedURL = jobURL(job, '/periodic/force'); - assert.ok( - this.server.pretender.handledRequests - .filterBy('method', 'POST') - .find(req => req.url === expectedURL), - 'POST URL was correct' - ); + assert.ok( + this.server.pretender.handledRequests + .filterBy('method', 'POST') + .find(req => req.url === expectedURL), + 'POST URL was correct' + ); - assert.equal(server.db.jobs.length, currentJobCount + 1, 'POST request was made'); + assert.equal(server.db.jobs.length, currentJobCount + 1, 'POST request was made'); + }); }); }); }); -}); -test('Clicking force launch without proper permissions shows an error message', function(assert) { - this.server.pretender.post('/v1/job/:id/periodic/force', () => [403, {}, null]); + test('Clicking force launch without proper permissions shows an error message', function(assert) { + this.server.pretender.post('/v1/job/:id/periodic/force', () => [403, {}, null]); - this.server.create('job', 'periodic', { - id: 'parent', - childrenCount: 1, - createAllocations: false, - status: 'running', - }); + this.server.create('job', 'periodic', { + id: 'parent', + childrenCount: 1, + createAllocations: false, + status: 'running', + }); - this.store.findAll('job'); + this.store.findAll('job'); - return wait().then(() => { - const job = this.store.peekAll('job').findBy('plainId', 'parent'); + return settled().then(async () => { + const job = this.store.peekAll('job').findBy('plainId', 'parent'); - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + this.setProperties(commonProperties(job)); + await render(commonTemplate); - return wait().then(() => { - assert.notOk(find('[data-test-job-error-title]'), 'No error message yet'); + return settled().then(() => { + assert.notOk(find('[data-test-job-error-title]'), 'No error message yet'); - click('[data-test-force-launch]'); + click('[data-test-force-launch]'); - return wait().then(() => { - assert.equal( - find('[data-test-job-error-title]').textContent, - 'Could Not Force Launch', - 'Appropriate error is shown' - ); - assert.ok( - find('[data-test-job-error-body]').textContent.includes('ACL'), - 'The error message mentions ACLs' - ); + return settled().then(() => { + assert.equal( + find('[data-test-job-error-title]').textContent, + 'Could Not Force Launch', + 'Appropriate error is shown' + ); + assert.ok( + find('[data-test-job-error-body]').textContent.includes('ACL'), + 'The error message mentions ACLs' + ); - click('[data-test-job-error-close]'); + click('[data-test-job-error-close]'); - assert.notOk(find('[data-test-job-error-title]'), 'Error message is dismissable'); + assert.notOk(find('[data-test-job-error-title]'), 'Error message is dismissable'); + }); }); }); }); -}); - -test('Stopping a job sends a delete request for the job', function(assert) { - const mirageJob = this.server.create('job', 'periodic', { - childrenCount: 0, - createAllocations: false, - status: 'running', - }); - - let job; - this.store.findAll('job'); - return wait() - .then(() => { - job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + test('Stopping a job sends a delete request for the job', function(assert) { + const mirageJob = this.server.create('job', 'periodic', { + childrenCount: 0, + createAllocations: false, + status: 'running', + }); - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + let job; + this.store.findAll('job'); - return wait(); - }) - .then(stopJob) - .then(() => expectDeleteRequest(assert, this.server, job)); -}); + return settled() + .then(async () => { + job = this.store.peekAll('job').findBy('plainId', mirageJob.id); -test('Stopping a job without proper permissions shows an error message', function(assert) { - this.server.pretender.delete('/v1/job/:id', () => [403, {}, null]); + this.setProperties(commonProperties(job)); + await render(commonTemplate); - const mirageJob = this.server.create('job', 'periodic', { - childrenCount: 0, - createAllocations: false, - status: 'running', + return settled(); + }) + .then(stopJob) + .then(() => expectDeleteRequest(assert, this.server, job)); }); - this.store.findAll('job'); + test('Stopping a job without proper permissions shows an error message', function(assert) { + this.server.pretender.delete('/v1/job/:id', () => [403, {}, null]); - return wait() - .then(() => { - const job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + const mirageJob = this.server.create('job', 'periodic', { + childrenCount: 0, + createAllocations: false, + status: 'running', + }); - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + this.store.findAll('job'); - return wait(); - }) - .then(stopJob) - .then(expectError(assert, 'Could Not Stop Job')); -}); + return settled() + .then(async () => { + const job = this.store.peekAll('job').findBy('plainId', mirageJob.id); -test('Starting a job sends a post request for the job using the current definition', function(assert) { - let job; + this.setProperties(commonProperties(job)); + await render(commonTemplate); - const mirageJob = this.server.create('job', 'periodic', { - childrenCount: 0, - createAllocations: false, - status: 'dead', + return settled(); + }) + .then(stopJob) + .then(expectError(assert, 'Could Not Stop Job')); }); - this.store.findAll('job'); - return wait() - .then(() => { - job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + test('Starting a job sends a post request for the job using the current definition', function(assert) { + let job; - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + const mirageJob = this.server.create('job', 'periodic', { + childrenCount: 0, + createAllocations: false, + status: 'dead', + }); + this.store.findAll('job'); - return wait(); - }) - .then(startJob) - .then(() => expectStartRequest(assert, this.server, job)); -}); + return settled() + .then(async () => { + job = this.store.peekAll('job').findBy('plainId', mirageJob.id); -test('Starting a job without proper permissions shows an error message', function(assert) { - this.server.pretender.post('/v1/job/:id', () => [403, {}, null]); + this.setProperties(commonProperties(job)); + await render(commonTemplate); - const mirageJob = this.server.create('job', 'periodic', { - childrenCount: 0, - createAllocations: false, - status: 'dead', + return settled(); + }) + .then(startJob) + .then(() => expectStartRequest(assert, this.server, job)); }); - this.store.findAll('job'); - return wait() - .then(() => { - const job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + test('Starting a job without proper permissions shows an error message', function(assert) { + this.server.pretender.post('/v1/job/:id', () => [403, {}, null]); - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + const mirageJob = this.server.create('job', 'periodic', { + childrenCount: 0, + createAllocations: false, + status: 'dead', + }); + this.store.findAll('job'); + + return settled() + .then(async () => { + const job = this.store.peekAll('job').findBy('plainId', mirageJob.id); - return wait(); - }) - .then(startJob) - .then(expectError(assert, 'Could Not Start Job')); + this.setProperties(commonProperties(job)); + await render(commonTemplate); + + return settled(); + }) + .then(startJob) + .then(expectError(assert, 'Could Not Start Job')); + }); }); diff --git a/ui/tests/integration/job-page/service-test.js b/ui/tests/integration/job-page/service-test.js index 635acaad0f1..51b7d0da809 100644 --- a/ui/tests/integration/job-page/service-test.js +++ b/ui/tests/integration/job-page/service-test.js @@ -1,282 +1,285 @@ import { getOwner } from '@ember/application'; import { assign } from '@ember/polyfills'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { click, find } from 'ember-native-dom-helpers'; -import wait from 'ember-test-helpers/wait'; import hbs from 'htmlbars-inline-precompile'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import { startJob, stopJob, expectError, expectDeleteRequest, expectStartRequest } from './helpers'; import Job from 'nomad-ui/tests/pages/jobs/detail'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; -moduleForComponent('job-page/service', 'Integration | Component | job-page/service', { - integration: true, - beforeEach() { +module('Integration | Component | job-page/service', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { Job.setContext(this); - fragmentSerializerInitializer(getOwner(this)); + fragmentSerializerInitializer(this.owner); window.localStorage.clear(); - this.store = getOwner(this).lookup('service:store'); + this.store = this.owner.lookup('service:store'); this.server = startMirage(); this.server.create('namespace'); - }, - afterEach() { + }); + + hooks.afterEach(function() { Job.removeContext(); this.server.shutdown(); window.localStorage.clear(); - }, -}); - -const commonTemplate = hbs` - {{job-page/service - job=job - sortProperty=sortProperty - sortDescending=sortDescending - currentPage=currentPage - gotoJob=gotoJob}} -`; - -const commonProperties = job => ({ - job, - sortProperty: 'name', - sortDescending: true, - currentPage: 1, - gotoJob() {}, -}); - -const makeMirageJob = (server, props = {}) => - server.create( - 'job', - assign( - { - type: 'service', - createAllocations: false, - status: 'running', - }, - props - ) - ); - -test('Stopping a job sends a delete request for the job', function(assert) { - let job; - - const mirageJob = makeMirageJob(this.server); - this.store.findAll('job'); - - return wait() - .then(() => { - job = this.store.peekAll('job').findBy('plainId', mirageJob.id); - - this.setProperties(commonProperties(job)); - this.render(commonTemplate); - - return wait(); - }) - .then(stopJob) - .then(() => expectDeleteRequest(assert, this.server, job)); -}); - -test('Stopping a job without proper permissions shows an error message', function(assert) { - this.server.pretender.delete('/v1/job/:id', () => [403, {}, null]); - - const mirageJob = makeMirageJob(this.server); - this.store.findAll('job'); - - return wait() - .then(() => { - const job = this.store.peekAll('job').findBy('plainId', mirageJob.id); - - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + }); - return wait(); - }) - .then(stopJob) - .then(expectError(assert, 'Could Not Stop Job')); -}); + const commonTemplate = hbs` + {{job-page/service + job=job + sortProperty=sortProperty + sortDescending=sortDescending + currentPage=currentPage + gotoJob=gotoJob}} + `; + + const commonProperties = job => ({ + job, + sortProperty: 'name', + sortDescending: true, + currentPage: 1, + gotoJob() {}, + }); -test('Starting a job sends a post request for the job using the current definition', function(assert) { - let job; + const makeMirageJob = (server, props = {}) => + server.create( + 'job', + assign( + { + type: 'service', + createAllocations: false, + status: 'running', + }, + props + ) + ); + + test('Stopping a job sends a delete request for the job', function(assert) { + let job; + + const mirageJob = makeMirageJob(this.server); + this.store.findAll('job'); + + return settled() + .then(async () => { + job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + + this.setProperties(commonProperties(job)); + await render(commonTemplate); + + return settled(); + }) + .then(stopJob) + .then(() => expectDeleteRequest(assert, this.server, job)); + }); - const mirageJob = makeMirageJob(this.server, { status: 'dead' }); - this.store.findAll('job'); + test('Stopping a job without proper permissions shows an error message', function(assert) { + this.server.pretender.delete('/v1/job/:id', () => [403, {}, null]); - return wait() - .then(() => { - job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + const mirageJob = makeMirageJob(this.server); + this.store.findAll('job'); - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + return settled() + .then(async () => { + const job = this.store.peekAll('job').findBy('plainId', mirageJob.id); - return wait(); - }) - .then(startJob) - .then(() => expectStartRequest(assert, this.server, job)); -}); + this.setProperties(commonProperties(job)); + await render(commonTemplate); -test('Starting a job without proper permissions shows an error message', function(assert) { - this.server.pretender.post('/v1/job/:id', () => [403, {}, null]); + return settled(); + }) + .then(stopJob) + .then(expectError(assert, 'Could Not Stop Job')); + }); - const mirageJob = makeMirageJob(this.server, { status: 'dead' }); - this.store.findAll('job'); + test('Starting a job sends a post request for the job using the current definition', function(assert) { + let job; - return wait() - .then(() => { - const job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + const mirageJob = makeMirageJob(this.server, { status: 'dead' }); + this.store.findAll('job'); - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + return settled() + .then(async () => { + job = this.store.peekAll('job').findBy('plainId', mirageJob.id); - return wait(); - }) - .then(startJob) - .then(expectError(assert, 'Could Not Start Job')); -}); + this.setProperties(commonProperties(job)); + await render(commonTemplate); -test('Recent allocations shows allocations in the job context', function(assert) { - let job; + return settled(); + }) + .then(startJob) + .then(() => expectStartRequest(assert, this.server, job)); + }); - this.server.create('node'); - const mirageJob = makeMirageJob(this.server, { createAllocations: true }); - this.store.findAll('job'); + test('Starting a job without proper permissions shows an error message', function(assert) { + this.server.pretender.post('/v1/job/:id', () => [403, {}, null]); - return wait() - .then(() => { - job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + const mirageJob = makeMirageJob(this.server, { status: 'dead' }); + this.store.findAll('job'); - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + return settled() + .then(async () => { + const job = this.store.peekAll('job').findBy('plainId', mirageJob.id); - return wait(); - }) - .then(() => { - const allocation = this.server.db.allocations.sortBy('modifyIndex').reverse()[0]; - const allocationRow = Job.allocations.objectAt(0); + this.setProperties(commonProperties(job)); + await render(commonTemplate); - assert.equal(allocationRow.shortId, allocation.id.split('-')[0], 'ID'); - assert.equal(allocationRow.taskGroup, allocation.taskGroup, 'Task Group name'); - }); -}); + return settled(); + }) + .then(startJob) + .then(expectError(assert, 'Could Not Start Job')); + }); -test('Recent allocations caps out at five', function(assert) { - let job; + test('Recent allocations shows allocations in the job context', function(assert) { + let job; - this.server.create('node'); - const mirageJob = makeMirageJob(this.server); - this.server.createList('allocation', 10); + this.server.create('node'); + const mirageJob = makeMirageJob(this.server, { createAllocations: true }); + this.store.findAll('job'); - this.store.findAll('job'); + return settled() + .then(async () => { + job = this.store.peekAll('job').findBy('plainId', mirageJob.id); - return wait().then(() => { - job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + this.setProperties(commonProperties(job)); + await render(commonTemplate); - this.setProperties(commonProperties(job)); - this.render(commonTemplate); + return settled(); + }) + .then(() => { + const allocation = this.server.db.allocations.sortBy('modifyIndex').reverse()[0]; + const allocationRow = Job.allocations.objectAt(0); - return wait().then(() => { - assert.equal(Job.allocations.length, 5, 'Capped at 5 allocations'); - assert.ok( - Job.viewAllAllocations.includes(job.get('allocations.length') + ''), - `View link mentions ${job.get('allocations.length')} allocations` - ); - }); + assert.equal(allocationRow.shortId, allocation.id.split('-')[0], 'ID'); + assert.equal(allocationRow.taskGroup, allocation.taskGroup, 'Task Group name'); + }); }); -}); -test('Recent allocations shows an empty message when the job has no allocations', function(assert) { - let job; + test('Recent allocations caps out at five', function(assert) { + let job; - this.server.create('node'); - const mirageJob = makeMirageJob(this.server); + this.server.create('node'); + const mirageJob = makeMirageJob(this.server); + this.server.createList('allocation', 10); - this.store.findAll('job'); + this.store.findAll('job'); - return wait() - .then(() => { + return settled().then(async () => { job = this.store.peekAll('job').findBy('plainId', mirageJob.id); this.setProperties(commonProperties(job)); - this.render(commonTemplate); - - return wait(); - }) - .then(() => { - assert.ok( - Job.recentAllocationsEmptyState.headline.includes('No Allocations'), - 'No allocations empty message' - ); + await render(commonTemplate); + + return settled().then(() => { + assert.equal(Job.allocations.length, 5, 'Capped at 5 allocations'); + assert.ok( + Job.viewAllAllocations.includes(job.get('allocations.length') + ''), + `View link mentions ${job.get('allocations.length')} allocations` + ); + }); }); -}); - -test('Active deployment can be promoted', function(assert) { - let job; - let deployment; - - this.server.create('node'); - const mirageJob = makeMirageJob(this.server, { activeDeployment: true }); - - this.store.findAll('job'); + }); - return wait() - .then(() => { - job = this.store.peekAll('job').findBy('plainId', mirageJob.id); - deployment = job.get('latestDeployment'); + test('Recent allocations shows an empty message when the job has no allocations', function(assert) { + let job; - this.setProperties(commonProperties(job)); - this.render(commonTemplate); - - return wait(); - }) - .then(() => { - click('[data-test-promote-canary]'); - return wait(); - }) - .then(() => { - const requests = this.server.pretender.handledRequests; - assert.ok( - requests - .filterBy('method', 'POST') - .findBy('url', `/v1/deployment/promote/${deployment.get('id')}`), - 'A promote POST request was made' - ); - }); -}); + this.server.create('node'); + const mirageJob = makeMirageJob(this.server); -test('When promoting the active deployment fails, an error is shown', function(assert) { - this.server.pretender.post('/v1/deployment/promote/:id', () => [403, {}, null]); + this.store.findAll('job'); - let job; + return settled() + .then(async () => { + job = this.store.peekAll('job').findBy('plainId', mirageJob.id); - this.server.create('node'); - const mirageJob = makeMirageJob(this.server, { activeDeployment: true }); + this.setProperties(commonProperties(job)); + await render(commonTemplate); - this.store.findAll('job'); + return settled(); + }) + .then(() => { + assert.ok( + Job.recentAllocationsEmptyState.headline.includes('No Allocations'), + 'No allocations empty message' + ); + }); + }); - return wait() - .then(() => { - job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + test('Active deployment can be promoted', function(assert) { + let job; + let deployment; + + this.server.create('node'); + const mirageJob = makeMirageJob(this.server, { activeDeployment: true }); + + this.store.findAll('job'); + + return settled() + .then(async () => { + job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + deployment = job.get('latestDeployment'); + + this.setProperties(commonProperties(job)); + await render(commonTemplate); + + return settled(); + }) + .then(() => { + click('[data-test-promote-canary]'); + return settled(); + }) + .then(() => { + const requests = this.server.pretender.handledRequests; + assert.ok( + requests + .filterBy('method', 'POST') + .findBy('url', `/v1/deployment/promote/${deployment.get('id')}`), + 'A promote POST request was made' + ); + }); + }); - this.setProperties(commonProperties(job)); - this.render(commonTemplate); - - return wait(); - }) - .then(() => { - click('[data-test-promote-canary]'); - return wait(); - }) - .then(() => { - assert.equal( - find('[data-test-job-error-title]').textContent, - 'Could Not Promote Deployment', - 'Appropriate error is shown' - ); - assert.ok( - find('[data-test-job-error-body]').textContent.includes('ACL'), - 'The error message mentions ACLs' - ); - - click('[data-test-job-error-close]'); - assert.notOk(find('[data-test-job-error-title]'), 'Error message is dismissable'); - return wait(); - }); + test('When promoting the active deployment fails, an error is shown', function(assert) { + this.server.pretender.post('/v1/deployment/promote/:id', () => [403, {}, null]); + + let job; + + this.server.create('node'); + const mirageJob = makeMirageJob(this.server, { activeDeployment: true }); + + this.store.findAll('job'); + + return settled() + .then(async () => { + job = this.store.peekAll('job').findBy('plainId', mirageJob.id); + + this.setProperties(commonProperties(job)); + await render(commonTemplate); + + return settled(); + }) + .then(() => { + click('[data-test-promote-canary]'); + return settled(); + }) + .then(() => { + assert.equal( + find('[data-test-job-error-title]').textContent, + 'Could Not Promote Deployment', + 'Appropriate error is shown' + ); + assert.ok( + find('[data-test-job-error-body]').textContent.includes('ACL'), + 'The error message mentions ACLs' + ); + + click('[data-test-job-error-close]'); + assert.notOk(find('[data-test-job-error-title]'), 'Error message is dismissable'); + return settled(); + }); + }); }); diff --git a/ui/tests/integration/list-pagination-test.js b/ui/tests/integration/list-pagination-test.js index a3091d62adc..0aa1301d285 100644 --- a/ui/tests/integration/list-pagination-test.js +++ b/ui/tests/integration/list-pagination-test.js @@ -1,245 +1,247 @@ import { findAll, find } from 'ember-native-dom-helpers'; -import { test, skip, moduleForComponent } from 'ember-qunit'; +import { module, skip, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; -moduleForComponent('list-pagination', 'Integration | Component | list pagination', { - integration: true, -}); +module('Integration | Component | list pagination', function(hooks) { + setupRenderingTest(hooks); + + const defaults = { + source: [], + size: 25, + page: 1, + spread: 2, + }; + + const list100 = Array(100) + .fill(null) + .map((_, i) => i); + + test('the source property', async function(assert) { + this.set('source', list100); + await render(hbs` + {{#list-pagination source=source as |p|}} + {{p.currentPage}} of {{p.totalPages}} + {{#p.first}}first{{/p.first}} + {{#p.prev}}prev{{/p.prev}} + {{#each p.pageLinks as |link|}} + {{link.pageNumber}} + {{/each}} + {{#p.next}}next{{/p.next}} + {{#p.last}}last{{/p.last}} + + {{#each p.list as |item|}} +
{{item}}
+ {{/each}} + {{/list-pagination}} + `); + + assert.ok(!findAll('.first').length, 'On the first page, there is no first link'); + assert.ok(!findAll('.prev').length, 'On the first page, there is no prev link'); -const defaults = { - source: [], - size: 25, - page: 1, - spread: 2, -}; - -const list100 = Array(100) - .fill(null) - .map((_, i) => i); - -test('the source property', function(assert) { - this.set('source', list100); - this.render(hbs` - {{#list-pagination source=source as |p|}} - {{p.currentPage}} of {{p.totalPages}} - {{#p.first}}first{{/p.first}} - {{#p.prev}}prev{{/p.prev}} - {{#each p.pageLinks as |link|}} - {{link.pageNumber}} - {{/each}} - {{#p.next}}next{{/p.next}} - {{#p.last}}last{{/p.last}} - - {{#each p.list as |item|}} -
{{item}}
- {{/each}} - {{/list-pagination}} - `); - - assert.ok(!findAll('.first').length, 'On the first page, there is no first link'); - assert.ok(!findAll('.prev').length, 'On the first page, there is no prev link'); - - assert.equal( - findAll('.link').length, - defaults.spread + 1, - 'Pages links spread to the right by the spread amount' - ); - - for (var pageNumber = 1; pageNumber <= defaults.spread + 1; pageNumber++) { - assert.ok(findAll(`.link.page-${pageNumber}`).length, `Page link includes ${pageNumber}`); - } + assert.equal( + findAll('.link').length, + defaults.spread + 1, + 'Pages links spread to the right by the spread amount' + ); - assert.ok(findAll('.next').length, 'While not on the last page, there is a next link'); - assert.ok(findAll('.last').length, 'While not on the last page, there is a last link'); + for (var pageNumber = 1; pageNumber <= defaults.spread + 1; pageNumber++) { + assert.ok(findAll(`.link.page-${pageNumber}`).length, `Page link includes ${pageNumber}`); + } - assert.ok( - findAll('.item').length, - defaults.size, - `Only ${defaults.size} (the default) number of items are rendered` - ); + assert.ok(findAll('.next').length, 'While not on the last page, there is a next link'); + assert.ok(findAll('.last').length, 'While not on the last page, there is a last link'); - for (var item = 0; item < defaults.size; item++) { - assert.equal( - findAll('.item')[item].textContent, - item, - 'Rendered items are in the current page' + assert.ok( + findAll('.item').length, + defaults.size, + `Only ${defaults.size} (the default) number of items are rendered` ); - } -}); -test('the size property', function(assert) { - this.setProperties({ - size: 5, - source: list100, + for (var item = 0; item < defaults.size; item++) { + assert.equal( + findAll('.item')[item].textContent, + item, + 'Rendered items are in the current page' + ); + } }); - this.render(hbs` - {{#list-pagination source=source size=size as |p|}} - {{p.currentPage}} of {{p.totalPages}} - {{/list-pagination}} - `); - - const totalPages = Math.ceil(this.get('source').length / this.get('size')); - assert.equal(find('.page-info').textContent, `1 of ${totalPages}`, `${totalPages} total pages`); -}); -test('the spread property', function(assert) { - this.setProperties({ - source: list100, - spread: 1, - size: 10, - currentPage: 5, + test('the size property', async function(assert) { + this.setProperties({ + size: 5, + source: list100, + }); + await render(hbs` + {{#list-pagination source=source size=size as |p|}} + {{p.currentPage}} of {{p.totalPages}} + {{/list-pagination}} + `); + + const totalPages = Math.ceil(this.get('source').length / this.get('size')); + assert.equal(find('.page-info').textContent, `1 of ${totalPages}`, `${totalPages} total pages`); }); - this.render(hbs` - {{#list-pagination source=source spread=spread size=size page=currentPage as |p|}} - {{#each p.pageLinks as |link|}} - {{link.pageNumber}} - {{/each}} - {{/list-pagination}} - `); - - testSpread.call(this, assert); - this.set('spread', 4); - testSpread.call(this, assert); -}); - -test('page property', function(assert) { - this.setProperties({ - source: list100, - size: 5, - currentPage: 5, + test('the spread property', async function(assert) { + this.setProperties({ + source: list100, + spread: 1, + size: 10, + currentPage: 5, + }); + + await render(hbs` + {{#list-pagination source=source spread=spread size=size page=currentPage as |p|}} + {{#each p.pageLinks as |link|}} + {{link.pageNumber}} + {{/each}} + {{/list-pagination}} + `); + + testSpread.call(this, assert); + this.set('spread', 4); + testSpread.call(this, assert); }); - this.render(hbs` - {{#list-pagination source=source size=size page=currentPage as |p|}} - {{#each p.list as |item|}} -
{{item}}
- {{/each}} - {{/list-pagination}} - `); - - testItems.call(this, assert); - this.set('currentPage', 2); - testItems.call(this, assert); -}); - -// Ember doesn't support query params (or controllers or routes) in integration tests, -// so links can only be tested in acceptance tests. -// Leaving this test here for posterity. -skip('pagination links link with query params', function() {}); - -test('there are no pagination links when source is less than page size', function(assert) { - this.set('source', list100.slice(0, 10)); - this.render(hbs` - {{#list-pagination source=source as |p|}} - {{p.currentPage}} of {{p.totalPages}} - {{#p.first}}first{{/p.first}} - {{#p.prev}}prev{{/p.prev}} - {{#each p.pageLinks as |link|}} - {{link.pageNumber}} - {{/each}} - {{#p.next}}next{{/p.next}} - {{#p.last}}last{{/p.last}} - - {{#each p.list as |item|}} -
{{item}}
- {{/each}} - {{/list-pagination}} - `); - - assert.ok(!findAll('.first').length, 'No first link'); - assert.ok(!findAll('.prev').length, 'No prev link'); - assert.ok(!findAll('.next').length, 'No next link'); - assert.ok(!findAll('.last').length, 'No last link'); - - assert.equal(find('.page-info').textContent, '1 of 1', 'Only one page'); - assert.equal( - findAll('.item').length, - this.get('source.length'), - 'Number of items equals length of source' - ); -}); - -// when there are no items in source -test('when there are no items in source', function(assert) { - this.set('source', []); - this.render(hbs` - {{#list-pagination source=source as |p|}} - {{p.currentPage}} of {{p.totalPages}} - {{#p.first}}first{{/p.first}} - {{#p.prev}}prev{{/p.prev}} - {{#each p.pageLinks as |link|}} - {{link.pageNumber}} - {{/each}} - {{#p.next}}next{{/p.next}} - {{#p.last}}last{{/p.last}} - - {{#each p.list as |item|}} -
{{item}}
- {{/each}} - {{else}} -
Empty State
- {{/list-pagination}} - `); - - assert.ok( - !findAll('.page-info, .first, .prev, .link, .next, .last, .item').length, - 'Nothing in the yield renders' - ); - assert.ok(findAll('.empty-state').length, 'Empty state is rendered'); -}); + test('page property', async function(assert) { + this.setProperties({ + source: list100, + size: 5, + currentPage: 5, + }); + + await render(hbs` + {{#list-pagination source=source size=size page=currentPage as |p|}} + {{#each p.list as |item|}} +
{{item}}
+ {{/each}} + {{/list-pagination}} + `); + + testItems.call(this, assert); + this.set('currentPage', 2); + testItems.call(this, assert); + }); -// when there is less pages than the total spread amount -test('when there is less pages than the total spread amount', function(assert) { - this.setProperties({ - source: list100, - spread: 4, - size: 20, - page: 3, + // Ember doesn't support query params (or controllers or routes) in integration tests, + // so links can only be tested in acceptance tests. + // Leaving this test here for posterity. + skip('pagination links link with query params', function() {}); + + test('there are no pagination links when source is less than page size', async function(assert) { + this.set('source', list100.slice(0, 10)); + await render(hbs` + {{#list-pagination source=source as |p|}} + {{p.currentPage}} of {{p.totalPages}} + {{#p.first}}first{{/p.first}} + {{#p.prev}}prev{{/p.prev}} + {{#each p.pageLinks as |link|}} + {{link.pageNumber}} + {{/each}} + {{#p.next}}next{{/p.next}} + {{#p.last}}last{{/p.last}} + + {{#each p.list as |item|}} +
{{item}}
+ {{/each}} + {{/list-pagination}} + `); + + assert.ok(!findAll('.first').length, 'No first link'); + assert.ok(!findAll('.prev').length, 'No prev link'); + assert.ok(!findAll('.next').length, 'No next link'); + assert.ok(!findAll('.last').length, 'No last link'); + + assert.equal(find('.page-info').textContent, '1 of 1', 'Only one page'); + assert.equal( + findAll('.item').length, + this.get('source.length'), + 'Number of items equals length of source' + ); }); - const totalPages = Math.ceil(this.get('source.length') / this.get('size')); - - this.render(hbs` - {{#list-pagination source=source page=page spread=spread size=size as |p|}} - {{p.currentPage}} of {{p.totalPages}} - {{#p.first}}first{{/p.first}} - {{#p.prev}}prev{{/p.prev}} - {{#each p.pageLinks as |link|}} - {{link.pageNumber}} - {{/each}} - {{#p.next}}next{{/p.next}} - {{#p.last}}last{{/p.last}} - {{/list-pagination}} - `); - - assert.ok(findAll('.first').length, 'First page still exists'); - assert.ok(findAll('.prev').length, 'Prev page still exists'); - assert.ok(findAll('.next').length, 'Next page still exists'); - assert.ok(findAll('.last').length, 'Last page still exists'); - assert.equal(findAll('.link').length, totalPages, 'Every page gets a page link'); - for (var pageNumber = 1; pageNumber < totalPages; pageNumber++) { - assert.ok(findAll(`.link.page-${pageNumber}`).length, `Page link for ${pageNumber} exists`); - } -}); + // when there are no items in source + test('when there are no items in source', async function(assert) { + this.set('source', []); + await render(hbs` + {{#list-pagination source=source as |p|}} + {{p.currentPage}} of {{p.totalPages}} + {{#p.first}}first{{/p.first}} + {{#p.prev}}prev{{/p.prev}} + {{#each p.pageLinks as |link|}} + {{link.pageNumber}} + {{/each}} + {{#p.next}}next{{/p.next}} + {{#p.last}}last{{/p.last}} + + {{#each p.list as |item|}} +
{{item}}
+ {{/each}} + {{else}} +
Empty State
+ {{/list-pagination}} + `); -function testSpread(assert) { - const { spread, currentPage } = this.getProperties('spread', 'currentPage'); - for (var pageNumber = currentPage - spread; pageNumber <= currentPage + spread; pageNumber++) { assert.ok( - findAll(`.link.page-${pageNumber}`).length, - `Page links for currentPage (${currentPage}) +/- spread of ${spread} (${pageNumber})` + !findAll('.page-info, .first, .prev, .link, .next, .last, .item').length, + 'Nothing in the yield renders' ); + assert.ok(findAll('.empty-state').length, 'Empty state is rendered'); + }); + + // when there is less pages than the total spread amount + test('when there is less pages than the total spread amount', async function(assert) { + this.setProperties({ + source: list100, + spread: 4, + size: 20, + page: 3, + }); + + const totalPages = Math.ceil(this.get('source.length') / this.get('size')); + + await render(hbs` + {{#list-pagination source=source page=page spread=spread size=size as |p|}} + {{p.currentPage}} of {{p.totalPages}} + {{#p.first}}first{{/p.first}} + {{#p.prev}}prev{{/p.prev}} + {{#each p.pageLinks as |link|}} + {{link.pageNumber}} + {{/each}} + {{#p.next}}next{{/p.next}} + {{#p.last}}last{{/p.last}} + {{/list-pagination}} + `); + + assert.ok(findAll('.first').length, 'First page still exists'); + assert.ok(findAll('.prev').length, 'Prev page still exists'); + assert.ok(findAll('.next').length, 'Next page still exists'); + assert.ok(findAll('.last').length, 'Last page still exists'); + assert.equal(findAll('.link').length, totalPages, 'Every page gets a page link'); + for (var pageNumber = 1; pageNumber < totalPages; pageNumber++) { + assert.ok(findAll(`.link.page-${pageNumber}`).length, `Page link for ${pageNumber} exists`); + } + }); + + function testSpread(assert) { + const { spread, currentPage } = this.getProperties('spread', 'currentPage'); + for (var pageNumber = currentPage - spread; pageNumber <= currentPage + spread; pageNumber++) { + assert.ok( + findAll(`.link.page-${pageNumber}`).length, + `Page links for currentPage (${currentPage}) +/- spread of ${spread} (${pageNumber})` + ); + } } -} -function testItems(assert) { - const { currentPage, size } = this.getProperties('currentPage', 'size'); - for (var item = 0; item < size; item++) { - assert.equal( - findAll('.item')[item].textContent, - item + (currentPage - 1) * size, - `Rendered items are in the current page, ${currentPage} (${item + (currentPage - 1) * size})` - ); + function testItems(assert) { + const { currentPage, size } = this.getProperties('currentPage', 'size'); + for (var item = 0; item < size; item++) { + assert.equal( + findAll('.item')[item].textContent, + item + (currentPage - 1) * size, + `Rendered items are in the current page, ${currentPage} (${item + (currentPage - 1) * size})` + ); + } } -} +}); diff --git a/ui/tests/integration/list-table-test.js b/ui/tests/integration/list-table-test.js index 7f4d74f6a64..7ca418b5ec2 100644 --- a/ui/tests/integration/list-table-test.js +++ b/ui/tests/integration/list-table-test.js @@ -1,93 +1,95 @@ import { findAll, find } from 'ember-native-dom-helpers'; -import { test, skip, moduleForComponent } from 'ember-qunit'; +import { module, skip, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; import { faker } from 'ember-cli-mirage'; import hbs from 'htmlbars-inline-precompile'; -moduleForComponent('list-table', 'Integration | Component | list table', { - integration: true, -}); - -const commonTable = Array(10) - .fill(null) - .map(() => ({ - firstName: faker.name.firstName(), - lastName: faker.name.lastName(), - age: faker.random.number({ min: 18, max: 60 }), - })); +module('Integration | Component | list table', function(hooks) { + setupRenderingTest(hooks); -// thead -test('component exposes a thead contextual component', function(assert) { - this.set('source', commonTable); - this.render(hbs` - {{#list-table source=source sortProperty=sortProperty sortDescending=sortDescending as |t|}} - {{#t.head class="head"}} - First Name - Last Name - Age - {{/t.head}} - {{/list-table}} - `); + const commonTable = Array(10) + .fill(null) + .map(() => ({ + firstName: faker.name.firstName(), + lastName: faker.name.lastName(), + age: faker.random.number({ min: 18, max: 60 }), + })); - assert.ok(findAll('.head').length, 'Table head is rendered'); - assert.equal(find('.head').tagName.toLowerCase(), 'thead', 'Table head is a thead element'); -}); + // thead + test('component exposes a thead contextual component', async function(assert) { + this.set('source', commonTable); + await render(hbs` + {{#list-table source=source sortProperty=sortProperty sortDescending=sortDescending as |t|}} + {{#t.head class="head"}} + First Name + Last Name + Age + {{/t.head}} + {{/list-table}} + `); -// tbody -test('component exposes a tbody contextual component', function(assert) { - this.setProperties({ - source: commonTable, - sortProperty: 'firstName', - sortDescending: false, + assert.ok(findAll('.head').length, 'Table head is rendered'); + assert.equal(find('.head').tagName.toLowerCase(), 'thead', 'Table head is a thead element'); }); - this.render(hbs` - {{#list-table source=source sortProperty=sortProperty sortDescending=sortDescending as |t|}} - {{#t.body class="body" as |row|}} - - {{row.model.firstName}} - {{row.model.lastName}} - {{row.model.age}} - - {{/t.body}} - {{/list-table}} - `); - assert.ok(findAll('.body').length, 'Table body is rendered'); - assert.equal(find('.body').tagName.toLowerCase(), 'tbody', 'Table body is a tbody element'); + // tbody + test('component exposes a tbody contextual component', async function(assert) { + this.setProperties({ + source: commonTable, + sortProperty: 'firstName', + sortDescending: false, + }); + await render(hbs` + {{#list-table source=source sortProperty=sortProperty sortDescending=sortDescending as |t|}} + {{#t.body class="body" as |row|}} + + {{row.model.firstName}} + {{row.model.lastName}} + {{row.model.age}} + + {{/t.body}} + {{/list-table}} + `); - assert.equal(findAll('.item').length, this.get('source.length'), 'Each item gets its own row'); + assert.ok(findAll('.body').length, 'Table body is rendered'); + assert.equal(find('.body').tagName.toLowerCase(), 'tbody', 'Table body is a tbody element'); - // list-table is not responsible for sorting, only dispatching sort events. The table is still - // rendered in index-order. - this.get('source').forEach((item, index) => { - const $item = this.$(`.item:eq(${index})`); - assert.equal( - $item - .find('td:eq(0)') - .text() - .trim(), - item.firstName, - 'First name' - ); - assert.equal( - $item - .find('td:eq(1)') - .text() - .trim(), - item.lastName, - 'Last name' - ); - assert.equal( - $item - .find('td:eq(2)') - .text() - .trim(), - item.age, - 'Age' - ); + assert.equal(findAll('.item').length, this.get('source.length'), 'Each item gets its own row'); + + // list-table is not responsible for sorting, only dispatching sort events. The table is still + // rendered in index-order. + this.get('source').forEach((item, index) => { + const $item = this.$(`.item:eq(${index})`); + assert.equal( + $item + .find('td:eq(0)') + .text() + .trim(), + item.firstName, + 'First name' + ); + assert.equal( + $item + .find('td:eq(1)') + .text() + .trim(), + item.lastName, + 'Last name' + ); + assert.equal( + $item + .find('td:eq(2)') + .text() + .trim(), + item.age, + 'Age' + ); + }); }); -}); -// Ember doesn't support query params (or controllers or routes) in integration tests, -// so sorting links can only be tested in acceptance tests. -// Leaving this test here for posterity. -skip('sort-by creates links using the appropriate links given sort property and sort descending', function() {}); + // Ember doesn't support query params (or controllers or routes) in integration tests, + // so sorting links can only be tested in acceptance tests. + // Leaving this test here for posterity. + skip('sort-by creates links using the appropriate links given sort property and sort descending', function() {}); +}); diff --git a/ui/tests/integration/multi-select-dropdown-test.js b/ui/tests/integration/multi-select-dropdown-test.js index f619ba80865..cea9527032e 100644 --- a/ui/tests/integration/multi-select-dropdown-test.js +++ b/ui/tests/integration/multi-select-dropdown-test.js @@ -1,7 +1,8 @@ import { findAll, find, click, focus, keyEvent } from 'ember-native-dom-helpers'; -import { moduleForComponent, test } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import sinon from 'sinon'; -import wait from 'ember-test-helpers/wait'; import hbs from 'htmlbars-inline-precompile'; const TAB = 9; @@ -10,302 +11,302 @@ const SPACE = 32; const ARROW_UP = 38; const ARROW_DOWN = 40; -moduleForComponent('multi-select-dropdown', 'Integration | Component | multi-select dropdown', { - integration: true, -}); +module('Integration | Component | multi-select dropdown', function(hooks) { + setupRenderingTest(hooks); + + const commonProperties = () => ({ + label: 'This is the dropdown label', + selection: [], + options: [ + { key: 'consul', label: 'Consul' }, + { key: 'nomad', label: 'Nomad' }, + { key: 'terraform', label: 'Terraform' }, + { key: 'packer', label: 'Packer' }, + { key: 'vagrant', label: 'Vagrant' }, + { key: 'vault', label: 'Vault' }, + ], + onSelect: sinon.spy(), + }); -const commonProperties = () => ({ - label: 'This is the dropdown label', - selection: [], - options: [ - { key: 'consul', label: 'Consul' }, - { key: 'nomad', label: 'Nomad' }, - { key: 'terraform', label: 'Terraform' }, - { key: 'packer', label: 'Packer' }, - { key: 'vagrant', label: 'Vagrant' }, - { key: 'vault', label: 'Vault' }, - ], - onSelect: sinon.spy(), -}); + const commonTemplate = hbs` + {{multi-select-dropdown + label=label + options=options + selection=selection + onSelect=onSelect}} + `; -const commonTemplate = hbs` - {{multi-select-dropdown - label=label - options=options - selection=selection - onSelect=onSelect}} -`; - -test('component is initially closed', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); - - assert.ok(find('.dropdown-trigger'), 'Trigger is shown'); - assert.equal( - find('[data-test-dropdown-trigger]').textContent.trim(), - props.label, - 'Trigger is appropriately labeled' - ); - assert.notOk(find('[data-test-dropdown-options]'), 'Options are not rendered'); -}); + test('component is initially closed', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); + + assert.ok(find('.dropdown-trigger'), 'Trigger is shown'); + assert.equal( + find('[data-test-dropdown-trigger]').textContent.trim(), + props.label, + 'Trigger is appropriately labeled' + ); + assert.notOk(find('[data-test-dropdown-options]'), 'Options are not rendered'); + }); -test('component opens the options dropdown when clicked', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); - - click('[data-test-dropdown-trigger]'); - - return wait() - .then(() => { - assert.ok(find('[data-test-dropdown-options]'), 'Options are shown now'); - click('[data-test-dropdown-trigger]'); - return wait(); - }) - .then(() => { - assert.notOk(find('[data-test-dropdown-options]'), 'Options are hidden after clicking again'); + test('component opens the options dropdown when clicked', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); + + click('[data-test-dropdown-trigger]'); + + return settled() + .then(() => { + assert.ok(find('[data-test-dropdown-options]'), 'Options are shown now'); + click('[data-test-dropdown-trigger]'); + return settled(); + }) + .then(() => { + assert.notOk(find('[data-test-dropdown-options]'), 'Options are hidden after clicking again'); + }); + }); + + test('all options are shown in the options dropdown, each with a checkbox input', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); + + click('[data-test-dropdown-trigger]'); + + return settled().then(() => { + assert.equal( + findAll('[data-test-dropdown-option]').length, + props.options.length, + 'All options are shown' + ); + findAll('[data-test-dropdown-option]').forEach((optionEl, index) => { + const label = props.options[index].label; + assert.equal(optionEl.textContent.trim(), label, `Correct label for ${label}`); + assert.ok(optionEl.querySelector('input[type="checkbox"]'), 'Option contains a checkbox'); + }); }); -}); + }); -test('all options are shown in the options dropdown, each with a checkbox input', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); + test('onSelect gets called when an option is clicked', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); + + click('[data-test-dropdown-trigger]'); + + return settled() + .then(() => { + click('[data-test-dropdown-option] label'); + return settled(); + }) + .then(() => { + assert.ok(props.onSelect.called, 'onSelect was called'); + const newSelection = props.onSelect.getCall(0).args[0]; + assert.deepEqual( + newSelection, + [props.options[0].key], + 'onSelect was called with the first option key' + ); + }); + }); - click('[data-test-dropdown-trigger]'); + test('the component trigger shows the selection count when there is a selection', async function(assert) { + const props = commonProperties(); + props.selection = [props.options[0].key, props.options[1].key]; + this.setProperties(props); + await render(commonTemplate); - return wait().then(() => { + assert.ok(find('[data-test-dropdown-trigger] [data-test-dropdown-count]'), 'The count is shown'); assert.equal( - findAll('[data-test-dropdown-option]').length, - props.options.length, - 'All options are shown' + find('[data-test-dropdown-trigger] [data-test-dropdown-count]').textContent, + props.selection.length, + 'The count is accurate' ); - findAll('[data-test-dropdown-option]').forEach((optionEl, index) => { - const label = props.options[index].label; - assert.equal(optionEl.textContent.trim(), label, `Correct label for ${label}`); - assert.ok(optionEl.querySelector('input[type="checkbox"]'), 'Option contains a checkbox'); - }); - }); -}); -test('onSelect gets called when an option is clicked', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); - - click('[data-test-dropdown-trigger]'); - - return wait() - .then(() => { - click('[data-test-dropdown-option] label'); - return wait(); - }) - .then(() => { - assert.ok(props.onSelect.called, 'onSelect was called'); - const newSelection = props.onSelect.getCall(0).args[0]; - assert.deepEqual( - newSelection, - [props.options[0].key], - 'onSelect was called with the first option key' + this.set('selection', []); + + return settled().then(() => { + assert.notOk( + find('[data-test-dropdown-trigger] [data-test-dropdown-count]'), + 'The count is no longer shown when the selection is empty' ); }); -}); + }); -test('the component trigger shows the selection count when there is a selection', function(assert) { - const props = commonProperties(); - props.selection = [props.options[0].key, props.options[1].key]; - this.setProperties(props); - this.render(commonTemplate); - - assert.ok(find('[data-test-dropdown-trigger] [data-test-dropdown-count]'), 'The count is shown'); - assert.equal( - find('[data-test-dropdown-trigger] [data-test-dropdown-count]').textContent, - props.selection.length, - 'The count is accurate' - ); - - this.set('selection', []); - - return wait().then(() => { - assert.notOk( - find('[data-test-dropdown-trigger] [data-test-dropdown-count]'), - 'The count is no longer shown when the selection is empty' + test('pressing DOWN when the trigger has focus opens the options list', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); + + focus('[data-test-dropdown-trigger]'); + assert.notOk(find('[data-test-dropdown-options]'), 'Options are not shown on focus'); + keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); + assert.ok(find('[data-test-dropdown-options]'), 'Options are now shown'); + assert.equal( + document.activeElement, + find('[data-test-dropdown-trigger]'), + 'The dropdown trigger maintains focus' ); }); -}); -test('pressing DOWN when the trigger has focus opens the options list', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); - - focus('[data-test-dropdown-trigger]'); - assert.notOk(find('[data-test-dropdown-options]'), 'Options are not shown on focus'); - keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); - assert.ok(find('[data-test-dropdown-options]'), 'Options are now shown'); - assert.equal( - document.activeElement, - find('[data-test-dropdown-trigger]'), - 'The dropdown trigger maintains focus' - ); -}); + test('pressing DOWN when the trigger has focus and the options list is open focuses the first option', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); -test('pressing DOWN when the trigger has focus and the options list is open focuses the first option', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); - - focus('[data-test-dropdown-trigger]'); - keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); - keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); - assert.equal( - document.activeElement, - find('[data-test-dropdown-option]'), - 'The first option now has focus' - ); -}); + focus('[data-test-dropdown-trigger]'); + keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); + keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); + assert.equal( + document.activeElement, + find('[data-test-dropdown-option]'), + 'The first option now has focus' + ); + }); -test('pressing TAB when the trigger has focus and the options list is open focuses the first option', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); - - focus('[data-test-dropdown-trigger]'); - keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); - keyEvent('[data-test-dropdown-trigger]', 'keydown', TAB); - assert.equal( - document.activeElement, - find('[data-test-dropdown-option]'), - 'The first option now has focus' - ); -}); + test('pressing TAB when the trigger has focus and the options list is open focuses the first option', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); -test('pressing UP when the first list option is focused does nothing', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); + focus('[data-test-dropdown-trigger]'); + keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); + keyEvent('[data-test-dropdown-trigger]', 'keydown', TAB); + assert.equal( + document.activeElement, + find('[data-test-dropdown-option]'), + 'The first option now has focus' + ); + }); - click('[data-test-dropdown-trigger]'); + test('pressing UP when the first list option is focused does nothing', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); - focus('[data-test-dropdown-option]'); - keyEvent('[data-test-dropdown-option]', 'keydown', ARROW_UP); - assert.equal( - document.activeElement, - find('[data-test-dropdown-option]'), - 'The first option maintains focus' - ); -}); + click('[data-test-dropdown-trigger]'); -test('pressing DOWN when the a list option is focused moves focus to the next list option', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); + focus('[data-test-dropdown-option]'); + keyEvent('[data-test-dropdown-option]', 'keydown', ARROW_UP); + assert.equal( + document.activeElement, + find('[data-test-dropdown-option]'), + 'The first option maintains focus' + ); + }); - click('[data-test-dropdown-trigger]'); + test('pressing DOWN when the a list option is focused moves focus to the next list option', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); - focus('[data-test-dropdown-option]'); - keyEvent('[data-test-dropdown-option]', 'keydown', ARROW_DOWN); - assert.equal( - document.activeElement, - findAll('[data-test-dropdown-option]')[1], - 'The second option has focus' - ); -}); + click('[data-test-dropdown-trigger]'); -test('pressing DOWN when the last list option has focus does nothing', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); - - click('[data-test-dropdown-trigger]'); - - focus('[data-test-dropdown-option]'); - const optionEls = findAll('[data-test-dropdown-option]'); - const lastIndex = optionEls.length - 1; - optionEls.forEach((option, index) => { - keyEvent(option, 'keydown', ARROW_DOWN); - if (index < lastIndex) { - assert.equal(document.activeElement, optionEls[index + 1], `Option ${index + 1} has focus`); - } + focus('[data-test-dropdown-option]'); + keyEvent('[data-test-dropdown-option]', 'keydown', ARROW_DOWN); + assert.equal( + document.activeElement, + findAll('[data-test-dropdown-option]')[1], + 'The second option has focus' + ); }); - keyEvent(optionEls[lastIndex], 'keydown', ARROW_DOWN); - assert.equal(document.activeElement, optionEls[lastIndex], `Option ${lastIndex} still has focus`); -}); + test('pressing DOWN when the last list option has focus does nothing', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); + + click('[data-test-dropdown-trigger]'); + + focus('[data-test-dropdown-option]'); + const optionEls = findAll('[data-test-dropdown-option]'); + const lastIndex = optionEls.length - 1; + optionEls.forEach((option, index) => { + keyEvent(option, 'keydown', ARROW_DOWN); + if (index < lastIndex) { + assert.equal(document.activeElement, optionEls[index + 1], `Option ${index + 1} has focus`); + } + }); -test('onSelect gets called when pressing SPACE when a list option is focused', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); + keyEvent(optionEls[lastIndex], 'keydown', ARROW_DOWN); + assert.equal(document.activeElement, optionEls[lastIndex], `Option ${lastIndex} still has focus`); + }); - click('[data-test-dropdown-trigger]'); + test('onSelect gets called when pressing SPACE when a list option is focused', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); - focus('[data-test-dropdown-option]'); - keyEvent('[data-test-dropdown-option]', 'keydown', SPACE); + click('[data-test-dropdown-trigger]'); - assert.ok(props.onSelect.called, 'onSelect was called'); - const newSelection = props.onSelect.getCall(0).args[0]; - assert.deepEqual( - newSelection, - [props.options[0].key], - 'onSelect was called with the first option key' - ); -}); + focus('[data-test-dropdown-option]'); + keyEvent('[data-test-dropdown-option]', 'keydown', SPACE); + + assert.ok(props.onSelect.called, 'onSelect was called'); + const newSelection = props.onSelect.getCall(0).args[0]; + assert.deepEqual( + newSelection, + [props.options[0].key], + 'onSelect was called with the first option key' + ); + }); -test('list options have a positive tabindex and are therefore sequentially navigable', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); + test('list options have a positive tabindex and are therefore sequentially navigable', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); - click('[data-test-dropdown-trigger]'); + click('[data-test-dropdown-trigger]'); - findAll('[data-test-dropdown-option]').forEach(option => { - assert.ok(parseInt(option.getAttribute('tabindex'), 10) > 0, 'tabindex is a positive value'); + findAll('[data-test-dropdown-option]').forEach(option => { + assert.ok(parseInt(option.getAttribute('tabindex'), 10) > 0, 'tabindex is a positive value'); + }); }); -}); -test('the checkboxes inside list options have a negative tabindex and are therefore not sequentially navigable', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); + test('the checkboxes inside list options have a negative tabindex and are therefore not sequentially navigable', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); - click('[data-test-dropdown-trigger]'); + click('[data-test-dropdown-trigger]'); - findAll('[data-test-dropdown-option]').forEach(option => { - assert.ok( - parseInt(option.querySelector('input[type="checkbox"]').getAttribute('tabindex'), 10) < 0, - 'tabindex is a negative value' - ); + findAll('[data-test-dropdown-option]').forEach(option => { + assert.ok( + parseInt(option.querySelector('input[type="checkbox"]').getAttribute('tabindex'), 10) < 0, + 'tabindex is a negative value' + ); + }); }); -}); -test('pressing ESC when the options list is open closes the list and returns focus to the dropdown trigger', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); - - focus('[data-test-dropdown-trigger]'); - keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); - keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); - keyEvent('[data-test-dropdown-option]', 'keydown', ESC); - - assert.notOk(find('[data-test-dropdown-options]'), 'The options list is hidden once more'); - assert.equal( - document.activeElement, - find('[data-test-dropdown-trigger]'), - 'The trigger has focus' - ); -}); + test('pressing ESC when the options list is open closes the list and returns focus to the dropdown trigger', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); -test('when there are no list options, an empty message is shown', function(assert) { - const props = commonProperties(); - props.options = []; - this.setProperties(props); - this.render(commonTemplate); + focus('[data-test-dropdown-trigger]'); + keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); + keyEvent('[data-test-dropdown-trigger]', 'keydown', ARROW_DOWN); + keyEvent('[data-test-dropdown-option]', 'keydown', ESC); - click('[data-test-dropdown-trigger]'); - assert.ok(find('[data-test-dropdown-options]'), 'The dropdown is still shown'); - assert.ok(find('[data-test-dropdown-empty]'), 'The empty state is shown'); - assert.notOk(find('[data-test-dropdown-option]'), 'No options are shown'); + assert.notOk(find('[data-test-dropdown-options]'), 'The options list is hidden once more'); + assert.equal( + document.activeElement, + find('[data-test-dropdown-trigger]'), + 'The trigger has focus' + ); + }); + + test('when there are no list options, an empty message is shown', async function(assert) { + const props = commonProperties(); + props.options = []; + this.setProperties(props); + await render(commonTemplate); + + click('[data-test-dropdown-trigger]'); + assert.ok(find('[data-test-dropdown-options]'), 'The dropdown is still shown'); + assert.ok(find('[data-test-dropdown-empty]'), 'The empty state is shown'); + assert.notOk(find('[data-test-dropdown-option]'), 'No options are shown'); + }); }); diff --git a/ui/tests/integration/page-layout-test.js b/ui/tests/integration/page-layout-test.js index d082886dbc2..d27e68d3da1 100644 --- a/ui/tests/integration/page-layout-test.js +++ b/ui/tests/integration/page-layout-test.js @@ -1,73 +1,76 @@ -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { find, click } from 'ember-native-dom-helpers'; -import wait from 'ember-test-helpers/wait'; import hbs from 'htmlbars-inline-precompile'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; -moduleForComponent('page-layout', 'Integration | Component | page layout', { - integration: true, - beforeEach() { +module('Integration | Component | page layout', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { this.server = startMirage(); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - }, -}); + }); -test('the global-header hamburger menu opens the gutter menu', function(assert) { - this.render(hbs`{{page-layout}}`); + test('the global-header hamburger menu opens the gutter menu', async function(assert) { + await render(hbs`{{page-layout}}`); - assert.notOk( - find('[data-test-gutter-menu]').classList.contains('is-open'), - 'Gutter menu is not open' - ); - click('[data-test-header-gutter-toggle]'); + assert.notOk( + find('[data-test-gutter-menu]').classList.contains('is-open'), + 'Gutter menu is not open' + ); + click('[data-test-header-gutter-toggle]'); - return wait().then(() => { - assert.ok(find('[data-test-gutter-menu]').classList.contains('is-open'), 'Gutter menu is open'); + return settled().then(() => { + assert.ok(find('[data-test-gutter-menu]').classList.contains('is-open'), 'Gutter menu is open'); + }); }); -}); -test('the gutter-menu hamburger menu closes the gutter menu', function(assert) { - this.render(hbs`{{page-layout}}`); + test('the gutter-menu hamburger menu closes the gutter menu', async function(assert) { + await render(hbs`{{page-layout}}`); - click('[data-test-header-gutter-toggle]'); + click('[data-test-header-gutter-toggle]'); - return wait() - .then(() => { - assert.ok( - find('[data-test-gutter-menu]').classList.contains('is-open'), - 'Gutter menu is open' - ); - click('[data-test-gutter-gutter-toggle]'); - return wait(); - }) - .then(() => { - assert.notOk( - find('[data-test-gutter-menu]').classList.contains('is-open'), - 'Gutter menu is not open' - ); - }); -}); + return settled() + .then(() => { + assert.ok( + find('[data-test-gutter-menu]').classList.contains('is-open'), + 'Gutter menu is open' + ); + click('[data-test-gutter-gutter-toggle]'); + return settled(); + }) + .then(() => { + assert.notOk( + find('[data-test-gutter-menu]').classList.contains('is-open'), + 'Gutter menu is not open' + ); + }); + }); -test('the gutter-menu backdrop closes the gutter menu', function(assert) { - this.render(hbs`{{page-layout}}`); + test('the gutter-menu backdrop closes the gutter menu', async function(assert) { + await render(hbs`{{page-layout}}`); - click('[data-test-header-gutter-toggle]'); + click('[data-test-header-gutter-toggle]'); - return wait() - .then(() => { - assert.ok( - find('[data-test-gutter-menu]').classList.contains('is-open'), - 'Gutter menu is open' - ); - click('[data-test-gutter-backdrop]'); - return wait(); - }) - .then(() => { - assert.notOk( - find('[data-test-gutter-menu]').classList.contains('is-open'), - 'Gutter menu is not open' - ); - }); + return settled() + .then(() => { + assert.ok( + find('[data-test-gutter-menu]').classList.contains('is-open'), + 'Gutter menu is open' + ); + click('[data-test-gutter-backdrop]'); + return settled(); + }) + .then(() => { + assert.notOk( + find('[data-test-gutter-menu]').classList.contains('is-open'), + 'Gutter menu is not open' + ); + }); + }); }); diff --git a/ui/tests/integration/placement-failure-test.js b/ui/tests/integration/placement-failure-test.js index 97d8b688e64..abe313a4f8e 100644 --- a/ui/tests/integration/placement-failure-test.js +++ b/ui/tests/integration/placement-failure-test.js @@ -1,140 +1,142 @@ import { find, findAll } from 'ember-native-dom-helpers'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; import { assign } from '@ember/polyfills'; import hbs from 'htmlbars-inline-precompile'; import cleanWhitespace from '../utils/clean-whitespace'; -moduleForComponent('placement-failure', 'Integration | Component | placement failures', { - integration: true, -}); +module('Integration | Component | placement failures', function(hooks) { + setupRenderingTest(hooks); -const commonTemplate = hbs` - {{placement-failure taskGroup=taskGroup}} -`; + const commonTemplate = hbs` + {{placement-failure taskGroup=taskGroup}} + `; -test('should render the placement failure (basic render)', function(assert) { - const name = 'Placement Failure'; - const failures = 11; - this.set( - 'taskGroup', - createFixture( - { - coalescedFailures: failures - 1, - }, - name - ) - ); + test('should render the placement failure (basic render)', async function(assert) { + const name = 'Placement Failure'; + const failures = 11; + this.set( + 'taskGroup', + createFixture( + { + coalescedFailures: failures - 1, + }, + name + ) + ); - this.render(commonTemplate); + await render(commonTemplate); - assert.equal( - cleanWhitespace(find('[data-test-placement-failure-task-group]').firstChild.wholeText), - name, - 'Title is rendered with the name of the placement failure' - ); - assert.equal( - parseInt(find('[data-test-placement-failure-coalesced-failures]').textContent), - failures, - 'Title is rendered correctly with a count of unplaced' - ); - assert.equal( - findAll('[data-test-placement-failure-no-evaluated-nodes]').length, - 1, - 'No evaluated nodes message shown' - ); - assert.equal( - findAll('[data-test-placement-failure-no-nodes-available]').length, - 1, - 'No nodes in datacenter message shown' - ); - assert.equal( - findAll('[data-test-placement-failure-class-filtered]').length, - 1, - 'Class filtered message shown' - ); - assert.equal( - findAll('[data-test-placement-failure-constraint-filtered]').length, - 1, - 'Constraint filtered message shown' - ); - assert.equal( - findAll('[data-test-placement-failure-nodes-exhausted]').length, - 1, - 'Node exhausted message shown' - ); - assert.equal( - findAll('[data-test-placement-failure-class-exhausted]').length, - 1, - 'Class exhausted message shown' - ); - assert.equal( - findAll('[data-test-placement-failure-dimension-exhausted]').length, - 1, - 'Dimension exhausted message shown' - ); - assert.equal( - findAll('[data-test-placement-failure-quota-exhausted]').length, - 1, - 'Quota exhausted message shown' - ); - assert.equal(findAll('[data-test-placement-failure-scores]').length, 1, 'Scores message shown'); -}); + assert.equal( + cleanWhitespace(find('[data-test-placement-failure-task-group]').firstChild.wholeText), + name, + 'Title is rendered with the name of the placement failure' + ); + assert.equal( + parseInt(find('[data-test-placement-failure-coalesced-failures]').textContent), + failures, + 'Title is rendered correctly with a count of unplaced' + ); + assert.equal( + findAll('[data-test-placement-failure-no-evaluated-nodes]').length, + 1, + 'No evaluated nodes message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-no-nodes-available]').length, + 1, + 'No nodes in datacenter message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-class-filtered]').length, + 1, + 'Class filtered message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-constraint-filtered]').length, + 1, + 'Constraint filtered message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-nodes-exhausted]').length, + 1, + 'Node exhausted message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-class-exhausted]').length, + 1, + 'Class exhausted message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-dimension-exhausted]').length, + 1, + 'Dimension exhausted message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-quota-exhausted]').length, + 1, + 'Quota exhausted message shown' + ); + assert.equal(findAll('[data-test-placement-failure-scores]').length, 1, 'Scores message shown'); + }); -test('should render correctly when a node is not evaluated', function(assert) { - this.set( - 'taskGroup', - createFixture({ - nodesEvaluated: 1, - nodesExhausted: 0, - }) - ); + test('should render correctly when a node is not evaluated', async function(assert) { + this.set( + 'taskGroup', + createFixture({ + nodesEvaluated: 1, + nodesExhausted: 0, + }) + ); - this.render(commonTemplate); + await render(commonTemplate); - assert.equal( - findAll('[data-test-placement-failure-no-evaluated-nodes]').length, - 0, - 'No evaluated nodes message shown' - ); - assert.equal( - findAll('[data-test-placement-failure-nodes-exhausted]').length, - 0, - 'Nodes exhausted message NOT shown when there are no nodes exhausted' - ); -}); + assert.equal( + findAll('[data-test-placement-failure-no-evaluated-nodes]').length, + 0, + 'No evaluated nodes message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-nodes-exhausted]').length, + 0, + 'Nodes exhausted message NOT shown when there are no nodes exhausted' + ); + }); -function createFixture(obj = {}, name = 'Placement Failure') { - return { - name: name, - placementFailures: assign( - { - name: name, - coalescedFailures: 10, - nodesEvaluated: 0, - nodesAvailable: { - datacenter: 0, - }, - classFiltered: { - filtered: 1, - }, - constraintFiltered: { - 'prop = val': 1, + function createFixture(obj = {}, name = 'Placement Failure') { + return { + name: name, + placementFailures: assign( + { + name: name, + coalescedFailures: 10, + nodesEvaluated: 0, + nodesAvailable: { + datacenter: 0, + }, + classFiltered: { + filtered: 1, + }, + constraintFiltered: { + 'prop = val': 1, + }, + nodesExhausted: 3, + classExhausted: { + class: 3, + }, + dimensionExhausted: { + iops: 3, + }, + quotaExhausted: { + quota: 'dimension', + }, + scores: { + name: 3, + }, }, - nodesExhausted: 3, - classExhausted: { - class: 3, - }, - dimensionExhausted: { - iops: 3, - }, - quotaExhausted: { - quota: 'dimension', - }, - scores: { - name: 3, - }, - }, - obj - ), - }; -} + obj + ), + }; + } +}); diff --git a/ui/tests/integration/primary-metric-test.js b/ui/tests/integration/primary-metric-test.js index d11c612b932..93b3f501244 100644 --- a/ui/tests/integration/primary-metric-test.js +++ b/ui/tests/integration/primary-metric-test.js @@ -1,8 +1,9 @@ import EmberObject, { computed } from '@ember/object'; import Service from '@ember/service'; import { getOwner } from '@ember/application'; -import { test, moduleForComponent } from 'ember-qunit'; -import wait from 'ember-test-helpers/wait'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; import { find } from 'ember-native-dom-helpers'; import { task } from 'ember-concurrency'; @@ -10,11 +11,12 @@ import sinon from 'sinon'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; -moduleForComponent('primary-metric', 'Integration | Component | primary metric', { - integration: true, - beforeEach() { - fragmentSerializerInitializer(getOwner(this)); - this.store = getOwner(this).lookup('service:store'); +module('Integration | Component | primary metric', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { + fragmentSerializerInitializer(this.owner); + this.store = this.owner.lookup('service:store'); this.server = startMirage(); this.server.create('namespace'); this.server.create('node'); @@ -42,157 +44,158 @@ moduleForComponent('primary-metric', 'Integration | Component | primary metric', }, }); - this.register('service:stats-trackers-registry', mockStatsTrackersRegistry); - this.statsTrackersRegistry = getOwner(this).lookup('service:stats-trackers-registry'); - }, - afterEach() { - this.server.shutdown(); - }, -}); - -const commonTemplate = hbs` - {{primary-metric - resource=resource - metric=metric}} -`; - -test('Contains a line chart, a percentage bar, a percentage figure, and an absolute usage figure', function(assert) { - let resource; - const metric = 'cpu'; - - this.store.findAll('node'); - - return wait() - .then(() => { - resource = this.store.peekAll('node').get('firstObject'); - this.setProperties({ resource, metric }); - - this.render(commonTemplate); - return wait(); - }) - .then(() => { - assert.ok(find('[data-test-line-chart]'), 'Line chart'); - assert.ok(find('[data-test-percentage-bar]'), 'Percentage bar'); - assert.ok(find('[data-test-percentage]'), 'Percentage figure'); - assert.ok(find('[data-test-absolute-value]'), 'Absolute usage figure'); - }); -}); - -test('The CPU metric maps to is-info', function(assert) { - let resource; - const metric = 'cpu'; - - this.store.findAll('node'); - - return wait() - .then(() => { - resource = this.store.peekAll('node').get('firstObject'); - this.setProperties({ resource, metric }); - - this.render(commonTemplate); - return wait(); - }) - .then(() => { - assert.ok( - find('[data-test-line-chart] .canvas').classList.contains('is-info'), - 'Info class for CPU metric' - ); - }); -}); - -test('The Memory metric maps to is-danger', function(assert) { - let resource; - const metric = 'memory'; - - this.store.findAll('node'); - - return wait() - .then(() => { - resource = this.store.peekAll('node').get('firstObject'); - this.setProperties({ resource, metric }); - - this.render(commonTemplate); - return wait(); - }) - .then(() => { - assert.ok( - find('[data-test-line-chart] .canvas').classList.contains('is-danger'), - 'Danger class for Memory metric' - ); - }); -}); + this.owner.register('service:stats-trackers-registry', mockStatsTrackersRegistry); + this.statsTrackersRegistry = this.owner.lookup('service:stats-trackers-registry'); + }); -test('Gets the tracker from the tracker registry', function(assert) { - let resource; - const metric = 'cpu'; - - this.store.findAll('node'); - - return wait() - .then(() => { - resource = this.store.peekAll('node').get('firstObject'); - this.setProperties({ resource, metric }); - - this.render(commonTemplate); - return wait(); - }) - .then(() => { - assert.ok( - this.getTrackerSpy.calledWith(resource), - 'Uses the tracker registry to get the tracker for the provided resource' - ); - }); -}); - -test('Immediately polls the tracker', function(assert) { - let resource; - const metric = 'cpu'; - - this.store.findAll('node'); - - return wait() - .then(() => { - resource = this.store.peekAll('node').get('firstObject'); - this.setProperties({ resource, metric }); - - this.render(commonTemplate); - return wait(); - }) - .then(() => { - assert.ok(this.trackerPollSpy.calledOnce, 'The tracker is polled immediately'); - }); -}); - -test('A pause signal is sent to the tracker when the component is destroyed', function(assert) { - let resource; - const metric = 'cpu'; - - // Capture a reference to the spy before the component is destroyed - const trackerSignalPauseSpy = this.trackerSignalPauseSpy; - - this.store.findAll('node'); - - return wait() - .then(() => { - resource = this.store.peekAll('node').get('firstObject'); - this.setProperties({ resource, metric, showComponent: true }); - this.render(hbs` - {{#if showComponent}} - {{primary-metric - resource=resource - metric=metric}} - }} - {{/if}} - `); - return wait(); - }) - .then(() => { - assert.notOk(trackerSignalPauseSpy.called, 'No pause signal has been sent yet'); - // This will toggle the if statement, resulting the primary-metric component being destroyed. - this.set('showComponent', false); - return wait(); - }) - .then(() => { - assert.ok(trackerSignalPauseSpy.calledOnce, 'A pause signal is sent to the tracker'); - }); + hooks.afterEach(function() { + this.server.shutdown(); + }); + + const commonTemplate = hbs` + {{primary-metric + resource=resource + metric=metric}} + `; + + test('Contains a line chart, a percentage bar, a percentage figure, and an absolute usage figure', function(assert) { + let resource; + const metric = 'cpu'; + + this.store.findAll('node'); + + return settled() + .then(async () => { + resource = this.store.peekAll('node').get('firstObject'); + this.setProperties({ resource, metric }); + + await render(commonTemplate); + return settled(); + }) + .then(() => { + assert.ok(find('[data-test-line-chart]'), 'Line chart'); + assert.ok(find('[data-test-percentage-bar]'), 'Percentage bar'); + assert.ok(find('[data-test-percentage]'), 'Percentage figure'); + assert.ok(find('[data-test-absolute-value]'), 'Absolute usage figure'); + }); + }); + + test('The CPU metric maps to is-info', function(assert) { + let resource; + const metric = 'cpu'; + + this.store.findAll('node'); + + return settled() + .then(async () => { + resource = this.store.peekAll('node').get('firstObject'); + this.setProperties({ resource, metric }); + + await render(commonTemplate); + return settled(); + }) + .then(() => { + assert.ok( + find('[data-test-line-chart] .canvas').classList.contains('is-info'), + 'Info class for CPU metric' + ); + }); + }); + + test('The Memory metric maps to is-danger', function(assert) { + let resource; + const metric = 'memory'; + + this.store.findAll('node'); + + return settled() + .then(async () => { + resource = this.store.peekAll('node').get('firstObject'); + this.setProperties({ resource, metric }); + + await render(commonTemplate); + return settled(); + }) + .then(() => { + assert.ok( + find('[data-test-line-chart] .canvas').classList.contains('is-danger'), + 'Danger class for Memory metric' + ); + }); + }); + + test('Gets the tracker from the tracker registry', function(assert) { + let resource; + const metric = 'cpu'; + + this.store.findAll('node'); + + return settled() + .then(async () => { + resource = this.store.peekAll('node').get('firstObject'); + this.setProperties({ resource, metric }); + + await render(commonTemplate); + return settled(); + }) + .then(() => { + assert.ok( + this.getTrackerSpy.calledWith(resource), + 'Uses the tracker registry to get the tracker for the provided resource' + ); + }); + }); + + test('Immediately polls the tracker', function(assert) { + let resource; + const metric = 'cpu'; + + this.store.findAll('node'); + + return settled() + .then(async () => { + resource = this.store.peekAll('node').get('firstObject'); + this.setProperties({ resource, metric }); + + await render(commonTemplate); + return settled(); + }) + .then(() => { + assert.ok(this.trackerPollSpy.calledOnce, 'The tracker is polled immediately'); + }); + }); + + test('A pause signal is sent to the tracker when the component is destroyed', function(assert) { + let resource; + const metric = 'cpu'; + + // Capture a reference to the spy before the component is destroyed + const trackerSignalPauseSpy = this.trackerSignalPauseSpy; + + this.store.findAll('node'); + + return settled() + .then(async () => { + resource = this.store.peekAll('node').get('firstObject'); + this.setProperties({ resource, metric, showComponent: true }); + await render(hbs` + {{#if showComponent}} + {{primary-metric + resource=resource + metric=metric}} + }} + {{/if}} + `); + return settled(); + }) + .then(() => { + assert.notOk(trackerSignalPauseSpy.called, 'No pause signal has been sent yet'); + // This will toggle the if statement, resulting the primary-metric component being destroyed. + this.set('showComponent', false); + return settled(); + }) + .then(() => { + assert.ok(trackerSignalPauseSpy.calledOnce, 'A pause signal is sent to the tracker'); + }); + }); }); diff --git a/ui/tests/integration/reschedule-event-timeline-test.js b/ui/tests/integration/reschedule-event-timeline-test.js index 4bed776a052..615ca832c22 100644 --- a/ui/tests/integration/reschedule-event-timeline-test.js +++ b/ui/tests/integration/reschedule-event-timeline-test.js @@ -1,198 +1,197 @@ import { getOwner } from '@ember/application'; -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { find, findAll } from 'ember-native-dom-helpers'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; -import wait from 'ember-test-helpers/wait'; import hbs from 'htmlbars-inline-precompile'; import moment from 'moment'; -moduleForComponent( - 'reschedule-event-timeline', - 'Integration | Component | reschedule event timeline', - { - integration: true, - beforeEach() { - this.store = getOwner(this).lookup('service:store'); - this.server = startMirage(); - this.server.create('namespace'); - this.server.create('node'); - this.server.create('job', { createAllocations: false }); - }, - afterEach() { - this.server.shutdown(); - }, - } -); - -const commonTemplate = hbs` - {{reschedule-event-timeline allocation=allocation}} -`; - -test('when the allocation is running, the timeline shows past allocations', function(assert) { - const attempts = 2; - - this.server.create('allocation', 'rescheduled', { - rescheduleAttempts: attempts, - rescheduleSuccess: true, +module('Integration | Component | reschedule event timeline', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { + this.store = this.owner.lookup('service:store'); + this.server = startMirage(); + this.server.create('namespace'); + this.server.create('node'); + this.server.create('job', { createAllocations: false }); }); - this.store.findAll('allocation'); - let allocation; - - return wait() - .then(() => { - allocation = this.store - .peekAll('allocation') - .find(alloc => !alloc.get('nextAllocation.content')); - - this.set('allocation', allocation); - this.render(commonTemplate); - - return wait(); - }) - .then(() => { - assert.equal( - findAll('[data-test-allocation]').length, - attempts + 1, - 'Total allocations equals current allocation plus all past allocations' - ); - assert.equal( - find('[data-test-allocation]'), - find(`[data-test-allocation="${allocation.id}"]`), - 'First allocation is the current allocation' - ); - - assert.notOk(find('[data-test-stop-warning]'), 'No stop warning'); - assert.notOk(find('[data-test-attempt-notice]'), 'No attempt notice'); - - assert.equal( - find( - `[data-test-allocation="${allocation.id}"] [data-test-allocation-link]` - ).textContent.trim(), - allocation.get('shortId'), - 'The "this" allocation is correct' - ); - assert.equal( - find( - `[data-test-allocation="${allocation.id}"] [data-test-allocation-status]` - ).textContent.trim(), - allocation.get('clientStatus'), - 'Allocation shows the status' - ); - }); -}); + hooks.afterEach(function() { + this.server.shutdown(); + }); -test('when the allocation has failed and there is a follow up evaluation, a note with a time is shown', function(assert) { - const attempts = 2; + const commonTemplate = hbs` + {{reschedule-event-timeline allocation=allocation}} + `; - this.server.create('allocation', 'rescheduled', { - rescheduleAttempts: attempts, - rescheduleSuccess: false, - }); + test('when the allocation is running, the timeline shows past allocations', function(assert) { + const attempts = 2; - this.store.findAll('allocation'); - let allocation; - - return wait() - .then(() => { - allocation = this.store - .peekAll('allocation') - .find(alloc => !alloc.get('nextAllocation.content')); - - this.set('allocation', allocation); - this.render(commonTemplate); - - return wait(); - }) - .then(() => { - assert.ok( - find('[data-test-stop-warning]'), - 'Stop warning is shown since the last allocation failed' - ); - assert.notOk(find('[data-test-attempt-notice]'), 'Reschdule attempt notice is not shown'); + this.server.create('allocation', 'rescheduled', { + rescheduleAttempts: attempts, + rescheduleSuccess: true, }); -}); -test('when the allocation has failed and there is no follow up evaluation, a warning is shown', function(assert) { - const attempts = 2; - - this.server.create('allocation', 'rescheduled', { - rescheduleAttempts: attempts, - rescheduleSuccess: false, + this.store.findAll('allocation'); + let allocation; + + return settled() + .then(async () => { + allocation = this.store + .peekAll('allocation') + .find(alloc => !alloc.get('nextAllocation.content')); + + this.set('allocation', allocation); + await render(commonTemplate); + + return settled(); + }) + .then(() => { + assert.equal( + findAll('[data-test-allocation]').length, + attempts + 1, + 'Total allocations equals current allocation plus all past allocations' + ); + assert.equal( + find('[data-test-allocation]'), + find(`[data-test-allocation="${allocation.id}"]`), + 'First allocation is the current allocation' + ); + + assert.notOk(find('[data-test-stop-warning]'), 'No stop warning'); + assert.notOk(find('[data-test-attempt-notice]'), 'No attempt notice'); + + assert.equal( + find( + `[data-test-allocation="${allocation.id}"] [data-test-allocation-link]` + ).textContent.trim(), + allocation.get('shortId'), + 'The "this" allocation is correct' + ); + assert.equal( + find( + `[data-test-allocation="${allocation.id}"] [data-test-allocation-status]` + ).textContent.trim(), + allocation.get('clientStatus'), + 'Allocation shows the status' + ); + }); }); - const lastAllocation = server.schema.allocations.findBy({ nextAllocation: undefined }); - lastAllocation.update({ - followupEvalId: server.create('evaluation', { - waitUntil: moment() - .add(2, 'hours') - .toDate(), - }).id, + test('when the allocation has failed and there is a follow up evaluation, a note with a time is shown', function(assert) { + const attempts = 2; + + this.server.create('allocation', 'rescheduled', { + rescheduleAttempts: attempts, + rescheduleSuccess: false, + }); + + this.store.findAll('allocation'); + let allocation; + + return settled() + .then(async () => { + allocation = this.store + .peekAll('allocation') + .find(alloc => !alloc.get('nextAllocation.content')); + + this.set('allocation', allocation); + await render(commonTemplate); + + return settled(); + }) + .then(() => { + assert.ok( + find('[data-test-stop-warning]'), + 'Stop warning is shown since the last allocation failed' + ); + assert.notOk(find('[data-test-attempt-notice]'), 'Reschdule attempt notice is not shown'); + }); }); - this.store.findAll('allocation'); - let allocation; - - return wait() - .then(() => { - allocation = this.store - .peekAll('allocation') - .find(alloc => !alloc.get('nextAllocation.content')); - - this.set('allocation', allocation); - this.render(commonTemplate); - - return wait(); - }) - .then(() => { - assert.ok( - find('[data-test-attempt-notice]'), - 'Reschedule notice is shown since the follow up eval says so' - ); - assert.notOk(find('[data-test-stop-warning]'), 'Stop warning is not shown'); + test('when the allocation has failed and there is no follow up evaluation, a warning is shown', function(assert) { + const attempts = 2; + + this.server.create('allocation', 'rescheduled', { + rescheduleAttempts: attempts, + rescheduleSuccess: false, }); -}); -test('when the allocation has a next allocation already, it is shown in the timeline', function(assert) { - const attempts = 2; + const lastAllocation = server.schema.allocations.findBy({ nextAllocation: undefined }); + lastAllocation.update({ + followupEvalId: server.create('evaluation', { + waitUntil: moment() + .add(2, 'hours') + .toDate(), + }).id, + }); - const originalAllocation = this.server.create('allocation', 'rescheduled', { - rescheduleAttempts: attempts, - rescheduleSuccess: true, + this.store.findAll('allocation'); + let allocation; + + return settled() + .then(async () => { + allocation = this.store + .peekAll('allocation') + .find(alloc => !alloc.get('nextAllocation.content')); + + this.set('allocation', allocation); + await render(commonTemplate); + + return settled(); + }) + .then(() => { + assert.ok( + find('[data-test-attempt-notice]'), + 'Reschedule notice is shown since the follow up eval says so' + ); + assert.notOk(find('[data-test-stop-warning]'), 'Stop warning is not shown'); + }); }); - this.store.findAll('allocation'); - let allocation; - - return wait() - .then(() => { - allocation = this.store.peekAll('allocation').findBy('id', originalAllocation.id); - - this.set('allocation', allocation); - this.render(commonTemplate); - - return wait(); - }) - .then(() => { - assert.ok( - find('[data-test-reschedule-label]').textContent.trim(), - 'Next Allocation', - 'The first allocation is the next allocation and labeled as such' - ); - - assert.equal( - find('[data-test-allocation] [data-test-allocation-link]').textContent.trim(), - allocation.get('nextAllocation.shortId'), - 'The next allocation item is for the correct allocation' - ); - - assert.equal( - findAll('[data-test-allocation]')[1], - find(`[data-test-allocation="${allocation.id}"]`), - 'Second allocation is the current allocation' - ); - - assert.notOk(find('[data-test-stop-warning]'), 'No stop warning'); - assert.notOk(find('[data-test-attempt-notice]'), 'No attempt notice'); + test('when the allocation has a next allocation already, it is shown in the timeline', function(assert) { + const attempts = 2; + + const originalAllocation = this.server.create('allocation', 'rescheduled', { + rescheduleAttempts: attempts, + rescheduleSuccess: true, }); + + this.store.findAll('allocation'); + let allocation; + + return settled() + .then(async () => { + allocation = this.store.peekAll('allocation').findBy('id', originalAllocation.id); + + this.set('allocation', allocation); + await render(commonTemplate); + + return settled(); + }) + .then(() => { + assert.ok( + find('[data-test-reschedule-label]').textContent.trim(), + 'Next Allocation', + 'The first allocation is the next allocation and labeled as such' + ); + + assert.equal( + find('[data-test-allocation] [data-test-allocation-link]').textContent.trim(), + allocation.get('nextAllocation.shortId'), + 'The next allocation item is for the correct allocation' + ); + + assert.equal( + findAll('[data-test-allocation]')[1], + find(`[data-test-allocation="${allocation.id}"]`), + 'Second allocation is the current allocation' + ); + + assert.notOk(find('[data-test-stop-warning]'), 'No stop warning'); + assert.notOk(find('[data-test-attempt-notice]'), 'No attempt notice'); + }); + }); }); diff --git a/ui/tests/integration/task-log-test.js b/ui/tests/integration/task-log-test.js index 563b0d6323c..53f8d3aa628 100644 --- a/ui/tests/integration/task-log-test.js +++ b/ui/tests/integration/task-log-test.js @@ -1,6 +1,7 @@ import { run } from '@ember/runloop'; -import { test, moduleForComponent } from 'ember-qunit'; -import wait from 'ember-test-helpers/wait'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import { find, click } from 'ember-native-dom-helpers'; import hbs from 'htmlbars-inline-precompile'; import Pretender from 'pretender'; @@ -26,9 +27,10 @@ const logTail = ['TAIL']; const streamFrames = ['one\n', 'two\n', 'three\n', 'four\n', 'five\n']; let streamPointer = 0; -moduleForComponent('task-log', 'Integration | Component | task log', { - integration: true, - beforeEach() { +module('Integration | Component | task log', function(hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function() { const handler = ({ queryParams }) => { const { origin, offset, plain, follow } = queryParams; @@ -58,199 +60,196 @@ moduleForComponent('task-log', 'Integration | Component | task log', { this.get('/v1/client/fs/logs/:allocation_id', handler); this.get('/v1/regions', () => [200, {}, '[]']); }); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); streamPointer = 0; - }, -}); - -test('Basic appearance', function(assert) { - this.setProperties(commonProps); - this.render(hbs`{{task-log allocation=allocation task=task}}`); - - assert.ok(find('[data-test-log-action="stdout"]'), 'Stdout button'); - assert.ok(find('[data-test-log-action="stderr"]'), 'Stderr button'); - assert.ok(find('[data-test-log-action="head"]'), 'Head button'); - assert.ok(find('[data-test-log-action="tail"]'), 'Tail button'); - assert.ok(find('[data-test-log-action="toggle-stream"]'), 'Stream toggle button'); - - assert.ok(find('[data-test-log-box].is-full-bleed.is-dark'), 'Body is full-bleed and dark'); - - assert.ok(find('pre.cli-window'), 'Cli is preformatted and using the cli-window component class'); -}); + }); -test('Streaming starts on creation', function(assert) { - run.later(run, run.cancelTimers, commonProps.interval); + test('Basic appearance', async function(assert) { + this.setProperties(commonProps); + await render(hbs`{{task-log allocation=allocation task=task}}`); - this.setProperties(commonProps); - this.render(hbs`{{task-log allocation=allocation task=task}}`); + assert.ok(find('[data-test-log-action="stdout"]'), 'Stdout button'); + assert.ok(find('[data-test-log-action="stderr"]'), 'Stderr button'); + assert.ok(find('[data-test-log-action="head"]'), 'Head button'); + assert.ok(find('[data-test-log-action="tail"]'), 'Tail button'); + assert.ok(find('[data-test-log-action="toggle-stream"]'), 'Stream toggle button'); - const logUrlRegex = new RegExp(`${HOST}/v1/client/fs/logs/${commonProps.allocation.id}`); - assert.ok( - this.server.handledRequests.filter(req => logUrlRegex.test(req.url)).length, - 'Log requests were made' - ); + assert.ok(find('[data-test-log-box].is-full-bleed.is-dark'), 'Body is full-bleed and dark'); - return wait().then(() => { - assert.equal( - find('[data-test-log-cli]').textContent, - streamFrames[0], - 'First chunk of streaming log is shown' - ); + assert.ok(find('pre.cli-window'), 'Cli is preformatted and using the cli-window component class'); }); -}); -test('Clicking Head loads the log head', function(assert) { - this.setProperties(commonProps); - this.render(hbs`{{task-log allocation=allocation task=task}}`); + test('Streaming starts on creation', async function(assert) { + run.later(run, run.cancelTimers, commonProps.interval); - click('[data-test-log-action="head"]'); + this.setProperties(commonProps); + await render(hbs`{{task-log allocation=allocation task=task}}`); - return wait().then(() => { + const logUrlRegex = new RegExp(`${HOST}/v1/client/fs/logs/${commonProps.allocation.id}`); assert.ok( - this.server.handledRequests.find( - ({ queryParams: qp }) => qp.origin === 'start' && qp.plain === 'true' && qp.offset === '0' - ), - 'Log head request was made' + this.server.handledRequests.filter(req => logUrlRegex.test(req.url)).length, + 'Log requests were made' ); - assert.equal(find('[data-test-log-cli]').textContent, logHead[0], 'Head of the log is shown'); + + return settled().then(() => { + assert.equal( + find('[data-test-log-cli]').textContent, + streamFrames[0], + 'First chunk of streaming log is shown' + ); + }); }); -}); -test('Clicking Tail loads the log tail', function(assert) { - this.setProperties(commonProps); - this.render(hbs`{{task-log allocation=allocation task=task}}`); + test('Clicking Head loads the log head', async function(assert) { + this.setProperties(commonProps); + await render(hbs`{{task-log allocation=allocation task=task}}`); - click('[data-test-log-action="tail"]'); + click('[data-test-log-action="head"]'); - return wait().then(() => { - assert.ok( - this.server.handledRequests.find( - ({ queryParams: qp }) => qp.origin === 'end' && qp.plain === 'true' - ), - 'Log tail request was made' - ); - assert.equal(find('[data-test-log-cli]').textContent, logTail[0], 'Tail of the log is shown'); + return settled().then(() => { + assert.ok( + this.server.handledRequests.find( + ({ queryParams: qp }) => qp.origin === 'start' && qp.plain === 'true' && qp.offset === '0' + ), + 'Log head request was made' + ); + assert.equal(find('[data-test-log-cli]').textContent, logHead[0], 'Head of the log is shown'); + }); }); -}); -test('Clicking toggleStream starts and stops the log stream', function(assert) { - const { interval } = commonProps; - this.setProperties(commonProps); - this.render(hbs`{{task-log allocation=allocation task=task interval=interval}}`); + test('Clicking Tail loads the log tail', async function(assert) { + this.setProperties(commonProps); + await render(hbs`{{task-log allocation=allocation task=task}}`); - run.later(() => { - click('[data-test-log-action="toggle-stream"]'); - }, interval); + click('[data-test-log-action="tail"]'); - return wait().then(() => { - assert.equal(find('[data-test-log-cli]').textContent, streamFrames[0], 'First frame loaded'); + return settled().then(() => { + assert.ok( + this.server.handledRequests.find( + ({ queryParams: qp }) => qp.origin === 'end' && qp.plain === 'true' + ), + 'Log tail request was made' + ); + assert.equal(find('[data-test-log-cli]').textContent, logTail[0], 'Tail of the log is shown'); + }); + }); + + test('Clicking toggleStream starts and stops the log stream', async function(assert) { + const { interval } = commonProps; + this.setProperties(commonProps); + await render(hbs`{{task-log allocation=allocation task=task interval=interval}}`); run.later(() => { - assert.equal( - find('[data-test-log-cli]').textContent, - streamFrames[0], - 'Still only first frame' - ); click('[data-test-log-action="toggle-stream"]'); - run.later(run, run.cancelTimers, interval * 2); - }, interval * 2); - - return wait().then(() => { - assert.equal( - find('[data-test-log-cli]').textContent, - streamFrames[0] + streamFrames[0] + streamFrames[1], - 'Now includes second frame' - ); + }, interval); + + return settled().then(() => { + assert.equal(find('[data-test-log-cli]').textContent, streamFrames[0], 'First frame loaded'); + + run.later(() => { + assert.equal( + find('[data-test-log-cli]').textContent, + streamFrames[0], + 'Still only first frame' + ); + click('[data-test-log-action="toggle-stream"]'); + run.later(run, run.cancelTimers, interval * 2); + }, interval * 2); + + return settled().then(() => { + assert.equal( + find('[data-test-log-cli]').textContent, + streamFrames[0] + streamFrames[0] + streamFrames[1], + 'Now includes second frame' + ); + }); }); }); -}); -test('Clicking stderr switches the log to standard error', function(assert) { - this.setProperties(commonProps); - this.render(hbs`{{task-log allocation=allocation task=task}}`); + test('Clicking stderr switches the log to standard error', async function(assert) { + this.setProperties(commonProps); + await render(hbs`{{task-log allocation=allocation task=task}}`); - click('[data-test-log-action="stderr"]'); - run.later(run, run.cancelTimers, commonProps.interval); + click('[data-test-log-action="stderr"]'); + run.later(run, run.cancelTimers, commonProps.interval); - return wait().then(() => { - assert.ok( - this.server.handledRequests.filter(req => req.queryParams.type === 'stderr').length, - 'stderr log requests were made' - ); + return settled().then(() => { + assert.ok( + this.server.handledRequests.filter(req => req.queryParams.type === 'stderr').length, + 'stderr log requests were made' + ); + }); }); -}); -test('When the client is inaccessible, task-log falls back to requesting logs through the server', function(assert) { - run.later(run, run.cancelTimers, allowedConnectionTime * 2); + test('When the client is inaccessible, task-log falls back to requesting logs through the server', async function(assert) { + run.later(run, run.cancelTimers, allowedConnectionTime * 2); - // override client response to timeout - this.server.get( - `http://${HOST}/v1/client/fs/logs/:allocation_id`, - () => [400, {}, ''], - allowedConnectionTime * 2 - ); + // override client response to timeout + this.server.get( + `http://${HOST}/v1/client/fs/logs/:allocation_id`, + () => [400, {}, ''], + allowedConnectionTime * 2 + ); - this.setProperties(commonProps); - this.render( - hbs`{{task-log + this.setProperties(commonProps); + await render(hbs`{{task-log allocation=allocation task=task clientTimeout=clientTimeout - serverTimeout=serverTimeout}}` - ); + serverTimeout=serverTimeout}}`); - const clientUrlRegex = new RegExp(`${HOST}/v1/client/fs/logs/${commonProps.allocation.id}`); - assert.ok( - this.server.handledRequests.filter(req => clientUrlRegex.test(req.url)).length, - 'Log request was initially made directly to the client' - ); - - return wait().then(() => { - const serverUrl = `/v1/client/fs/logs/${commonProps.allocation.id}`; + const clientUrlRegex = new RegExp(`${HOST}/v1/client/fs/logs/${commonProps.allocation.id}`); assert.ok( - this.server.handledRequests.filter(req => req.url.startsWith(serverUrl)).length, - 'Log request was later made to the server' + this.server.handledRequests.filter(req => clientUrlRegex.test(req.url)).length, + 'Log request was initially made directly to the client' ); + + return settled().then(() => { + const serverUrl = `/v1/client/fs/logs/${commonProps.allocation.id}`; + assert.ok( + this.server.handledRequests.filter(req => req.url.startsWith(serverUrl)).length, + 'Log request was later made to the server' + ); + }); }); -}); -test('When both the client and the server are inaccessible, an error message is shown', function(assert) { - run.later(run, run.cancelTimers, allowedConnectionTime * 5); - - // override client and server responses to timeout - this.server.get( - `http://${HOST}/v1/client/fs/logs/:allocation_id`, - () => [400, {}, ''], - allowedConnectionTime * 2 - ); - this.server.get( - '/v1/client/fs/logs/:allocation_id', - () => [400, {}, ''], - allowedConnectionTime * 2 - ); - - this.setProperties(commonProps); - this.render( - hbs`{{task-log + test('When both the client and the server are inaccessible, an error message is shown', async function(assert) { + run.later(run, run.cancelTimers, allowedConnectionTime * 5); + + // override client and server responses to timeout + this.server.get( + `http://${HOST}/v1/client/fs/logs/:allocation_id`, + () => [400, {}, ''], + allowedConnectionTime * 2 + ); + this.server.get( + '/v1/client/fs/logs/:allocation_id', + () => [400, {}, ''], + allowedConnectionTime * 2 + ); + + this.setProperties(commonProps); + await render(hbs`{{task-log allocation=allocation task=task clientTimeout=clientTimeout - serverTimeout=serverTimeout}}` - ); + serverTimeout=serverTimeout}}`); - return wait().then(() => { - const clientUrlRegex = new RegExp(`${HOST}/v1/client/fs/logs/${commonProps.allocation.id}`); - assert.ok( - this.server.handledRequests.filter(req => clientUrlRegex.test(req.url)).length, - 'Log request was initially made directly to the client' - ); - const serverUrl = `/v1/client/fs/logs/${commonProps.allocation.id}`; - assert.ok( - this.server.handledRequests.filter(req => req.url.startsWith(serverUrl)).length, - 'Log request was later made to the server' - ); - assert.ok(find('[data-test-connection-error]'), 'An error message is shown'); + return settled().then(() => { + const clientUrlRegex = new RegExp(`${HOST}/v1/client/fs/logs/${commonProps.allocation.id}`); + assert.ok( + this.server.handledRequests.filter(req => clientUrlRegex.test(req.url)).length, + 'Log request was initially made directly to the client' + ); + const serverUrl = `/v1/client/fs/logs/${commonProps.allocation.id}`; + assert.ok( + this.server.handledRequests.filter(req => req.url.startsWith(serverUrl)).length, + 'Log request was later made to the server' + ); + assert.ok(find('[data-test-connection-error]'), 'An error message is shown'); + }); }); }); diff --git a/ui/tests/integration/two-step-button-test.js b/ui/tests/integration/two-step-button-test.js index 12d23c1d738..fb7b30a0b80 100644 --- a/ui/tests/integration/two-step-button-test.js +++ b/ui/tests/integration/two-step-button-test.js @@ -1,137 +1,138 @@ import { find, click } from 'ember-native-dom-helpers'; -import { test, moduleForComponent } from 'ember-qunit'; -import wait from 'ember-test-helpers/wait'; +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render, settled } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; import sinon from 'sinon'; -moduleForComponent('two-step-button', 'Integration | Component | two step button', { - integration: true, -}); - -const commonProperties = () => ({ - idleText: 'Idle State Button', - cancelText: 'Cancel Action', - confirmText: 'Confirm Action', - confirmationMessage: 'Are you certain', - awaitingConfirmation: false, - onConfirm: sinon.spy(), - onCancel: sinon.spy(), -}); - -const commonTemplate = hbs` - {{two-step-button - idleText=idleText - cancelText=cancelText - confirmText=confirmText - confirmationMessage=confirmationMessage - awaitingConfirmation=awaitingConfirmation - onConfirm=onConfirm - onCancel=onCancel}} -`; - -test('presents as a button in the idle state', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); - - assert.ok(find('[data-test-idle-button]'), 'Idle button is rendered'); - assert.equal( - find('[data-test-idle-button]').textContent.trim(), - props.idleText, - 'Button is labeled correctly' - ); - - assert.notOk(find('[data-test-cancel-button]'), 'No cancel button yet'); - assert.notOk(find('[data-test-confirm-button]'), 'No confirm button yet'); - assert.notOk(find('[data-test-confirmation-message]'), 'No confirmation message yet'); -}); - -test('clicking the idle state button transitions into the promptForConfirmation state', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); - - click('[data-test-idle-button]'); - - return wait().then(() => { - assert.ok(find('[data-test-cancel-button]'), 'Cancel button is rendered'); - assert.equal( - find('[data-test-cancel-button]').textContent.trim(), - props.cancelText, - 'Button is labeled correctly' - ); +module('Integration | Component | two step button', function(hooks) { + setupRenderingTest(hooks); + + const commonProperties = () => ({ + idleText: 'Idle State Button', + cancelText: 'Cancel Action', + confirmText: 'Confirm Action', + confirmationMessage: 'Are you certain', + awaitingConfirmation: false, + onConfirm: sinon.spy(), + onCancel: sinon.spy(), + }); - assert.ok(find('[data-test-confirm-button]'), 'Confirm button is rendered'); + const commonTemplate = hbs` + {{two-step-button + idleText=idleText + cancelText=cancelText + confirmText=confirmText + confirmationMessage=confirmationMessage + awaitingConfirmation=awaitingConfirmation + onConfirm=onConfirm + onCancel=onCancel}} + `; + + test('presents as a button in the idle state', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); + + assert.ok(find('[data-test-idle-button]'), 'Idle button is rendered'); assert.equal( - find('[data-test-confirm-button]').textContent.trim(), - props.confirmText, + find('[data-test-idle-button]').textContent.trim(), + props.idleText, 'Button is labeled correctly' ); - assert.equal( - find('[data-test-confirmation-message]').textContent.trim(), - props.confirmationMessage, - 'Confirmation message is shown' - ); + assert.notOk(find('[data-test-cancel-button]'), 'No cancel button yet'); + assert.notOk(find('[data-test-confirm-button]'), 'No confirm button yet'); + assert.notOk(find('[data-test-confirmation-message]'), 'No confirmation message yet'); + }); - assert.notOk(find('[data-test-idle-button]'), 'No more idle button'); + test('clicking the idle state button transitions into the promptForConfirmation state', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); + + click('[data-test-idle-button]'); + + return settled().then(() => { + assert.ok(find('[data-test-cancel-button]'), 'Cancel button is rendered'); + assert.equal( + find('[data-test-cancel-button]').textContent.trim(), + props.cancelText, + 'Button is labeled correctly' + ); + + assert.ok(find('[data-test-confirm-button]'), 'Confirm button is rendered'); + assert.equal( + find('[data-test-confirm-button]').textContent.trim(), + props.confirmText, + 'Button is labeled correctly' + ); + + assert.equal( + find('[data-test-confirmation-message]').textContent.trim(), + props.confirmationMessage, + 'Confirmation message is shown' + ); + + assert.notOk(find('[data-test-idle-button]'), 'No more idle button'); + }); }); -}); -test('canceling in the promptForConfirmation state calls the onCancel hook and resets to the idle state', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); + test('canceling in the promptForConfirmation state calls the onCancel hook and resets to the idle state', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); - click('[data-test-idle-button]'); + click('[data-test-idle-button]'); - return wait().then(() => { - click('[data-test-cancel-button]'); + return settled().then(() => { + click('[data-test-cancel-button]'); - return wait().then(() => { - assert.ok(props.onCancel.calledOnce, 'The onCancel hook fired'); - assert.ok(find('[data-test-idle-button]'), 'Idle button is back'); + return settled().then(() => { + assert.ok(props.onCancel.calledOnce, 'The onCancel hook fired'); + assert.ok(find('[data-test-idle-button]'), 'Idle button is back'); + }); }); }); -}); -test('confirming the promptForConfirmation state calls the onConfirm hook and resets to the idle state', function(assert) { - const props = commonProperties(); - this.setProperties(props); - this.render(commonTemplate); + test('confirming the promptForConfirmation state calls the onConfirm hook and resets to the idle state', async function(assert) { + const props = commonProperties(); + this.setProperties(props); + await render(commonTemplate); - click('[data-test-idle-button]'); + click('[data-test-idle-button]'); - return wait().then(() => { - click('[data-test-confirm-button]'); + return settled().then(() => { + click('[data-test-confirm-button]'); - return wait().then(() => { - assert.ok(props.onConfirm.calledOnce, 'The onConfirm hook fired'); - assert.ok(find('[data-test-idle-button]'), 'Idle button is back'); + return settled().then(() => { + assert.ok(props.onConfirm.calledOnce, 'The onConfirm hook fired'); + assert.ok(find('[data-test-idle-button]'), 'Idle button is back'); + }); }); }); -}); -test('when awaitingConfirmation is true, the cancel and submit buttons are disabled and the submit button is loading', function(assert) { - const props = commonProperties(); - props.awaitingConfirmation = true; - this.setProperties(props); - this.render(commonTemplate); - - click('[data-test-idle-button]'); - - return wait().then(() => { - assert.ok( - find('[data-test-cancel-button]').hasAttribute('disabled'), - 'The cancel button is disabled' - ); - assert.ok( - find('[data-test-confirm-button]').hasAttribute('disabled'), - 'The confirm button is disabled' - ); - assert.ok( - find('[data-test-confirm-button]').classList.contains('is-loading'), - 'The confirm button is in a loading state' - ); + test('when awaitingConfirmation is true, the cancel and submit buttons are disabled and the submit button is loading', async function(assert) { + const props = commonProperties(); + props.awaitingConfirmation = true; + this.setProperties(props); + await render(commonTemplate); + + click('[data-test-idle-button]'); + + return settled().then(() => { + assert.ok( + find('[data-test-cancel-button]').hasAttribute('disabled'), + 'The cancel button is disabled' + ); + assert.ok( + find('[data-test-confirm-button]').hasAttribute('disabled'), + 'The confirm button is disabled' + ); + assert.ok( + find('[data-test-confirm-button]').classList.contains('is-loading'), + 'The confirm button is in a loading state' + ); + }); }); }); diff --git a/ui/tests/unit/adapters/job-test.js b/ui/tests/unit/adapters/job-test.js index 0a1fb9f657d..bf26008daee 100644 --- a/ui/tests/unit/adapters/job-test.js +++ b/ui/tests/unit/adapters/job-test.js @@ -2,10 +2,10 @@ import EmberObject from '@ember/object'; import { getOwner } from '@ember/application'; import { run } from '@ember/runloop'; import { assign } from '@ember/polyfills'; -import { test } from 'ember-qunit'; -import wait from 'ember-test-helpers/wait'; +import { test } from 'qunit'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import moduleForAdapter from '../../helpers/module-for-adapter'; +import { settled } from '@ember/test-helpers'; moduleForAdapter('job', 'Unit | Adapter | Job', { needs: [ @@ -67,7 +67,7 @@ test('The job endpoint is the only required endpoint for fetching a job', functi const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - return wait().then(() => { + return settled().then(() => { this.subject().findRecord(null, { modelName: 'job' }, jobId); assert.deepEqual( @@ -87,7 +87,7 @@ test('When a namespace is set in localStorage but a job in the default namespace const jobId = JSON.stringify([jobName, jobNamespace]); this.system.get('namespaces'); - return wait().then(() => { + return settled().then(() => { this.subject().findRecord(null, { modelName: 'job' }, jobId); assert.deepEqual( @@ -106,7 +106,7 @@ test('When a namespace is in localStorage and the requested job is in the defaul const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - return wait().then(() => { + return settled().then(() => { this.subject().findRecord(null, { modelName: 'job' }, jobId); assert.deepEqual( @@ -123,7 +123,7 @@ test('When the job has a namespace other than default, it is in the URL', functi const jobNamespace = 'some-namespace'; const jobId = JSON.stringify([jobName, jobNamespace]); - return wait().then(() => { + return settled().then(() => { this.subject().findRecord(null, { modelName: 'job' }, jobId); assert.deepEqual( @@ -138,7 +138,7 @@ test('When there is no token set in the token service, no x-nomad-token header i const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); - return wait().then(() => { + return settled().then(() => { this.subject().findRecord(null, { modelName: 'job' }, jobId); assert.notOk( @@ -153,7 +153,7 @@ test('When a token is set in the token service, then x-nomad-token header is set const jobId = JSON.stringify(['job-1', 'default']); const secret = 'here is the secret'; - return wait().then(() => { + return settled().then(() => { this.subject().set('token.secret', secret); this.subject().findRecord(null, { modelName: 'job' }, jobId); @@ -182,7 +182,7 @@ test('findAll can be watched', function(assert) { 'Second request is a blocking request for jobs' ); - return wait().then(() => { + return settled().then(() => { request(); assert.equal( pretender.handledRequests[1].url, @@ -190,7 +190,7 @@ test('findAll can be watched', function(assert) { 'Third request is a blocking request with an incremented index param' ); - return wait(); + return settled(); }); }); @@ -211,7 +211,7 @@ test('findRecord can be watched', function(assert) { 'Second request is a blocking request for job-1' ); - return wait().then(() => { + return settled().then(() => { request(); assert.equal( pretender.handledRequests[1].url, @@ -219,7 +219,7 @@ test('findRecord can be watched', function(assert) { 'Third request is a blocking request with an incremented index param' ); - return wait(); + return settled(); }); }); @@ -229,7 +229,7 @@ test('relationships can be reloaded', function(assert) { const mockModel = makeMockModel(plainId); this.subject().reloadRelationship(mockModel, 'summary'); - return wait().then(() => { + return settled().then(() => { assert.equal( pretender.handledRequests[0].url, `/v1/job/${plainId}/summary`, @@ -250,7 +250,7 @@ test('relationship reloads can be watched', function(assert) { 'First request is a blocking request for job-1 summary relationship' ); - return wait().then(() => { + return settled().then(() => { this.subject().reloadRelationship(mockModel, 'summary', true); assert.equal( pretender.handledRequests[1].url, @@ -279,7 +279,7 @@ test('findAll can be canceled', function(assert) { this.subject().cancelFindAll('job'); }); - return wait().then(() => { + return settled().then(() => { assert.ok(xhr.aborted, 'Request was aborted'); }); }); @@ -303,7 +303,7 @@ test('findRecord can be canceled', function(assert) { this.subject().cancelFindRecord('job', jobId); }); - return wait().then(() => { + return settled().then(() => { assert.ok(xhr.aborted, 'Request was aborted'); }); }); @@ -324,7 +324,7 @@ test('relationship reloads can be canceled', function(assert) { this.subject().cancelReloadRelationship(mockModel, 'summary'); }); - return wait().then(() => { + return settled().then(() => { assert.ok(xhr.aborted, 'Request was aborted'); }); }); @@ -359,7 +359,7 @@ test('requests can be canceled even if multiple requests for the same URL were m this.subject().cancelFindRecord('job', jobId); }); - return wait().then(() => { + return settled().then(() => { assert.ok(xhr.aborted, 'Request was aborted'); }); }); @@ -388,7 +388,7 @@ test('canceling a find record request will never cancel a request with the same this.subject().cancelFindRecord('job', jobId); }); - return wait().then(() => { + return settled().then(() => { assert.ok(getXHR.aborted, 'Get request was aborted'); assert.notOk(deleteXHR.aborted, 'Delete request was aborted'); }); @@ -400,7 +400,7 @@ test('when there is no region set, requests are made without the region query pa const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - return wait().then(() => { + return settled().then(() => { this.subject().findRecord(null, { modelName: 'job' }, jobId); this.subject().findAll(null, { modelName: 'job' }, null); @@ -421,7 +421,7 @@ test('when there is a region set, requests are made with the region query param' const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - return wait().then(() => { + return settled().then(() => { this.subject().findRecord(null, { modelName: 'job' }, jobId); this.subject().findAll(null, { modelName: 'job' }, null); @@ -441,7 +441,7 @@ test('when the region is set to the default region, requests are made without th const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - return wait().then(() => { + return settled().then(() => { this.subject().findRecord(null, { modelName: 'job' }, jobId); this.subject().findAll(null, { modelName: 'job' }, null); diff --git a/ui/tests/unit/adapters/node-test.js b/ui/tests/unit/adapters/node-test.js index 214864c027e..9382d3c8f77 100644 --- a/ui/tests/unit/adapters/node-test.js +++ b/ui/tests/unit/adapters/node-test.js @@ -1,8 +1,8 @@ import { run } from '@ember/runloop'; -import { test } from 'ember-qunit'; -import wait from 'ember-test-helpers/wait'; +import { test } from 'qunit'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; import moduleForAdapter from '../../helpers/module-for-adapter'; +import { settled } from '@ember/test-helpers'; moduleForAdapter('node', 'Unit | Adapter | Node', { needs: [ @@ -59,7 +59,7 @@ test('findHasMany removes old related models from the store', function(assert) { }); }); - return wait().then(() => { + return settled().then(() => { server.db.allocations.remove('node-1-1'); run(() => { @@ -95,7 +95,7 @@ test('findHasMany does not remove old unrelated models from the store', function this.store.findRecord('node', 'node-2').then(model => findHasMany(model, 'allocations')); }); - return wait().then(() => { + return settled().then(() => { assert.deepEqual( this.store .peekAll('allocation') diff --git a/ui/tests/unit/components/line-chart-test.js b/ui/tests/unit/components/line-chart-test.js index ba0be6f3614..6340fe78b46 100644 --- a/ui/tests/unit/components/line-chart-test.js +++ b/ui/tests/unit/components/line-chart-test.js @@ -1,150 +1,151 @@ -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import d3Format from 'd3-format'; -moduleForComponent('line-chart', 'Unit | Component | line-chart', { - unit: true, -}); +module('Unit | Component | line-chart', function(hooks) { + setupTest(hooks); + + const data = [ + { foo: 1, bar: 100 }, + { foo: 2, bar: 200 }, + { foo: 3, bar: 300 }, + { foo: 8, bar: 400 }, + { foo: 4, bar: 500 }, + ]; + + test('x scale domain is the min and max values in data based on the xProp value', function(assert) { + const chart = this.owner.factoryFor('component:line-chart').create(); + + chart.setProperties({ + xProp: 'foo', + data, + }); + + let [xDomainLow, xDomainHigh] = chart.get('xScale').domain(); + assert.equal( + xDomainLow, + Math.min(...data.mapBy('foo')), + 'Domain lower bound is the lowest foo value' + ); + assert.equal( + xDomainHigh, + Math.max(...data.mapBy('foo')), + 'Domain upper bound is the highest foo value' + ); + + chart.set('data', [...data, { foo: 12, bar: 600 }]); + + [, xDomainHigh] = chart.get('xScale').domain(); + assert.equal(xDomainHigh, 12, 'When the data changes, the xScale is recalculated'); + }); -const data = [ - { foo: 1, bar: 100 }, - { foo: 2, bar: 200 }, - { foo: 3, bar: 300 }, - { foo: 8, bar: 400 }, - { foo: 4, bar: 500 }, -]; + test('y scale domain uses the max value in the data based off of yProp, but is always zero-based', function(assert) { + const chart = this.owner.factoryFor('component:line-chart').create(); -test('x scale domain is the min and max values in data based on the xProp value', function(assert) { - const chart = this.subject(); + chart.setProperties({ + yProp: 'bar', + data, + }); - chart.setProperties({ - xProp: 'foo', - data, - }); - - let [xDomainLow, xDomainHigh] = chart.get('xScale').domain(); - assert.equal( - xDomainLow, - Math.min(...data.mapBy('foo')), - 'Domain lower bound is the lowest foo value' - ); - assert.equal( - xDomainHigh, - Math.max(...data.mapBy('foo')), - 'Domain upper bound is the highest foo value' - ); - - chart.set('data', [...data, { foo: 12, bar: 600 }]); - - [, xDomainHigh] = chart.get('xScale').domain(); - assert.equal(xDomainHigh, 12, 'When the data changes, the xScale is recalculated'); -}); + let [yDomainLow, yDomainHigh] = chart.get('yScale').domain(); + assert.equal(yDomainLow, 0, 'Domain lower bound is always 0'); + assert.equal( + yDomainHigh, + Math.max(...data.mapBy('bar')), + 'Domain upper bound is the highest bar value' + ); -test('y scale domain uses the max value in the data based off of yProp, but is always zero-based', function(assert) { - const chart = this.subject(); + chart.set('data', [...data, { foo: 12, bar: 600 }]); - chart.setProperties({ - yProp: 'bar', - data, + [, yDomainHigh] = chart.get('yScale').domain(); + assert.equal(yDomainHigh, 600, 'When the data changes, the yScale is recalculated'); }); - let [yDomainLow, yDomainHigh] = chart.get('yScale').domain(); - assert.equal(yDomainLow, 0, 'Domain lower bound is always 0'); - assert.equal( - yDomainHigh, - Math.max(...data.mapBy('bar')), - 'Domain upper bound is the highest bar value' - ); + test('the number of yTicks is always odd (to always have a mid-line) and is based off the chart height', function(assert) { + const chart = this.owner.factoryFor('component:line-chart').create(); - chart.set('data', [...data, { foo: 12, bar: 600 }]); + chart.setProperties({ + yProp: 'bar', + xAxisOffset: 100, + data, + }); - [, yDomainHigh] = chart.get('yScale').domain(); - assert.equal(yDomainHigh, 600, 'When the data changes, the yScale is recalculated'); -}); + assert.equal(chart.get('yTicks').length, 3); -test('the number of yTicks is always odd (to always have a mid-line) and is based off the chart height', function(assert) { - const chart = this.subject(); + chart.set('xAxisOffset', 240); + assert.equal(chart.get('yTicks').length, 5); - chart.setProperties({ - yProp: 'bar', - xAxisOffset: 100, - data, + chart.set('xAxisOffset', 241); + assert.equal(chart.get('yTicks').length, 7); }); - assert.equal(chart.get('yTicks').length, 3); + test('the values for yTicks are rounded to whole numbers', function(assert) { + const chart = this.owner.factoryFor('component:line-chart').create(); - chart.set('xAxisOffset', 240); - assert.equal(chart.get('yTicks').length, 5); + chart.setProperties({ + yProp: 'bar', + xAxisOffset: 100, + data, + }); - chart.set('xAxisOffset', 241); - assert.equal(chart.get('yTicks').length, 7); -}); + assert.deepEqual(chart.get('yTicks'), [0, 250, 500]); -test('the values for yTicks are rounded to whole numbers', function(assert) { - const chart = this.subject(); + chart.set('xAxisOffset', 240); + assert.deepEqual(chart.get('yTicks'), [0, 125, 250, 375, 500]); - chart.setProperties({ - yProp: 'bar', - xAxisOffset: 100, - data, + chart.set('xAxisOffset', 241); + assert.deepEqual(chart.get('yTicks'), [0, 83, 167, 250, 333, 417, 500]); }); - assert.deepEqual(chart.get('yTicks'), [0, 250, 500]); - - chart.set('xAxisOffset', 240); - assert.deepEqual(chart.get('yTicks'), [0, 125, 250, 375, 500]); - - chart.set('xAxisOffset', 241); - assert.deepEqual(chart.get('yTicks'), [0, 83, 167, 250, 333, 417, 500]); -}); - -test('the values for yTicks are fractions when the domain is between 0 and 1', function(assert) { - const chart = this.subject(); - - chart.setProperties({ - yProp: 'bar', - xAxisOffset: 100, - data: [ - { foo: 1, bar: 0.1 }, - { foo: 2, bar: 0.2 }, - { foo: 3, bar: 0.3 }, - { foo: 8, bar: 0.4 }, - { foo: 4, bar: 0.5 }, - ], + test('the values for yTicks are fractions when the domain is between 0 and 1', function(assert) { + const chart = this.owner.factoryFor('component:line-chart').create(); + + chart.setProperties({ + yProp: 'bar', + xAxisOffset: 100, + data: [ + { foo: 1, bar: 0.1 }, + { foo: 2, bar: 0.2 }, + { foo: 3, bar: 0.3 }, + { foo: 8, bar: 0.4 }, + { foo: 4, bar: 0.5 }, + ], + }); + + assert.deepEqual(chart.get('yTicks'), [0, 0.25, 0.5]); }); - assert.deepEqual(chart.get('yTicks'), [0, 0.25, 0.5]); -}); - -test('activeDatumLabel is the xProp value of the activeDatum formatted with xFormat', function(assert) { - const chart = this.subject(); - - chart.setProperties({ - xProp: 'foo', - yProp: 'bar', - data, - activeDatum: data[1], + test('activeDatumLabel is the xProp value of the activeDatum formatted with xFormat', function(assert) { + const chart = this.owner.factoryFor('component:line-chart').create(); + + chart.setProperties({ + xProp: 'foo', + yProp: 'bar', + data, + activeDatum: data[1], + }); + + assert.equal( + chart.get('activeDatumLabel'), + d3Format.format(',')(data[1].foo), + 'activeDatumLabel correctly formats the correct prop of the correct datum' + ); }); - assert.equal( - chart.get('activeDatumLabel'), - d3Format.format(',')(data[1].foo), - 'activeDatumLabel correctly formats the correct prop of the correct datum' - ); -}); - -test('activeDatumValue is the yProp value of the activeDatum formatted with yFormat', function(assert) { - const chart = this.subject(); - - chart.setProperties({ - xProp: 'foo', - yProp: 'bar', - data, - activeDatum: data[1], + test('activeDatumValue is the yProp value of the activeDatum formatted with yFormat', function(assert) { + const chart = this.owner.factoryFor('component:line-chart').create(); + + chart.setProperties({ + xProp: 'foo', + yProp: 'bar', + data, + activeDatum: data[1], + }); + + assert.equal( + chart.get('activeDatumValue'), + d3Format.format(',.2~r')(data[1].bar), + 'activeDatumValue correctly formats the correct prop of the correct datum' + ); }); - - assert.equal( - chart.get('activeDatumValue'), - d3Format.format(',.2~r')(data[1].bar), - 'activeDatumValue correctly formats the correct prop of the correct datum' - ); }); diff --git a/ui/tests/unit/components/stats-time-series-test.js b/ui/tests/unit/components/stats-time-series-test.js index 8913a51f468..edee16a787b 100644 --- a/ui/tests/unit/components/stats-time-series-test.js +++ b/ui/tests/unit/components/stats-time-series-test.js @@ -1,149 +1,150 @@ -import { test, moduleForComponent } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import moment from 'moment'; import d3Format from 'd3-format'; import d3TimeFormat from 'd3-time-format'; -moduleForComponent('stats-time-series', 'Unit | Component | stats-time-series', { - unit: true, -}); - -const ts = (offset, resolution = 'm') => - moment() - .subtract(offset, resolution) - .toDate(); - -const wideData = [ - { timestamp: ts(20), percent: 0.5 }, - { timestamp: ts(18), percent: 0.5 }, - { timestamp: ts(16), percent: 0.4 }, - { timestamp: ts(14), percent: 0.3 }, - { timestamp: ts(12), percent: 0.9 }, - { timestamp: ts(10), percent: 0.3 }, - { timestamp: ts(8), percent: 0.3 }, - { timestamp: ts(6), percent: 0.4 }, - { timestamp: ts(4), percent: 0.5 }, - { timestamp: ts(2), percent: 0.6 }, - { timestamp: ts(0), percent: 0.6 }, -]; - -const narrowData = [ - { timestamp: ts(20, 's'), percent: 0.5 }, - { timestamp: ts(18, 's'), percent: 0.5 }, - { timestamp: ts(16, 's'), percent: 0.4 }, - { timestamp: ts(14, 's'), percent: 0.3 }, - { timestamp: ts(12, 's'), percent: 0.9 }, - { timestamp: ts(10, 's'), percent: 0.3 }, -]; - -const unboundedData = [ - { timestamp: ts(20, 's'), percent: -0.5 }, - { timestamp: ts(18, 's'), percent: 1.5 }, -]; - -const nullData = [ - { timestamp: ts(20, 's'), percent: null }, - { timestamp: ts(18, 's'), percent: null }, -]; - -test('xFormat is time-formatted for hours, minutes, and seconds', function(assert) { - const chart = this.subject(); - - chart.set('data', wideData); - - wideData.forEach(datum => { - assert.equal( - chart.xFormat()(datum.timestamp), - d3TimeFormat.timeFormat('%H:%M:%S')(datum.timestamp) - ); +module('Unit | Component | stats-time-series', function(hooks) { + setupTest(hooks); + + const ts = (offset, resolution = 'm') => + moment() + .subtract(offset, resolution) + .toDate(); + + const wideData = [ + { timestamp: ts(20), percent: 0.5 }, + { timestamp: ts(18), percent: 0.5 }, + { timestamp: ts(16), percent: 0.4 }, + { timestamp: ts(14), percent: 0.3 }, + { timestamp: ts(12), percent: 0.9 }, + { timestamp: ts(10), percent: 0.3 }, + { timestamp: ts(8), percent: 0.3 }, + { timestamp: ts(6), percent: 0.4 }, + { timestamp: ts(4), percent: 0.5 }, + { timestamp: ts(2), percent: 0.6 }, + { timestamp: ts(0), percent: 0.6 }, + ]; + + const narrowData = [ + { timestamp: ts(20, 's'), percent: 0.5 }, + { timestamp: ts(18, 's'), percent: 0.5 }, + { timestamp: ts(16, 's'), percent: 0.4 }, + { timestamp: ts(14, 's'), percent: 0.3 }, + { timestamp: ts(12, 's'), percent: 0.9 }, + { timestamp: ts(10, 's'), percent: 0.3 }, + ]; + + const unboundedData = [ + { timestamp: ts(20, 's'), percent: -0.5 }, + { timestamp: ts(18, 's'), percent: 1.5 }, + ]; + + const nullData = [ + { timestamp: ts(20, 's'), percent: null }, + { timestamp: ts(18, 's'), percent: null }, + ]; + + test('xFormat is time-formatted for hours, minutes, and seconds', function(assert) { + const chart = this.owner.factoryFor('component:stats-time-series').create(); + + chart.set('data', wideData); + + wideData.forEach(datum => { + assert.equal( + chart.xFormat()(datum.timestamp), + d3TimeFormat.timeFormat('%H:%M:%S')(datum.timestamp) + ); + }); }); -}); -test('yFormat is percent-formatted', function(assert) { - const chart = this.subject(); + test('yFormat is percent-formatted', function(assert) { + const chart = this.owner.factoryFor('component:stats-time-series').create(); - chart.set('data', wideData); + chart.set('data', wideData); - wideData.forEach(datum => { - assert.equal(chart.yFormat()(datum.percent), d3Format.format('.1~%')(datum.percent)); + wideData.forEach(datum => { + assert.equal(chart.yFormat()(datum.percent), d3Format.format('.1~%')(datum.percent)); + }); }); -}); -test('x scale domain is at least five minutes', function(assert) { - const chart = this.subject(); + test('x scale domain is at least five minutes', function(assert) { + const chart = this.owner.factoryFor('component:stats-time-series').create(); - chart.set('data', narrowData); + chart.set('data', narrowData); - assert.equal( - +chart.get('xScale').domain()[0], - +moment(Math.max(...narrowData.mapBy('timestamp'))) - .subtract(5, 'm') - .toDate(), - 'The lower bound of the xScale is 5 minutes ago' - ); -}); + assert.equal( + +chart.get('xScale').domain()[0], + +moment(Math.max(...narrowData.mapBy('timestamp'))) + .subtract(5, 'm') + .toDate(), + 'The lower bound of the xScale is 5 minutes ago' + ); + }); -test('x scale domain is greater than five minutes when the domain of the data is larger than five minutes', function(assert) { - const chart = this.subject(); + test('x scale domain is greater than five minutes when the domain of the data is larger than five minutes', function(assert) { + const chart = this.owner.factoryFor('component:stats-time-series').create(); - chart.set('data', wideData); + chart.set('data', wideData); - assert.equal( - +chart.get('xScale').domain()[0], - Math.min(...wideData.mapBy('timestamp')), - 'The lower bound of the xScale is the oldest timestamp in the dataset' - ); -}); + assert.equal( + +chart.get('xScale').domain()[0], + Math.min(...wideData.mapBy('timestamp')), + 'The lower bound of the xScale is the oldest timestamp in the dataset' + ); + }); -test('y scale domain is typically 0 to 1 (0 to 100%)', function(assert) { - const chart = this.subject(); + test('y scale domain is typically 0 to 1 (0 to 100%)', function(assert) { + const chart = this.owner.factoryFor('component:stats-time-series').create(); - chart.set('data', wideData); + chart.set('data', wideData); - assert.deepEqual( - [Math.min(...wideData.mapBy('percent')), Math.max(...wideData.mapBy('percent'))], - [0.3, 0.9], - 'The bounds of the value prop of the dataset is narrower than 0 - 1' - ); + assert.deepEqual( + [Math.min(...wideData.mapBy('percent')), Math.max(...wideData.mapBy('percent'))], + [0.3, 0.9], + 'The bounds of the value prop of the dataset is narrower than 0 - 1' + ); - assert.deepEqual( - chart.get('yScale').domain(), - [0, 1], - 'The bounds of the yScale are still 0 and 1' - ); -}); + assert.deepEqual( + chart.get('yScale').domain(), + [0, 1], + 'The bounds of the yScale are still 0 and 1' + ); + }); -test('the extent of the y domain overrides the default 0 to 1 domain when there are values beyond these bounds', function(assert) { - const chart = this.subject(); + test('the extent of the y domain overrides the default 0 to 1 domain when there are values beyond these bounds', function(assert) { + const chart = this.owner.factoryFor('component:stats-time-series').create(); - chart.set('data', unboundedData); + chart.set('data', unboundedData); - assert.deepEqual( - chart.get('yScale').domain(), - [-0.5, 1.5], - 'The bounds of the yScale match the bounds of the unbounded data' - ); + assert.deepEqual( + chart.get('yScale').domain(), + [-0.5, 1.5], + 'The bounds of the yScale match the bounds of the unbounded data' + ); - chart.set('data', [unboundedData[0]]); + chart.set('data', [unboundedData[0]]); - assert.deepEqual( - chart.get('yScale').domain(), - [-0.5, 1], - 'The upper bound is still the default 1, but the lower bound is overridden due to the unbounded low value' - ); + assert.deepEqual( + chart.get('yScale').domain(), + [-0.5, 1], + 'The upper bound is still the default 1, but the lower bound is overridden due to the unbounded low value' + ); - chart.set('data', [unboundedData[1]]); + chart.set('data', [unboundedData[1]]); - assert.deepEqual( - chart.get('yScale').domain(), - [0, 1.5], - 'The lower bound is still the default 0, but the upper bound is overridden due to the unbounded high value' - ); -}); + assert.deepEqual( + chart.get('yScale').domain(), + [0, 1.5], + 'The lower bound is still the default 0, but the upper bound is overridden due to the unbounded high value' + ); + }); -test('when there are only empty frames in the data array, the default y domain is used', function(assert) { - const chart = this.subject(); + test('when there are only empty frames in the data array, the default y domain is used', function(assert) { + const chart = this.owner.factoryFor('component:stats-time-series').create(); - chart.set('data', nullData); + chart.set('data', nullData); - assert.deepEqual(chart.get('yScale').domain(), [0, 1], 'The bounds are 0 and 1'); + assert.deepEqual(chart.get('yScale').domain(), [0, 1], 'The bounds are 0 and 1'); + }); }); diff --git a/ui/tests/unit/helpers/format-bytes-test.js b/ui/tests/unit/helpers/format-bytes-test.js index 510cb788477..14da4d13e34 100644 --- a/ui/tests/unit/helpers/format-bytes-test.js +++ b/ui/tests/unit/helpers/format-bytes-test.js @@ -1,31 +1,31 @@ -import { module, test } from 'ember-qunit'; +import { module, test } from 'qunit'; import { formatBytes } from 'nomad-ui/helpers/format-bytes'; -module('Unit | Helper | format-bytes'); +module('Unit | Helper | format-bytes', function() { + test('formats null/undefined as 0 bytes', function(assert) { + assert.equal(formatBytes([undefined]), '0 Bytes'); + assert.equal(formatBytes([null]), '0 Bytes'); + }); -test('formats null/undefined as 0 bytes', function(assert) { - assert.equal(formatBytes([undefined]), '0 Bytes'); - assert.equal(formatBytes([null]), '0 Bytes'); -}); + test('formats x < 1024 as bytes', function(assert) { + assert.equal(formatBytes([0]), '0 Bytes'); + assert.equal(formatBytes([100]), '100 Bytes'); + assert.equal(formatBytes([1023]), '1023 Bytes'); + }); -test('formats x < 1024 as bytes', function(assert) { - assert.equal(formatBytes([0]), '0 Bytes'); - assert.equal(formatBytes([100]), '100 Bytes'); - assert.equal(formatBytes([1023]), '1023 Bytes'); -}); + test('formats 1024 <= x < 1024 * 1024 as KiB', function(assert) { + assert.equal(formatBytes([1024]), '1 KiB'); + assert.equal(formatBytes([125952]), '123 KiB'); + assert.equal(formatBytes([1024 * 1024 - 1]), '1023 KiB'); + }); -test('formats 1024 <= x < 1024 * 1024 as KiB', function(assert) { - assert.equal(formatBytes([1024]), '1 KiB'); - assert.equal(formatBytes([125952]), '123 KiB'); - assert.equal(formatBytes([1024 * 1024 - 1]), '1023 KiB'); -}); - -test('formats 1024 * 1024 <= x < 1024 * 1024 * 1024 as MiB', function(assert) { - assert.equal(formatBytes([1024 * 1024]), '1 MiB'); - assert.equal(formatBytes([128974848]), '123 MiB'); -}); + test('formats 1024 * 1024 <= x < 1024 * 1024 * 1024 as MiB', function(assert) { + assert.equal(formatBytes([1024 * 1024]), '1 MiB'); + assert.equal(formatBytes([128974848]), '123 MiB'); + }); -test('formats x > 1024 * 1024 * 1024 as MiB, since it is the highest allowed unit', function(assert) { - assert.equal(formatBytes([1024 * 1024 * 1024]), '1024 MiB'); - assert.equal(formatBytes([1024 * 1024 * 1024 * 4]), '4096 MiB'); + test('formats x > 1024 * 1024 * 1024 as MiB, since it is the highest allowed unit', function(assert) { + assert.equal(formatBytes([1024 * 1024 * 1024]), '1024 MiB'); + assert.equal(formatBytes([1024 * 1024 * 1024 * 4]), '4096 MiB'); + }); }); diff --git a/ui/tests/unit/mixins/searchable-test.js b/ui/tests/unit/mixins/searchable-test.js index 00b749d943c..7ffdd868f7a 100644 --- a/ui/tests/unit/mixins/searchable-test.js +++ b/ui/tests/unit/mixins/searchable-test.js @@ -1,207 +1,216 @@ import { alias } from '@ember/object/computed'; import { getOwner } from '@ember/application'; import EmberObject, { computed } from '@ember/object'; -import { moduleFor, test } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import Searchable from 'nomad-ui/mixins/searchable'; -moduleFor('mixin:searchable', 'Unit | Mixin | Searchable', { - subject() { - const SearchableObject = EmberObject.extend(Searchable, { - source: null, - searchProps: computed(() => ['id', 'name']), - listToSearch: alias('source'), - }); - - this.register('test-container:searchable-object', SearchableObject); - return getOwner(this).lookup('test-container:searchable-object'); - }, -}); - -test('the searchable mixin does nothing when there is no search term', function(assert) { - const subject = this.subject(); - subject.set('source', [{ id: '1', name: 'hello' }, { id: '2', name: 'world' }]); - - assert.deepEqual(subject.get('listSearched'), subject.get('source')); -}); - -test('the searchable mixin allows for regex search', function(assert) { - const subject = this.subject(); - subject.set('source', [ - { id: '1', name: 'hello' }, - { id: '2', name: 'world' }, - { id: '3', name: 'oranges' }, - ]); - - subject.set('searchTerm', '.+l+[A-Z]$'); - assert.deepEqual( - subject.get('listSearched'), - [{ id: '1', name: 'hello' }, { id: '2', name: 'world' }], - 'hello and world matched for regex' - ); -}); - -test('the searchable mixin only searches the declared search props', function(assert) { - const subject = this.subject(); - subject.set('source', [ - { id: '1', name: 'United States of America', continent: 'North America' }, - { id: '2', name: 'Canada', continent: 'North America' }, - { id: '3', name: 'Mexico', continent: 'North America' }, - ]); - - subject.set('searchTerm', 'America'); - assert.deepEqual( - subject.get('listSearched'), - [{ id: '1', name: 'United States of America', continent: 'North America' }], - 'Only USA matched, since continent is not a search prop' - ); -}); - -test('the fuzzy search mode is off by default', function(assert) { - const subject = this.subject(); - subject.set('source', [ - { id: '1', name: 'United States of America', continent: 'North America' }, - { id: '2', name: 'Canada', continent: 'North America' }, - { id: '3', name: 'Mexico', continent: 'North America' }, - ]); - - subject.set('searchTerm', 'Ameerica'); - assert.deepEqual( - subject.get('listSearched'), - [], - 'Nothing is matched since America is spelled incorrectly' - ); -}); - -test('the fuzzy search mode can be enabled', function(assert) { - const subject = this.subject(); - subject.set('source', [ - { id: '1', name: 'United States of America', continent: 'North America' }, - { id: '2', name: 'Canada', continent: 'North America' }, - { id: '3', name: 'Mexico', continent: 'North America' }, - ]); - - subject.set('fuzzySearchEnabled', true); - subject.set('searchTerm', 'Ameerica'); - assert.deepEqual( - subject.get('listSearched'), - [{ id: '1', name: 'United States of America', continent: 'North America' }], - 'America is matched due to fuzzy matching' - ); -}); - -test('the exact match search mode can be disabled', function(assert) { - const subject = this.subject(); - subject.set('source', [ - { id: '1', name: 'United States of America', continent: 'North America' }, - { id: '2', name: 'Canada', continent: 'North America' }, - { id: '3', name: 'Mexico', continent: 'North America' }, - ]); - - subject.set('regexSearchProps', []); - subject.set('searchTerm', 'Mexico'); - - assert.deepEqual( - subject.get('listSearched'), - [{ id: '3', name: 'Mexico', continent: 'North America' }], - 'Mexico is matched exactly' - ); - - subject.set('exactMatchEnabled', false); - - assert.deepEqual( - subject.get('listSearched'), - [], - 'Nothing is matched now that exactMatch is disabled' - ); -}); - -test('the regex search mode can be disabled', function(assert) { - const subject = this.subject(); - subject.set('source', [ - { id: '1', name: 'United States of America', continent: 'North America' }, - { id: '2', name: 'Canada', continent: 'North America' }, - { id: '3', name: 'Mexico', continent: 'North America' }, - ]); - - subject.set('searchTerm', '^.{6}$'); - assert.deepEqual( - subject.get('listSearched'), - [ +module('Unit | Mixin | Searchable', function(hooks) { + setupTest(hooks); + + hooks.beforeEach(function() { + this.subject = function() { + const SearchableObject = EmberObject.extend(Searchable, { + source: null, + searchProps: computed(() => ['id', 'name']), + listToSearch: alias('source'), + }); + + this.owner.register('test-container:searchable-object', SearchableObject); + return this.owner.lookup('test-container:searchable-object'); + }; + }); + + test('the searchable mixin does nothing when there is no search term', function(assert) { + const subject = this.subject(); + subject.set('source', [{ id: '1', name: 'hello' }, { id: '2', name: 'world' }]); + + assert.deepEqual(subject.get('listSearched'), subject.get('source')); + }); + + test('the searchable mixin allows for regex search', function(assert) { + const subject = this.subject(); + subject.set('source', [ + { id: '1', name: 'hello' }, + { id: '2', name: 'world' }, + { id: '3', name: 'oranges' }, + ]); + + subject.set('searchTerm', '.+l+[A-Z]$'); + assert.deepEqual( + subject.get('listSearched'), + [{ id: '1', name: 'hello' }, { id: '2', name: 'world' }], + 'hello and world matched for regex' + ); + }); + + test('the searchable mixin only searches the declared search props', function(assert) { + const subject = this.subject(); + subject.set('source', [ + { id: '1', name: 'United States of America', continent: 'North America' }, { id: '2', name: 'Canada', continent: 'North America' }, { id: '3', name: 'Mexico', continent: 'North America' }, - ], - 'Canada and Mexico meet the regex criteria' - ); - - subject.set('regexEnabled', false); - - assert.deepEqual( - subject.get('listSearched'), - [], - 'Nothing is matched now that regex is disabled' - ); -}); - -test('each search mode has independent search props', function(assert) { - const subject = this.subject(); - subject.set('source', [ - { id: '1', name: 'United States of America', continent: 'North America' }, - { id: '2', name: 'Canada', continent: 'North America' }, - { id: '3', name: 'Mexico', continent: 'North America' }, - ]); - - subject.set('fuzzySearchEnabled', true); - subject.set('regexSearchProps', ['id']); - subject.set('exactMatchSearchProps', ['continent']); - subject.set('fuzzySearchProps', ['name']); - - subject.set('searchTerm', 'Nor America'); - assert.deepEqual( - subject.get('listSearched'), - [], - 'Not an exact match on continent, not a matchAllTokens match on fuzzy, not a regex match on id' - ); - - subject.set('searchTerm', 'America States'); - assert.deepEqual( - subject.get('listSearched'), - [{ id: '1', name: 'United States of America', continent: 'North America' }], - 'Fuzzy match on one country, but not an exact match on continent' - ); - - subject.set('searchTerm', '^(.a){3}$'); - assert.deepEqual( - subject.get('listSearched'), - [], - 'Canada is not matched by the regex because only id is looked at for regex search' - ); -}); - -test('the resetPagination method is a no-op', function(assert) { - const subject = this.subject(); - assert.strictEqual(subject.get('currentPage'), undefined, 'No currentPage value set'); - subject.resetPagination(); - assert.strictEqual(subject.get('currentPage'), undefined, 'Still no currentPage value set'); -}); - -moduleFor('mixin:searchable', 'Unit | Mixin | Searchable (with pagination)', { - subject() { - const SearchablePaginatedObject = EmberObject.extend(Searchable, { - source: null, - searchProps: computed(() => ['id', 'name']), - listToSearch: alias('source'), - currentPage: 1, - }); - - this.register('test-container:searchable-paginated-object', SearchablePaginatedObject); - return getOwner(this).lookup('test-container:searchable-paginated-object'); - }, + ]); + + subject.set('searchTerm', 'America'); + assert.deepEqual( + subject.get('listSearched'), + [{ id: '1', name: 'United States of America', continent: 'North America' }], + 'Only USA matched, since continent is not a search prop' + ); + }); + + test('the fuzzy search mode is off by default', function(assert) { + const subject = this.subject(); + subject.set('source', [ + { id: '1', name: 'United States of America', continent: 'North America' }, + { id: '2', name: 'Canada', continent: 'North America' }, + { id: '3', name: 'Mexico', continent: 'North America' }, + ]); + + subject.set('searchTerm', 'Ameerica'); + assert.deepEqual( + subject.get('listSearched'), + [], + 'Nothing is matched since America is spelled incorrectly' + ); + }); + + test('the fuzzy search mode can be enabled', function(assert) { + const subject = this.subject(); + subject.set('source', [ + { id: '1', name: 'United States of America', continent: 'North America' }, + { id: '2', name: 'Canada', continent: 'North America' }, + { id: '3', name: 'Mexico', continent: 'North America' }, + ]); + + subject.set('fuzzySearchEnabled', true); + subject.set('searchTerm', 'Ameerica'); + assert.deepEqual( + subject.get('listSearched'), + [{ id: '1', name: 'United States of America', continent: 'North America' }], + 'America is matched due to fuzzy matching' + ); + }); + + test('the exact match search mode can be disabled', function(assert) { + const subject = this.subject(); + subject.set('source', [ + { id: '1', name: 'United States of America', continent: 'North America' }, + { id: '2', name: 'Canada', continent: 'North America' }, + { id: '3', name: 'Mexico', continent: 'North America' }, + ]); + + subject.set('regexSearchProps', []); + subject.set('searchTerm', 'Mexico'); + + assert.deepEqual( + subject.get('listSearched'), + [{ id: '3', name: 'Mexico', continent: 'North America' }], + 'Mexico is matched exactly' + ); + + subject.set('exactMatchEnabled', false); + + assert.deepEqual( + subject.get('listSearched'), + [], + 'Nothing is matched now that exactMatch is disabled' + ); + }); + + test('the regex search mode can be disabled', function(assert) { + const subject = this.subject(); + subject.set('source', [ + { id: '1', name: 'United States of America', continent: 'North America' }, + { id: '2', name: 'Canada', continent: 'North America' }, + { id: '3', name: 'Mexico', continent: 'North America' }, + ]); + + subject.set('searchTerm', '^.{6}$'); + assert.deepEqual( + subject.get('listSearched'), + [ + { id: '2', name: 'Canada', continent: 'North America' }, + { id: '3', name: 'Mexico', continent: 'North America' }, + ], + 'Canada and Mexico meet the regex criteria' + ); + + subject.set('regexEnabled', false); + + assert.deepEqual( + subject.get('listSearched'), + [], + 'Nothing is matched now that regex is disabled' + ); + }); + + test('each search mode has independent search props', function(assert) { + const subject = this.subject(); + subject.set('source', [ + { id: '1', name: 'United States of America', continent: 'North America' }, + { id: '2', name: 'Canada', continent: 'North America' }, + { id: '3', name: 'Mexico', continent: 'North America' }, + ]); + + subject.set('fuzzySearchEnabled', true); + subject.set('regexSearchProps', ['id']); + subject.set('exactMatchSearchProps', ['continent']); + subject.set('fuzzySearchProps', ['name']); + + subject.set('searchTerm', 'Nor America'); + assert.deepEqual( + subject.get('listSearched'), + [], + 'Not an exact match on continent, not a matchAllTokens match on fuzzy, not a regex match on id' + ); + + subject.set('searchTerm', 'America States'); + assert.deepEqual( + subject.get('listSearched'), + [{ id: '1', name: 'United States of America', continent: 'North America' }], + 'Fuzzy match on one country, but not an exact match on continent' + ); + + subject.set('searchTerm', '^(.a){3}$'); + assert.deepEqual( + subject.get('listSearched'), + [], + 'Canada is not matched by the regex because only id is looked at for regex search' + ); + }); + + test('the resetPagination method is a no-op', function(assert) { + const subject = this.subject(); + assert.strictEqual(subject.get('currentPage'), undefined, 'No currentPage value set'); + subject.resetPagination(); + assert.strictEqual(subject.get('currentPage'), undefined, 'Still no currentPage value set'); + }); }); -test('the resetPagination method sets the currentPage to 1', function(assert) { - const subject = this.subject(); - subject.set('currentPage', 5); - assert.equal(subject.get('currentPage'), 5, 'Current page is something other than 1'); - subject.resetPagination(); - assert.equal(subject.get('currentPage'), 1, 'Current page gets reset to 1'); +module('Unit | Mixin | Searchable (with pagination)', function(hooks) { + setupTest(hooks); + + hooks.beforeEach(function() { + this.subject = function() { + const SearchablePaginatedObject = EmberObject.extend(Searchable, { + source: null, + searchProps: computed(() => ['id', 'name']), + listToSearch: alias('source'), + currentPage: 1, + }); + + this.owner.register('test-container:searchable-paginated-object', SearchablePaginatedObject); + return this.owner.lookup('test-container:searchable-paginated-object'); + }; + }); + + test('the resetPagination method sets the currentPage to 1', function(assert) { + const subject = this.subject(); + subject.set('currentPage', 5); + assert.equal(subject.get('currentPage'), 5, 'Current page is something other than 1'); + subject.resetPagination(); + assert.equal(subject.get('currentPage'), 1, 'Current page gets reset to 1'); + }); }); diff --git a/ui/tests/unit/models/job-test.js b/ui/tests/unit/models/job-test.js index 1913a20bf07..a3ff69b0e59 100644 --- a/ui/tests/unit/models/job-test.js +++ b/ui/tests/unit/models/job-test.js @@ -1,130 +1,131 @@ import { getOwner } from '@ember/application'; import { run } from '@ember/runloop'; -import { moduleForModel, test } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; -moduleForModel('job', 'Unit | Model | job', { - needs: ['model:job-summary', 'model:task-group', 'model:task', 'model:task-group-summary'], -}); +module('Unit | Model | job', function(hooks) { + setupTest(hooks); + + test('should expose aggregate allocations derived from task groups', function(assert) { + const store = this.owner.lookup('service:store'); + let summary; + run(() => { + summary = store.createRecord('job-summary', { + taskGroupSummaries: [ + { + name: 'one', + queuedAllocs: 1, + startingAllocs: 2, + runningAllocs: 3, + completeAllocs: 4, + failedAllocs: 5, + lostAllocs: 6, + }, + { + name: 'two', + queuedAllocs: 2, + startingAllocs: 4, + runningAllocs: 6, + completeAllocs: 8, + failedAllocs: 10, + lostAllocs: 12, + }, + { + name: 'three', + queuedAllocs: 3, + startingAllocs: 6, + runningAllocs: 9, + completeAllocs: 12, + failedAllocs: 15, + lostAllocs: 18, + }, + ], + }); + }); -test('should expose aggregate allocations derived from task groups', function(assert) { - const store = getOwner(this).lookup('service:store'); - let summary; - run(() => { - summary = store.createRecord('job-summary', { - taskGroupSummaries: [ + const job = run(() => this.owner.lookup('service:store').createRecord('job', { + summary, + name: 'example', + taskGroups: [ { name: 'one', - queuedAllocs: 1, - startingAllocs: 2, - runningAllocs: 3, - completeAllocs: 4, - failedAllocs: 5, - lostAllocs: 6, + count: 0, + tasks: [], }, { name: 'two', - queuedAllocs: 2, - startingAllocs: 4, - runningAllocs: 6, - completeAllocs: 8, - failedAllocs: 10, - lostAllocs: 12, + count: 0, + tasks: [], }, { name: 'three', - queuedAllocs: 3, - startingAllocs: 6, - runningAllocs: 9, - completeAllocs: 12, - failedAllocs: 15, - lostAllocs: 18, + count: 0, + tasks: [], }, ], - }); - }); - - const job = this.subject({ - summary, - name: 'example', - taskGroups: [ - { - name: 'one', - count: 0, - tasks: [], - }, - { - name: 'two', - count: 0, - tasks: [], - }, - { - name: 'three', - count: 0, - tasks: [], - }, - ], - }); + })); - assert.equal( - job.get('totalAllocs'), - job - .get('taskGroups') - .mapBy('summary.totalAllocs') - .reduce((sum, allocs) => sum + allocs, 0), - 'totalAllocs is the sum of all group totalAllocs' - ); + assert.equal( + job.get('totalAllocs'), + job + .get('taskGroups') + .mapBy('summary.totalAllocs') + .reduce((sum, allocs) => sum + allocs, 0), + 'totalAllocs is the sum of all group totalAllocs' + ); - assert.equal( - job.get('queuedAllocs'), - job - .get('taskGroups') - .mapBy('summary.queuedAllocs') - .reduce((sum, allocs) => sum + allocs, 0), - 'queuedAllocs is the sum of all group queuedAllocs' - ); + assert.equal( + job.get('queuedAllocs'), + job + .get('taskGroups') + .mapBy('summary.queuedAllocs') + .reduce((sum, allocs) => sum + allocs, 0), + 'queuedAllocs is the sum of all group queuedAllocs' + ); - assert.equal( - job.get('startingAllocs'), - job - .get('taskGroups') - .mapBy('summary.startingAllocs') - .reduce((sum, allocs) => sum + allocs, 0), - 'startingAllocs is the sum of all group startingAllocs' - ); + assert.equal( + job.get('startingAllocs'), + job + .get('taskGroups') + .mapBy('summary.startingAllocs') + .reduce((sum, allocs) => sum + allocs, 0), + 'startingAllocs is the sum of all group startingAllocs' + ); - assert.equal( - job.get('runningAllocs'), - job - .get('taskGroups') - .mapBy('summary.runningAllocs') - .reduce((sum, allocs) => sum + allocs, 0), - 'runningAllocs is the sum of all group runningAllocs' - ); + assert.equal( + job.get('runningAllocs'), + job + .get('taskGroups') + .mapBy('summary.runningAllocs') + .reduce((sum, allocs) => sum + allocs, 0), + 'runningAllocs is the sum of all group runningAllocs' + ); - assert.equal( - job.get('completeAllocs'), - job - .get('taskGroups') - .mapBy('summary.completeAllocs') - .reduce((sum, allocs) => sum + allocs, 0), - 'completeAllocs is the sum of all group completeAllocs' - ); + assert.equal( + job.get('completeAllocs'), + job + .get('taskGroups') + .mapBy('summary.completeAllocs') + .reduce((sum, allocs) => sum + allocs, 0), + 'completeAllocs is the sum of all group completeAllocs' + ); - assert.equal( - job.get('failedAllocs'), - job - .get('taskGroups') - .mapBy('summary.failedAllocs') - .reduce((sum, allocs) => sum + allocs, 0), - 'failedAllocs is the sum of all group failedAllocs' - ); + assert.equal( + job.get('failedAllocs'), + job + .get('taskGroups') + .mapBy('summary.failedAllocs') + .reduce((sum, allocs) => sum + allocs, 0), + 'failedAllocs is the sum of all group failedAllocs' + ); - assert.equal( - job.get('lostAllocs'), - job - .get('taskGroups') - .mapBy('summary.lostAllocs') - .reduce((sum, allocs) => sum + allocs, 0), - 'lostAllocs is the sum of all group lostAllocs' - ); + assert.equal( + job.get('lostAllocs'), + job + .get('taskGroups') + .mapBy('summary.lostAllocs') + .reduce((sum, allocs) => sum + allocs, 0), + 'lostAllocs is the sum of all group lostAllocs' + ); + }); }); diff --git a/ui/tests/unit/models/task-group-test.js b/ui/tests/unit/models/task-group-test.js index 0e6117e685e..d1ec78781cd 100644 --- a/ui/tests/unit/models/task-group-test.js +++ b/ui/tests/unit/models/task-group-test.js @@ -1,60 +1,63 @@ import { get } from '@ember/object'; -import { moduleForModel, test } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +import { run } from '@ember/runloop'; const sum = (list, key) => list.reduce((sum, item) => sum + get(item, key), 0); -moduleForModel('task-group', 'Unit | Model | task-group', { - needs: ['model:task', 'model:task-group-summary'], -}); +module('Unit | Model | task-group', function(hooks) { + setupTest(hooks); -test("should expose reserved resource stats as aggregates of each task's reserved resources", function(assert) { - const taskGroup = this.subject({ - name: 'group-example', - tasks: [ - { - name: 'task-one', - driver: 'docker', - reservedMemory: 512, - reservedCPU: 500, - reservedDisk: 1024, - }, - { - name: 'task-two', - driver: 'docker', - reservedMemory: 256, - reservedCPU: 1000, - reservedDisk: 512, - }, - { - name: 'task-three', - driver: 'docker', - reservedMemory: 1024, - reservedCPU: 1500, - reservedDisk: 4096, - }, - { - name: 'task-four', - driver: 'docker', - reservedMemory: 2048, - reservedCPU: 500, - reservedDisk: 128, - }, - ], - }); + test("should expose reserved resource stats as aggregates of each task's reserved resources", function(assert) { + const taskGroup = run(() => this.owner.lookup('service:store').createRecord('task-group', { + name: 'group-example', + tasks: [ + { + name: 'task-one', + driver: 'docker', + reservedMemory: 512, + reservedCPU: 500, + reservedDisk: 1024, + }, + { + name: 'task-two', + driver: 'docker', + reservedMemory: 256, + reservedCPU: 1000, + reservedDisk: 512, + }, + { + name: 'task-three', + driver: 'docker', + reservedMemory: 1024, + reservedCPU: 1500, + reservedDisk: 4096, + }, + { + name: 'task-four', + driver: 'docker', + reservedMemory: 2048, + reservedCPU: 500, + reservedDisk: 128, + }, + ], + })); - assert.equal( - taskGroup.get('reservedCPU'), - sum(taskGroup.get('tasks'), 'reservedCPU'), - 'reservedCPU is an aggregate sum of task CPU reservations' - ); - assert.equal( - taskGroup.get('reservedMemory'), - sum(taskGroup.get('tasks'), 'reservedMemory'), - 'reservedMemory is an aggregate sum of task memory reservations' - ); - assert.equal( - taskGroup.get('reservedDisk'), - sum(taskGroup.get('tasks'), 'reservedDisk'), - 'reservedDisk is an aggregate sum of task disk reservations' - ); + assert.equal( + taskGroup.get('reservedCPU'), + sum(taskGroup.get('tasks'), 'reservedCPU'), + 'reservedCPU is an aggregate sum of task CPU reservations' + ); + assert.equal( + taskGroup.get('reservedMemory'), + sum(taskGroup.get('tasks'), 'reservedMemory'), + 'reservedMemory is an aggregate sum of task memory reservations' + ); + assert.equal( + taskGroup.get('reservedDisk'), + sum(taskGroup.get('tasks'), 'reservedDisk'), + 'reservedDisk is an aggregate sum of task disk reservations' + ); + }); }); diff --git a/ui/tests/unit/serializers/allocation-test.js b/ui/tests/unit/serializers/allocation-test.js index a4c0941ec58..c713114f4c4 100644 --- a/ui/tests/unit/serializers/allocation-test.js +++ b/ui/tests/unit/serializers/allocation-test.js @@ -1,4 +1,4 @@ -import { test } from 'ember-qunit'; +import { test } from 'qunit'; import AllocationModel from 'nomad-ui/models/allocation'; import moduleForSerializer from '../../helpers/module-for-serializer'; diff --git a/ui/tests/unit/serializers/deployment-test.js b/ui/tests/unit/serializers/deployment-test.js index 04605160f7b..5797dd8225b 100644 --- a/ui/tests/unit/serializers/deployment-test.js +++ b/ui/tests/unit/serializers/deployment-test.js @@ -1,4 +1,4 @@ -import { test } from 'ember-qunit'; +import { test } from 'qunit'; import DeploymentModel from 'nomad-ui/models/deployment'; import moduleForSerializer from '../../helpers/module-for-serializer'; diff --git a/ui/tests/unit/serializers/evaluation-test.js b/ui/tests/unit/serializers/evaluation-test.js index fc1f39db7d6..22fb2ad316f 100644 --- a/ui/tests/unit/serializers/evaluation-test.js +++ b/ui/tests/unit/serializers/evaluation-test.js @@ -1,4 +1,4 @@ -import { test } from 'ember-qunit'; +import { test } from 'qunit'; import EvaluationModel from 'nomad-ui/models/evaluation'; import moduleForSerializer from '../../helpers/module-for-serializer'; diff --git a/ui/tests/unit/serializers/job-plan-test.js b/ui/tests/unit/serializers/job-plan-test.js index ccc1cdf149b..bef598c6afa 100644 --- a/ui/tests/unit/serializers/job-plan-test.js +++ b/ui/tests/unit/serializers/job-plan-test.js @@ -1,4 +1,4 @@ -import { test } from 'ember-qunit'; +import { test } from 'qunit'; import JobPlanModel from 'nomad-ui/models/job-plan'; import moduleForSerializer from '../../helpers/module-for-serializer'; diff --git a/ui/tests/unit/serializers/job-summary-test.js b/ui/tests/unit/serializers/job-summary-test.js index 8272cf2a5b5..a3190df70db 100644 --- a/ui/tests/unit/serializers/job-summary-test.js +++ b/ui/tests/unit/serializers/job-summary-test.js @@ -1,4 +1,4 @@ -import { test } from 'ember-qunit'; +import { test } from 'qunit'; import JobSummaryModel from 'nomad-ui/models/job-summary'; import moduleForSerializer from '../../helpers/module-for-serializer'; diff --git a/ui/tests/unit/serializers/job-test.js b/ui/tests/unit/serializers/job-test.js index 529e1bf162d..ab9f2c08e87 100644 --- a/ui/tests/unit/serializers/job-test.js +++ b/ui/tests/unit/serializers/job-test.js @@ -1,4 +1,4 @@ -import { test } from 'ember-qunit'; +import { test } from 'qunit'; import JobModel from 'nomad-ui/models/job'; import moduleForSerializer from '../../helpers/module-for-serializer'; diff --git a/ui/tests/unit/serializers/node-test.js b/ui/tests/unit/serializers/node-test.js index 15cf914b381..e0cd16d750d 100644 --- a/ui/tests/unit/serializers/node-test.js +++ b/ui/tests/unit/serializers/node-test.js @@ -1,9 +1,9 @@ import { run } from '@ember/runloop'; -import { test } from 'ember-qunit'; -import wait from 'ember-test-helpers/wait'; +import { test } from 'qunit'; import NodeModel from 'nomad-ui/models/node'; import moduleForSerializer from '../../helpers/module-for-serializer'; import pushPayloadToStore from '../../utils/push-payload-to-store'; +import { settled } from '@ember/test-helpers'; moduleForSerializer('node', 'Unit | Serializer | Node', { needs: [ @@ -61,7 +61,7 @@ test('local store is culled to reflect the state of findAll requests', function( }); pushPayloadToStore(this.store, newPayload, NodeModel.modelName); - return wait().then(() => { + return settled().then(() => { assert.equal( newPayload.data.length, newFindAllResponse.length, diff --git a/ui/tests/unit/services/breadcrumbs-test.js b/ui/tests/unit/services/breadcrumbs-test.js index 6ec833556c1..0f2ac5b5714 100644 --- a/ui/tests/unit/services/breadcrumbs-test.js +++ b/ui/tests/unit/services/breadcrumbs-test.js @@ -5,7 +5,8 @@ import { get } from '@ember/object'; import { alias } from '@ember/object/computed'; import { getOwner } from '@ember/application'; import RSVP from 'rsvp'; -import { moduleFor, test } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import PromiseObject from 'nomad-ui/utils/classes/promise-object'; const makeRoute = (crumbs, controller = {}) => @@ -14,15 +15,25 @@ const makeRoute = (crumbs, controller = {}) => controller: Controller.extend(controller).create(), }); -moduleFor('service:breadcrumbs', 'Unit | Service | Breadcrumbs', { - beforeEach() { +module('Unit | Service | Breadcrumbs', function(hooks) { + setupTest(hooks); + + hooks.beforeEach(function() { + this.subject = function() { + return this.owner + .factoryFor('service:breadcrumbs') + .create(); + }; + }); + + hooks.beforeEach(function() { const mockRouter = Service.extend({ currentRouteName: 'application', currentURL: '/', }); - this.register('service:router', mockRouter); - this.router = getOwner(this).lookup('service:router'); + this.owner.register('service:router', mockRouter); + this.router = this.owner.lookup('service:router'); const none = makeRoute(); const fixed = makeRoute([{ label: 'Static', args: ['static.index'] }]); @@ -54,96 +65,90 @@ moduleFor('service:breadcrumbs', 'Unit | Service | Breadcrumbs', { }), ]); const fromURL = makeRoute(model => [{ label: model, args: ['url'] }], { - router: getOwner(this).lookup('service:router'), + router: this.owner.lookup('service:router'), model: alias('router.currentURL'), }); - this.register('route:none', none); - this.register('route:none.more-none', none); - this.register('route:static', fixed); - this.register('route:static.many', manyFixed); - this.register('route:dynamic', dynamic); - this.register('route:dynamic.many', manyDynamic); - this.register('route:promise', promise); - this.register('route:url', fromURL); - }, - - subject() { - return getOwner(this) - .factoryFor('service:breadcrumbs') - .create(); - }, -}); + this.owner.register('route:none', none); + this.owner.register('route:none.more-none', none); + this.owner.register('route:static', fixed); + this.owner.register('route:static.many', manyFixed); + this.owner.register('route:dynamic', dynamic); + this.owner.register('route:dynamic.many', manyDynamic); + this.owner.register('route:promise', promise); + this.owner.register('route:url', fromURL); + }); -test('when the route hierarchy has no breadcrumbs', function(assert) { - this.router.set('currentRouteName', 'none'); + test('when the route hierarchy has no breadcrumbs', function(assert) { + this.router.set('currentRouteName', 'none'); - const service = this.subject(); - assert.deepEqual(service.get('breadcrumbs'), []); -}); + const service = this.subject(); + assert.deepEqual(service.get('breadcrumbs'), []); + }); -test('when the route hierarchy has one segment with static crumbs', function(assert) { - this.router.set('currentRouteName', 'static'); + test('when the route hierarchy has one segment with static crumbs', function(assert) { + this.router.set('currentRouteName', 'static'); - const service = this.subject(); - assert.deepEqual(service.get('breadcrumbs'), [{ label: 'Static', args: ['static.index'] }]); -}); + const service = this.subject(); + assert.deepEqual(service.get('breadcrumbs'), [{ label: 'Static', args: ['static.index'] }]); + }); -test('when the route hierarchy has multiple segments with static crumbs', function(assert) { - this.router.set('currentRouteName', 'static.many'); + test('when the route hierarchy has multiple segments with static crumbs', function(assert) { + this.router.set('currentRouteName', 'static.many'); - const service = this.subject(); - assert.deepEqual(service.get('breadcrumbs'), [ - { label: 'Static', args: ['static.index'] }, - { label: 'Static 1', args: ['static.index', 1] }, - { label: 'Static 2', args: ['static.index', 2] }, - ]); -}); + const service = this.subject(); + assert.deepEqual(service.get('breadcrumbs'), [ + { label: 'Static', args: ['static.index'] }, + { label: 'Static 1', args: ['static.index', 1] }, + { label: 'Static 2', args: ['static.index', 2] }, + ]); + }); -test('when the route hierarchy has a function as its breadcrumbs property', function(assert) { - this.router.set('currentRouteName', 'dynamic'); + test('when the route hierarchy has a function as its breadcrumbs property', function(assert) { + this.router.set('currentRouteName', 'dynamic'); - const service = this.subject(); - assert.deepEqual(service.get('breadcrumbs'), [ - { label: 'Label of the Crumb', args: ['dynamic.index', 'Label of the Crumb'] }, - ]); -}); + const service = this.subject(); + assert.deepEqual(service.get('breadcrumbs'), [ + { label: 'Label of the Crumb', args: ['dynamic.index', 'Label of the Crumb'] }, + ]); + }); -test('when the route hierarchy has multiple segments with dynamic crumbs', function(assert) { - this.router.set('currentRouteName', 'dynamic.many'); + test('when the route hierarchy has multiple segments with dynamic crumbs', function(assert) { + this.router.set('currentRouteName', 'dynamic.many'); - const service = this.subject(); - assert.deepEqual(service.get('breadcrumbs'), [ - { label: 'Label of the Crumb', args: ['dynamic.index', 'Label of the Crumb'] }, - { label: 'red', args: ['dynamic.index', 'red'] }, - { label: 'blue', args: ['dynamic.index', 'blue'] }, - ]); -}); + const service = this.subject(); + assert.deepEqual(service.get('breadcrumbs'), [ + { label: 'Label of the Crumb', args: ['dynamic.index', 'Label of the Crumb'] }, + { label: 'red', args: ['dynamic.index', 'red'] }, + { label: 'blue', args: ['dynamic.index', 'blue'] }, + ]); + }); -test('when a route provides a breadcrumb that is a promise, it gets passed through to the template', function(assert) { - this.router.set('currentRouteName', 'promise'); + test('when a route provides a breadcrumb that is a promise, it gets passed through to the template', function(assert) { + this.router.set('currentRouteName', 'promise'); - const service = this.subject(); - assert.ok(service.get('breadcrumbs.firstObject') instanceof PromiseObject); -}); + const service = this.subject(); + assert.ok(service.get('breadcrumbs.firstObject') instanceof PromiseObject); + }); + + // This happens when transitioning to the current route but with a different model + // jobs.job.index --> jobs.job.index + // /jobs/one --> /jobs/two + test('when the route stays the same but the url changes, breadcrumbs get recomputed', function(assert) { + this.router.set('currentRouteName', 'url'); + + const service = this.subject(); + assert.deepEqual( + service.get('breadcrumbs'), + [{ label: '/', args: ['url'] }], + 'The label is initially / as is the router currentURL' + ); -// This happens when transitioning to the current route but with a different model -// jobs.job.index --> jobs.job.index -// /jobs/one --> /jobs/two -test('when the route stays the same but the url changes, breadcrumbs get recomputed', function(assert) { - this.router.set('currentRouteName', 'url'); - - const service = this.subject(); - assert.deepEqual( - service.get('breadcrumbs'), - [{ label: '/', args: ['url'] }], - 'The label is initially / as is the router currentURL' - ); - - this.router.set('currentURL', '/somewhere/else'); - assert.deepEqual( - service.get('breadcrumbs'), - [{ label: '/somewhere/else', args: ['url'] }], - 'The label changes with currentURL since it is an alias and a change to currentURL recomputes breadcrumbs' - ); + this.router.set('currentURL', '/somewhere/else'); + assert.deepEqual( + service.get('breadcrumbs'), + [{ label: '/somewhere/else', args: ['url'] }], + 'The label changes with currentURL since it is an alias and a change to currentURL recomputes breadcrumbs' + ); + }); }); diff --git a/ui/tests/unit/services/stats-trackers-registry-test.js b/ui/tests/unit/services/stats-trackers-registry-test.js index 55959041054..a91ca555574 100644 --- a/ui/tests/unit/services/stats-trackers-registry-test.js +++ b/ui/tests/unit/services/stats-trackers-registry-test.js @@ -1,16 +1,25 @@ import EmberObject from '@ember/object'; -import { getOwner } from '@ember/application'; import Service from '@ember/service'; -import { run } from '@ember/runloop'; -import wait from 'ember-test-helpers/wait'; -import { moduleFor, test } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import { settled } from '@ember/test-helpers'; import Pretender from 'pretender'; import sinon from 'sinon'; import fetch from 'nomad-ui/utils/fetch'; import NodeStatsTracker from 'nomad-ui/utils/classes/node-stats-tracker'; -moduleFor('service:stats-trackers-registry', 'Unit | Service | Stats Trackers Registry', { - beforeEach() { +module('Unit | Service | Stats Trackers Registry', function(hooks) { + setupTest(hooks); + + hooks.beforeEach(function() { + this.subject = function() { + return this.owner + .factoryFor('service:stats-trackers-registry') + .create(); + }; + }); + + hooks.beforeEach(function() { // Inject a mock token service const authorizedRequestSpy = (this.tokenAuthorizedRequestSpy = sinon.spy()); const mockToken = Service.extend({ @@ -20,8 +29,8 @@ moduleFor('service:stats-trackers-registry', 'Unit | Service | Stats Trackers Re }, }); - this.register('service:token', mockToken); - this.token = getOwner(this).lookup('service:token'); + this.owner.register('service:token', mockToken); + this.token = this.owner.lookup('service:token'); this.server = new Pretender(function() { this.get('/v1/client/stats', () => [ 200, @@ -35,110 +44,103 @@ moduleFor('service:stats-trackers-registry', 'Unit | Service | Stats Trackers Re }), ]); }); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - }, - subject() { - return getOwner(this) - .factoryFor('service:stats-trackers-registry') - .create(); - }, -}); + }); -const makeModelMock = (modelName, defaults) => { - const Class = EmberObject.extend(defaults); - Class.prototype.constructor.modelName = modelName; - return Class; -}; + const makeModelMock = (modelName, defaults) => { + const Class = EmberObject.extend(defaults); + Class.prototype.constructor.modelName = modelName; + return Class; + }; -const mockNode = makeModelMock('node', { id: 'test' }); + const mockNode = makeModelMock('node', { id: 'test' }); -test('Creates a tracker when one isn’t found', function(assert) { - const registry = this.subject(); - const id = 'id'; + test('Creates a tracker when one isn’t found', function(assert) { + const registry = this.subject(); + const id = 'id'; - assert.equal(registry.get('registryRef').size, 0, 'Nothing in the registry yet'); + assert.equal(registry.get('registryRef').size, 0, 'Nothing in the registry yet'); - const tracker = registry.getTracker(mockNode.create({ id })); - assert.ok(tracker instanceof NodeStatsTracker, 'The correct type of tracker is made'); - assert.equal(registry.get('registryRef').size, 1, 'The tracker was added to the registry'); - assert.deepEqual( - Array.from(registry.get('registryRef').keys()), - [`node:${id}`], - 'The object in the registry has the correct key' - ); -}); + const tracker = registry.getTracker(mockNode.create({ id })); + assert.ok(tracker instanceof NodeStatsTracker, 'The correct type of tracker is made'); + assert.equal(registry.get('registryRef').size, 1, 'The tracker was added to the registry'); + assert.deepEqual( + Array.from(registry.get('registryRef').keys()), + [`node:${id}`], + 'The object in the registry has the correct key' + ); + }); -test('Returns an existing tracker when one is found', function(assert) { - const registry = this.subject(); - const node = mockNode.create(); + test('Returns an existing tracker when one is found', function(assert) { + const registry = this.subject(); + const node = mockNode.create(); - const tracker1 = registry.getTracker(node); - const tracker2 = registry.getTracker(node); + const tracker1 = registry.getTracker(node); + const tracker2 = registry.getTracker(node); - assert.equal(tracker1, tracker2, 'Returns an existing tracker for the same resource'); - assert.equal(registry.get('registryRef').size, 1, 'Only one tracker in the registry'); -}); + assert.equal(tracker1, tracker2, 'Returns an existing tracker for the same resource'); + assert.equal(registry.get('registryRef').size, 1, 'Only one tracker in the registry'); + }); -test('Registry does not depend on persistent object references', function(assert) { - const registry = this.subject(); - const id = 'some-id'; + test('Registry does not depend on persistent object references', function(assert) { + const registry = this.subject(); + const id = 'some-id'; - const node1 = mockNode.create({ id }); - const node2 = mockNode.create({ id }); + const node1 = mockNode.create({ id }); + const node2 = mockNode.create({ id }); - assert.notEqual(node1, node2, 'Two different resources'); - assert.equal(node1.get('id'), node2.get('id'), 'With the same IDs'); - assert.equal(node1.constructor.modelName, node2.constructor.modelName, 'And the same className'); + assert.notEqual(node1, node2, 'Two different resources'); + assert.equal(node1.get('id'), node2.get('id'), 'With the same IDs'); + assert.equal(node1.constructor.modelName, node2.constructor.modelName, 'And the same className'); - assert.equal(registry.getTracker(node1), registry.getTracker(node2), 'Return the same tracker'); - assert.equal(registry.get('registryRef').size, 1, 'Only one tracker in the registry'); -}); + assert.equal(registry.getTracker(node1), registry.getTracker(node2), 'Return the same tracker'); + assert.equal(registry.get('registryRef').size, 1, 'Only one tracker in the registry'); + }); -test('Has a max size', function(assert) { - const registry = this.subject(); - const ref = registry.get('registryRef'); + test('Has a max size', function(assert) { + const registry = this.subject(); + const ref = registry.get('registryRef'); - // Kind of a silly assertion, but the exact limit is arbitrary. Whether it's 10 or 1000 - // isn't important as long as there is one. - assert.ok(ref.limit < Infinity, `A limit (${ref.limit}) is set`); -}); + // Kind of a silly assertion, but the exact limit is arbitrary. Whether it's 10 or 1000 + // isn't important as long as there is one. + assert.ok(ref.limit < Infinity, `A limit (${ref.limit}) is set`); + }); -test('Registry re-attaches deleted resources to cached trackers', function(assert) { - const registry = this.subject(); - const id = 'some-id'; + test('Registry re-attaches deleted resources to cached trackers', function(assert) { + const registry = this.subject(); + const id = 'some-id'; - const node1 = mockNode.create({ id }); - let tracker = registry.getTracker(node1); + const node1 = mockNode.create({ id }); + let tracker = registry.getTracker(node1); - assert.ok(tracker.get('node'), 'The tracker has a node'); + assert.ok(tracker.get('node'), 'The tracker has a node'); - tracker.set('node', null); - assert.notOk(tracker.get('node'), 'The tracker does not have a node'); + tracker.set('node', null); + assert.notOk(tracker.get('node'), 'The tracker does not have a node'); - tracker = registry.getTracker(node1); - assert.equal( - tracker.get('node'), - node1, - 'The node was re-attached to the tracker after calling getTracker again' - ); -}); + tracker = registry.getTracker(node1); + assert.equal( + tracker.get('node'), + node1, + 'The node was re-attached to the tracker after calling getTracker again' + ); + }); -test('Registry re-attaches destroyed resources to cached trackers', function(assert) { - const registry = this.subject(); - const id = 'some-id'; + test('Registry re-attaches destroyed resources to cached trackers', async function(assert) { + const registry = this.subject(); + const id = 'some-id'; - const node1 = mockNode.create({ id }); - let tracker = registry.getTracker(node1); + const node1 = mockNode.create({ id }); + let tracker = registry.getTracker(node1); - assert.ok(tracker.get('node'), 'The tracker has a node'); + assert.ok(tracker.get('node'), 'The tracker has a node'); - run(() => { node1.destroy(); - }); + await settled(); - return wait().then(() => { assert.ok(tracker.get('node').isDestroyed, 'The tracker node is destroyed'); const node2 = mockNode.create({ id }); @@ -149,51 +151,51 @@ test('Registry re-attaches destroyed resources to cached trackers', function(ass 'Since node1 was destroyed but it matches the tracker of node2, node2 is attached to the tracker' ); }); -}); -test('Removes least recently used when something needs to be removed', function(assert) { - const registry = this.subject(); - const activeNode = mockNode.create({ id: 'active' }); - const inactiveNode = mockNode.create({ id: 'inactive' }); - const limit = registry.get('registryRef').limit; + test('Removes least recently used when something needs to be removed', function(assert) { + const registry = this.subject(); + const activeNode = mockNode.create({ id: 'active' }); + const inactiveNode = mockNode.create({ id: 'inactive' }); + const limit = registry.get('registryRef').limit; - // First put in the two tracked nodes - registry.getTracker(activeNode); - registry.getTracker(inactiveNode); + // First put in the two tracked nodes + registry.getTracker(activeNode); + registry.getTracker(inactiveNode); - for (let i = 0; i < limit; i++) { - // Add a new tracker to the registry - const newNode = mockNode.create({ id: `node-${i}` }); - registry.getTracker(newNode); + for (let i = 0; i < limit; i++) { + // Add a new tracker to the registry + const newNode = mockNode.create({ id: `node-${i}` }); + registry.getTracker(newNode); - // But read the active node tracker to keep it fresh - registry.getTracker(activeNode); - } - - const ref = registry.get('registryRef'); - assert.equal(ref.size, ref.limit, 'The limit was reached'); - - assert.ok( - ref.get('node:active'), - 'The active tracker is still in the registry despite being added first' - ); - assert.notOk( - ref.get('node:inactive'), - 'The inactive tracker got pushed out due to not being accessed' - ); -}); + // But read the active node tracker to keep it fresh + registry.getTracker(activeNode); + } + + const ref = registry.get('registryRef'); + assert.equal(ref.size, ref.limit, 'The limit was reached'); + + assert.ok( + ref.get('node:active'), + 'The active tracker is still in the registry despite being added first' + ); + assert.notOk( + ref.get('node:inactive'), + 'The inactive tracker got pushed out due to not being accessed' + ); + }); -test('Trackers are created using the token authorizedRequest', function(assert) { - const registry = this.subject(); - const node = mockNode.create(); + test('Trackers are created using the token authorizedRequest', function(assert) { + const registry = this.subject(); + const node = mockNode.create(); - const tracker = registry.getTracker(node); + const tracker = registry.getTracker(node); - tracker.get('poll').perform(); - assert.ok( - this.tokenAuthorizedRequestSpy.calledWith(`/v1/client/stats?node_id=${node.get('id')}`), - 'The token service authorizedRequest function was used' - ); + tracker.get('poll').perform(); + assert.ok( + this.tokenAuthorizedRequestSpy.calledWith(`/v1/client/stats?node_id=${node.get('id')}`), + 'The token service authorizedRequest function was used' + ); - return wait(); + return settled(); + }); }); diff --git a/ui/tests/unit/services/token-test.js b/ui/tests/unit/services/token-test.js index ed9d6f2e97c..a84c38052b4 100644 --- a/ui/tests/unit/services/token-test.js +++ b/ui/tests/unit/services/token-test.js @@ -1,59 +1,66 @@ import { getOwner } from '@ember/application'; import Service from '@ember/service'; -import { moduleFor, test } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import Pretender from 'pretender'; -moduleFor('service:token', 'Unit | Service | Token', { - beforeEach() { +module('Unit | Service | Token', function(hooks) { + setupTest(hooks); + + hooks.beforeEach(function() { + this.subject = function() { + return this.owner + .factoryFor('service:token') + .create(); + }; + }); + + hooks.beforeEach(function() { const mockSystem = Service.extend({ activeRegion: 'region-1', shouldIncludeRegion: true, }); - this.register('service:system', mockSystem); - this.system = getOwner(this).lookup('service:system'); + this.owner.register('service:system', mockSystem); + this.system = this.owner.lookup('service:system'); this.server = new Pretender(function() { this.get('/path', () => [200, {}, null]); }); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - }, - subject() { - return getOwner(this) - .factoryFor('service:token') - .create(); - }, -}); + }); -test('authorizedRequest includes the region param when the system service says to', function(assert) { - const token = this.subject(); + test('authorizedRequest includes the region param when the system service says to', function(assert) { + const token = this.subject(); - token.authorizedRequest('/path'); - assert.equal( - this.server.handledRequests.pop().url, - `/path?region=${this.system.get('activeRegion')}`, - 'The region param is included when the system service shouldIncludeRegion property is true' - ); + token.authorizedRequest('/path'); + assert.equal( + this.server.handledRequests.pop().url, + `/path?region=${this.system.get('activeRegion')}`, + 'The region param is included when the system service shouldIncludeRegion property is true' + ); - this.system.set('shouldIncludeRegion', false); + this.system.set('shouldIncludeRegion', false); - token.authorizedRequest('/path'); - assert.equal( - this.server.handledRequests.pop().url, - '/path', - 'The region param is not included when the system service shouldIncludeRegion property is false' - ); -}); + token.authorizedRequest('/path'); + assert.equal( + this.server.handledRequests.pop().url, + '/path', + 'The region param is not included when the system service shouldIncludeRegion property is false' + ); + }); -test('authorizedRawRequest bypasses adding the region param', function(assert) { - const token = this.subject(); + test('authorizedRawRequest bypasses adding the region param', function(assert) { + const token = this.subject(); - token.authorizedRawRequest('/path'); - assert.equal( - this.server.handledRequests.pop().url, - '/path', - 'The region param is ommitted when making a raw request' - ); + token.authorizedRawRequest('/path'); + assert.equal( + this.server.handledRequests.pop().url, + '/path', + 'The region param is ommitted when making a raw request' + ); + }); }); diff --git a/ui/tests/unit/utils/allocation-stats-tracker-test.js b/ui/tests/unit/utils/allocation-stats-tracker-test.js index 5af885a8054..3518242a79c 100644 --- a/ui/tests/unit/utils/allocation-stats-tracker-test.js +++ b/ui/tests/unit/utils/allocation-stats-tracker-test.js @@ -1,480 +1,481 @@ import EmberObject from '@ember/object'; import { assign } from '@ember/polyfills'; -import wait from 'ember-test-helpers/wait'; -import { module, test } from 'ember-qunit'; +import { module, test } from 'qunit'; import sinon from 'sinon'; import Pretender from 'pretender'; import AllocationStatsTracker, { stats } from 'nomad-ui/utils/classes/allocation-stats-tracker'; import fetch from 'nomad-ui/utils/fetch'; import statsTrackerFrameMissingBehavior from './behaviors/stats-tracker-frame-missing'; -module('Unit | Util | AllocationStatsTracker'); - -const refDate = Date.now() * 1000000; -const makeDate = ts => new Date(ts / 1000000); - -const MockAllocation = overrides => - assign( - { - id: 'some-identifier', - taskGroup: { - reservedCPU: 200, - reservedMemory: 512, - tasks: [ - { - name: 'service', - reservedCPU: 100, - reservedMemory: 256, - }, - { - name: 'log-shipper', - reservedCPU: 50, - reservedMemory: 128, - }, - { - name: 'sidecar', - reservedCPU: 50, - reservedMemory: 128, - }, - ], - }, - }, - overrides - ); +import { settled } from '@ember/test-helpers'; -const mockFrame = step => ({ - ResourceUsage: { - CpuStats: { - TotalTicks: step + 100, - }, - MemoryStats: { - RSS: (step + 400) * 1024 * 1024, - }, - }, - Tasks: { - service: { - ResourceUsage: { - CpuStats: { - TotalTicks: step + 50, - }, - MemoryStats: { - RSS: (step + 100) * 1024 * 1024, +module('Unit | Util | AllocationStatsTracker', function() { + const refDate = Date.now() * 1000000; + const makeDate = ts => new Date(ts / 1000000); + + const MockAllocation = overrides => + assign( + { + id: 'some-identifier', + taskGroup: { + reservedCPU: 200, + reservedMemory: 512, + tasks: [ + { + name: 'service', + reservedCPU: 100, + reservedMemory: 256, + }, + { + name: 'log-shipper', + reservedCPU: 50, + reservedMemory: 128, + }, + { + name: 'sidecar', + reservedCPU: 50, + reservedMemory: 128, + }, + ], }, }, - Timestamp: refDate + step, + overrides + ); + + const mockFrame = step => ({ + ResourceUsage: { + CpuStats: { + TotalTicks: step + 100, + }, + MemoryStats: { + RSS: (step + 400) * 1024 * 1024, + }, }, - 'log-shipper': { - ResourceUsage: { - CpuStats: { - TotalTicks: step + 25, - }, - MemoryStats: { - RSS: (step + 50) * 1024 * 1024, + Tasks: { + service: { + ResourceUsage: { + CpuStats: { + TotalTicks: step + 50, + }, + MemoryStats: { + RSS: (step + 100) * 1024 * 1024, + }, }, + Timestamp: refDate + step, }, - Timestamp: refDate + step * 10, - }, - sidecar: { - ResourceUsage: { - CpuStats: { - TotalTicks: step + 26, + 'log-shipper': { + ResourceUsage: { + CpuStats: { + TotalTicks: step + 25, + }, + MemoryStats: { + RSS: (step + 50) * 1024 * 1024, + }, }, - MemoryStats: { - RSS: (step + 51) * 1024 * 1024, + Timestamp: refDate + step * 10, + }, + sidecar: { + ResourceUsage: { + CpuStats: { + TotalTicks: step + 26, + }, + MemoryStats: { + RSS: (step + 51) * 1024 * 1024, + }, }, + Timestamp: refDate + step * 100, }, - Timestamp: refDate + step * 100, }, - }, - Timestamp: refDate + step * 1000, -}); + Timestamp: refDate + step * 1000, + }); -test('the AllocationStatsTracker constructor expects a fetch definition and an allocation', function(assert) { - const tracker = AllocationStatsTracker.create(); - assert.throws( - () => { - tracker.fetch(); - }, - /StatsTrackers need a fetch method/, - 'Polling does not work without a fetch method provided' - ); -}); + test('the AllocationStatsTracker constructor expects a fetch definition and an allocation', function(assert) { + const tracker = AllocationStatsTracker.create(); + assert.throws( + () => { + tracker.fetch(); + }, + /StatsTrackers need a fetch method/, + 'Polling does not work without a fetch method provided' + ); + }); -test('the url property is computed based off the allocation id', function(assert) { - const allocation = MockAllocation(); - const tracker = AllocationStatsTracker.create({ fetch, allocation }); + test('the url property is computed based off the allocation id', function(assert) { + const allocation = MockAllocation(); + const tracker = AllocationStatsTracker.create({ fetch, allocation }); - assert.equal( - tracker.get('url'), - `/v1/client/allocation/${allocation.id}/stats`, - 'Url is derived from the allocation id' - ); -}); + assert.equal( + tracker.get('url'), + `/v1/client/allocation/${allocation.id}/stats`, + 'Url is derived from the allocation id' + ); + }); -test('reservedCPU and reservedMemory properties come from the allocation', function(assert) { - const allocation = MockAllocation(); - const tracker = AllocationStatsTracker.create({ fetch, allocation }); - - assert.equal( - tracker.get('reservedCPU'), - allocation.taskGroup.reservedCPU, - 'reservedCPU comes from the allocation task group' - ); - assert.equal( - tracker.get('reservedMemory'), - allocation.taskGroup.reservedMemory, - 'reservedMemory comes from the allocation task group' - ); -}); + test('reservedCPU and reservedMemory properties come from the allocation', function(assert) { + const allocation = MockAllocation(); + const tracker = AllocationStatsTracker.create({ fetch, allocation }); -test('the tasks list comes from the allocation', function(assert) { - const allocation = MockAllocation(); - const tracker = AllocationStatsTracker.create({ fetch, allocation }); - - assert.equal( - tracker.get('tasks.length'), - allocation.taskGroup.tasks.length, - 'tasks matches lengths with the allocation task group' - ); - allocation.taskGroup.tasks.forEach(task => { - const trackerTask = tracker.get('tasks').findBy('task', task.name); - assert.equal(trackerTask.reservedCPU, task.reservedCPU, `CPU matches for task ${task.name}`); assert.equal( - trackerTask.reservedMemory, - task.reservedMemory, - `Memory matches for task ${task.name}` + tracker.get('reservedCPU'), + allocation.taskGroup.reservedCPU, + 'reservedCPU comes from the allocation task group' + ); + assert.equal( + tracker.get('reservedMemory'), + allocation.taskGroup.reservedMemory, + 'reservedMemory comes from the allocation task group' ); }); -}); -test('poll results in requesting the url and calling append with the resulting JSON', function(assert) { - const allocation = MockAllocation(); - const tracker = AllocationStatsTracker.create({ fetch, allocation, append: sinon.spy() }); - const mockFrame = { - Some: { - data: ['goes', 'here'], - twelve: 12, - }, - }; + test('the tasks list comes from the allocation', function(assert) { + const allocation = MockAllocation(); + const tracker = AllocationStatsTracker.create({ fetch, allocation }); - const server = new Pretender(function() { - this.get('/v1/client/allocation/:id/stats', () => [200, {}, JSON.stringify(mockFrame)]); + assert.equal( + tracker.get('tasks.length'), + allocation.taskGroup.tasks.length, + 'tasks matches lengths with the allocation task group' + ); + allocation.taskGroup.tasks.forEach(task => { + const trackerTask = tracker.get('tasks').findBy('task', task.name); + assert.equal(trackerTask.reservedCPU, task.reservedCPU, `CPU matches for task ${task.name}`); + assert.equal( + trackerTask.reservedMemory, + task.reservedMemory, + `Memory matches for task ${task.name}` + ); + }); }); - tracker.get('poll').perform(); + test('poll results in requesting the url and calling append with the resulting JSON', function(assert) { + const allocation = MockAllocation(); + const tracker = AllocationStatsTracker.create({ fetch, allocation, append: sinon.spy() }); + const mockFrame = { + Some: { + data: ['goes', 'here'], + twelve: 12, + }, + }; + + const server = new Pretender(function() { + this.get('/v1/client/allocation/:id/stats', () => [200, {}, JSON.stringify(mockFrame)]); + }); - assert.equal(server.handledRequests.length, 1, 'Only one request was made'); - assert.equal( - server.handledRequests[0].url, - `/v1/client/allocation/${allocation.id}/stats`, - 'The correct URL was requested' - ); + tracker.get('poll').perform(); - return wait().then(() => { - assert.ok( - tracker.append.calledWith(mockFrame), - 'The JSON response was passed onto append as a POJO' + assert.equal(server.handledRequests.length, 1, 'Only one request was made'); + assert.equal( + server.handledRequests[0].url, + `/v1/client/allocation/${allocation.id}/stats`, + 'The correct URL was requested' ); - server.shutdown(); + return settled().then(() => { + assert.ok( + tracker.append.calledWith(mockFrame), + 'The JSON response was passed onto append as a POJO' + ); + + server.shutdown(); + }); }); -}); -test('append appropriately maps a data frame to the tracked stats for cpu and memory for the allocation as well as individual tasks', function(assert) { - const allocation = MockAllocation(); - const tracker = AllocationStatsTracker.create({ fetch, allocation }); - - assert.deepEqual(tracker.get('cpu'), [], 'No tracked cpu yet'); - assert.deepEqual(tracker.get('memory'), [], 'No tracked memory yet'); - - assert.deepEqual( - tracker.get('tasks'), - [ - { task: 'service', reservedCPU: 100, reservedMemory: 256, cpu: [], memory: [] }, - { task: 'log-shipper', reservedCPU: 50, reservedMemory: 128, cpu: [], memory: [] }, - { task: 'sidecar', reservedCPU: 50, reservedMemory: 128, cpu: [], memory: [] }, - ], - 'tasks represents the tasks for the allocation with no stats yet' - ); - - tracker.append(mockFrame(1)); - - assert.deepEqual( - tracker.get('cpu'), - [{ timestamp: makeDate(refDate + 1000), used: 101, percent: 101 / 200 }], - 'One frame of cpu' - ); - assert.deepEqual( - tracker.get('memory'), - [ - { - timestamp: makeDate(refDate + 1000), - used: 401 * 1024 * 1024, - percent: 401 / 512, - }, - ], - 'One frame of memory' - ); + test('append appropriately maps a data frame to the tracked stats for cpu and memory for the allocation as well as individual tasks', function(assert) { + const allocation = MockAllocation(); + const tracker = AllocationStatsTracker.create({ fetch, allocation }); + + assert.deepEqual(tracker.get('cpu'), [], 'No tracked cpu yet'); + assert.deepEqual(tracker.get('memory'), [], 'No tracked memory yet'); + + assert.deepEqual( + tracker.get('tasks'), + [ + { task: 'service', reservedCPU: 100, reservedMemory: 256, cpu: [], memory: [] }, + { task: 'log-shipper', reservedCPU: 50, reservedMemory: 128, cpu: [], memory: [] }, + { task: 'sidecar', reservedCPU: 50, reservedMemory: 128, cpu: [], memory: [] }, + ], + 'tasks represents the tasks for the allocation with no stats yet' + ); - assert.deepEqual( - tracker.get('tasks'), - [ - { - task: 'service', - reservedCPU: 100, - reservedMemory: 256, - cpu: [{ timestamp: makeDate(refDate + 1), used: 51, percent: 51 / 100 }], - memory: [ - { - timestamp: makeDate(refDate + 1), - used: 101 * 1024 * 1024, - percent: 101 / 256, - }, - ], - }, - { - task: 'log-shipper', - reservedCPU: 50, - reservedMemory: 128, - cpu: [{ timestamp: makeDate(refDate + 10), used: 26, percent: 26 / 50 }], - memory: [ - { - timestamp: makeDate(refDate + 10), - used: 51 * 1024 * 1024, - percent: 51 / 128, - }, - ], - }, - { - task: 'sidecar', - reservedCPU: 50, - reservedMemory: 128, - cpu: [{ timestamp: makeDate(refDate + 100), used: 27, percent: 27 / 50 }], - memory: [ - { - timestamp: makeDate(refDate + 100), - used: 52 * 1024 * 1024, - percent: 52 / 128, - }, - ], - }, - ], - 'tasks represents the tasks for the allocation, each with one frame of stats' - ); - - tracker.append(mockFrame(2)); - - assert.deepEqual( - tracker.get('cpu'), - [ - { timestamp: makeDate(refDate + 1000), used: 101, percent: 101 / 200 }, - { timestamp: makeDate(refDate + 2000), used: 102, percent: 102 / 200 }, - ], - 'Two frames of cpu' - ); - assert.deepEqual( - tracker.get('memory'), - [ - { timestamp: makeDate(refDate + 1000), used: 401 * 1024 * 1024, percent: 401 / 512 }, - { timestamp: makeDate(refDate + 2000), used: 402 * 1024 * 1024, percent: 402 / 512 }, - ], - 'Two frames of memory' - ); - - assert.deepEqual( - tracker.get('tasks'), - [ - { - task: 'service', - reservedCPU: 100, - reservedMemory: 256, - cpu: [ - { timestamp: makeDate(refDate + 1), used: 51, percent: 51 / 100 }, - { timestamp: makeDate(refDate + 2), used: 52, percent: 52 / 100 }, - ], - memory: [ - { timestamp: makeDate(refDate + 1), used: 101 * 1024 * 1024, percent: 101 / 256 }, - { timestamp: makeDate(refDate + 2), used: 102 * 1024 * 1024, percent: 102 / 256 }, - ], - }, - { - task: 'log-shipper', - reservedCPU: 50, - reservedMemory: 128, - cpu: [ - { timestamp: makeDate(refDate + 10), used: 26, percent: 26 / 50 }, - { timestamp: makeDate(refDate + 20), used: 27, percent: 27 / 50 }, - ], - memory: [ - { timestamp: makeDate(refDate + 10), used: 51 * 1024 * 1024, percent: 51 / 128 }, - { timestamp: makeDate(refDate + 20), used: 52 * 1024 * 1024, percent: 52 / 128 }, - ], - }, - { - task: 'sidecar', - reservedCPU: 50, - reservedMemory: 128, - cpu: [ - { timestamp: makeDate(refDate + 100), used: 27, percent: 27 / 50 }, - { timestamp: makeDate(refDate + 200), used: 28, percent: 28 / 50 }, - ], - memory: [ - { timestamp: makeDate(refDate + 100), used: 52 * 1024 * 1024, percent: 52 / 128 }, - { timestamp: makeDate(refDate + 200), used: 53 * 1024 * 1024, percent: 53 / 128 }, - ], - }, - ], - 'tasks represents the tasks for the allocation, each with two frames of stats' - ); -}); + tracker.append(mockFrame(1)); + + assert.deepEqual( + tracker.get('cpu'), + [{ timestamp: makeDate(refDate + 1000), used: 101, percent: 101 / 200 }], + 'One frame of cpu' + ); + assert.deepEqual( + tracker.get('memory'), + [ + { + timestamp: makeDate(refDate + 1000), + used: 401 * 1024 * 1024, + percent: 401 / 512, + }, + ], + 'One frame of memory' + ); + + assert.deepEqual( + tracker.get('tasks'), + [ + { + task: 'service', + reservedCPU: 100, + reservedMemory: 256, + cpu: [{ timestamp: makeDate(refDate + 1), used: 51, percent: 51 / 100 }], + memory: [ + { + timestamp: makeDate(refDate + 1), + used: 101 * 1024 * 1024, + percent: 101 / 256, + }, + ], + }, + { + task: 'log-shipper', + reservedCPU: 50, + reservedMemory: 128, + cpu: [{ timestamp: makeDate(refDate + 10), used: 26, percent: 26 / 50 }], + memory: [ + { + timestamp: makeDate(refDate + 10), + used: 51 * 1024 * 1024, + percent: 51 / 128, + }, + ], + }, + { + task: 'sidecar', + reservedCPU: 50, + reservedMemory: 128, + cpu: [{ timestamp: makeDate(refDate + 100), used: 27, percent: 27 / 50 }], + memory: [ + { + timestamp: makeDate(refDate + 100), + used: 52 * 1024 * 1024, + percent: 52 / 128, + }, + ], + }, + ], + 'tasks represents the tasks for the allocation, each with one frame of stats' + ); + + tracker.append(mockFrame(2)); + + assert.deepEqual( + tracker.get('cpu'), + [ + { timestamp: makeDate(refDate + 1000), used: 101, percent: 101 / 200 }, + { timestamp: makeDate(refDate + 2000), used: 102, percent: 102 / 200 }, + ], + 'Two frames of cpu' + ); + assert.deepEqual( + tracker.get('memory'), + [ + { timestamp: makeDate(refDate + 1000), used: 401 * 1024 * 1024, percent: 401 / 512 }, + { timestamp: makeDate(refDate + 2000), used: 402 * 1024 * 1024, percent: 402 / 512 }, + ], + 'Two frames of memory' + ); + + assert.deepEqual( + tracker.get('tasks'), + [ + { + task: 'service', + reservedCPU: 100, + reservedMemory: 256, + cpu: [ + { timestamp: makeDate(refDate + 1), used: 51, percent: 51 / 100 }, + { timestamp: makeDate(refDate + 2), used: 52, percent: 52 / 100 }, + ], + memory: [ + { timestamp: makeDate(refDate + 1), used: 101 * 1024 * 1024, percent: 101 / 256 }, + { timestamp: makeDate(refDate + 2), used: 102 * 1024 * 1024, percent: 102 / 256 }, + ], + }, + { + task: 'log-shipper', + reservedCPU: 50, + reservedMemory: 128, + cpu: [ + { timestamp: makeDate(refDate + 10), used: 26, percent: 26 / 50 }, + { timestamp: makeDate(refDate + 20), used: 27, percent: 27 / 50 }, + ], + memory: [ + { timestamp: makeDate(refDate + 10), used: 51 * 1024 * 1024, percent: 51 / 128 }, + { timestamp: makeDate(refDate + 20), used: 52 * 1024 * 1024, percent: 52 / 128 }, + ], + }, + { + task: 'sidecar', + reservedCPU: 50, + reservedMemory: 128, + cpu: [ + { timestamp: makeDate(refDate + 100), used: 27, percent: 27 / 50 }, + { timestamp: makeDate(refDate + 200), used: 28, percent: 28 / 50 }, + ], + memory: [ + { timestamp: makeDate(refDate + 100), used: 52 * 1024 * 1024, percent: 52 / 128 }, + { timestamp: makeDate(refDate + 200), used: 53 * 1024 * 1024, percent: 53 / 128 }, + ], + }, + ], + 'tasks represents the tasks for the allocation, each with two frames of stats' + ); + }); + + test('each stat list has maxLength equal to bufferSize', function(assert) { + const allocation = MockAllocation(); + const bufferSize = 10; + const tracker = AllocationStatsTracker.create({ fetch, allocation, bufferSize }); + + for (let i = 1; i <= 20; i++) { + tracker.append(mockFrame(i)); + } -test('each stat list has maxLength equal to bufferSize', function(assert) { - const allocation = MockAllocation(); - const bufferSize = 10; - const tracker = AllocationStatsTracker.create({ fetch, allocation, bufferSize }); - - for (let i = 1; i <= 20; i++) { - tracker.append(mockFrame(i)); - } - - assert.equal( - tracker.get('cpu.length'), - bufferSize, - `20 calls to append, only ${bufferSize} frames in the stats array` - ); - assert.equal( - tracker.get('memory.length'), - bufferSize, - `20 calls to append, only ${bufferSize} frames in the stats array` - ); - - assert.equal( - +tracker.get('cpu')[0].timestamp, - +makeDate(refDate + 11000), - 'Old frames are removed in favor of newer ones' - ); - assert.equal( - +tracker.get('memory')[0].timestamp, - +makeDate(refDate + 11000), - 'Old frames are removed in favor of newer ones' - ); - - tracker.get('tasks').forEach(task => { assert.equal( - task.cpu.length, + tracker.get('cpu.length'), bufferSize, `20 calls to append, only ${bufferSize} frames in the stats array` ); assert.equal( - task.memory.length, + tracker.get('memory.length'), bufferSize, `20 calls to append, only ${bufferSize} frames in the stats array` ); - }); - assert.equal( - +tracker.get('tasks').findBy('task', 'service').cpu[0].timestamp, - +makeDate(refDate + 11), - 'Old frames are removed in favor of newer ones' - ); - assert.equal( - +tracker.get('tasks').findBy('task', 'service').memory[0].timestamp, - +makeDate(refDate + 11), - 'Old frames are removed in favor of newer ones' - ); - - assert.equal( - +tracker.get('tasks').findBy('task', 'log-shipper').cpu[0].timestamp, - +makeDate(refDate + 110), - 'Old frames are removed in favor of newer ones' - ); - assert.equal( - +tracker.get('tasks').findBy('task', 'log-shipper').memory[0].timestamp, - +makeDate(refDate + 110), - 'Old frames are removed in favor of newer ones' - ); - - assert.equal( - +tracker.get('tasks').findBy('task', 'sidecar').cpu[0].timestamp, - +makeDate(refDate + 1100), - 'Old frames are removed in favor of newer ones' - ); - assert.equal( - +tracker.get('tasks').findBy('task', 'sidecar').memory[0].timestamp, - +makeDate(refDate + 1100), - 'Old frames are removed in favor of newer ones' - ); -}); + assert.equal( + +tracker.get('cpu')[0].timestamp, + +makeDate(refDate + 11000), + 'Old frames are removed in favor of newer ones' + ); + assert.equal( + +tracker.get('memory')[0].timestamp, + +makeDate(refDate + 11000), + 'Old frames are removed in favor of newer ones' + ); -test('the stats computed property macro constructs an AllocationStatsTracker based on an allocationProp and a fetch definition', function(assert) { - const allocation = MockAllocation(); - const fetchSpy = sinon.spy(); + tracker.get('tasks').forEach(task => { + assert.equal( + task.cpu.length, + bufferSize, + `20 calls to append, only ${bufferSize} frames in the stats array` + ); + assert.equal( + task.memory.length, + bufferSize, + `20 calls to append, only ${bufferSize} frames in the stats array` + ); + }); - const SomeClass = EmberObject.extend({ - stats: stats('alloc', function() { - return () => fetchSpy(this); - }), - }); - const someObject = SomeClass.create({ - alloc: allocation, + assert.equal( + +tracker.get('tasks').findBy('task', 'service').cpu[0].timestamp, + +makeDate(refDate + 11), + 'Old frames are removed in favor of newer ones' + ); + assert.equal( + +tracker.get('tasks').findBy('task', 'service').memory[0].timestamp, + +makeDate(refDate + 11), + 'Old frames are removed in favor of newer ones' + ); + + assert.equal( + +tracker.get('tasks').findBy('task', 'log-shipper').cpu[0].timestamp, + +makeDate(refDate + 110), + 'Old frames are removed in favor of newer ones' + ); + assert.equal( + +tracker.get('tasks').findBy('task', 'log-shipper').memory[0].timestamp, + +makeDate(refDate + 110), + 'Old frames are removed in favor of newer ones' + ); + + assert.equal( + +tracker.get('tasks').findBy('task', 'sidecar').cpu[0].timestamp, + +makeDate(refDate + 1100), + 'Old frames are removed in favor of newer ones' + ); + assert.equal( + +tracker.get('tasks').findBy('task', 'sidecar').memory[0].timestamp, + +makeDate(refDate + 1100), + 'Old frames are removed in favor of newer ones' + ); }); - assert.equal( - someObject.get('stats.url'), - `/v1/client/allocation/${allocation.id}/stats`, - 'stats computed property macro creates an AllocationStatsTracker' - ); + test('the stats computed property macro constructs an AllocationStatsTracker based on an allocationProp and a fetch definition', function(assert) { + const allocation = MockAllocation(); + const fetchSpy = sinon.spy(); - someObject.get('stats').fetch(); + const SomeClass = EmberObject.extend({ + stats: stats('alloc', function() { + return () => fetchSpy(this); + }), + }); + const someObject = SomeClass.create({ + alloc: allocation, + }); - assert.ok( - fetchSpy.calledWith(someObject), - 'the fetch factory passed into the macro gets called to assign a bound version of fetch to the AllocationStatsTracker instance' - ); -}); + assert.equal( + someObject.get('stats.url'), + `/v1/client/allocation/${allocation.id}/stats`, + 'stats computed property macro creates an AllocationStatsTracker' + ); -test('changing the value of the allocationProp constructs a new AllocationStatsTracker', function(assert) { - const alloc1 = MockAllocation(); - const alloc2 = MockAllocation(); - const SomeClass = EmberObject.extend({ - stats: stats('alloc', () => fetch), - }); + someObject.get('stats').fetch(); - const someObject = SomeClass.create({ - alloc: alloc1, + assert.ok( + fetchSpy.calledWith(someObject), + 'the fetch factory passed into the macro gets called to assign a bound version of fetch to the AllocationStatsTracker instance' + ); }); - const stats1 = someObject.get('stats'); + test('changing the value of the allocationProp constructs a new AllocationStatsTracker', function(assert) { + const alloc1 = MockAllocation(); + const alloc2 = MockAllocation(); + const SomeClass = EmberObject.extend({ + stats: stats('alloc', () => fetch), + }); - someObject.set('alloc', alloc2); - const stats2 = someObject.get('stats'); + const someObject = SomeClass.create({ + alloc: alloc1, + }); - assert.notOk( - stats1 === stats2, - 'Changing the value of alloc results in creating a new AllocationStatsTracker instance' - ); -}); + const stats1 = someObject.get('stats'); -statsTrackerFrameMissingBehavior({ - resourceName: 'allocation', - ResourceConstructor: MockAllocation, - TrackerConstructor: AllocationStatsTracker, - mockFrame, - compileResources(frame) { - const timestamp = makeDate(frame.Timestamp); - const cpu = frame.ResourceUsage.CpuStats.TotalTicks; - const memory = frame.ResourceUsage.MemoryStats.RSS; - return [ - { - timestamp, - used: cpu, - percent: cpu / 200, - }, - { - timestamp, - used: memory, - percent: memory / 1024 / 1024 / 512, - }, - ]; - }, + someObject.set('alloc', alloc2); + const stats2 = someObject.get('stats'); + + assert.notOk( + stats1 === stats2, + 'Changing the value of alloc results in creating a new AllocationStatsTracker instance' + ); + }); + + statsTrackerFrameMissingBehavior({ + resourceName: 'allocation', + ResourceConstructor: MockAllocation, + TrackerConstructor: AllocationStatsTracker, + mockFrame, + compileResources(frame) { + const timestamp = makeDate(frame.Timestamp); + const cpu = frame.ResourceUsage.CpuStats.TotalTicks; + const memory = frame.ResourceUsage.MemoryStats.RSS; + return [ + { + timestamp, + used: cpu, + percent: cpu / 200, + }, + { + timestamp, + used: memory, + percent: memory / 1024 / 1024 / 512, + }, + ]; + }, + }); }); diff --git a/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js b/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js index 679143848c1..80c6adc30a8 100644 --- a/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js +++ b/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js @@ -1,7 +1,7 @@ import { resolve } from 'rsvp'; -import wait from 'ember-test-helpers/wait'; -import { test } from 'ember-qunit'; +import { test } from 'qunit'; import sinon from 'sinon'; +import { settled } from '@ember/test-helpers'; const MockResponse = json => ({ ok: true, @@ -31,14 +31,14 @@ export default function statsTrackerFrameMissing({ tracker.get('poll').perform(); - return wait() + return settled() .then(() => { assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'One frame of cpu'); assert.deepEqual(tracker.get('memory'), [compiledMemory], 'One frame of memory'); shouldFail = true; tracker.get('poll').perform(); - return wait(); + return settled(); }) .then(() => { assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'Still one frame of cpu'); @@ -47,7 +47,7 @@ export default function statsTrackerFrameMissing({ shouldFail = false; tracker.get('poll').perform(); - return wait(); + return settled(); }) .then(() => { assert.deepEqual(tracker.get('cpu'), [compiledCPU, compiledCPU], 'Still one frame of cpu'); @@ -74,20 +74,20 @@ export default function statsTrackerFrameMissing({ }); tracker.get('poll').perform(); - return wait() + return settled() .then(() => { assert.equal(tracker.get('frameMisses'), 1, 'Tick misses'); assert.notOk(tracker.pause.called, 'Pause not called yet'); tracker.get('poll').perform(); - return wait(); + return settled(); }) .then(() => { assert.equal(tracker.get('frameMisses'), 2, 'Tick misses'); assert.notOk(tracker.pause.called, 'Pause still not called yet'); tracker.get('poll').perform(); - return wait(); + return settled(); }) .then(() => { assert.equal(tracker.get('frameMisses'), 0, 'Misses reset'); diff --git a/ui/tests/unit/utils/format-duration-test.js b/ui/tests/unit/utils/format-duration-test.js index 69cb02b3225..9a3e49230cc 100644 --- a/ui/tests/unit/utils/format-duration-test.js +++ b/ui/tests/unit/utils/format-duration-test.js @@ -1,35 +1,35 @@ -import { module, test } from 'ember-qunit'; +import { module, test } from 'qunit'; import formatDuration from 'nomad-ui/utils/format-duration'; -module('Unit | Util | formatDuration'); +module('Unit | Util | formatDuration', function() { + test('When all units have values, all units are displayed', function(assert) { + const expectation = '39 years 1 month 13 days 23h 31m 30s 987ms 654µs 400ns'; + assert.equal(formatDuration(1234567890987654321), expectation, expectation); + }); -test('When all units have values, all units are displayed', function(assert) { - const expectation = '39 years 1 month 13 days 23h 31m 30s 987ms 654µs 400ns'; - assert.equal(formatDuration(1234567890987654321), expectation, expectation); -}); + test('Any unit without values gets dropped from the display', function(assert) { + const expectation = '14 days 6h 56m 890ms 980µs'; + assert.equal(formatDuration(1234560890980000), expectation, expectation); + }); -test('Any unit without values gets dropped from the display', function(assert) { - const expectation = '14 days 6h 56m 890ms 980µs'; - assert.equal(formatDuration(1234560890980000), expectation, expectation); -}); + test('The units option allows for units coarser than nanoseconds', function(assert) { + const expectation1 = '1s 200ms'; + const expectation2 = '20m'; + const expectation3 = '1 month 1 day'; + assert.equal(formatDuration(1200, 'ms'), expectation1, expectation1); + assert.equal(formatDuration(1200, 's'), expectation2, expectation2); + assert.equal(formatDuration(32, 'd'), expectation3, expectation3); + }); -test('The units option allows for units coarser than nanoseconds', function(assert) { - const expectation1 = '1s 200ms'; - const expectation2 = '20m'; - const expectation3 = '1 month 1 day'; - assert.equal(formatDuration(1200, 'ms'), expectation1, expectation1); - assert.equal(formatDuration(1200, 's'), expectation2, expectation2); - assert.equal(formatDuration(32, 'd'), expectation3, expectation3); -}); - -test('When duration is 0, 0 is shown in terms of the units provided to the function', function(assert) { - assert.equal(formatDuration(0), '0ns', 'formatDuration(0) -> 0ns'); - assert.equal(formatDuration(0, 'year'), '0 years', 'formatDuration(0, "year") -> 0 years'); -}); + test('When duration is 0, 0 is shown in terms of the units provided to the function', function(assert) { + assert.equal(formatDuration(0), '0ns', 'formatDuration(0) -> 0ns'); + assert.equal(formatDuration(0, 'year'), '0 years', 'formatDuration(0, "year") -> 0 years'); + }); -test('The longForm option expands suffixes to words', function(assert) { - const expectation1 = '3 seconds 20ms'; - const expectation2 = '5 hours 59 minutes'; - assert.equal(formatDuration(3020, 'ms', true), expectation1, expectation1); - assert.equal(formatDuration(60 * 5 + 59, 'm', true), expectation2, expectation2); + test('The longForm option expands suffixes to words', function(assert) { + const expectation1 = '3 seconds 20ms'; + const expectation2 = '5 hours 59 minutes'; + assert.equal(formatDuration(3020, 'ms', true), expectation1, expectation1); + assert.equal(formatDuration(60 * 5 + 59, 'm', true), expectation2, expectation2); + }); }); diff --git a/ui/tests/unit/utils/log-test.js b/ui/tests/unit/utils/log-test.js index 94faed82225..6de9b36bb33 100644 --- a/ui/tests/unit/utils/log-test.js +++ b/ui/tests/unit/utils/log-test.js @@ -2,10 +2,11 @@ import EmberObject from '@ember/object'; import RSVP from 'rsvp'; import { run } from '@ember/runloop'; import sinon from 'sinon'; -import wait from 'ember-test-helpers/wait'; -import { module, test } from 'ember-qunit'; +import { module, test } from 'qunit'; import _Log from 'nomad-ui/utils/classes/log'; +import { settled } from '@ember/test-helpers'; + let startSpy, stopSpy, initSpy, fetchSpy; const MockStreamer = EmberObject.extend({ @@ -42,114 +43,114 @@ const Log = _Log.extend({ }, }); -module('Unit | Util | Log', { - beforeEach() { +module('Unit | Util | Log', function(hooks) { + hooks.beforeEach(function() { initSpy = sinon.spy(); startSpy = sinon.spy(); stopSpy = sinon.spy(); fetchSpy = sinon.spy(); - }, -}); + }); -const makeMocks = output => ({ - url: '/test-url/', - params: { - a: 'param', - another: 'one', - }, - logFetch: function() { - fetchSpy(...arguments); - return RSVP.Promise.resolve({ - text() { - return output; - }, - }); - }, -}); + const makeMocks = output => ({ + url: '/test-url/', + params: { + a: 'param', + another: 'one', + }, + logFetch: function() { + fetchSpy(...arguments); + return RSVP.Promise.resolve({ + text() { + return output; + }, + }); + }, + }); -test('logStreamer is created on init', function(assert) { - const log = Log.create(makeMocks('')); + test('logStreamer is created on init', function(assert) { + const log = Log.create(makeMocks('')); - assert.ok(log.get('logStreamer'), 'logStreamer property is defined'); - assert.ok(initSpy.calledOnce, 'logStreamer init was called'); -}); + assert.ok(log.get('logStreamer'), 'logStreamer property is defined'); + assert.ok(initSpy.calledOnce, 'logStreamer init was called'); + }); -test('gotoHead builds the correct URL', function(assert) { - const mocks = makeMocks(''); - const expectedUrl = `${mocks.url}?a=param&another=one&offset=0&origin=start&plain=true`; - const log = Log.create(mocks); + test('gotoHead builds the correct URL', function(assert) { + const mocks = makeMocks(''); + const expectedUrl = `${mocks.url}?a=param&another=one&offset=0&origin=start&plain=true`; + const log = Log.create(mocks); - run(() => { - log.get('gotoHead').perform(); - assert.ok(fetchSpy.calledWith(expectedUrl), `gotoHead URL was ${expectedUrl}`); + run(() => { + log.get('gotoHead').perform(); + assert.ok(fetchSpy.calledWith(expectedUrl), `gotoHead URL was ${expectedUrl}`); + }); }); -}); -test('When gotoHead returns too large of a log, the log is truncated', function(assert) { - const longLog = Array(50001) - .fill('a') - .join(''); - const truncationMessage = - '\n\n---------- TRUNCATED: Click "tail" to view the bottom of the log ----------'; + test('When gotoHead returns too large of a log, the log is truncated', function(assert) { + const longLog = Array(50001) + .fill('a') + .join(''); + const truncationMessage = + '\n\n---------- TRUNCATED: Click "tail" to view the bottom of the log ----------'; - const mocks = makeMocks(longLog); - const log = Log.create(mocks); + const mocks = makeMocks(longLog); + const log = Log.create(mocks); - run(() => { - log.get('gotoHead').perform(); - }); + run(() => { + log.get('gotoHead').perform(); + }); - return wait().then(() => { - assert.ok(log.get('output').endsWith(truncationMessage), 'Truncation message is shown'); - assert.equal( - log.get('output').length, - 50000 + truncationMessage.length, - 'Output is truncated the appropriate amount' - ); + return settled().then(() => { + assert.ok(log.get('output').endsWith(truncationMessage), 'Truncation message is shown'); + assert.equal( + log.get('output').length, + 50000 + truncationMessage.length, + 'Output is truncated the appropriate amount' + ); + }); }); -}); -test('gotoTail builds the correct URL', function(assert) { - const mocks = makeMocks(''); - const expectedUrl = `${mocks.url}?a=param&another=one&offset=50000&origin=end&plain=true`; - const log = Log.create(mocks); + test('gotoTail builds the correct URL', function(assert) { + const mocks = makeMocks(''); + const expectedUrl = `${mocks.url}?a=param&another=one&offset=50000&origin=end&plain=true`; + const log = Log.create(mocks); - run(() => { - log.get('gotoTail').perform(); - assert.ok(fetchSpy.calledWith(expectedUrl), `gotoTail URL was ${expectedUrl}`); + run(() => { + log.get('gotoTail').perform(); + assert.ok(fetchSpy.calledWith(expectedUrl), `gotoTail URL was ${expectedUrl}`); + }); }); -}); -test('startStreaming starts the log streamer', function(assert) { - const log = Log.create(makeMocks('')); + test('startStreaming starts the log streamer', function(assert) { + const log = Log.create(makeMocks('')); - log.startStreaming(); - assert.ok(startSpy.calledOnce, 'Streaming started'); - assert.equal(log.get('logPointer'), 'tail', 'Streaming points the log to the tail'); -}); + log.startStreaming(); + assert.ok(startSpy.calledOnce, 'Streaming started'); + assert.equal(log.get('logPointer'), 'tail', 'Streaming points the log to the tail'); + }); -test('When the log streamer calls `write`, the output is appended', function(assert) { - const log = Log.create(makeMocks('')); - const chunk1 = 'Hello'; - const chunk2 = ' World'; - const chunk3 = '\n\nEOF'; + test('When the log streamer calls `write`, the output is appended', function(assert) { + const log = Log.create(makeMocks('')); + const chunk1 = 'Hello'; + const chunk2 = ' World'; + const chunk3 = '\n\nEOF'; - log.startStreaming(); - assert.equal(log.get('output'), '', 'No output yet'); + log.startStreaming(); + assert.equal(log.get('output'), '', 'No output yet'); - log.get('logStreamer').step(chunk1); - assert.equal(log.get('output'), chunk1, 'First chunk written'); + log.get('logStreamer').step(chunk1); + assert.equal(log.get('output'), chunk1, 'First chunk written'); - log.get('logStreamer').step(chunk2); - assert.equal(log.get('output'), chunk1 + chunk2, 'Second chunk written'); + log.get('logStreamer').step(chunk2); + assert.equal(log.get('output'), chunk1 + chunk2, 'Second chunk written'); - log.get('logStreamer').step(chunk3); - assert.equal(log.get('output'), chunk1 + chunk2 + chunk3, 'Third chunk written'); -}); + log.get('logStreamer').step(chunk3); + assert.equal(log.get('output'), chunk1 + chunk2 + chunk3, 'Third chunk written'); + }); -test('stop stops the log streamer', function(assert) { - const log = Log.create(makeMocks('')); + test('stop stops the log streamer', function(assert) { + const log = Log.create(makeMocks('')); - log.stop(); - assert.ok(stopSpy.calledOnce, 'Streaming stopped'); + log.stop(); + assert.ok(stopSpy.calledOnce, 'Streaming stopped'); + }); }); diff --git a/ui/tests/unit/utils/node-stats-tracker-test.js b/ui/tests/unit/utils/node-stats-tracker-test.js index cfcf1426dda..a4cb89d3378 100644 --- a/ui/tests/unit/utils/node-stats-tracker-test.js +++ b/ui/tests/unit/utils/node-stats-tracker-test.js @@ -1,246 +1,247 @@ import EmberObject from '@ember/object'; import { assign } from '@ember/polyfills'; -import wait from 'ember-test-helpers/wait'; -import { module, test } from 'ember-qunit'; +import { module, test } from 'qunit'; import sinon from 'sinon'; import Pretender from 'pretender'; import NodeStatsTracker, { stats } from 'nomad-ui/utils/classes/node-stats-tracker'; import fetch from 'nomad-ui/utils/fetch'; import statsTrackerFrameMissingBehavior from './behaviors/stats-tracker-frame-missing'; -module('Unit | Util | NodeStatsTracker'); +import { settled } from '@ember/test-helpers'; -const refDate = Date.now() * 1000000; -const makeDate = ts => new Date(ts / 1000000); +module('Unit | Util | NodeStatsTracker', function() { + const refDate = Date.now() * 1000000; + const makeDate = ts => new Date(ts / 1000000); -const MockNode = overrides => - assign( - { - id: 'some-identifier', - resources: { - cpu: 2000, - memory: 4096, + const MockNode = overrides => + assign( + { + id: 'some-identifier', + resources: { + cpu: 2000, + memory: 4096, + }, }, - }, - overrides - ); - -const mockFrame = step => ({ - CPUTicksConsumed: step + 1000, - Memory: { - Used: (step + 2048) * 1024 * 1024, - }, - Timestamp: refDate + step, -}); + overrides + ); -test('the NodeStatsTracker constructor expects a fetch definition and a node', function(assert) { - const tracker = NodeStatsTracker.create(); - assert.throws( - () => { - tracker.fetch(); + const mockFrame = step => ({ + CPUTicksConsumed: step + 1000, + Memory: { + Used: (step + 2048) * 1024 * 1024, }, - /StatsTrackers need a fetch method/, - 'Polling does not work without a fetch method provided' - ); -}); + Timestamp: refDate + step, + }); -test('the url property is computed based off the node id', function(assert) { - const node = MockNode(); - const tracker = NodeStatsTracker.create({ fetch, node }); + test('the NodeStatsTracker constructor expects a fetch definition and a node', function(assert) { + const tracker = NodeStatsTracker.create(); + assert.throws( + () => { + tracker.fetch(); + }, + /StatsTrackers need a fetch method/, + 'Polling does not work without a fetch method provided' + ); + }); - assert.equal( - tracker.get('url'), - `/v1/client/stats?node_id=${node.id}`, - 'Url is derived from the node id' - ); -}); + test('the url property is computed based off the node id', function(assert) { + const node = MockNode(); + const tracker = NodeStatsTracker.create({ fetch, node }); -test('reservedCPU and reservedMemory properties come from the node', function(assert) { - const node = MockNode(); - const tracker = NodeStatsTracker.create({ fetch, node }); + assert.equal( + tracker.get('url'), + `/v1/client/stats?node_id=${node.id}`, + 'Url is derived from the node id' + ); + }); - assert.equal(tracker.get('reservedCPU'), node.resources.cpu, 'reservedCPU comes from the node'); - assert.equal( - tracker.get('reservedMemory'), - node.resources.memory, - 'reservedMemory comes from the node' - ); -}); + test('reservedCPU and reservedMemory properties come from the node', function(assert) { + const node = MockNode(); + const tracker = NodeStatsTracker.create({ fetch, node }); -test('poll results in requesting the url and calling append with the resulting JSON', function(assert) { - const node = MockNode(); - const tracker = NodeStatsTracker.create({ fetch, node, append: sinon.spy() }); - const mockFrame = { - Some: { - data: ['goes', 'here'], - twelve: 12, - }, - }; - - const server = new Pretender(function() { - this.get('/v1/client/stats', () => [200, {}, JSON.stringify(mockFrame)]); + assert.equal(tracker.get('reservedCPU'), node.resources.cpu, 'reservedCPU comes from the node'); + assert.equal( + tracker.get('reservedMemory'), + node.resources.memory, + 'reservedMemory comes from the node' + ); }); - tracker.get('poll').perform(); + test('poll results in requesting the url and calling append with the resulting JSON', function(assert) { + const node = MockNode(); + const tracker = NodeStatsTracker.create({ fetch, node, append: sinon.spy() }); + const mockFrame = { + Some: { + data: ['goes', 'here'], + twelve: 12, + }, + }; - assert.equal(server.handledRequests.length, 1, 'Only one request was made'); - assert.equal( - server.handledRequests[0].url, - `/v1/client/stats?node_id=${node.id}`, - 'The correct URL was requested' - ); + const server = new Pretender(function() { + this.get('/v1/client/stats', () => [200, {}, JSON.stringify(mockFrame)]); + }); - return wait().then(() => { - assert.ok( - tracker.append.calledWith(mockFrame), - 'The JSON response was passed into append as a POJO' + tracker.get('poll').perform(); + + assert.equal(server.handledRequests.length, 1, 'Only one request was made'); + assert.equal( + server.handledRequests[0].url, + `/v1/client/stats?node_id=${node.id}`, + 'The correct URL was requested' ); - server.shutdown(); + return settled().then(() => { + assert.ok( + tracker.append.calledWith(mockFrame), + 'The JSON response was passed into append as a POJO' + ); + + server.shutdown(); + }); }); -}); -test('append appropriately maps a data frame to the tracked stats for cpu and memory for the node', function(assert) { - const node = MockNode(); - const tracker = NodeStatsTracker.create({ fetch, node }); - - assert.deepEqual(tracker.get('cpu'), [], 'No tracked cpu yet'); - assert.deepEqual(tracker.get('memory'), [], 'No tracked memory yet'); - - tracker.append(mockFrame(1)); - - assert.deepEqual( - tracker.get('cpu'), - [{ timestamp: makeDate(refDate + 1), used: 1001, percent: 1001 / 2000 }], - 'One frame of cpu' - ); - - assert.deepEqual( - tracker.get('memory'), - [{ timestamp: makeDate(refDate + 1), used: 2049 * 1024 * 1024, percent: 2049 / 4096 }], - 'One frame of memory' - ); - - tracker.append(mockFrame(2)); - - assert.deepEqual( - tracker.get('cpu'), - [ - { timestamp: makeDate(refDate + 1), used: 1001, percent: 1001 / 2000 }, - { timestamp: makeDate(refDate + 2), used: 1002, percent: 1002 / 2000 }, - ], - 'Two frames of cpu' - ); - - assert.deepEqual( - tracker.get('memory'), - [ - { timestamp: makeDate(refDate + 1), used: 2049 * 1024 * 1024, percent: 2049 / 4096 }, - { timestamp: makeDate(refDate + 2), used: 2050 * 1024 * 1024, percent: 2050 / 4096 }, - ], - 'Two frames of memory' - ); -}); + test('append appropriately maps a data frame to the tracked stats for cpu and memory for the node', function(assert) { + const node = MockNode(); + const tracker = NodeStatsTracker.create({ fetch, node }); -test('each stat list has maxLength equal to bufferSize', function(assert) { - const node = MockNode(); - const bufferSize = 10; - const tracker = NodeStatsTracker.create({ fetch, node, bufferSize }); - - for (let i = 1; i <= 20; i++) { - tracker.append(mockFrame(i)); - } - - assert.equal( - tracker.get('cpu.length'), - bufferSize, - `20 calls to append, only ${bufferSize} frames in the stats array` - ); - assert.equal( - tracker.get('memory.length'), - bufferSize, - `20 calls to append, only ${bufferSize} frames in the stats array` - ); - - assert.equal( - +tracker.get('cpu')[0].timestamp, - +makeDate(refDate + 11), - 'Old frames are removed in favor of newer ones' - ); - assert.equal( - +tracker.get('memory')[0].timestamp, - +makeDate(refDate + 11), - 'Old frames are removed in favor of newer ones' - ); -}); + assert.deepEqual(tracker.get('cpu'), [], 'No tracked cpu yet'); + assert.deepEqual(tracker.get('memory'), [], 'No tracked memory yet'); -test('the stats computed property macro constructs a NodeStatsTracker based on a nodeProp and a fetch definition', function(assert) { - const node = MockNode(); - const fetchSpy = sinon.spy(); + tracker.append(mockFrame(1)); - const SomeClass = EmberObject.extend({ - stats: stats('theNode', function() { - return () => fetchSpy(this); - }), - }); - const someObject = SomeClass.create({ - theNode: node, + assert.deepEqual( + tracker.get('cpu'), + [{ timestamp: makeDate(refDate + 1), used: 1001, percent: 1001 / 2000 }], + 'One frame of cpu' + ); + + assert.deepEqual( + tracker.get('memory'), + [{ timestamp: makeDate(refDate + 1), used: 2049 * 1024 * 1024, percent: 2049 / 4096 }], + 'One frame of memory' + ); + + tracker.append(mockFrame(2)); + + assert.deepEqual( + tracker.get('cpu'), + [ + { timestamp: makeDate(refDate + 1), used: 1001, percent: 1001 / 2000 }, + { timestamp: makeDate(refDate + 2), used: 1002, percent: 1002 / 2000 }, + ], + 'Two frames of cpu' + ); + + assert.deepEqual( + tracker.get('memory'), + [ + { timestamp: makeDate(refDate + 1), used: 2049 * 1024 * 1024, percent: 2049 / 4096 }, + { timestamp: makeDate(refDate + 2), used: 2050 * 1024 * 1024, percent: 2050 / 4096 }, + ], + 'Two frames of memory' + ); }); - assert.equal( - someObject.get('stats.url'), - `/v1/client/stats?node_id=${node.id}`, - 'stats computed property macro creates a NodeStatsTracker' - ); + test('each stat list has maxLength equal to bufferSize', function(assert) { + const node = MockNode(); + const bufferSize = 10; + const tracker = NodeStatsTracker.create({ fetch, node, bufferSize }); - someObject.get('stats').fetch(); + for (let i = 1; i <= 20; i++) { + tracker.append(mockFrame(i)); + } - assert.ok( - fetchSpy.calledWith(someObject), - 'the fetch factory passed into the macro gets called to assign a bound version of fetch to the NodeStatsTracker instance' - ); -}); + assert.equal( + tracker.get('cpu.length'), + bufferSize, + `20 calls to append, only ${bufferSize} frames in the stats array` + ); + assert.equal( + tracker.get('memory.length'), + bufferSize, + `20 calls to append, only ${bufferSize} frames in the stats array` + ); -test('changing the value of the nodeProp constructs a new NodeStatsTracker', function(assert) { - const node1 = MockNode(); - const node2 = MockNode(); - const SomeClass = EmberObject.extend({ - stats: stats('theNode', () => fetch), + assert.equal( + +tracker.get('cpu')[0].timestamp, + +makeDate(refDate + 11), + 'Old frames are removed in favor of newer ones' + ); + assert.equal( + +tracker.get('memory')[0].timestamp, + +makeDate(refDate + 11), + 'Old frames are removed in favor of newer ones' + ); }); - const someObject = SomeClass.create({ - theNode: node1, + test('the stats computed property macro constructs a NodeStatsTracker based on a nodeProp and a fetch definition', function(assert) { + const node = MockNode(); + const fetchSpy = sinon.spy(); + + const SomeClass = EmberObject.extend({ + stats: stats('theNode', function() { + return () => fetchSpy(this); + }), + }); + const someObject = SomeClass.create({ + theNode: node, + }); + + assert.equal( + someObject.get('stats.url'), + `/v1/client/stats?node_id=${node.id}`, + 'stats computed property macro creates a NodeStatsTracker' + ); + + someObject.get('stats').fetch(); + + assert.ok( + fetchSpy.calledWith(someObject), + 'the fetch factory passed into the macro gets called to assign a bound version of fetch to the NodeStatsTracker instance' + ); }); - const stats1 = someObject.get('stats'); + test('changing the value of the nodeProp constructs a new NodeStatsTracker', function(assert) { + const node1 = MockNode(); + const node2 = MockNode(); + const SomeClass = EmberObject.extend({ + stats: stats('theNode', () => fetch), + }); - someObject.set('theNode', node2); - const stats2 = someObject.get('stats'); + const someObject = SomeClass.create({ + theNode: node1, + }); - assert.notOk( - stats1 === stats2, - 'Changing the value of the node results in creating a new NodeStatsTracker instance' - ); -}); + const stats1 = someObject.get('stats'); -statsTrackerFrameMissingBehavior({ - resourceName: 'node', - ResourceConstructor: MockNode, - TrackerConstructor: NodeStatsTracker, - mockFrame, - compileResources(frame) { - const timestamp = makeDate(frame.Timestamp); - return [ - { - timestamp, - used: frame.CPUTicksConsumed, - percent: frame.CPUTicksConsumed / 2000, - }, - { - timestamp, - used: frame.Memory.Used, - percent: frame.Memory.Used / 1024 / 1024 / 4096, - }, - ]; - }, + someObject.set('theNode', node2); + const stats2 = someObject.get('stats'); + + assert.notOk( + stats1 === stats2, + 'Changing the value of the node results in creating a new NodeStatsTracker instance' + ); + }); + + statsTrackerFrameMissingBehavior({ + resourceName: 'node', + ResourceConstructor: MockNode, + TrackerConstructor: NodeStatsTracker, + mockFrame, + compileResources(frame) { + const timestamp = makeDate(frame.Timestamp); + return [ + { + timestamp, + used: frame.CPUTicksConsumed, + percent: frame.CPUTicksConsumed / 2000, + }, + { + timestamp, + used: frame.Memory.Used, + percent: frame.Memory.Used / 1024 / 1024 / 4096, + }, + ]; + }, + }); }); diff --git a/ui/tests/unit/utils/rolling-array-test.js b/ui/tests/unit/utils/rolling-array-test.js index dc9870a05aa..f3af28cb427 100644 --- a/ui/tests/unit/utils/rolling-array-test.js +++ b/ui/tests/unit/utils/rolling-array-test.js @@ -1,92 +1,92 @@ import { isArray } from '@ember/array'; -import { module, test } from 'ember-qunit'; +import { module, test } from 'qunit'; import RollingArray from 'nomad-ui/utils/classes/rolling-array'; -module('Unit | Util | RollingArray'); +module('Unit | Util | RollingArray', function() { + test('has a maxLength property that gets set in the constructor', function(assert) { + const array = RollingArray(10, 'a', 'b', 'c'); + assert.equal(array.maxLength, 10, 'maxLength is set in the constructor'); + assert.deepEqual( + array, + ['a', 'b', 'c'], + 'additional arguments to the constructor become elements' + ); + }); -test('has a maxLength property that gets set in the constructor', function(assert) { - const array = RollingArray(10, 'a', 'b', 'c'); - assert.equal(array.maxLength, 10, 'maxLength is set in the constructor'); - assert.deepEqual( - array, - ['a', 'b', 'c'], - 'additional arguments to the constructor become elements' - ); -}); - -test('push works like Array#push', function(assert) { - const array = RollingArray(10); - const pushReturn = array.push('a'); - assert.equal( - pushReturn, - array.length, - 'the return value from push is equal to the return value of Array#push' - ); - assert.equal(array[0], 'a', 'the arguments passed to push are appended to the array'); + test('push works like Array#push', function(assert) { + const array = RollingArray(10); + const pushReturn = array.push('a'); + assert.equal( + pushReturn, + array.length, + 'the return value from push is equal to the return value of Array#push' + ); + assert.equal(array[0], 'a', 'the arguments passed to push are appended to the array'); - array.push('b', 'c', 'd'); - assert.deepEqual( - array, - ['a', 'b', 'c', 'd'], - 'the elements already in the array are left in tact and new elements are appended' - ); -}); + array.push('b', 'c', 'd'); + assert.deepEqual( + array, + ['a', 'b', 'c', 'd'], + 'the elements already in the array are left in tact and new elements are appended' + ); + }); -test('when pushing past maxLength, items are removed from the head of the array', function(assert) { - const array = RollingArray(3); - const pushReturn = array.push(1, 2, 3, 4); - assert.deepEqual( - array, - [2, 3, 4], - 'The first argument to push is not in the array, but the following three are' - ); - assert.equal( - pushReturn, - array.length, - 'The return value of push is still the array length despite more arguments than possible were provided to push' - ); -}); + test('when pushing past maxLength, items are removed from the head of the array', function(assert) { + const array = RollingArray(3); + const pushReturn = array.push(1, 2, 3, 4); + assert.deepEqual( + array, + [2, 3, 4], + 'The first argument to push is not in the array, but the following three are' + ); + assert.equal( + pushReturn, + array.length, + 'The return value of push is still the array length despite more arguments than possible were provided to push' + ); + }); -test('when splicing past maxLength, items are removed from the head of the array', function(assert) { - const array = RollingArray(3, 'a', 'b', 'c'); + test('when splicing past maxLength, items are removed from the head of the array', function(assert) { + const array = RollingArray(3, 'a', 'b', 'c'); - array.splice(1, 0, 'z'); - assert.deepEqual( - array, - ['z', 'b', 'c'], - 'The new element is inserted as the second element in the array and the first element is removed due to maxLength restrictions' - ); + array.splice(1, 0, 'z'); + assert.deepEqual( + array, + ['z', 'b', 'c'], + 'The new element is inserted as the second element in the array and the first element is removed due to maxLength restrictions' + ); - array.splice(0, 0, 'pickme'); - assert.deepEqual( - array, - ['z', 'b', 'c'], - 'The new element never makes it into the array since it was added at the head of the array and immediately removed' - ); + array.splice(0, 0, 'pickme'); + assert.deepEqual( + array, + ['z', 'b', 'c'], + 'The new element never makes it into the array since it was added at the head of the array and immediately removed' + ); - array.splice(0, 1, 'pickme'); - assert.deepEqual( - array, - ['pickme', 'b', 'c'], - 'The new element makes it into the array since the previous element at the head of the array is first removed due to the second argument to splice' - ); -}); + array.splice(0, 1, 'pickme'); + assert.deepEqual( + array, + ['pickme', 'b', 'c'], + 'The new element makes it into the array since the previous element at the head of the array is first removed due to the second argument to splice' + ); + }); -test('unshift throws instead of prepending elements', function(assert) { - const array = RollingArray(5); + test('unshift throws instead of prepending elements', function(assert) { + const array = RollingArray(5); - assert.throws( - () => { - array.unshift(1); - }, - /Cannot unshift/, - 'unshift is not supported, but is not undefined' - ); -}); + assert.throws( + () => { + array.unshift(1); + }, + /Cannot unshift/, + 'unshift is not supported, but is not undefined' + ); + }); -test('RollingArray is an instance of Array', function(assert) { - const array = RollingArray(5); - assert.ok(array.constructor === Array, 'The constructor is Array'); - assert.ok(array instanceof Array, 'The instanceof check is true'); - assert.ok(isArray(array), 'The ember isArray helper works'); + test('RollingArray is an instance of Array', function(assert) { + const array = RollingArray(5); + assert.ok(array.constructor === Array, 'The constructor is Array'); + assert.ok(array instanceof Array, 'The instanceof check is true'); + assert.ok(isArray(array), 'The ember isArray helper works'); + }); }); From 0a6e84ebf41fcc09969ed1f59e8d9fcef237a992 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 12 Mar 2019 17:08:16 -0700 Subject: [PATCH 06/46] Ember test-helpers codemod --- ui/tests/acceptance/allocation-detail-test.js | 1 + ui/tests/acceptance/application-errors-test.js | 1 + ui/tests/acceptance/client-detail-test.js | 1 + ui/tests/acceptance/clients-list-test.js | 1 + ui/tests/acceptance/job-allocations-test.js | 1 + ui/tests/acceptance/job-definition-test.js | 1 + ui/tests/acceptance/job-deployments-test.js | 1 + ui/tests/acceptance/job-detail-test.js | 1 + ui/tests/acceptance/job-evaluations-test.js | 1 + ui/tests/acceptance/job-run-test.js | 1 + ui/tests/acceptance/job-versions-test.js | 1 + ui/tests/acceptance/jobs-list-test.js | 1 + ui/tests/acceptance/regions-test.js | 1 + ui/tests/acceptance/server-detail-test.js | 1 + ui/tests/acceptance/servers-list-test.js | 1 + ui/tests/acceptance/task-detail-test.js | 1 + ui/tests/acceptance/task-group-detail-test.js | 1 + ui/tests/acceptance/task-logs-test.js | 1 + 18 files changed, 18 insertions(+) diff --git a/ui/tests/acceptance/allocation-detail-test.js b/ui/tests/acceptance/allocation-detail-test.js index 0dde63a1de6..14d3d99f8fc 100644 --- a/ui/tests/acceptance/allocation-detail-test.js +++ b/ui/tests/acceptance/allocation-detail-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { assign } from '@ember/polyfills'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; diff --git a/ui/tests/acceptance/application-errors-test.js b/ui/tests/acceptance/application-errors-test.js index aefa11449c7..955a5e5cce8 100644 --- a/ui/tests/acceptance/application-errors-test.js +++ b/ui/tests/acceptance/application-errors-test.js @@ -1,3 +1,4 @@ +import { currentURL, visit } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; diff --git a/ui/tests/acceptance/client-detail-test.js b/ui/tests/acceptance/client-detail-test.js index e95c62fcb07..2d9b7fc3369 100644 --- a/ui/tests/acceptance/client-detail-test.js +++ b/ui/tests/acceptance/client-detail-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { assign } from '@ember/polyfills'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; diff --git a/ui/tests/acceptance/clients-list-test.js b/ui/tests/acceptance/clients-list-test.js index ceb6ea2e5ba..a8d8cd0b9dd 100644 --- a/ui/tests/acceptance/clients-list-test.js +++ b/ui/tests/acceptance/clients-list-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; diff --git a/ui/tests/acceptance/job-allocations-test.js b/ui/tests/acceptance/job-allocations-test.js index 652cfd45442..f639a5445f4 100644 --- a/ui/tests/acceptance/job-allocations-test.js +++ b/ui/tests/acceptance/job-allocations-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import Allocations from 'nomad-ui/tests/pages/jobs/job/allocations'; diff --git a/ui/tests/acceptance/job-definition-test.js b/ui/tests/acceptance/job-definition-test.js index 881886c4ee4..9f1e8f4500e 100644 --- a/ui/tests/acceptance/job-definition-test.js +++ b/ui/tests/acceptance/job-definition-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; diff --git a/ui/tests/acceptance/job-deployments-test.js b/ui/tests/acceptance/job-deployments-test.js index 7166cc2b4ef..c7497376117 100644 --- a/ui/tests/acceptance/job-deployments-test.js +++ b/ui/tests/acceptance/job-deployments-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { get } from '@ember/object'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; diff --git a/ui/tests/acceptance/job-detail-test.js b/ui/tests/acceptance/job-detail-test.js index 06525e847bc..b46bc873092 100644 --- a/ui/tests/acceptance/job-detail-test.js +++ b/ui/tests/acceptance/job-detail-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; diff --git a/ui/tests/acceptance/job-evaluations-test.js b/ui/tests/acceptance/job-evaluations-test.js index 8cb7d1fc81a..e746c9a514f 100644 --- a/ui/tests/acceptance/job-evaluations-test.js +++ b/ui/tests/acceptance/job-evaluations-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import Evaluations from 'nomad-ui/tests/pages/jobs/job/evaluations'; diff --git a/ui/tests/acceptance/job-run-test.js b/ui/tests/acceptance/job-run-test.js index a89ca661403..8bdc5656cc4 100644 --- a/ui/tests/acceptance/job-run-test.js +++ b/ui/tests/acceptance/job-run-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { assign } from '@ember/polyfills'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; diff --git a/ui/tests/acceptance/job-versions-test.js b/ui/tests/acceptance/job-versions-test.js index ece4daf62e6..d47ece212d6 100644 --- a/ui/tests/acceptance/job-versions-test.js +++ b/ui/tests/acceptance/job-versions-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import Versions from 'nomad-ui/tests/pages/jobs/job/versions'; diff --git a/ui/tests/acceptance/jobs-list-test.js b/ui/tests/acceptance/jobs-list-test.js index 91ecbae559c..b06499352a8 100644 --- a/ui/tests/acceptance/jobs-list-test.js +++ b/ui/tests/acceptance/jobs-list-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; diff --git a/ui/tests/acceptance/regions-test.js b/ui/tests/acceptance/regions-test.js index 95256966d84..3e6d7a33b56 100644 --- a/ui/tests/acceptance/regions-test.js +++ b/ui/tests/acceptance/regions-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; diff --git a/ui/tests/acceptance/server-detail-test.js b/ui/tests/acceptance/server-detail-test.js index 098c41adc64..3c21ef6eaf5 100644 --- a/ui/tests/acceptance/server-detail-test.js +++ b/ui/tests/acceptance/server-detail-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; diff --git a/ui/tests/acceptance/servers-list-test.js b/ui/tests/acceptance/servers-list-test.js index 7acd79ecea5..8759d992b0d 100644 --- a/ui/tests/acceptance/servers-list-test.js +++ b/ui/tests/acceptance/servers-list-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; diff --git a/ui/tests/acceptance/task-detail-test.js b/ui/tests/acceptance/task-detail-test.js index db59ece7ecd..0aeccb2b6cc 100644 --- a/ui/tests/acceptance/task-detail-test.js +++ b/ui/tests/acceptance/task-detail-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; diff --git a/ui/tests/acceptance/task-group-detail-test.js b/ui/tests/acceptance/task-group-detail-test.js index 65e8f492674..53a4833c987 100644 --- a/ui/tests/acceptance/task-group-detail-test.js +++ b/ui/tests/acceptance/task-group-detail-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; diff --git a/ui/tests/acceptance/task-logs-test.js b/ui/tests/acceptance/task-logs-test.js index 7286f12fcb0..a0fa39e4230 100644 --- a/ui/tests/acceptance/task-logs-test.js +++ b/ui/tests/acceptance/task-logs-test.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { run } from '@ember/runloop'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; From 9cc9fa84f2fef5b89c9c32ac09e13786719c09d4 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 12 Mar 2019 17:40:39 -0700 Subject: [PATCH 07/46] Fix a bunch of snowflake situations the codemod missed --- ui/.eslintignore | 21 ++++ ui/.eslintrc.js | 13 +-- ui/package.json | 3 +- ui/tests/acceptance/allocation-detail-test.js | 1 - ui/tests/acceptance/client-detail-test.js | 1 - ui/tests/acceptance/clients-list-test.js | 4 +- ui/tests/acceptance/job-definition-test.js | 1 - ui/tests/acceptance/job-detail-test.js | 1 - ui/tests/acceptance/job-run-test.js | 1 - ui/tests/acceptance/jobs-list-test.js | 13 ++- ui/tests/acceptance/namespaces-test.js | 4 +- ui/tests/acceptance/server-detail-test.js | 1 - ui/tests/acceptance/servers-list-test.js | 1 - ui/tests/acceptance/task-detail-test.js | 7 +- ui/tests/acceptance/task-group-detail-test.js | 1 - ui/tests/helpers/module-for-adapter.js | 32 ++---- ui/tests/helpers/module-for-job.js | 99 ++++++++++--------- ui/tests/helpers/module-for-serializer.js | 32 ++---- ui/tests/integration/allocation-row-test.js | 1 - ui/tests/integration/app-breadcrumbs-test.js | 1 - ui/tests/integration/job-editor-test.js | 6 +- .../integration/job-page/parts/body-test.js | 1 - .../job-page/parts/children-test.js | 1 - .../job-page/parts/latest-deployment-test.js | 10 +- .../job-page/parts/placement-failures-test.js | 6 +- .../job-page/parts/summary-test.js | 1 - .../job-page/parts/task-groups-test.js | 1 - .../integration/job-page/periodic-test.js | 1 - ui/tests/integration/job-page/service-test.js | 1 - ui/tests/integration/primary-metric-test.js | 1 - .../reschedule-event-timeline-test.js | 1 - ui/tests/unit/mixins/searchable-test.js | 1 - ui/tests/unit/models/job-test.js | 45 ++++----- ui/tests/unit/services/breadcrumbs-test.js | 5 +- .../services/stats-trackers-registry-test.js | 10 +- ui/tests/unit/services/token-test.js | 5 +- 36 files changed, 164 insertions(+), 170 deletions(-) diff --git a/ui/.eslintignore b/ui/.eslintignore index 2d132050865..4089d9aaff8 100644 --- a/ui/.eslintignore +++ b/ui/.eslintignore @@ -1 +1,22 @@ mirage/ + +# unconventional js +/blueprints/*/files/ +/vendor/ + +# compiled output +/dist/ +/tmp/ + +# dependencies +/bower_components/ +/node_modules/ + +# misc +/coverage/ +!.* + +# ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/package.json.ember-try diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js index 764d6dd4696..9cf8e868a6f 100644 --- a/ui/.eslintrc.js +++ b/ui/.eslintrc.js @@ -30,19 +30,20 @@ module.exports = { // node files { files: [ + '.eslintrc.js', 'ember-cli-build.js', 'testem.js', 'config/**/*.js', - 'lib/*/index.js' + 'lib/*/index.js', ], parserOptions: { sourceType: 'script', - ecmaVersion: 2015 + ecmaVersion: 2015, }, env: { browser: false, - node: true - } - } - ] + node: true, + }, + }, + ], }; diff --git a/ui/package.json b/ui/package.json index 9903a75966c..4c3e055a1a5 100644 --- a/ui/package.json +++ b/ui/package.json @@ -11,7 +11,8 @@ "build": "./node_modules/ember-cli/bin/ember build -prod", "start": "./node_modules/ember-cli/bin/ember server", "test": "./node_modules/ember-cli/bin/ember test", - "precommit": "lint-staged" + "precommit": "lint-staged", + "lint:js": "eslint ." }, "lint-staged": { "'{app,tests,config,lib,mirage}/**/*.js'": ["prettier --write", "git add"], diff --git a/ui/tests/acceptance/allocation-detail-test.js b/ui/tests/acceptance/allocation-detail-test.js index 14d3d99f8fc..e59eed1fe5a 100644 --- a/ui/tests/acceptance/allocation-detail-test.js +++ b/ui/tests/acceptance/allocation-detail-test.js @@ -1,6 +1,5 @@ import { currentURL } from '@ember/test-helpers'; import { assign } from '@ember/polyfills'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import Allocation from 'nomad-ui/tests/pages/allocations/detail'; diff --git a/ui/tests/acceptance/client-detail-test.js b/ui/tests/acceptance/client-detail-test.js index 2d9b7fc3369..5f6f8bf4ddc 100644 --- a/ui/tests/acceptance/client-detail-test.js +++ b/ui/tests/acceptance/client-detail-test.js @@ -1,6 +1,5 @@ import { currentURL } from '@ember/test-helpers'; import { assign } from '@ember/polyfills'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import { formatBytes } from 'nomad-ui/helpers/format-bytes'; diff --git a/ui/tests/acceptance/clients-list-test.js b/ui/tests/acceptance/clients-list-test.js index a8d8cd0b9dd..71408c80a17 100644 --- a/ui/tests/acceptance/clients-list-test.js +++ b/ui/tests/acceptance/clients-list-test.js @@ -1,5 +1,4 @@ import { currentURL } from '@ember/test-helpers'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; @@ -155,7 +154,8 @@ module('Acceptance | clients list', function(hooks) { }, filter: (node, selection) => { if (selection.includes('draining') && !node.drain) return false; - if (selection.includes('ineligible') && node.schedulingEligibility === 'eligible') return false; + if (selection.includes('ineligible') && node.schedulingEligibility === 'eligible') + return false; return true; }, }); diff --git a/ui/tests/acceptance/job-definition-test.js b/ui/tests/acceptance/job-definition-test.js index 9f1e8f4500e..436642f4aca 100644 --- a/ui/tests/acceptance/job-definition-test.js +++ b/ui/tests/acceptance/job-definition-test.js @@ -1,5 +1,4 @@ import { currentURL } from '@ember/test-helpers'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import Definition from 'nomad-ui/tests/pages/jobs/job/definition'; diff --git a/ui/tests/acceptance/job-detail-test.js b/ui/tests/acceptance/job-detail-test.js index b46bc873092..08142b04e28 100644 --- a/ui/tests/acceptance/job-detail-test.js +++ b/ui/tests/acceptance/job-detail-test.js @@ -1,5 +1,4 @@ import { currentURL } from '@ember/test-helpers'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import moduleForJob from 'nomad-ui/tests/helpers/module-for-job'; diff --git a/ui/tests/acceptance/job-run-test.js b/ui/tests/acceptance/job-run-test.js index 8bdc5656cc4..157ac781a88 100644 --- a/ui/tests/acceptance/job-run-test.js +++ b/ui/tests/acceptance/job-run-test.js @@ -1,6 +1,5 @@ import { currentURL } from '@ember/test-helpers'; import { assign } from '@ember/polyfills'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import JobRun from 'nomad-ui/tests/pages/jobs/run'; diff --git a/ui/tests/acceptance/jobs-list-test.js b/ui/tests/acceptance/jobs-list-test.js index b06499352a8..71fee2cc726 100644 --- a/ui/tests/acceptance/jobs-list-test.js +++ b/ui/tests/acceptance/jobs-list-test.js @@ -1,5 +1,4 @@ import { currentURL } from '@ember/test-helpers'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; @@ -171,8 +170,16 @@ module('Acceptance | jobs list', function(hooks) { paramName: 'status', expectedOptions: ['Pending', 'Running', 'Dead'], beforeEach() { - server.createList('job', 2, { status: 'pending', createAllocations: false, childrenCount: 0 }); - server.createList('job', 2, { status: 'running', createAllocations: false, childrenCount: 0 }); + server.createList('job', 2, { + status: 'pending', + createAllocations: false, + childrenCount: 0, + }); + server.createList('job', 2, { + status: 'running', + createAllocations: false, + childrenCount: 0, + }); server.createList('job', 2, { status: 'dead', createAllocations: false, childrenCount: 0 }); JobsList.visit(); }, diff --git a/ui/tests/acceptance/namespaces-test.js b/ui/tests/acceptance/namespaces-test.js index f5ebc5e1ebc..762c4e9d416 100644 --- a/ui/tests/acceptance/namespaces-test.js +++ b/ui/tests/acceptance/namespaces-test.js @@ -83,7 +83,7 @@ module('Acceptance | namespaces (enabled)', function(hooks) { JobsList.visit(); - const requests = server.pretender.handledRequests.filter(req => req.url.startsWith('/v1/jobs')); + let requests = server.pretender.handledRequests.filter(req => req.url.startsWith('/v1/jobs')); assert.equal(requests.length, 1, 'First request to jobs'); assert.equal( requests[0].queryParams.namespace, @@ -94,7 +94,7 @@ module('Acceptance | namespaces (enabled)', function(hooks) { // TODO: handle this with Page Objects selectChoose('[data-test-namespace-switcher]', namespace.name); - const requests = server.pretender.handledRequests.filter(req => req.url.startsWith('/v1/jobs')); + requests = server.pretender.handledRequests.filter(req => req.url.startsWith('/v1/jobs')); assert.equal(requests.length, 2, 'Second request to jobs'); assert.equal( requests[1].queryParams.namespace, diff --git a/ui/tests/acceptance/server-detail-test.js b/ui/tests/acceptance/server-detail-test.js index 3c21ef6eaf5..7876096935e 100644 --- a/ui/tests/acceptance/server-detail-test.js +++ b/ui/tests/acceptance/server-detail-test.js @@ -1,5 +1,4 @@ import { currentURL } from '@ember/test-helpers'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import ServerDetail from 'nomad-ui/tests/pages/servers/detail'; diff --git a/ui/tests/acceptance/servers-list-test.js b/ui/tests/acceptance/servers-list-test.js index 8759d992b0d..326d5add951 100644 --- a/ui/tests/acceptance/servers-list-test.js +++ b/ui/tests/acceptance/servers-list-test.js @@ -1,5 +1,4 @@ import { currentURL } from '@ember/test-helpers'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import { findLeader } from '../../mirage/config'; diff --git a/ui/tests/acceptance/task-detail-test.js b/ui/tests/acceptance/task-detail-test.js index 0aeccb2b6cc..50d08ef3f75 100644 --- a/ui/tests/acceptance/task-detail-test.js +++ b/ui/tests/acceptance/task-detail-test.js @@ -1,5 +1,4 @@ import { currentURL } from '@ember/test-helpers'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import Task from 'nomad-ui/tests/pages/allocations/task/detail'; @@ -38,7 +37,11 @@ module('Acceptance | task detail', function(hooks) { const shortId = allocation.id.split('-')[0]; assert.equal(Task.breadcrumbFor('jobs.index').text, 'Jobs', 'Jobs is the first breadcrumb'); - assert.equal(Task.breadcrumbFor('jobs.job.index').text, job.name, 'Job is the second breadcrumb'); + assert.equal( + Task.breadcrumbFor('jobs.job.index').text, + job.name, + 'Job is the second breadcrumb' + ); assert.equal( Task.breadcrumbFor('jobs.job.task-group').text, taskGroup, diff --git a/ui/tests/acceptance/task-group-detail-test.js b/ui/tests/acceptance/task-group-detail-test.js index 53a4833c987..4dd6959d15e 100644 --- a/ui/tests/acceptance/task-group-detail-test.js +++ b/ui/tests/acceptance/task-group-detail-test.js @@ -1,5 +1,4 @@ import { currentURL } from '@ember/test-helpers'; -import { currentURL } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import { formatBytes } from 'nomad-ui/helpers/format-bytes'; diff --git a/ui/tests/helpers/module-for-adapter.js b/ui/tests/helpers/module-for-adapter.js index 19ba121b528..1517a37bd52 100644 --- a/ui/tests/helpers/module-for-adapter.js +++ b/ui/tests/helpers/module-for-adapter.js @@ -1,34 +1,18 @@ -import { getOwner } from '@ember/application'; import { module } from 'qunit'; import { setupTest } from 'ember-qunit'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; -export default function(modelName, description, options = { needs: [] }) { +export default function(modelName, description) { // moduleForModel correctly creates the store service // but moduleFor does not. - moduleForModel(modelName, description, { - unit: true, - needs: options.needs, - beforeEach() { - const model = this.subject(); + module(description, function(hooks) { + setupTest(hooks); + this.store = this.owner.lookup('service:store'); - // Initializers don't run automatically in unit tests - fragmentSerializerInitializer(getOwner(model)); + // Initializers don't run automatically in unit tests + fragmentSerializerInitializer(this.owner); - // Reassign the subject to provide the adapter - this.subject = () => model.store.adapterFor(modelName); - - // Expose the store as well, since it is a parameter for many adapter methods - this.store = model.store; - - if (options.beforeEach) { - options.beforeEach.apply(this, arguments); - } - }, - afterEach() { - if (options.afterEach) { - options.afterEach.apply(this, arguments); - } - }, + // Reassign the subject to provide the adapter + this.subject = () => this.store.adapterFor(modelName); }); } diff --git a/ui/tests/helpers/module-for-job.js b/ui/tests/helpers/module-for-job.js index 3e1b3bcc159..c1ef8d62c75 100644 --- a/ui/tests/helpers/module-for-job.js +++ b/ui/tests/helpers/module-for-job.js @@ -1,3 +1,4 @@ +import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; @@ -5,73 +6,75 @@ import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; export default function moduleForJob(title, context, jobFactory, additionalTests) { let job; - moduleForAcceptance(title, { - before() { + module(title, function(hooks) { + setupApplicationTest(hooks); + hooks.before(function() { if (context !== 'allocations' && context !== 'children') { throw new Error( `Invalid context provided to moduleForJob, expected either "allocations" or "children", got ${context}` ); } - }, - beforeEach() { + }); + + hooks.beforeEach(function() { server.create('node'); job = jobFactory(); JobDetail.visit({ id: job.id }); - }, - }); - - test('visiting /jobs/:job_id', function(assert) { - assert.equal(currentURL(), `/jobs/${job.id}`); - }); + }); - test('the subnav links to overview', function(assert) { - JobDetail.tabFor('overview').visit(); - andThen(() => { + test('visiting /jobs/:job_id', function(assert) { assert.equal(currentURL(), `/jobs/${job.id}`); }); - }); - test('the subnav links to definition', function(assert) { - JobDetail.tabFor('definition').visit(); - andThen(() => { - assert.equal(currentURL(), `/jobs/${job.id}/definition`); + test('the subnav links to overview', function(assert) { + JobDetail.tabFor('overview').visit(); + andThen(() => { + assert.equal(currentURL(), `/jobs/${job.id}`); + }); }); - }); - test('the subnav links to versions', function(assert) { - JobDetail.tabFor('versions').visit(); - andThen(() => { - assert.equal(currentURL(), `/jobs/${job.id}/versions`); + test('the subnav links to definition', function(assert) { + JobDetail.tabFor('definition').visit(); + andThen(() => { + assert.equal(currentURL(), `/jobs/${job.id}/definition`); + }); }); - }); - test('the subnav links to evaluations', function(assert) { - JobDetail.tabFor('evaluations').visit(); - andThen(() => { - assert.equal(currentURL(), `/jobs/${job.id}/evaluations`); + test('the subnav links to versions', function(assert) { + JobDetail.tabFor('versions').visit(); + andThen(() => { + assert.equal(currentURL(), `/jobs/${job.id}/versions`); + }); }); - }); - if (context === 'allocations') { - test('allocations for the job are shown in the overview', function(assert) { - assert.ok(JobDetail.allocationsSummary, 'Allocations are shown in the summary section'); - assert.notOk(JobDetail.childrenSummary, 'Children are not shown in the summary section'); + test('the subnav links to evaluations', function(assert) { + JobDetail.tabFor('evaluations').visit(); + andThen(() => { + assert.equal(currentURL(), `/jobs/${job.id}/evaluations`); + }); }); - } - if (context === 'children') { - test('children for the job are shown in the overview', function(assert) { - assert.ok(JobDetail.childrenSummary, 'Children are shown in the summary section'); - assert.notOk( - JobDetail.allocationsSummary, - 'Allocations are not shown in the summary section' - ); - }); - } + if (context === 'allocations') { + test('allocations for the job are shown in the overview', function(assert) { + assert.ok(JobDetail.allocationsSummary, 'Allocations are shown in the summary section'); + assert.notOk(JobDetail.childrenSummary, 'Children are not shown in the summary section'); + }); + } - for (var testName in additionalTests) { - test(testName, function(assert) { - additionalTests[testName](job, assert); - }); - } + if (context === 'children') { + test('children for the job are shown in the overview', function(assert) { + assert.ok(JobDetail.childrenSummary, 'Children are shown in the summary section'); + assert.notOk( + JobDetail.allocationsSummary, + 'Allocations are not shown in the summary section' + ); + }); + } + + for (var testName in additionalTests) { + test(testName, function(assert) { + additionalTests[testName](job, assert); + }); + } + }); } diff --git a/ui/tests/helpers/module-for-serializer.js b/ui/tests/helpers/module-for-serializer.js index 436d1ac86a8..3003596720b 100644 --- a/ui/tests/helpers/module-for-serializer.js +++ b/ui/tests/helpers/module-for-serializer.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { module } from 'qunit'; import { setupTest } from 'ember-qunit'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; @@ -6,29 +5,18 @@ import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initialize export default function(modelName, description, options = { needs: [] }) { // moduleForModel correctly wires up #Serializer.store, // but module does not. - moduleForModel(modelName, description, { - unit: true, - needs: options.needs, - beforeEach() { - const model = this.subject(); + module(description, function(hooks) { + setupTest(hooks); + this.store = this.owner.lookup('service:store'); - // Initializers don't run automatically in unit tests - fragmentSerializerInitializer(getOwner(model)); + // Initializers don't run automatically in unit tests + fragmentSerializerInitializer(this.owner); - // Reassign the subject to provide the serializer - this.subject = () => model.store.serializerFor(modelName); + // Reassign the subject to provide the serializer + this.subject = () => this.store.serializerFor(modelName); - // Expose the store as well, since it is a parameter for many serializer methods - this.store = model.store; - - if (options.beforeEach) { - options.beforeEach.apply(this, arguments); - } - }, - afterEach() { - if (options.beforeEach) { - options.beforeEach.apply(this, arguments); - } - }, + if (options.beforeEach) { + options.beforeEach.apply(this, arguments); + } }); } diff --git a/ui/tests/integration/allocation-row-test.js b/ui/tests/integration/allocation-row-test.js index 5ffaa541575..bd3c48f210f 100644 --- a/ui/tests/integration/allocation-row-test.js +++ b/ui/tests/integration/allocation-row-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, settled } from '@ember/test-helpers'; diff --git a/ui/tests/integration/app-breadcrumbs-test.js b/ui/tests/integration/app-breadcrumbs-test.js index 10b167e4c98..c9b710aeb5f 100644 --- a/ui/tests/integration/app-breadcrumbs-test.js +++ b/ui/tests/integration/app-breadcrumbs-test.js @@ -1,5 +1,4 @@ import Service from '@ember/service'; -import { getOwner } from '@ember/application'; import RSVP from 'rsvp'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; diff --git a/ui/tests/integration/job-editor-test.js b/ui/tests/integration/job-editor-test.js index 4dd75508b66..2b0f7e6869d 100644 --- a/ui/tests/integration/job-editor-test.js +++ b/ui/tests/integration/job-editor-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { assign } from '@ember/polyfills'; import { run } from '@ember/runloop'; import { module, test } from 'qunit'; @@ -183,7 +182,10 @@ module('Integration | Component | job-editor', function(hooks) { .then(() => { const requests = this.server.pretender.handledRequests.mapBy('url'); assert.notOk(requests.includes('/v1/jobs/parse'), 'JSON job spec is not parsed'); - assert.ok(requests.includes(`/v1/job/${newJobName}/plan`), 'JSON job spec is still planned'); + assert.ok( + requests.includes(`/v1/job/${newJobName}/plan`), + 'JSON job spec is still planned' + ); }); }); diff --git a/ui/tests/integration/job-page/parts/body-test.js b/ui/tests/integration/job-page/parts/body-test.js index 3225366f2ce..5f79f3978b9 100644 --- a/ui/tests/integration/job-page/parts/body-test.js +++ b/ui/tests/integration/job-page/parts/body-test.js @@ -1,5 +1,4 @@ import { run } from '@ember/runloop'; -import { getOwner } from '@ember/application'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, settled } from '@ember/test-helpers'; diff --git a/ui/tests/integration/job-page/parts/children-test.js b/ui/tests/integration/job-page/parts/children-test.js index 74c6d37eb35..5e3fab9310c 100644 --- a/ui/tests/integration/job-page/parts/children-test.js +++ b/ui/tests/integration/job-page/parts/children-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { assign } from '@ember/polyfills'; import { run } from '@ember/runloop'; import hbs from 'htmlbars-inline-precompile'; diff --git a/ui/tests/integration/job-page/parts/latest-deployment-test.js b/ui/tests/integration/job-page/parts/latest-deployment-test.js index 5b036e9e2c2..fa1bed2c830 100644 --- a/ui/tests/integration/job-page/parts/latest-deployment-test.js +++ b/ui/tests/integration/job-page/parts/latest-deployment-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, settled } from '@ember/test-helpers'; @@ -46,7 +45,11 @@ module('Integration | Component | job-page/parts/latest-deployment', function(ho }); test('the latest deployment section shows up for the currently running deployment', function(assert) { - this.server.create('job', { type: 'service', createAllocations: false, activeDeployment: true }); + this.server.create('job', { + type: 'service', + createAllocations: false, + activeDeployment: true, + }); this.store.findAll('job'); @@ -188,7 +191,8 @@ module('Integration | Component | job-page/parts/latest-deployment', function(ho }) .then(() => { const task = job.get('runningDeployment.taskGroupSummaries.firstObject'); - const findForTaskGroup = selector => find(`[data-test-deployment-task-group-${selector}]`); + const findForTaskGroup = selector => + find(`[data-test-deployment-task-group-${selector}]`); assert.equal(findForTaskGroup('name').textContent.trim(), task.get('name')); assert.equal( findForTaskGroup('progress-deadline').textContent.trim(), diff --git a/ui/tests/integration/job-page/parts/placement-failures-test.js b/ui/tests/integration/job-page/parts/placement-failures-test.js index 162645d5679..c136e1ef59e 100644 --- a/ui/tests/integration/job-page/parts/placement-failures-test.js +++ b/ui/tests/integration/job-page/parts/placement-failures-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { run } from '@ember/runloop'; import hbs from 'htmlbars-inline-precompile'; import { findAll, find } from 'ember-native-dom-helpers'; @@ -82,7 +81,10 @@ module('Integration | Component | job-page/parts/placement-failures', function(h `); return settled().then(() => { - assert.notOk(find('[data-test-placement-failures]'), 'Placement failures section not found'); + assert.notOk( + find('[data-test-placement-failures]'), + 'Placement failures section not found' + ); }); }); }); diff --git a/ui/tests/integration/job-page/parts/summary-test.js b/ui/tests/integration/job-page/parts/summary-test.js index 8a82b70e8cf..c4aafbad6a4 100644 --- a/ui/tests/integration/job-page/parts/summary-test.js +++ b/ui/tests/integration/job-page/parts/summary-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import hbs from 'htmlbars-inline-precompile'; import { find, click } from 'ember-native-dom-helpers'; import { module, test } from 'qunit'; diff --git a/ui/tests/integration/job-page/parts/task-groups-test.js b/ui/tests/integration/job-page/parts/task-groups-test.js index bf4c0fefda0..a36067ec9a9 100644 --- a/ui/tests/integration/job-page/parts/task-groups-test.js +++ b/ui/tests/integration/job-page/parts/task-groups-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { assign } from '@ember/polyfills'; import hbs from 'htmlbars-inline-precompile'; import { click, findAll, find } from 'ember-native-dom-helpers'; diff --git a/ui/tests/integration/job-page/periodic-test.js b/ui/tests/integration/job-page/periodic-test.js index cf992dd49e6..6595b90eee2 100644 --- a/ui/tests/integration/job-page/periodic-test.js +++ b/ui/tests/integration/job-page/periodic-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, settled } from '@ember/test-helpers'; diff --git a/ui/tests/integration/job-page/service-test.js b/ui/tests/integration/job-page/service-test.js index 51b7d0da809..01e9cd2733b 100644 --- a/ui/tests/integration/job-page/service-test.js +++ b/ui/tests/integration/job-page/service-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { assign } from '@ember/polyfills'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; diff --git a/ui/tests/integration/primary-metric-test.js b/ui/tests/integration/primary-metric-test.js index 93b3f501244..3f4acd4368b 100644 --- a/ui/tests/integration/primary-metric-test.js +++ b/ui/tests/integration/primary-metric-test.js @@ -1,6 +1,5 @@ import EmberObject, { computed } from '@ember/object'; import Service from '@ember/service'; -import { getOwner } from '@ember/application'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, settled } from '@ember/test-helpers'; diff --git a/ui/tests/integration/reschedule-event-timeline-test.js b/ui/tests/integration/reschedule-event-timeline-test.js index 615ca832c22..d274be37eaf 100644 --- a/ui/tests/integration/reschedule-event-timeline-test.js +++ b/ui/tests/integration/reschedule-event-timeline-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, settled } from '@ember/test-helpers'; diff --git a/ui/tests/unit/mixins/searchable-test.js b/ui/tests/unit/mixins/searchable-test.js index 7ffdd868f7a..57bf662d36f 100644 --- a/ui/tests/unit/mixins/searchable-test.js +++ b/ui/tests/unit/mixins/searchable-test.js @@ -1,5 +1,4 @@ import { alias } from '@ember/object/computed'; -import { getOwner } from '@ember/application'; import EmberObject, { computed } from '@ember/object'; import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; diff --git a/ui/tests/unit/models/job-test.js b/ui/tests/unit/models/job-test.js index a3ff69b0e59..d16f46f8f09 100644 --- a/ui/tests/unit/models/job-test.js +++ b/ui/tests/unit/models/job-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import { run } from '@ember/runloop'; import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; @@ -43,27 +42,29 @@ module('Unit | Model | job', function(hooks) { }); }); - const job = run(() => this.owner.lookup('service:store').createRecord('job', { - summary, - name: 'example', - taskGroups: [ - { - name: 'one', - count: 0, - tasks: [], - }, - { - name: 'two', - count: 0, - tasks: [], - }, - { - name: 'three', - count: 0, - tasks: [], - }, - ], - })); + const job = run(() => + this.owner.lookup('service:store').createRecord('job', { + summary, + name: 'example', + taskGroups: [ + { + name: 'one', + count: 0, + tasks: [], + }, + { + name: 'two', + count: 0, + tasks: [], + }, + { + name: 'three', + count: 0, + tasks: [], + }, + ], + }) + ); assert.equal( job.get('totalAllocs'), diff --git a/ui/tests/unit/services/breadcrumbs-test.js b/ui/tests/unit/services/breadcrumbs-test.js index 0f2ac5b5714..e71c7eb3a67 100644 --- a/ui/tests/unit/services/breadcrumbs-test.js +++ b/ui/tests/unit/services/breadcrumbs-test.js @@ -3,7 +3,6 @@ import Route from '@ember/routing/route'; import Controller from '@ember/controller'; import { get } from '@ember/object'; import { alias } from '@ember/object/computed'; -import { getOwner } from '@ember/application'; import RSVP from 'rsvp'; import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; @@ -20,9 +19,7 @@ module('Unit | Service | Breadcrumbs', function(hooks) { hooks.beforeEach(function() { this.subject = function() { - return this.owner - .factoryFor('service:breadcrumbs') - .create(); + return this.owner.factoryFor('service:breadcrumbs').create(); }; }); diff --git a/ui/tests/unit/services/stats-trackers-registry-test.js b/ui/tests/unit/services/stats-trackers-registry-test.js index a91ca555574..8a700eab407 100644 --- a/ui/tests/unit/services/stats-trackers-registry-test.js +++ b/ui/tests/unit/services/stats-trackers-registry-test.js @@ -13,9 +13,7 @@ module('Unit | Service | Stats Trackers Registry', function(hooks) { hooks.beforeEach(function() { this.subject = function() { - return this.owner - .factoryFor('service:stats-trackers-registry') - .create(); + return this.owner.factoryFor('service:stats-trackers-registry').create(); }; }); @@ -94,7 +92,11 @@ module('Unit | Service | Stats Trackers Registry', function(hooks) { assert.notEqual(node1, node2, 'Two different resources'); assert.equal(node1.get('id'), node2.get('id'), 'With the same IDs'); - assert.equal(node1.constructor.modelName, node2.constructor.modelName, 'And the same className'); + assert.equal( + node1.constructor.modelName, + node2.constructor.modelName, + 'And the same className' + ); assert.equal(registry.getTracker(node1), registry.getTracker(node2), 'Return the same tracker'); assert.equal(registry.get('registryRef').size, 1, 'Only one tracker in the registry'); diff --git a/ui/tests/unit/services/token-test.js b/ui/tests/unit/services/token-test.js index a84c38052b4..5bc72437ae9 100644 --- a/ui/tests/unit/services/token-test.js +++ b/ui/tests/unit/services/token-test.js @@ -1,4 +1,3 @@ -import { getOwner } from '@ember/application'; import Service from '@ember/service'; import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; @@ -9,9 +8,7 @@ module('Unit | Service | Token', function(hooks) { hooks.beforeEach(function() { this.subject = function() { - return this.owner - .factoryFor('service:token') - .create(); + return this.owner.factoryFor('service:token').create(); }; }); From 06e7338269ad586a5c2f5b75cc717e54ec57f732 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 12 Mar 2019 18:09:19 -0700 Subject: [PATCH 08/46] Use mirage test hooks --- ui/tests/acceptance/allocation-detail-test.js | 2 ++ ui/tests/acceptance/application-errors-test.js | 2 ++ ui/tests/acceptance/client-detail-test.js | 2 ++ ui/tests/acceptance/clients-list-test.js | 2 ++ ui/tests/acceptance/job-allocations-test.js | 2 ++ ui/tests/acceptance/job-definition-test.js | 2 ++ ui/tests/acceptance/job-deployments-test.js | 2 ++ ui/tests/acceptance/job-evaluations-test.js | 2 ++ ui/tests/acceptance/job-run-test.js | 2 ++ ui/tests/acceptance/job-versions-test.js | 2 ++ ui/tests/acceptance/jobs-list-test.js | 2 ++ ui/tests/acceptance/namespaces-test.js | 2 ++ ui/tests/acceptance/regions-test.js | 2 ++ ui/tests/acceptance/server-detail-test.js | 2 ++ ui/tests/acceptance/servers-list-test.js | 2 ++ ui/tests/acceptance/task-detail-test.js | 2 ++ ui/tests/acceptance/task-group-detail-test.js | 2 ++ ui/tests/acceptance/task-logs-test.js | 2 ++ ui/tests/acceptance/token-test.js | 11 ++++++----- ui/tests/helpers/module-for-job.js | 2 ++ 20 files changed, 44 insertions(+), 5 deletions(-) diff --git a/ui/tests/acceptance/allocation-detail-test.js b/ui/tests/acceptance/allocation-detail-test.js index e59eed1fe5a..aed30693c08 100644 --- a/ui/tests/acceptance/allocation-detail-test.js +++ b/ui/tests/acceptance/allocation-detail-test.js @@ -2,6 +2,7 @@ import { currentURL } from '@ember/test-helpers'; import { assign } from '@ember/polyfills'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import Allocation from 'nomad-ui/tests/pages/allocations/detail'; import moment from 'moment'; @@ -11,6 +12,7 @@ let allocation; module('Acceptance | allocation detail', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('agent'); diff --git a/ui/tests/acceptance/application-errors-test.js b/ui/tests/acceptance/application-errors-test.js index 955a5e5cce8..3cdf4943f30 100644 --- a/ui/tests/acceptance/application-errors-test.js +++ b/ui/tests/acceptance/application-errors-test.js @@ -1,12 +1,14 @@ import { currentURL, visit } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; import Job from 'nomad-ui/tests/pages/jobs/detail'; module('Acceptance | application errors ', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('agent'); diff --git a/ui/tests/acceptance/client-detail-test.js b/ui/tests/acceptance/client-detail-test.js index 5f6f8bf4ddc..077af82e5fb 100644 --- a/ui/tests/acceptance/client-detail-test.js +++ b/ui/tests/acceptance/client-detail-test.js @@ -2,6 +2,7 @@ import { currentURL } from '@ember/test-helpers'; import { assign } from '@ember/polyfills'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { formatBytes } from 'nomad-ui/helpers/format-bytes'; import formatDuration from 'nomad-ui/utils/format-duration'; import moment from 'moment'; @@ -13,6 +14,7 @@ let node; module('Acceptance | client detail', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('node', 'forceIPv4', { schedulingEligibility: 'eligible' }); diff --git a/ui/tests/acceptance/clients-list-test.js b/ui/tests/acceptance/clients-list-test.js index 71408c80a17..d698a4873cc 100644 --- a/ui/tests/acceptance/clients-list-test.js +++ b/ui/tests/acceptance/clients-list-test.js @@ -1,6 +1,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; function minimumSetup() { @@ -10,6 +11,7 @@ function minimumSetup() { module('Acceptance | clients list', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); test('/clients should list one page of clients', function(assert) { // Make sure to make more nodes than 1 page to assert that pagination is working diff --git a/ui/tests/acceptance/job-allocations-test.js b/ui/tests/acceptance/job-allocations-test.js index f639a5445f4..ee51a00816e 100644 --- a/ui/tests/acceptance/job-allocations-test.js +++ b/ui/tests/acceptance/job-allocations-test.js @@ -1,6 +1,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import Allocations from 'nomad-ui/tests/pages/jobs/job/allocations'; let job; @@ -18,6 +19,7 @@ const makeSearchAllocations = server => { module('Acceptance | job allocations', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('node'); diff --git a/ui/tests/acceptance/job-definition-test.js b/ui/tests/acceptance/job-definition-test.js index 436642f4aca..594dcd3f8c6 100644 --- a/ui/tests/acceptance/job-definition-test.js +++ b/ui/tests/acceptance/job-definition-test.js @@ -1,12 +1,14 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import Definition from 'nomad-ui/tests/pages/jobs/job/definition'; let job; module('Acceptance | job definition', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('node'); diff --git a/ui/tests/acceptance/job-deployments-test.js b/ui/tests/acceptance/job-deployments-test.js index c7497376117..07bd792033f 100644 --- a/ui/tests/acceptance/job-deployments-test.js +++ b/ui/tests/acceptance/job-deployments-test.js @@ -2,6 +2,7 @@ import { currentURL } from '@ember/test-helpers'; import { get } from '@ember/object'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import moment from 'moment'; import Deployments from 'nomad-ui/tests/pages/jobs/job/deployments'; @@ -14,6 +15,7 @@ let sortedDeployments; module('Acceptance | job deployments', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('node'); diff --git a/ui/tests/acceptance/job-evaluations-test.js b/ui/tests/acceptance/job-evaluations-test.js index e746c9a514f..9a76d369a18 100644 --- a/ui/tests/acceptance/job-evaluations-test.js +++ b/ui/tests/acceptance/job-evaluations-test.js @@ -1,6 +1,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import Evaluations from 'nomad-ui/tests/pages/jobs/job/evaluations'; let job; @@ -8,6 +9,7 @@ let evaluations; module('Acceptance | job evaluations', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { job = server.create('job', { noFailedPlacements: true, createAllocations: false }); diff --git a/ui/tests/acceptance/job-run-test.js b/ui/tests/acceptance/job-run-test.js index 157ac781a88..9e783562d90 100644 --- a/ui/tests/acceptance/job-run-test.js +++ b/ui/tests/acceptance/job-run-test.js @@ -2,6 +2,7 @@ import { currentURL } from '@ember/test-helpers'; import { assign } from '@ember/polyfills'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import JobRun from 'nomad-ui/tests/pages/jobs/run'; const newJobName = 'new-job'; @@ -37,6 +38,7 @@ const jsonJob = overrides => { module('Acceptance | job run', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { // Required for placing allocations (a result of creating jobs) diff --git a/ui/tests/acceptance/job-versions-test.js b/ui/tests/acceptance/job-versions-test.js index d47ece212d6..8232e5aa26c 100644 --- a/ui/tests/acceptance/job-versions-test.js +++ b/ui/tests/acceptance/job-versions-test.js @@ -1,6 +1,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import Versions from 'nomad-ui/tests/pages/jobs/job/versions'; import moment from 'moment'; @@ -9,6 +10,7 @@ let versions; module('Acceptance | job versions', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { job = server.create('job', { createAllocations: false }); diff --git a/ui/tests/acceptance/jobs-list-test.js b/ui/tests/acceptance/jobs-list-test.js index 71fee2cc726..b3d199a68d7 100644 --- a/ui/tests/acceptance/jobs-list-test.js +++ b/ui/tests/acceptance/jobs-list-test.js @@ -1,10 +1,12 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; module('Acceptance | jobs list', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { // Required for placing allocations (a result of creating jobs) diff --git a/ui/tests/acceptance/namespaces-test.js b/ui/tests/acceptance/namespaces-test.js index 762c4e9d416..4de7840534c 100644 --- a/ui/tests/acceptance/namespaces-test.js +++ b/ui/tests/acceptance/namespaces-test.js @@ -1,9 +1,11 @@ import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; module('Acceptance | namespaces (disabled)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('agent'); diff --git a/ui/tests/acceptance/regions-test.js b/ui/tests/acceptance/regions-test.js index 3e6d7a33b56..9c925a21b05 100644 --- a/ui/tests/acceptance/regions-test.js +++ b/ui/tests/acceptance/regions-test.js @@ -1,6 +1,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; import PageLayout from 'nomad-ui/tests/pages/layout'; @@ -8,6 +9,7 @@ import Allocation from 'nomad-ui/tests/pages/allocations/detail'; module('Acceptance | regions (only one)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('agent'); diff --git a/ui/tests/acceptance/server-detail-test.js b/ui/tests/acceptance/server-detail-test.js index 7876096935e..4d0c41da172 100644 --- a/ui/tests/acceptance/server-detail-test.js +++ b/ui/tests/acceptance/server-detail-test.js @@ -1,12 +1,14 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import ServerDetail from 'nomad-ui/tests/pages/servers/detail'; let agent; module('Acceptance | server detail', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.createList('agent', 3); diff --git a/ui/tests/acceptance/servers-list-test.js b/ui/tests/acceptance/servers-list-test.js index 326d5add951..41127a363db 100644 --- a/ui/tests/acceptance/servers-list-test.js +++ b/ui/tests/acceptance/servers-list-test.js @@ -1,6 +1,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { findLeader } from '../../mirage/config'; import ServersList from 'nomad-ui/tests/pages/servers/list'; @@ -20,6 +21,7 @@ const agentSort = leader => (a, b) => { module('Acceptance | servers list', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); test('/servers should list all servers', function(assert) { server.createList('node', 1); diff --git a/ui/tests/acceptance/task-detail-test.js b/ui/tests/acceptance/task-detail-test.js index 50d08ef3f75..1fb7c6ce883 100644 --- a/ui/tests/acceptance/task-detail-test.js +++ b/ui/tests/acceptance/task-detail-test.js @@ -1,6 +1,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import Task from 'nomad-ui/tests/pages/allocations/task/detail'; import moment from 'moment'; @@ -9,6 +10,7 @@ let task; module('Acceptance | task detail', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('agent'); diff --git a/ui/tests/acceptance/task-group-detail-test.js b/ui/tests/acceptance/task-group-detail-test.js index 4dd6959d15e..0f65ab5e38c 100644 --- a/ui/tests/acceptance/task-group-detail-test.js +++ b/ui/tests/acceptance/task-group-detail-test.js @@ -1,6 +1,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { formatBytes } from 'nomad-ui/helpers/format-bytes'; import TaskGroup from 'nomad-ui/tests/pages/jobs/job/task-group'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; @@ -15,6 +16,7 @@ const sum = (total, n) => total + n; module('Acceptance | task group detail', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('agent'); diff --git a/ui/tests/acceptance/task-logs-test.js b/ui/tests/acceptance/task-logs-test.js index a0fa39e4230..cf6355c6d21 100644 --- a/ui/tests/acceptance/task-logs-test.js +++ b/ui/tests/acceptance/task-logs-test.js @@ -2,6 +2,7 @@ import { currentURL } from '@ember/test-helpers'; import { run } from '@ember/runloop'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import TaskLogs from 'nomad-ui/tests/pages/allocations/task/logs'; let allocation; @@ -9,6 +10,7 @@ let task; module('Acceptance | task logs', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('agent'); diff --git a/ui/tests/acceptance/token-test.js b/ui/tests/acceptance/token-test.js index 85910505c5d..8fdf4590964 100644 --- a/ui/tests/acceptance/token-test.js +++ b/ui/tests/acceptance/token-test.js @@ -1,6 +1,7 @@ import { find } from 'ember-native-dom-helpers'; import { module, skip, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import Tokens from 'nomad-ui/tests/pages/settings/tokens'; import Jobs from 'nomad-ui/tests/pages/jobs/list'; import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; @@ -13,6 +14,7 @@ let clientToken; module('Acceptance | tokens', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('agent'); @@ -85,10 +87,7 @@ module('Acceptance | tokens', function(hooks) { Tokens.secret(bogusSecret).submit(); - assert.ok( - window.localStorage.nomadTokenSecret == null, - 'Token secret is discarded on failure' - ); + assert.ok(window.localStorage.nomadTokenSecret == null, 'Token secret is discarded on failure'); assert.ok(Tokens.errorMessage, 'Token error message is shown'); assert.notOk(Tokens.successMessage, 'Token success message is not shown'); assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); @@ -156,7 +155,9 @@ module('Acceptance | tokens', function(hooks) { function getHeader({ requestHeaders }, name) { // Headers are case-insensitive, but object property look up is not return ( - requestHeaders[name] || requestHeaders[name.toLowerCase()] || requestHeaders[name.toUpperCase()] + requestHeaders[name] || + requestHeaders[name.toLowerCase()] || + requestHeaders[name.toUpperCase()] ); } }); diff --git a/ui/tests/helpers/module-for-job.js b/ui/tests/helpers/module-for-job.js index c1ef8d62c75..9dfa94b4ca4 100644 --- a/ui/tests/helpers/module-for-job.js +++ b/ui/tests/helpers/module-for-job.js @@ -1,6 +1,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; export default function moduleForJob(title, context, jobFactory, additionalTests) { @@ -8,6 +9,7 @@ export default function moduleForJob(title, context, jobFactory, additionalTests module(title, function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.before(function() { if (context !== 'allocations' && context !== 'children') { throw new Error( From 57e84b1d10b3e19dfdde7c228a5c8c3dc789c670 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 19:14:58 -0700 Subject: [PATCH 09/46] Critical peer dependency upgrades --- ui/package.json | 4 +- ui/yarn.lock | 263 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 253 insertions(+), 14 deletions(-) diff --git a/ui/package.json b/ui/package.json index 4c3e055a1a5..a41f288804b 100644 --- a/ui/package.json +++ b/ui/package.json @@ -44,7 +44,7 @@ "ember-cli-inject-live-reload": "^1.4.1", "ember-cli-mirage": "^0.4.3", "ember-cli-moment-shim": "^3.5.0", - "ember-cli-page-object": "^1.14.1", + "ember-cli-page-object": "^1.15.1", "ember-cli-qunit": "^4.2.1", "ember-cli-sass": "^7.1.2", "ember-cli-shims": "^1.2.0", @@ -54,7 +54,7 @@ "ember-composable-helpers": "^2.0.3", "ember-concurrency": "^0.8.12", "ember-data": "~3.0.0", - "ember-data-model-fragments": "^2.14.0", + "ember-data-model-fragments": "3.0.0-beta.1", "ember-export-application-global": "^2.0.0", "ember-fetch": "^3.4.3", "ember-freestyle": "~0.6.2", diff --git a/ui/yarn.lock b/ui/yarn.lock index 06750e1a3e5..500340dc9b3 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -300,6 +300,13 @@ amd-name-resolver@1.0.0: dependencies: ensure-posix-path "^1.0.1" +amd-name-resolver@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" + integrity sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA== + dependencies: + ensure-posix-path "^1.0.1" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -900,6 +907,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-beta.6: + 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-ember-modules-api-polyfill@^1.4.2: version "1.6.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-1.6.0.tgz#abd1afa4237b3121cb51222f9bf3283cad8990aa" @@ -914,6 +928,13 @@ babel-plugin-ember-modules-api-polyfill@^2.3.0: dependencies: ember-rfc176-data "^0.3.0" +babel-plugin-ember-modules-api-polyfill@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.7.0.tgz#dcd6a9999da0d47d8c9185362bda6244ca525f4a" + integrity sha512-+QXPqmRngp13d7nKWrBcL6iIixpuyMNq107XV1dKvsvAO5BGFQ0mSk7Dl6/OgG+z2F1KquxkFfdXYBwbREQI6A== + dependencies: + ember-rfc176-data "^0.3.7" + babel-plugin-eval@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" @@ -1249,7 +1270,7 @@ babel-plugin-undefined-to-void@^1.1.6: resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" integrity sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E= -babel-polyfill@^6.16.0: +babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= @@ -1294,6 +1315,42 @@ babel-preset-env@^1.5.1: invariant "^2.2.2" semver "^5.3.0" +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -1626,6 +1683,22 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: rsvp "^3.5.0" workerpool "^2.2.1" +broccoli-babel-transpiler@^6.5.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.1.tgz#a4afc8d3b59b441518eb9a07bd44149476e30738" + integrity sha512-w6GcnkxvHcNCte5FcLGEG1hUdQvlfvSN/6PtGWU/otg69Ugk8rUk51h41R0Ugoc+TNxyeFG1opRt2RlA87XzNw== + dependencies: + babel-core "^6.26.0" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^2.0.0" + broccoli-persistent-filter "^1.4.3" + clone "^2.0.0" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.7" + json-stable-stringify "^1.0.0" + rsvp "^4.8.2" + workerpool "^2.3.0" + broccoli-builder@^0.18.8: version "0.18.10" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.10.tgz#9767e0061ff5b5e6eb1619d1a972ef2c7fd07631" @@ -1731,6 +1804,14 @@ broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: rsvp "~3.0.6" symlink-or-copy "^1.0.1" +broccoli-file-creator@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-2.1.1.tgz#7351dd2496c762cfce7736ce9b49e3fce0c7b7db" + integrity sha512-YpjOExWr92C5vhnK0kmD81kM7U09kdIRZk9w4ZDCDHuHXW+VE/x6AGEOQQW3loBQQ6Jk+k+TSm8dESy4uZsnjw== + dependencies: + broccoli-plugin "^1.1.0" + mkdirp "^0.5.1" + broccoli-filter@^0.1.11: version "0.1.14" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-0.1.14.tgz#23cae3891ff9ebb7b4d7db00c6dcf03535daf7ad" @@ -2137,6 +2218,14 @@ browserslist@^2.1.2, browserslist@^2.2.2: caniuse-lite "^1.0.30000718" electron-to-chromium "^1.3.18" +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -2307,6 +2396,11 @@ caniuse-lite@^1.0.30000718: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000718.tgz#0dd24290beb11310b2d80f6b70a823c2a65a6fad" integrity sha1-DdJCkL6xExCy2A9rcKgjwqZab60= +caniuse-lite@^1.0.30000844: + version "1.0.30000945" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000945.tgz#d51e3750416dd05126d5ac94a9c57d1c26c6fd21" + integrity sha512-PSGwYChNIXJ4FZr9Z9mrVzBCB1TF3yyiRmIDRIdKDHZ6u+1jYH6xeR28XaquxnMwcZVX3f48S9zi7eswO/G1nQ== + capture-exit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -3390,6 +3484,11 @@ electron-to-chromium@^1.3.18: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.18.tgz#3dcc99da3e6b665f6abbc71c28ad51a2cd731a9c" integrity sha1-PcyZ2j5rZl9qu8ccKK1Ros1zGpw= +electron-to-chromium@^1.3.47: + version "1.3.115" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.115.tgz#fdaa56c19b9f7386dbf29abc1cc632ff5468ff3b" + integrity sha512-mN2qeapQWdi2B9uddxTZ4nl80y46hbyKY5Wt9Yjih+QZFQLdaujEDK4qJky35WhyxMzHF3ZY41Lgjd2BPDuBhg== + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -3482,6 +3581,25 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.0" semver "^5.4.1" +ember-cli-babel@^6.16.0, ember-cli-babel@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" + integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== + dependencies: + amd-name-resolver "1.2.0" + babel-plugin-debug-macros "^0.2.0-beta.6" + babel-plugin-ember-modules-api-polyfill "^2.6.0" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-polyfill "^6.26.0" + babel-preset-env "^1.7.0" + broccoli-babel-transpiler "^6.5.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.0" + broccoli-source "^1.1.0" + clone "^2.0.0" + ember-cli-version-checker "^2.1.2" + semver "^5.5.0" + ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" @@ -3661,13 +3779,15 @@ ember-cli-normalize-entity-name@^1.0.0: dependencies: silent-error "^1.0.0" -ember-cli-page-object@^1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/ember-cli-page-object/-/ember-cli-page-object-1.14.1.tgz#2e3599c204c56440c6c8154fc686c603816f877a" - integrity sha512-PtgJeVAD0bcHWv5DCmyRRmaHghAikdbcEyJjXgzNfAMjO1F6CWCxjfZgBRgWIbrNhVQgHAGYar/t37+6zVwZpw== +ember-cli-page-object@^1.15.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/ember-cli-page-object/-/ember-cli-page-object-1.15.1.tgz#da1f870638584b17e183d0014b4efb15465fadd5" + integrity sha512-/oUkiha+CLUNQGkQLHJ+mw9rm/V6Gi3VGgzKo7laEGZe6Mk8jl13otxEKWKI2NTJmL69fZxPPfFsqQqpzN+0UA== dependencies: + broccoli-file-creator "^2.1.1" + broccoli-merge-trees "^2.0.0" ceibo "~2.0.0" - ember-cli-babel "^6.6.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" @@ -3811,6 +3931,14 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: resolve "^1.3.3" semver "^5.3.0" +ember-cli-version-checker@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" + integrity sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg== + dependencies: + resolve "^1.3.3" + semver "^5.3.0" + ember-cli@~3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.0.4.tgz#89275dd59994c64fa0ed5dcec24c83cd2935320b" @@ -3917,14 +4045,17 @@ ember-concurrency@^0.8.12: ember-getowner-polyfill "^2.0.0" ember-maybe-import-regenerator "^0.1.5" -ember-data-model-fragments@^2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/ember-data-model-fragments/-/ember-data-model-fragments-2.14.0.tgz#f31a03cdcf2449eaaaf84e0996324bf6af6c7b8e" - integrity sha512-U8AKBjqKrjAMNv1FfeqrIua2iHh7fUnhOAzG5zAVhLqFxqPBYXf3owU1bL0thZnBW0JdwiS/F5edBTxwMCV18g== +ember-data-model-fragments@3.0.0-beta.1: + version "3.0.0-beta.1" + resolved "https://registry.yarnpkg.com/ember-data-model-fragments/-/ember-data-model-fragments-3.0.0-beta.1.tgz#0be50b9e7db33acbc350389a68610e1e01f2d378" + integrity sha512-svOInt6LI+CO1SF8sEUBQIyS8NC6ch6RmYiqd9cTUIhg1tURu15WxMkFNOfO+6ypXjGXE3EblpLuj5fQ4PlFQg== dependencies: broccoli-file-creator "^1.1.1" broccoli-merge-trees "^2.0.0" - ember-cli-babel "^6.0.0" + calculate-cache-key-for-tree "^1.1.0" + ember-cli-babel "^6.8.0" + eslint-plugin-ember "^5.0.3" + eslint-plugin-node "^5.2.1" exists-sync "^0.0.4" git-repo-info "^1.4.1" npm-git-info "^1.0.3" @@ -4171,6 +4302,11 @@ ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== +ember-rfc176-data@^0.3.5, ember-rfc176-data@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.7.tgz#ecff7d74987d09296d3703343fed934515a4be33" + integrity sha512-AbTlD+q7sfyrD4diZqE7r9Y9/Je+HntVn7TlpHAe+nP5BNXxUXJIfDs5w5e3MxPcMs6Dz/yY90YfW8h1oKEvGg== + ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" @@ -4427,6 +4563,24 @@ escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +eslint-plugin-ember@^5.0.3: + version "5.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-5.4.0.tgz#2980a4389119b37d0450fff8e82d59c9aab126d0" + integrity sha512-tYMuxUrTad4f7Dq9gY9GUs9lXwKY+fZklzCJ0JoYbzK2PwSfdrPInr2Y4tHornc9dzPvNbRxsn5b26PrWp2iZg== + dependencies: + ember-rfc176-data "^0.3.5" + snake-case "^2.1.0" + +eslint-plugin-node@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz#80df3253c4d7901045ec87fa660a284e32bdca29" + integrity sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g== + dependencies: + ignore "^3.3.6" + minimatch "^3.0.4" + resolve "^1.3.3" + semver "5.3.0" + eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" @@ -5534,6 +5688,18 @@ hash-for-dep@^1.0.2: heimdalljs-logger "^0.1.7" resolve "^1.4.0" +hash-for-dep@^1.2.3: + version "1.5.0" + resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.0.tgz#02dacb5a3ee14e45d06f5aa039d142c970940476" + integrity sha512-Jtp264IRh25UmNHBNjB9jgYQGOpUVFMzt8E2MS6dJyR5uAO14bq4B9q5znOStkKpOpcxNUrYtg3hgpOSjQSONw== + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + heimdalljs "^0.2.3" + heimdalljs-logger "^0.1.7" + path-root "^0.1.1" + resolve "^1.10.0" + resolve-package-path "^1.0.11" + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.3" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" @@ -5709,6 +5875,11 @@ ignore@^3.3.3: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.4.tgz#85ab6d0a9ca8b27b31604c09efe1c14dc21ab872" integrity sha512-KjHyHxUgicfgFiTJaIA9DoeY3TIQz5thaKqm35re7RTVVB7zjF1fTMIDMXM4GUUBipR4FW8BvGnA115pZ/AxQQ== +ignore@^3.3.6: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -7126,6 +7297,11 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -7647,6 +7823,13 @@ nise@^1.0.1: path-to-regexp "^1.7.0" text-encoding "^0.6.4" +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + node-fetch@^2.0.0-alpha.9: version "2.0.0-alpha.9" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.0.0-alpha.9.tgz#990c0634f510f76449a0d6f6eaec96b22f273628" @@ -8228,11 +8411,28 @@ path-parse@^1.0.5: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + path-posix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" integrity sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8= +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -8890,6 +9090,14 @@ resolve-from@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= +resolve-package-path@^1.0.11: + version "1.2.4" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.4.tgz#814c5fcfb5f6e4151d95ec6e5653707c43706670" + integrity sha512-AOIfR/AauBM1w1Oq9swqGxUjL4PW7bMztN7UCQ4KWg9AR2t03bGb9faegZbE0meAOHlntAni/4kXkcsQ7dWLPQ== + dependencies: + path-root "^0.1.1" + resolve "^1.10.0" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -8909,6 +9117,13 @@ resolve@^1.1.2, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.3, resolve@^1.4.0, dependencies: path-parse "^1.0.5" +resolve@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== + dependencies: + path-parse "^1.0.6" + resolve@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" @@ -9005,6 +9220,11 @@ rsvp@^4.6.1, rsvp@^4.7.0: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.7.0.tgz#dc1b0b1a536f7dec9d2be45e0a12ad4197c9fd96" integrity sha1-3BsLGlNvfeydK+ReChKtQZfJ/ZY= +rsvp@^4.8.2: + version "4.8.4" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" + integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== + rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" @@ -9149,11 +9369,16 @@ scss-tokenizer@^0.2.3: resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -semver@~5.3.0: +semver@5.3.0, semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= +semver@^5.5.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + send@0.15.4: version "0.15.4" resolved "https://registry.yarnpkg.com/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9" @@ -9309,6 +9534,13 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= +snake-case@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= + dependencies: + no-case "^2.2.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -10603,6 +10835,13 @@ workerpool@^2.2.1: dependencies: object-assign "4.1.1" +workerpool@^2.3.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.3.tgz#49a70089bd55e890d68cc836a19419451d7c81d7" + integrity sha512-L1ovlYHp6UObYqElXXpbd214GgbEKDED0d3sj7pRdFXjNkb2+un/AUcCkceHizO0IVI6SOGGncrcjozruCkRgA== + dependencies: + object-assign "4.1.1" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" From 43a9b6d86509baa516943e49ca0195ba65421cad Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 19:15:25 -0700 Subject: [PATCH 10/46] Update environment to 3.0 conventions --- ui/config/environment.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/config/environment.js b/ui/config/environment.js index 1ae693c2429..f7f55db36dc 100644 --- a/ui/config/environment.js +++ b/ui/config/environment.js @@ -51,6 +51,7 @@ module.exports = function(environment) { ENV.APP.LOG_VIEW_LOOKUPS = false; ENV.APP.rootElement = '#ember-testing'; + ENV.APP.autoboot = false; ENV.browserify = { tests: true, From 2d6aaaa837639b2e226a3bb2d551580177e8280a Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 19:16:01 -0700 Subject: [PATCH 11/46] Update test-helper to new testing style --- ui/tests/test-helper.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ui/tests/test-helper.js b/ui/tests/test-helper.js index 3d00b17e92d..eb1af9a7d55 100644 --- a/ui/tests/test-helper.js +++ b/ui/tests/test-helper.js @@ -1,7 +1,9 @@ import 'core-js'; -import resolver from './helpers/resolver'; -import { setResolver } from 'ember-qunit'; -import { start } from 'ember-cli-qunit'; +import Application from '../app'; +import config from '../config/environment'; +import { setApplication } from '@ember/test-helpers'; +import { start } from 'ember-qunit'; + +setApplication(Application.create(config.APP)); -setResolver(resolver); start(); From 31dc1399458554b669b8c27d6b83bd7c16f063a0 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 19:16:39 -0700 Subject: [PATCH 12/46] Update adapter tests to use module instead of custom code --- ui/tests/helpers/module-for-adapter.js | 18 - ui/tests/unit/adapters/job-test.js | 642 ++++++++++++------------- ui/tests/unit/adapters/node-test.js | 170 +++---- 3 files changed, 391 insertions(+), 439 deletions(-) delete mode 100644 ui/tests/helpers/module-for-adapter.js diff --git a/ui/tests/helpers/module-for-adapter.js b/ui/tests/helpers/module-for-adapter.js deleted file mode 100644 index 1517a37bd52..00000000000 --- a/ui/tests/helpers/module-for-adapter.js +++ /dev/null @@ -1,18 +0,0 @@ -import { module } from 'qunit'; -import { setupTest } from 'ember-qunit'; -import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; - -export default function(modelName, description) { - // moduleForModel correctly creates the store service - // but moduleFor does not. - module(description, function(hooks) { - setupTest(hooks); - this.store = this.owner.lookup('service:store'); - - // Initializers don't run automatically in unit tests - fragmentSerializerInitializer(this.owner); - - // Reassign the subject to provide the adapter - this.subject = () => this.store.adapterFor(modelName); - }); -} diff --git a/ui/tests/unit/adapters/job-test.js b/ui/tests/unit/adapters/job-test.js index bf26008daee..df50742e700 100644 --- a/ui/tests/unit/adapters/job-test.js +++ b/ui/tests/unit/adapters/job-test.js @@ -1,35 +1,18 @@ import EmberObject from '@ember/object'; -import { getOwner } from '@ember/application'; import { run } from '@ember/runloop'; import { assign } from '@ember/polyfills'; -import { test } from 'qunit'; -import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; -import moduleForAdapter from '../../helpers/module-for-adapter'; import { settled } from '@ember/test-helpers'; +import { setupTest } from 'ember-qunit'; +import { module, test } from 'qunit'; +import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; + +module('Unit | Adapter | Job', function(hooks) { + setupTest(hooks); + + hooks.beforeEach(function() { + this.store = this.owner.lookup('service:store'); + this.subject = () => this.store.adapterFor('job'); -moduleForAdapter('job', 'Unit | Adapter | Job', { - needs: [ - 'adapter:application', - 'adapter:job', - 'adapter:namespace', - 'model:task-group', - 'model:allocation', - 'model:deployment', - 'model:evaluation', - 'model:job-summary', - 'model:job-version', - 'model:namespace', - 'model:task-group-summary', - 'serializer:namespace', - 'serializer:job', - 'serializer:job-summary', - 'service:token', - 'service:system', - 'service:watchList', - 'transform:fragment', - 'transform:fragment-array', - ], - beforeEach() { window.sessionStorage.clear(); window.localStorage.clear(); @@ -43,7 +26,7 @@ moduleForAdapter('job', 'Unit | Adapter | Job', { this.server.create('region', { id: 'region-1' }); this.server.create('region', { id: 'region-2' }); - this.system = getOwner(this).lookup('service:system'); + this.system = this.owner.lookup('service:system'); // Namespace, default region, and all regions are requests that all // job requests depend on. Fetching them ahead of time means testing @@ -55,401 +38,402 @@ moduleForAdapter('job', 'Unit | Adapter | Job', { // Reset the handledRequests array to avoid accounting for this // namespaces request everywhere. this.server.pretender.handledRequests.length = 0; - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - }, -}); + }); -test('The job endpoint is the only required endpoint for fetching a job', function(assert) { - const { pretender } = this.server; - const jobName = 'job-1'; - const jobNamespace = 'default'; - const jobId = JSON.stringify([jobName, jobNamespace]); + test('The job endpoint is the only required endpoint for fetching a job', function(assert) { + const { pretender } = this.server; + const jobName = 'job-1'; + const jobNamespace = 'default'; + const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); + return settled().then(() => { + this.subject().findRecord(null, { modelName: 'job' }, jobId); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}`], - 'The only request made is /job/:id' - ); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}`], + 'The only request made is /job/:id' + ); + }); }); -}); - -test('When a namespace is set in localStorage but a job in the default namespace is requested, the namespace query param is not present', function(assert) { - window.localStorage.nomadActiveNamespace = 'some-namespace'; - const { pretender } = this.server; - const jobName = 'job-1'; - const jobNamespace = 'default'; - const jobId = JSON.stringify([jobName, jobNamespace]); + test('When a namespace is set in localStorage but a job in the default namespace is requested, the namespace query param is not present', function(assert) { + window.localStorage.nomadActiveNamespace = 'some-namespace'; - this.system.get('namespaces'); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); + const { pretender } = this.server; + const jobName = 'job-1'; + const jobNamespace = 'default'; + const jobId = JSON.stringify([jobName, jobNamespace]); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}`], - 'The only request made is /job/:id with no namespace query param' - ); + this.system.get('namespaces'); + return settled().then(() => { + this.subject().findRecord(null, { modelName: 'job' }, jobId); + + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}`], + 'The only request made is /job/:id with no namespace query param' + ); + }); }); -}); -test('When a namespace is in localStorage and the requested job is in the default namespace, the namespace query param is left out', function(assert) { - window.localStorage.nomadActiveNamespace = 'red-herring'; + test('When a namespace is in localStorage and the requested job is in the default namespace, the namespace query param is left out', function(assert) { + window.localStorage.nomadActiveNamespace = 'red-herring'; - const { pretender } = this.server; - const jobName = 'job-1'; - const jobNamespace = 'default'; - const jobId = JSON.stringify([jobName, jobNamespace]); + const { pretender } = this.server; + const jobName = 'job-1'; + const jobNamespace = 'default'; + const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); + return settled().then(() => { + this.subject().findRecord(null, { modelName: 'job' }, jobId); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}`], - 'The request made is /job/:id with no namespace query param' - ); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}`], + 'The request made is /job/:id with no namespace query param' + ); + }); }); -}); -test('When the job has a namespace other than default, it is in the URL', function(assert) { - const { pretender } = this.server; - const jobName = 'job-2'; - const jobNamespace = 'some-namespace'; - const jobId = JSON.stringify([jobName, jobNamespace]); + test('When the job has a namespace other than default, it is in the URL', function(assert) { + const { pretender } = this.server; + const jobName = 'job-2'; + const jobNamespace = 'some-namespace'; + const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); + return settled().then(() => { + this.subject().findRecord(null, { modelName: 'job' }, jobId); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}?namespace=${jobNamespace}`], - 'The only request made is /job/:id?namespace=:namespace' - ); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}?namespace=${jobNamespace}`], + 'The only request made is /job/:id?namespace=:namespace' + ); + }); }); -}); -test('When there is no token set in the token service, no x-nomad-token header is set', function(assert) { - const { pretender } = this.server; - const jobId = JSON.stringify(['job-1', 'default']); + test('When there is no token set in the token service, no x-nomad-token header is set', function(assert) { + const { pretender } = this.server; + const jobId = JSON.stringify(['job-1', 'default']); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); + return settled().then(() => { + this.subject().findRecord(null, { modelName: 'job' }, jobId); - assert.notOk( - pretender.handledRequests.mapBy('requestHeaders').some(headers => headers['X-Nomad-Token']), - 'No token header present on either job request' - ); + assert.notOk( + pretender.handledRequests.mapBy('requestHeaders').some(headers => headers['X-Nomad-Token']), + 'No token header present on either job request' + ); + }); }); -}); - -test('When a token is set in the token service, then x-nomad-token header is set', function(assert) { - const { pretender } = this.server; - const jobId = JSON.stringify(['job-1', 'default']); - const secret = 'here is the secret'; - - return settled().then(() => { - this.subject().set('token.secret', secret); - this.subject().findRecord(null, { modelName: 'job' }, jobId); - assert.ok( - pretender.handledRequests - .mapBy('requestHeaders') - .every(headers => headers['X-Nomad-Token'] === secret), - 'The token header is present on both job requests' - ); + test('When a token is set in the token service, then x-nomad-token header is set', function(assert) { + const { pretender } = this.server; + const jobId = JSON.stringify(['job-1', 'default']); + const secret = 'here is the secret'; + + return settled().then(() => { + this.subject().set('token.secret', secret); + this.subject().findRecord(null, { modelName: 'job' }, jobId); + + assert.ok( + pretender.handledRequests + .mapBy('requestHeaders') + .every(headers => headers['X-Nomad-Token'] === secret), + 'The token header is present on both job requests' + ); + }); }); -}); -test('findAll can be watched', function(assert) { - const { pretender } = this.server; + test('findAll can be watched', function(assert) { + const { pretender } = this.server; - const request = () => - this.subject().findAll(null, { modelName: 'job' }, null, { - reload: true, - adapterOptions: { watch: true }, - }); - - request(); - assert.equal( - pretender.handledRequests[0].url, - '/v1/jobs?index=1', - 'Second request is a blocking request for jobs' - ); + const request = () => + this.subject().findAll(null, { modelName: 'job' }, null, { + reload: true, + adapterOptions: { watch: true }, + }); - return settled().then(() => { request(); assert.equal( - pretender.handledRequests[1].url, - '/v1/jobs?index=2', - 'Third request is a blocking request with an incremented index param' + pretender.handledRequests[0].url, + '/v1/jobs?index=1', + 'Second request is a blocking request for jobs' ); - return settled(); - }); -}); + return settled().then(() => { + request(); + assert.equal( + pretender.handledRequests[1].url, + '/v1/jobs?index=2', + 'Third request is a blocking request with an incremented index param' + ); -test('findRecord can be watched', function(assert) { - const jobId = JSON.stringify(['job-1', 'default']); - const { pretender } = this.server; - - const request = () => - this.subject().findRecord(null, { modelName: 'job' }, jobId, { - reload: true, - adapterOptions: { watch: true }, + return settled(); }); + }); - request(); - assert.equal( - pretender.handledRequests[0].url, - '/v1/job/job-1?index=1', - 'Second request is a blocking request for job-1' - ); + test('findRecord can be watched', function(assert) { + const jobId = JSON.stringify(['job-1', 'default']); + const { pretender } = this.server; + + const request = () => + this.subject().findRecord(null, { modelName: 'job' }, jobId, { + reload: true, + adapterOptions: { watch: true }, + }); - return settled().then(() => { request(); assert.equal( - pretender.handledRequests[1].url, - '/v1/job/job-1?index=2', - 'Third request is a blocking request with an incremented index param' + pretender.handledRequests[0].url, + '/v1/job/job-1?index=1', + 'Second request is a blocking request for job-1' ); - return settled(); - }); -}); - -test('relationships can be reloaded', function(assert) { - const { pretender } = this.server; - const plainId = 'job-1'; - const mockModel = makeMockModel(plainId); + return settled().then(() => { + request(); + assert.equal( + pretender.handledRequests[1].url, + '/v1/job/job-1?index=2', + 'Third request is a blocking request with an incremented index param' + ); - this.subject().reloadRelationship(mockModel, 'summary'); - return settled().then(() => { - assert.equal( - pretender.handledRequests[0].url, - `/v1/job/${plainId}/summary`, - 'Relationship was reloaded' - ); + return settled(); + }); }); -}); -test('relationship reloads can be watched', function(assert) { - const { pretender } = this.server; - const plainId = 'job-1'; - const mockModel = makeMockModel(plainId); + test('relationships can be reloaded', function(assert) { + const { pretender } = this.server; + const plainId = 'job-1'; + const mockModel = makeMockModel(plainId); + + this.subject().reloadRelationship(mockModel, 'summary'); + return settled().then(() => { + assert.equal( + pretender.handledRequests[0].url, + `/v1/job/${plainId}/summary`, + 'Relationship was reloaded' + ); + }); + }); - this.subject().reloadRelationship(mockModel, 'summary', true); - assert.equal( - pretender.handledRequests[0].url, - '/v1/job/job-1/summary?index=1', - 'First request is a blocking request for job-1 summary relationship' - ); + test('relationship reloads can be watched', function(assert) { + const { pretender } = this.server; + const plainId = 'job-1'; + const mockModel = makeMockModel(plainId); - return settled().then(() => { this.subject().reloadRelationship(mockModel, 'summary', true); assert.equal( - pretender.handledRequests[1].url, - '/v1/job/job-1/summary?index=2', - 'Second request is a blocking request with an incremented index param' + pretender.handledRequests[0].url, + '/v1/job/job-1/summary?index=1', + 'First request is a blocking request for job-1 summary relationship' ); + + return settled().then(() => { + this.subject().reloadRelationship(mockModel, 'summary', true); + assert.equal( + pretender.handledRequests[1].url, + '/v1/job/job-1/summary?index=2', + 'Second request is a blocking request with an incremented index param' + ); + }); }); -}); -test('findAll can be canceled', function(assert) { - const { pretender } = this.server; - pretender.get('/v1/jobs', () => [200, {}, '[]'], true); + test('findAll can be canceled', function(assert) { + const { pretender } = this.server; + pretender.get('/v1/jobs', () => [200, {}, '[]'], true); - this.subject() - .findAll(null, { modelName: 'job' }, null, { - reload: true, - adapterOptions: { watch: true }, - }) - .catch(() => {}); + this.subject() + .findAll(null, { modelName: 'job' }, null, { + reload: true, + adapterOptions: { watch: true }, + }) + .catch(() => {}); - const { request: xhr } = pretender.requestReferences[0]; - assert.equal(xhr.status, 0, 'Request is still pending'); + const { request: xhr } = pretender.requestReferences[0]; + assert.equal(xhr.status, 0, 'Request is still pending'); - // Schedule the cancelation before waiting - run.next(() => { - this.subject().cancelFindAll('job'); - }); + // Schedule the cancelation before waiting + run.next(() => { + this.subject().cancelFindAll('job'); + }); - return settled().then(() => { - assert.ok(xhr.aborted, 'Request was aborted'); + return settled().then(() => { + assert.ok(xhr.aborted, 'Request was aborted'); + }); }); -}); -test('findRecord can be canceled', function(assert) { - const { pretender } = this.server; - const jobId = JSON.stringify(['job-1', 'default']); + test('findRecord can be canceled', function(assert) { + const { pretender } = this.server; + const jobId = JSON.stringify(['job-1', 'default']); - pretender.get('/v1/job/:id', () => [200, {}, '{}'], true); + pretender.get('/v1/job/:id', () => [200, {}, '{}'], true); - this.subject().findRecord(null, { modelName: 'job' }, jobId, { - reload: true, - adapterOptions: { watch: true }, - }); + this.subject().findRecord(null, { modelName: 'job' }, jobId, { + reload: true, + adapterOptions: { watch: true }, + }); - const { request: xhr } = pretender.requestReferences[0]; - assert.equal(xhr.status, 0, 'Request is still pending'); + const { request: xhr } = pretender.requestReferences[0]; + assert.equal(xhr.status, 0, 'Request is still pending'); - // Schedule the cancelation before waiting - run.next(() => { - this.subject().cancelFindRecord('job', jobId); - }); + // Schedule the cancelation before waiting + run.next(() => { + this.subject().cancelFindRecord('job', jobId); + }); - return settled().then(() => { - assert.ok(xhr.aborted, 'Request was aborted'); + return settled().then(() => { + assert.ok(xhr.aborted, 'Request was aborted'); + }); }); -}); -test('relationship reloads can be canceled', function(assert) { - const { pretender } = this.server; - const plainId = 'job-1'; - const mockModel = makeMockModel(plainId); - pretender.get('/v1/job/:id/summary', () => [200, {}, '{}'], true); + test('relationship reloads can be canceled', function(assert) { + const { pretender } = this.server; + const plainId = 'job-1'; + const mockModel = makeMockModel(plainId); + pretender.get('/v1/job/:id/summary', () => [200, {}, '{}'], true); - this.subject().reloadRelationship(mockModel, 'summary', true); + this.subject().reloadRelationship(mockModel, 'summary', true); - const { request: xhr } = pretender.requestReferences[0]; - assert.equal(xhr.status, 0, 'Request is still pending'); + const { request: xhr } = pretender.requestReferences[0]; + assert.equal(xhr.status, 0, 'Request is still pending'); - // Schedule the cancelation before waiting - run.next(() => { - this.subject().cancelReloadRelationship(mockModel, 'summary'); - }); + // Schedule the cancelation before waiting + run.next(() => { + this.subject().cancelReloadRelationship(mockModel, 'summary'); + }); - return settled().then(() => { - assert.ok(xhr.aborted, 'Request was aborted'); + return settled().then(() => { + assert.ok(xhr.aborted, 'Request was aborted'); + }); }); -}); -test('requests can be canceled even if multiple requests for the same URL were made', function(assert) { - const { pretender } = this.server; - const jobId = JSON.stringify(['job-1', 'default']); + test('requests can be canceled even if multiple requests for the same URL were made', function(assert) { + const { pretender } = this.server; + const jobId = JSON.stringify(['job-1', 'default']); - pretender.get('/v1/job/:id', () => [200, {}, '{}'], true); + pretender.get('/v1/job/:id', () => [200, {}, '{}'], true); - this.subject().findRecord(null, { modelName: 'job' }, jobId, { - reload: true, - adapterOptions: { watch: true }, - }); + this.subject().findRecord(null, { modelName: 'job' }, jobId, { + reload: true, + adapterOptions: { watch: true }, + }); - this.subject().findRecord(null, { modelName: 'job' }, jobId, { - reload: true, - adapterOptions: { watch: true }, - }); + this.subject().findRecord(null, { modelName: 'job' }, jobId, { + reload: true, + adapterOptions: { watch: true }, + }); - const { request: xhr } = pretender.requestReferences[0]; - assert.equal(xhr.status, 0, 'Request is still pending'); - assert.equal(pretender.requestReferences.length, 2, 'Two findRecord requests were made'); - assert.equal( - pretender.requestReferences.mapBy('url').uniq().length, - 1, - 'The two requests have the same URL' - ); + const { request: xhr } = pretender.requestReferences[0]; + assert.equal(xhr.status, 0, 'Request is still pending'); + assert.equal(pretender.requestReferences.length, 2, 'Two findRecord requests were made'); + assert.equal( + pretender.requestReferences.mapBy('url').uniq().length, + 1, + 'The two requests have the same URL' + ); - // Schedule the cancelation before waiting - run.next(() => { - this.subject().cancelFindRecord('job', jobId); - }); + // Schedule the cancelation before waiting + run.next(() => { + this.subject().cancelFindRecord('job', jobId); + }); - return settled().then(() => { - assert.ok(xhr.aborted, 'Request was aborted'); + return settled().then(() => { + assert.ok(xhr.aborted, 'Request was aborted'); + }); }); -}); -test('canceling a find record request will never cancel a request with the same url but different method', function(assert) { - const { pretender } = this.server; - const jobId = JSON.stringify(['job-1', 'default']); + test('canceling a find record request will never cancel a request with the same url but different method', function(assert) { + const { pretender } = this.server; + const jobId = JSON.stringify(['job-1', 'default']); - pretender.get('/v1/job/:id', () => [200, {}, '{}'], true); - pretender.delete('/v1/job/:id', () => [204, {}, ''], 200); + pretender.get('/v1/job/:id', () => [200, {}, '{}'], true); + pretender.delete('/v1/job/:id', () => [204, {}, ''], 200); - this.subject().findRecord(null, { modelName: 'job' }, jobId, { - reload: true, - adapterOptions: { watch: true }, - }); + this.subject().findRecord(null, { modelName: 'job' }, jobId, { + reload: true, + adapterOptions: { watch: true }, + }); - this.subject().stop(EmberObject.create({ id: jobId })); + this.subject().stop(EmberObject.create({ id: jobId })); - const { request: getXHR } = pretender.requestReferences[0]; - const { request: deleteXHR } = pretender.requestReferences[1]; - assert.equal(getXHR.status, 0, 'Get request is still pending'); - assert.equal(deleteXHR.status, 0, 'Delete request is still pending'); + const { request: getXHR } = pretender.requestReferences[0]; + const { request: deleteXHR } = pretender.requestReferences[1]; + assert.equal(getXHR.status, 0, 'Get request is still pending'); + assert.equal(deleteXHR.status, 0, 'Delete request is still pending'); - // Schedule the cancelation before waiting - run.next(() => { - this.subject().cancelFindRecord('job', jobId); - }); + // Schedule the cancelation before waiting + run.next(() => { + this.subject().cancelFindRecord('job', jobId); + }); - return settled().then(() => { - assert.ok(getXHR.aborted, 'Get request was aborted'); - assert.notOk(deleteXHR.aborted, 'Delete request was aborted'); + return settled().then(() => { + assert.ok(getXHR.aborted, 'Get request was aborted'); + assert.notOk(deleteXHR.aborted, 'Delete request was aborted'); + }); }); -}); -test('when there is no region set, requests are made without the region query param', function(assert) { - const { pretender } = this.server; - const jobName = 'job-1'; - const jobNamespace = 'default'; - const jobId = JSON.stringify([jobName, jobNamespace]); - - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); - this.subject().findAll(null, { modelName: 'job' }, null); - - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}`, '/v1/jobs'], - 'No requests include the region query param' - ); + test('when there is no region set, requests are made without the region query param', function(assert) { + const { pretender } = this.server; + const jobName = 'job-1'; + const jobNamespace = 'default'; + const jobId = JSON.stringify([jobName, jobNamespace]); + + return settled().then(() => { + this.subject().findRecord(null, { modelName: 'job' }, jobId); + this.subject().findAll(null, { modelName: 'job' }, null); + + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}`, '/v1/jobs'], + 'No requests include the region query param' + ); + }); }); -}); -test('when there is a region set, requests are made with the region query param', function(assert) { - const region = 'region-2'; - window.localStorage.nomadActiveRegion = region; + test('when there is a region set, requests are made with the region query param', function(assert) { + const region = 'region-2'; + window.localStorage.nomadActiveRegion = region; - const { pretender } = this.server; - const jobName = 'job-1'; - const jobNamespace = 'default'; - const jobId = JSON.stringify([jobName, jobNamespace]); + const { pretender } = this.server; + const jobName = 'job-1'; + const jobNamespace = 'default'; + const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); - this.subject().findAll(null, { modelName: 'job' }, null); + return settled().then(() => { + this.subject().findRecord(null, { modelName: 'job' }, jobId); + this.subject().findAll(null, { modelName: 'job' }, null); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}?region=${region}`, `/v1/jobs?region=${region}`], - 'Requests include the region query param' - ); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}?region=${region}`, `/v1/jobs?region=${region}`], + 'Requests include the region query param' + ); + }); }); -}); -test('when the region is set to the default region, requests are made without the region query param', function(assert) { - window.localStorage.nomadActiveRegion = 'region-1'; + test('when the region is set to the default region, requests are made without the region query param', function(assert) { + window.localStorage.nomadActiveRegion = 'region-1'; - const { pretender } = this.server; - const jobName = 'job-1'; - const jobNamespace = 'default'; - const jobId = JSON.stringify([jobName, jobNamespace]); + const { pretender } = this.server; + const jobName = 'job-1'; + const jobNamespace = 'default'; + const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); - this.subject().findAll(null, { modelName: 'job' }, null); + return settled().then(() => { + this.subject().findRecord(null, { modelName: 'job' }, jobId); + this.subject().findAll(null, { modelName: 'job' }, null); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}`, '/v1/jobs'], - 'No requests include the region query param' - ); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}`, '/v1/jobs'], + 'No requests include the region query param' + ); + }); }); }); diff --git a/ui/tests/unit/adapters/node-test.js b/ui/tests/unit/adapters/node-test.js index 9382d3c8f77..d0c1356de04 100644 --- a/ui/tests/unit/adapters/node-test.js +++ b/ui/tests/unit/adapters/node-test.js @@ -1,31 +1,16 @@ import { run } from '@ember/runloop'; -import { test } from 'qunit'; +import { module, test } from 'qunit'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; -import moduleForAdapter from '../../helpers/module-for-adapter'; +import { setupTest } from 'ember-qunit'; import { settled } from '@ember/test-helpers'; -moduleForAdapter('node', 'Unit | Adapter | Node', { - needs: [ - 'adapter:node', - 'model:node-attributes', - 'model:allocation', - 'model:node-driver', - 'model:node-event', - 'model:evaluation', - 'model:resources', - 'model:network', - 'model:job', - 'serializer:application', - 'serializer:node', - 'service:system', - 'service:token', - 'service:config', - 'service:watchList', - 'transform:fragment', - 'transform:fragment-array', - 'transform:array', - ], - beforeEach() { +module('Unit | Adapter | Node', function(hooks) { + setupTest(hooks); + + hooks.beforeEach(function() { + this.store = this.owner.lookup('service:store'); + this.subject = () => this.store.adapterFor('node'); + this.server = startMirage(); this.server.create('node', { id: 'node-1' }); this.server.create('node', { id: 'node-2' }); @@ -35,89 +20,90 @@ moduleForAdapter('node', 'Unit | Adapter | Node', { this.server.create('allocation', { id: 'node-1-2', nodeId: 'node-1' }); this.server.create('allocation', { id: 'node-2-1', nodeId: 'node-2' }); this.server.create('allocation', { id: 'node-2-2', nodeId: 'node-2' }); - }, - afterEach() { + }); + + hooks.afterEach(function() { this.server.shutdown(); - }, -}); + }); + + test('findHasMany removes old related models from the store', function(assert) { + let node; + run(() => { + // Fetch the model + this.store.findRecord('node', 'node-1').then(model => { + node = model; -test('findHasMany removes old related models from the store', function(assert) { - let node; - run(() => { - // Fetch the model - this.store.findRecord('node', 'node-1').then(model => { - node = model; - - // Fetch the related allocations - return findHasMany(model, 'allocations').then(allocations => { - assert.equal( - allocations.get('length'), - this.server.db.allocations.where({ nodeId: node.get('id') }).length, - 'Allocations returned from the findHasMany matches the db state' - ); + // Fetch the related allocations + return findHasMany(model, 'allocations').then(allocations => { + assert.equal( + allocations.get('length'), + this.server.db.allocations.where({ nodeId: node.get('id') }).length, + 'Allocations returned from the findHasMany matches the db state' + ); + }); }); }); - }); - return settled().then(() => { - server.db.allocations.remove('node-1-1'); + return settled().then(() => { + server.db.allocations.remove('node-1-1'); - run(() => { - // Reload the related allocations now that one was removed server-side - return findHasMany(node, 'allocations').then(allocations => { - const dbAllocations = this.server.db.allocations.where({ nodeId: node.get('id') }); - assert.equal( - allocations.get('length'), - dbAllocations.length, - 'Allocations returned from the findHasMany matches the db state' - ); - assert.equal( - this.store.peekAll('allocation').get('length'), - dbAllocations.length, - 'Server-side deleted allocation was removed from the store' - ); + run(() => { + // Reload the related allocations now that one was removed server-side + return findHasMany(node, 'allocations').then(allocations => { + const dbAllocations = this.server.db.allocations.where({ nodeId: node.get('id') }); + assert.equal( + allocations.get('length'), + dbAllocations.length, + 'Allocations returned from the findHasMany matches the db state' + ); + assert.equal( + this.store.peekAll('allocation').get('length'), + dbAllocations.length, + 'Server-side deleted allocation was removed from the store' + ); + }); }); }); }); -}); -test('findHasMany does not remove old unrelated models from the store', function(assert) { - let node; + test('findHasMany does not remove old unrelated models from the store', function(assert) { + let node; - run(() => { - // Fetch the first node and related allocations - this.store.findRecord('node', 'node-1').then(model => { - node = model; - return findHasMany(model, 'allocations'); - }); + run(() => { + // Fetch the first node and related allocations + this.store.findRecord('node', 'node-1').then(model => { + node = model; + return findHasMany(model, 'allocations'); + }); - // Also fetch the second node and related allocations; - this.store.findRecord('node', 'node-2').then(model => findHasMany(model, 'allocations')); - }); + // Also fetch the second node and related allocations; + this.store.findRecord('node', 'node-2').then(model => findHasMany(model, 'allocations')); + }); - return settled().then(() => { - assert.deepEqual( - this.store - .peekAll('allocation') - .mapBy('id') - .sort(), - ['node-1-1', 'node-1-2', 'node-2-1', 'node-2-2'], - 'All allocations for the first and second node are in the store' - ); + return settled().then(() => { + assert.deepEqual( + this.store + .peekAll('allocation') + .mapBy('id') + .sort(), + ['node-1-1', 'node-1-2', 'node-2-1', 'node-2-2'], + 'All allocations for the first and second node are in the store' + ); - server.db.allocations.remove('node-1-1'); + server.db.allocations.remove('node-1-1'); - run(() => { - // Reload the related allocations now that one was removed server-side - return findHasMany(node, 'allocations').then(() => { - assert.deepEqual( - this.store - .peekAll('allocation') - .mapBy('id') - .sort(), - ['node-1-2', 'node-2-1', 'node-2-2'], - 'The deleted allocation is removed from the store and the allocations associated with the other node are untouched' - ); + run(() => { + // Reload the related allocations now that one was removed server-side + return findHasMany(node, 'allocations').then(() => { + assert.deepEqual( + this.store + .peekAll('allocation') + .mapBy('id') + .sort(), + ['node-1-2', 'node-2-1', 'node-2-2'], + 'The deleted allocation is removed from the store and the allocations associated with the other node are untouched' + ); + }); }); }); }); From a35fd98a04791b69759221eaa5a07287e16efc5d Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 19:17:12 -0700 Subject: [PATCH 13/46] Update serializer unit tests to use module instead of custom code --- ui/tests/helpers/module-for-serializer.js | 22 -- ui/tests/unit/serializers/allocation-test.js | 240 ++++++++------- ui/tests/unit/serializers/deployment-test.js | 206 +++++++------ ui/tests/unit/serializers/evaluation-test.js | 162 +++++----- ui/tests/unit/serializers/job-plan-test.js | 146 +++++---- ui/tests/unit/serializers/job-summary-test.js | 163 +++++------ ui/tests/unit/serializers/job-test.js | 57 ++-- ui/tests/unit/serializers/node-test.js | 277 +++++++++--------- 8 files changed, 613 insertions(+), 660 deletions(-) delete mode 100644 ui/tests/helpers/module-for-serializer.js diff --git a/ui/tests/helpers/module-for-serializer.js b/ui/tests/helpers/module-for-serializer.js deleted file mode 100644 index 3003596720b..00000000000 --- a/ui/tests/helpers/module-for-serializer.js +++ /dev/null @@ -1,22 +0,0 @@ -import { module } from 'qunit'; -import { setupTest } from 'ember-qunit'; -import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; - -export default function(modelName, description, options = { needs: [] }) { - // moduleForModel correctly wires up #Serializer.store, - // but module does not. - module(description, function(hooks) { - setupTest(hooks); - this.store = this.owner.lookup('service:store'); - - // Initializers don't run automatically in unit tests - fragmentSerializerInitializer(this.owner); - - // Reassign the subject to provide the serializer - this.subject = () => this.store.serializerFor(modelName); - - if (options.beforeEach) { - options.beforeEach.apply(this, arguments); - } - }); -} diff --git a/ui/tests/unit/serializers/allocation-test.js b/ui/tests/unit/serializers/allocation-test.js index c713114f4c4..75b467c2622 100644 --- a/ui/tests/unit/serializers/allocation-test.js +++ b/ui/tests/unit/serializers/allocation-test.js @@ -1,149 +1,139 @@ -import { test } from 'qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import AllocationModel from 'nomad-ui/models/allocation'; -import moduleForSerializer from '../../helpers/module-for-serializer'; -moduleForSerializer('allocation', 'Unit | Serializer | Allocation', { - needs: [ - 'service:token', - 'service:system', - 'serializer:allocation', - 'transform:fragment', - 'transform:fragment-array', - 'model:job', - 'model:node', - 'model:namespace', - 'model:evaluation', - 'model:allocation', - 'model:resources', - 'model:task-state', - 'model:reschedule-event', - ], -}); +module('Unit | Serializer | Allocation', function(hooks) { + setupTest(hooks); + hooks.beforeEach(function() { + this.store = this.owner.lookup('service:store'); + this.subject = () => this.store.serializerFor('allocation'); + }); -const sampleDate = new Date('2018-12-12T00:00:00'); -const normalizationTestCases = [ - { - name: 'Normal', - in: { - ID: 'test-allocation', - JobID: 'test-summary', - Name: 'test-summary[1]', - Namespace: 'test-namespace', - TaskGroup: 'test-group', - CreateTime: +sampleDate * 1000000, - ModifyTime: +sampleDate * 1000000, - TaskStates: { - testTask: { - State: 'running', - Failed: false, + const sampleDate = new Date('2018-12-12T00:00:00'); + const normalizationTestCases = [ + { + name: 'Normal', + in: { + ID: 'test-allocation', + JobID: 'test-summary', + Name: 'test-summary[1]', + Namespace: 'test-namespace', + TaskGroup: 'test-group', + CreateTime: +sampleDate * 1000000, + ModifyTime: +sampleDate * 1000000, + TaskStates: { + testTask: { + State: 'running', + Failed: false, + }, }, }, - }, - out: { - data: { - id: 'test-allocation', - type: 'allocation', - attributes: { - taskGroupName: 'test-group', - name: 'test-summary[1]', - modifyTime: sampleDate, - createTime: sampleDate, - states: [ - { - name: 'testTask', - state: 'running', - failed: false, - }, - ], - }, - relationships: { - followUpEvaluation: { - data: null, + out: { + data: { + id: 'test-allocation', + type: 'allocation', + attributes: { + taskGroupName: 'test-group', + name: 'test-summary[1]', + modifyTime: sampleDate, + createTime: sampleDate, + states: [ + { + name: 'testTask', + state: 'running', + failed: false, + }, + ], }, - nextAllocation: { - data: null, - }, - previousAllocation: { - data: null, - }, - job: { - data: { - id: '["test-summary","test-namespace"]', - type: 'job', + relationships: { + followUpEvaluation: { + data: null, + }, + nextAllocation: { + data: null, + }, + previousAllocation: { + data: null, + }, + job: { + data: { + id: '["test-summary","test-namespace"]', + type: 'job', + }, }, }, }, }, }, - }, - { - name: 'Dots in task names', - in: { - ID: 'test-allocation', - JobID: 'test-summary', - Name: 'test-summary[1]', - Namespace: 'test-namespace', - TaskGroup: 'test-group', - CreateTime: +sampleDate * 1000000, - ModifyTime: +sampleDate * 1000000, - TaskStates: { - 'one.two': { - State: 'running', - Failed: false, - }, - 'three.four': { - State: 'pending', - Failed: true, + { + name: 'Dots in task names', + in: { + ID: 'test-allocation', + JobID: 'test-summary', + Name: 'test-summary[1]', + Namespace: 'test-namespace', + TaskGroup: 'test-group', + CreateTime: +sampleDate * 1000000, + ModifyTime: +sampleDate * 1000000, + TaskStates: { + 'one.two': { + State: 'running', + Failed: false, + }, + 'three.four': { + State: 'pending', + Failed: true, + }, }, }, - }, - out: { - data: { - id: 'test-allocation', - type: 'allocation', - attributes: { - taskGroupName: 'test-group', - name: 'test-summary[1]', - modifyTime: sampleDate, - createTime: sampleDate, - states: [ - { - name: 'one.two', - state: 'running', - failed: false, + out: { + data: { + id: 'test-allocation', + type: 'allocation', + attributes: { + taskGroupName: 'test-group', + name: 'test-summary[1]', + modifyTime: sampleDate, + createTime: sampleDate, + states: [ + { + name: 'one.two', + state: 'running', + failed: false, + }, + { + name: 'three.four', + state: 'pending', + failed: true, + }, + ], + }, + relationships: { + followUpEvaluation: { + data: null, }, - { - name: 'three.four', - state: 'pending', - failed: true, + nextAllocation: { + data: null, }, - ], - }, - relationships: { - followUpEvaluation: { - data: null, - }, - nextAllocation: { - data: null, - }, - previousAllocation: { - data: null, - }, - job: { - data: { - id: '["test-summary","test-namespace"]', - type: 'job', + previousAllocation: { + data: null, + }, + job: { + data: { + id: '["test-summary","test-namespace"]', + type: 'job', + }, }, }, }, }, }, - }, -]; + ]; -normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { - assert.deepEqual(this.subject().normalize(AllocationModel, testCase.in), testCase.out); + normalizationTestCases.forEach(testCase => { + test(`normalization: ${testCase.name}`, function(assert) { + assert.deepEqual(this.subject().normalize(AllocationModel, testCase.in), testCase.out); + }); }); }); diff --git a/ui/tests/unit/serializers/deployment-test.js b/ui/tests/unit/serializers/deployment-test.js index 5797dd8225b..486986a2d9c 100644 --- a/ui/tests/unit/serializers/deployment-test.js +++ b/ui/tests/unit/serializers/deployment-test.js @@ -1,129 +1,127 @@ -import { test } from 'qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import DeploymentModel from 'nomad-ui/models/deployment'; -import moduleForSerializer from '../../helpers/module-for-serializer'; -moduleForSerializer('deployment', 'Unit | Serializer | Deployment', { - needs: [ - 'adapter:application', - 'serializer:deployment', - 'service:system', - 'service:token', - 'transform:fragment-array', - 'model:allocation', - 'model:job', - 'model:task-group-deployment-summary', - ], -}); +module('Unit | Serializer | Deployment', function(hooks) { + setupTest(hooks); + hooks.beforeEach(function() { + this.store = this.owner.lookup('service:store'); + this.subject = () => this.store.serializerFor('deployment'); + }); -const normalizationTestCases = [ - { - name: 'Normal', - in: { - ID: 'test-deployment', - JobID: 'test-job', - Namespace: 'test-namespace', - Status: 'canceled', - TaskGroups: { - taskGroup: { - DesiredCanaries: 2, + const normalizationTestCases = [ + { + name: 'Normal', + in: { + ID: 'test-deployment', + JobID: 'test-job', + Namespace: 'test-namespace', + Status: 'canceled', + TaskGroups: { + taskGroup: { + DesiredCanaries: 2, + }, }, }, - }, - out: { - data: { - id: 'test-deployment', - type: 'deployment', - attributes: { - status: 'canceled', - taskGroupSummaries: [ - { - name: 'taskGroup', - desiredCanaries: 2, - }, - ], - }, - relationships: { - allocations: { - links: { - related: '/v1/deployment/allocations/test-deployment', - }, + out: { + data: { + id: 'test-deployment', + type: 'deployment', + attributes: { + status: 'canceled', + taskGroupSummaries: [ + { + name: 'taskGroup', + desiredCanaries: 2, + placedCanaryAllocations: [], + }, + ], }, - job: { - data: { - id: '["test-job","test-namespace"]', - type: 'job', + relationships: { + allocations: { + links: { + related: '/v1/deployment/allocations/test-deployment', + }, }, - }, - jobForLatest: { - data: { - id: '["test-job","test-namespace"]', - type: 'job', + job: { + data: { + id: '["test-job","test-namespace"]', + type: 'job', + }, + }, + jobForLatest: { + data: { + id: '["test-job","test-namespace"]', + type: 'job', + }, }, }, }, }, }, - }, - { - name: 'Dots in task group names', - in: { - ID: 'test-deployment', - JobID: 'test-job', - Namespace: 'test-namespace', - Status: 'canceled', - TaskGroups: { - 'one.two': { - DesiredCanaries: 2, - }, - 'three.four': { - DesiredCanaries: 3, + { + name: 'Dots in task group names', + in: { + ID: 'test-deployment', + JobID: 'test-job', + Namespace: 'test-namespace', + Status: 'canceled', + TaskGroups: { + 'one.two': { + DesiredCanaries: 2, + }, + 'three.four': { + DesiredCanaries: 3, + }, }, }, - }, - out: { - data: { - id: 'test-deployment', - type: 'deployment', - attributes: { - status: 'canceled', - taskGroupSummaries: [ - { - name: 'one.two', - desiredCanaries: 2, - }, - { - name: 'three.four', - desiredCanaries: 3, - }, - ], - }, - relationships: { - allocations: { - links: { - related: '/v1/deployment/allocations/test-deployment', - }, + out: { + data: { + id: 'test-deployment', + type: 'deployment', + attributes: { + status: 'canceled', + taskGroupSummaries: [ + { + name: 'one.two', + desiredCanaries: 2, + placedCanaryAllocations: [], + }, + { + name: 'three.four', + desiredCanaries: 3, + placedCanaryAllocations: [], + }, + ], }, - job: { - data: { - id: '["test-job","test-namespace"]', - type: 'job', + relationships: { + allocations: { + links: { + related: '/v1/deployment/allocations/test-deployment', + }, }, - }, - jobForLatest: { - data: { - id: '["test-job","test-namespace"]', - type: 'job', + job: { + data: { + id: '["test-job","test-namespace"]', + type: 'job', + }, + }, + jobForLatest: { + data: { + id: '["test-job","test-namespace"]', + type: 'job', + }, }, }, }, }, }, - }, -]; + ]; -normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { - assert.deepEqual(this.subject().normalize(DeploymentModel, testCase.in), testCase.out); + normalizationTestCases.forEach(testCase => { + test(`normalization: ${testCase.name}`, function(assert) { + assert.deepEqual(this.subject().normalize(DeploymentModel, testCase.in), testCase.out); + }); }); }); diff --git a/ui/tests/unit/serializers/evaluation-test.js b/ui/tests/unit/serializers/evaluation-test.js index 22fb2ad316f..82e0175a5cb 100644 --- a/ui/tests/unit/serializers/evaluation-test.js +++ b/ui/tests/unit/serializers/evaluation-test.js @@ -1,104 +1,102 @@ -import { test } from 'qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import EvaluationModel from 'nomad-ui/models/evaluation'; -import moduleForSerializer from '../../helpers/module-for-serializer'; -moduleForSerializer('evaluation', 'Unit | Serializer | Evaluation', { - needs: [ - 'serializer:evaluation', - 'service:system', - 'transform:fragment-array', - 'model:job', - 'model:placement-failure', - ], -}); +module('Unit | Serializer | Evaluation', function(hooks) { + setupTest(hooks); + hooks.beforeEach(function() { + this.store = this.owner.lookup('service:store'); + this.subject = () => this.store.serializerFor('evaluation'); + }); -const normalizationTestCases = [ - { - name: 'Normal', - in: { - ID: 'test-eval', - FailedTGAllocs: { - taskGroup: { - NodesAvailable: 10, + const normalizationTestCases = [ + { + name: 'Normal', + in: { + ID: 'test-eval', + FailedTGAllocs: { + taskGroup: { + NodesAvailable: 10, + }, }, - }, - JobID: 'some-job-id', - Job: { - Namespace: 'test-namespace', - }, - }, - out: { - data: { - id: 'test-eval', - type: 'evaluation', - attributes: { - failedTGAllocs: [ - { - name: 'taskGroup', - nodesAvailable: 10, - }, - ], + JobID: 'some-job-id', + Job: { + Namespace: 'test-namespace', }, - relationships: { - job: { - data: { - id: '["some-job-id","test-namespace"]', - type: 'job', + }, + out: { + data: { + id: 'test-eval', + type: 'evaluation', + attributes: { + failedTGAllocs: [ + { + name: 'taskGroup', + nodesAvailable: 10, + }, + ], + }, + relationships: { + job: { + data: { + id: '["some-job-id","test-namespace"]', + type: 'job', + }, }, }, }, }, }, - }, - { - name: 'Dots in task group names', - in: { - ID: 'test-eval', - FailedTGAllocs: { - 'one.two': { - NodesAvailable: 10, + { + name: 'Dots in task group names', + in: { + ID: 'test-eval', + FailedTGAllocs: { + 'one.two': { + NodesAvailable: 10, + }, + 'three.four': { + NodesAvailable: 25, + }, }, - 'three.four': { - NodesAvailable: 25, + JobID: 'some-job-id', + Job: { + Namespace: 'test-namespace', }, }, - JobID: 'some-job-id', - Job: { - Namespace: 'test-namespace', - }, - }, - out: { - data: { - id: 'test-eval', - type: 'evaluation', - attributes: { - failedTGAllocs: [ - { - name: 'one.two', - nodesAvailable: 10, - }, - { - name: 'three.four', - nodesAvailable: 25, - }, - ], - }, - relationships: { - job: { - data: { - id: '["some-job-id","test-namespace"]', - type: 'job', + out: { + data: { + id: 'test-eval', + type: 'evaluation', + attributes: { + failedTGAllocs: [ + { + name: 'one.two', + nodesAvailable: 10, + }, + { + name: 'three.four', + nodesAvailable: 25, + }, + ], + }, + relationships: { + job: { + data: { + id: '["some-job-id","test-namespace"]', + type: 'job', + }, }, }, }, }, }, - }, -]; + ]; -normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { - assert.deepEqual(this.subject().normalize(EvaluationModel, testCase.in), testCase.out); + normalizationTestCases.forEach(testCase => { + test(`normalization: ${testCase.name}`, function(assert) { + assert.deepEqual(this.subject().normalize(EvaluationModel, testCase.in), testCase.out); + }); }); }); diff --git a/ui/tests/unit/serializers/job-plan-test.js b/ui/tests/unit/serializers/job-plan-test.js index bef598c6afa..8fa49f58f10 100644 --- a/ui/tests/unit/serializers/job-plan-test.js +++ b/ui/tests/unit/serializers/job-plan-test.js @@ -1,94 +1,92 @@ -import { test } from 'qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import JobPlanModel from 'nomad-ui/models/job-plan'; -import moduleForSerializer from '../../helpers/module-for-serializer'; -moduleForSerializer('job-plan', 'Unit | Serializer | JobPlan', { - needs: [ - 'service:token', - 'service:system', - 'serializer:job-plan', - 'transform:fragment-array', - 'model:placement-failure', - ], -}); +module('Unit | Serializer | JobPlan', function(hooks) { + setupTest(hooks); + hooks.beforeEach(function() { + this.store = this.owner.lookup('service:store'); + this.subject = () => this.store.serializerFor('job-plan'); + }); -const normalizationTestCases = [ - { - name: 'Normal', - in: { - ID: 'test-plan', - Diff: { - Arbitrary: 'Value', - }, - FailedTGAllocs: { - taskGroup: { - NodesAvailable: 10, + const normalizationTestCases = [ + { + name: 'Normal', + in: { + ID: 'test-plan', + Diff: { + Arbitrary: 'Value', }, - }, - }, - out: { - data: { - id: 'test-plan', - type: 'job-plan', - attributes: { - diff: { - Arbitrary: 'Value', + FailedTGAllocs: { + taskGroup: { + NodesAvailable: 10, }, - failedTGAllocs: [ - { - name: 'taskGroup', - nodesAvailable: 10, + }, + }, + out: { + data: { + id: 'test-plan', + type: 'job-plan', + attributes: { + diff: { + Arbitrary: 'Value', }, - ], + failedTGAllocs: [ + { + name: 'taskGroup', + nodesAvailable: 10, + }, + ], + }, + relationships: {}, }, - relationships: {}, }, }, - }, - { - name: 'Dots in task names', - in: { - ID: 'test-plan', - Diff: { - Arbitrary: 'Value', - }, - FailedTGAllocs: { - 'one.two': { - NodesAvailable: 10, + { + name: 'Dots in task names', + in: { + ID: 'test-plan', + Diff: { + Arbitrary: 'Value', }, - 'three.four': { - NodesAvailable: 25, + FailedTGAllocs: { + 'one.two': { + NodesAvailable: 10, + }, + 'three.four': { + NodesAvailable: 25, + }, }, }, - }, - out: { - data: { - id: 'test-plan', - type: 'job-plan', - attributes: { - diff: { - Arbitrary: 'Value', - }, - failedTGAllocs: [ - { - name: 'one.two', - nodesAvailable: 10, - }, - { - name: 'three.four', - nodesAvailable: 25, + out: { + data: { + id: 'test-plan', + type: 'job-plan', + attributes: { + diff: { + Arbitrary: 'Value', }, - ], + failedTGAllocs: [ + { + name: 'one.two', + nodesAvailable: 10, + }, + { + name: 'three.four', + nodesAvailable: 25, + }, + ], + }, + relationships: {}, }, - relationships: {}, }, }, - }, -]; + ]; -normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { - assert.deepEqual(this.subject().normalize(JobPlanModel, testCase.in), testCase.out); + normalizationTestCases.forEach(testCase => { + test(`normalization: ${testCase.name}`, function(assert) { + assert.deepEqual(this.subject().normalize(JobPlanModel, testCase.in), testCase.out); + }); }); }); diff --git a/ui/tests/unit/serializers/job-summary-test.js b/ui/tests/unit/serializers/job-summary-test.js index a3190df70db..d7aff79228e 100644 --- a/ui/tests/unit/serializers/job-summary-test.js +++ b/ui/tests/unit/serializers/job-summary-test.js @@ -1,103 +1,102 @@ -import { test } from 'qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import JobSummaryModel from 'nomad-ui/models/job-summary'; -import moduleForSerializer from '../../helpers/module-for-serializer'; -moduleForSerializer('job-summary', 'Unit | Serializer | JobSummary', { - needs: [ - 'serializer:job-summary', - 'transform:fragment-array', - 'model:job', - 'model:task-group-summary', - ], -}); +module('Unit | Serializer | JobSummary', function(hooks) { + setupTest(hooks); + hooks.beforeEach(function() { + this.store = this.owner.lookup('service:store'); + this.subject = () => this.store.serializerFor('job-summary'); + }); -const normalizationTestCases = [ - { - name: 'Normal', - in: { - JobID: 'test-summary', - Namespace: 'test-namespace', - Summary: { - taskGroup: { - Complete: 0, - Running: 1, + const normalizationTestCases = [ + { + name: 'Normal', + in: { + JobID: 'test-summary', + Namespace: 'test-namespace', + Summary: { + taskGroup: { + Complete: 0, + Running: 1, + }, }, }, - }, - out: { - data: { - id: '["test-summary","test-namespace"]', - type: 'job-summary', - attributes: { - taskGroupSummaries: [ - { - name: 'taskGroup', - completeAllocs: 0, - runningAllocs: 1, - }, - ], - }, - relationships: { - job: { - data: { - id: '["test-summary","test-namespace"]', - type: 'job', + out: { + data: { + id: '["test-summary","test-namespace"]', + type: 'job-summary', + attributes: { + taskGroupSummaries: [ + { + name: 'taskGroup', + completeAllocs: 0, + runningAllocs: 1, + }, + ], + }, + relationships: { + job: { + data: { + id: '["test-summary","test-namespace"]', + type: 'job', + }, }, }, }, }, }, - }, - { - name: 'Dots in task group names', - in: { - JobID: 'test-summary', - Namespace: 'test-namespace', - Summary: { - 'one.two': { - Complete: 0, - Running: 1, - }, - 'three.four': { - Failed: 2, - Lost: 3, + { + name: 'Dots in task group names', + in: { + JobID: 'test-summary', + Namespace: 'test-namespace', + Summary: { + 'one.two': { + Complete: 0, + Running: 1, + }, + 'three.four': { + Failed: 2, + Lost: 3, + }, }, }, - }, - out: { - data: { - id: '["test-summary","test-namespace"]', - type: 'job-summary', - attributes: { - taskGroupSummaries: [ - { - name: 'one.two', - completeAllocs: 0, - runningAllocs: 1, - }, - { - name: 'three.four', - failedAllocs: 2, - lostAllocs: 3, - }, - ], - }, - relationships: { - job: { - data: { - id: '["test-summary","test-namespace"]', - type: 'job', + out: { + data: { + id: '["test-summary","test-namespace"]', + type: 'job-summary', + attributes: { + taskGroupSummaries: [ + { + name: 'one.two', + completeAllocs: 0, + runningAllocs: 1, + }, + { + name: 'three.four', + failedAllocs: 2, + lostAllocs: 3, + }, + ], + }, + relationships: { + job: { + data: { + id: '["test-summary","test-namespace"]', + type: 'job', + }, }, }, }, }, }, - }, -]; + ]; -normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { - assert.deepEqual(this.subject().normalize(JobSummaryModel, testCase.in), testCase.out); + normalizationTestCases.forEach(testCase => { + test(`normalization: ${testCase.name}`, function(assert) { + assert.deepEqual(this.subject().normalize(JobSummaryModel, testCase.in), testCase.out); + }); }); }); diff --git a/ui/tests/unit/serializers/job-test.js b/ui/tests/unit/serializers/job-test.js index ab9f2c08e87..b552d2cbb3d 100644 --- a/ui/tests/unit/serializers/job-test.js +++ b/ui/tests/unit/serializers/job-test.js @@ -1,36 +1,35 @@ -import { test } from 'qunit'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import JobModel from 'nomad-ui/models/job'; -import moduleForSerializer from '../../helpers/module-for-serializer'; -moduleForSerializer('job', 'Unit | Serializer | Job', { - needs: [ - 'serializer:job', - 'model:task-group-summary', - 'model:task-group', - 'transform:fragment-array', - ], -}); +module('Unit | Serializer | Job', function(hooks) { + setupTest(hooks); + hooks.beforeEach(function() { + this.store = this.owner.lookup('service:store'); + this.subject = () => this.store.serializerFor('job'); + }); -test('`default` is used as the namespace in the job ID when there is no namespace in the payload', function(assert) { - const original = { - ID: 'example', - Name: 'example', - }; + test('`default` is used as the namespace in the job ID when there is no namespace in the payload', function(assert) { + const original = { + ID: 'example', + Name: 'example', + }; - const { data } = this.subject().normalize(JobModel, original); - assert.equal(data.id, JSON.stringify([data.attributes.name, 'default'])); -}); + const { data } = this.subject().normalize(JobModel, original); + assert.equal(data.id, JSON.stringify([data.attributes.name, 'default'])); + }); -test('The ID of the record is a composite of both the name and the namespace', function(assert) { - const original = { - ID: 'example', - Name: 'example', - Namespace: 'special-namespace', - }; + test('The ID of the record is a composite of both the name and the namespace', function(assert) { + const original = { + ID: 'example', + Name: 'example', + Namespace: 'special-namespace', + }; - const { data } = this.subject().normalize(JobModel, original); - assert.equal( - data.id, - JSON.stringify([data.attributes.name, data.relationships.namespace.data.id]) - ); + const { data } = this.subject().normalize(JobModel, original); + assert.equal( + data.id, + JSON.stringify([data.attributes.name, data.relationships.namespace.data.id]) + ); + }); }); diff --git a/ui/tests/unit/serializers/node-test.js b/ui/tests/unit/serializers/node-test.js index e0cd16d750d..30cb48db49d 100644 --- a/ui/tests/unit/serializers/node-test.js +++ b/ui/tests/unit/serializers/node-test.js @@ -1,71 +1,31 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; import { run } from '@ember/runloop'; -import { test } from 'qunit'; import NodeModel from 'nomad-ui/models/node'; -import moduleForSerializer from '../../helpers/module-for-serializer'; import pushPayloadToStore from '../../utils/push-payload-to-store'; import { settled } from '@ember/test-helpers'; -moduleForSerializer('node', 'Unit | Serializer | Node', { - needs: [ - 'adapter:application', - 'service:config', - 'serializer:node', - 'service:system', - 'service:token', - 'transform:fragment', - 'transform:fragment-array', - 'model:node-attributes', - 'model:resources', - 'model:drain-strategy', - 'model:node-driver', - 'model:node-event', - 'model:allocation', - 'model:job', - ], -}); - -test('local store is culled to reflect the state of findAll requests', function(assert) { - const findAllResponse = [ - makeNode('1', 'One', '127.0.0.1:4646'), - makeNode('2', 'Two', '127.0.0.2:4646'), - makeNode('3', 'Three', '127.0.0.3:4646'), - ]; - - const payload = this.subject().normalizeFindAllResponse(this.store, NodeModel, findAllResponse); - pushPayloadToStore(this.store, payload, NodeModel.modelName); - - assert.equal( - payload.data.length, - findAllResponse.length, - 'Each original record is returned in the response' - ); - - assert.equal( - this.store - .peekAll('node') - .filterBy('id') - .get('length'), - findAllResponse.length, - 'Each original record is now in the store' - ); +module('Unit | Serializer | Node', function(hooks) { + setupTest(hooks); + hooks.beforeEach(function() { + this.store = this.owner.lookup('service:store'); + this.subject = () => this.store.serializerFor('node'); + }); - const newFindAllResponse = [ - makeNode('2', 'Two', '127.0.0.2:4646'), - makeNode('3', 'Three', '127.0.0.3:4646'), - makeNode('4', 'Four', '127.0.0.4:4646'), - ]; + test('local store is culled to reflect the state of findAll requests', function(assert) { + const findAllResponse = [ + makeNode('1', 'One', '127.0.0.1:4646'), + makeNode('2', 'Two', '127.0.0.2:4646'), + makeNode('3', 'Three', '127.0.0.3:4646'), + ]; - let newPayload; - run(() => { - newPayload = this.subject().normalizeFindAllResponse(this.store, NodeModel, newFindAllResponse); - }); - pushPayloadToStore(this.store, newPayload, NodeModel.modelName); + const payload = this.subject().normalizeFindAllResponse(this.store, NodeModel, findAllResponse); + pushPayloadToStore(this.store, payload, NodeModel.modelName); - return settled().then(() => { assert.equal( - newPayload.data.length, - newFindAllResponse.length, - 'Each new record is returned in the response' + payload.data.length, + findAllResponse.length, + 'Each original record is returned in the response' ); assert.equal( @@ -73,109 +33,142 @@ test('local store is culled to reflect the state of findAll requests', function( .peekAll('node') .filterBy('id') .get('length'), - newFindAllResponse.length, - 'The node length in the store reflects the new response' + findAllResponse.length, + 'Each original record is now in the store' ); - assert.notOk(this.store.peekAll('node').findBy('id', '1'), 'Record One is no longer found'); + const newFindAllResponse = [ + makeNode('2', 'Two', '127.0.0.2:4646'), + makeNode('3', 'Three', '127.0.0.3:4646'), + makeNode('4', 'Four', '127.0.0.4:4646'), + ]; + + let newPayload; + run(() => { + newPayload = this.subject().normalizeFindAllResponse( + this.store, + NodeModel, + newFindAllResponse + ); + }); + pushPayloadToStore(this.store, newPayload, NodeModel.modelName); + + return settled().then(() => { + assert.equal( + newPayload.data.length, + newFindAllResponse.length, + 'Each new record is returned in the response' + ); + + assert.equal( + this.store + .peekAll('node') + .filterBy('id') + .get('length'), + newFindAllResponse.length, + 'The node length in the store reflects the new response' + ); + + assert.notOk(this.store.peekAll('node').findBy('id', '1'), 'Record One is no longer found'); + }); }); -}); -function makeNode(id, name, ip) { - return { ID: id, Name: name, HTTPAddr: ip }; -} + function makeNode(id, name, ip) { + return { ID: id, Name: name, HTTPAddr: ip }; + } -const normalizationTestCases = [ - { - name: 'Normal', - in: { - ID: 'test-node', - HTTPAddr: '867.53.0.9:4646', - Drain: false, - Drivers: { - docker: { - Detected: true, - Healthy: false, + const normalizationTestCases = [ + { + name: 'Normal', + in: { + ID: 'test-node', + HTTPAddr: '867.53.0.9:4646', + Drain: false, + Drivers: { + docker: { + Detected: true, + Healthy: false, + }, }, }, - }, - out: { - data: { - id: 'test-node', - type: 'node', - attributes: { - isDraining: false, - httpAddr: '867.53.0.9:4646', - drivers: [ - { - name: 'docker', - detected: true, - healthy: false, - }, - ], - }, - relationships: { - allocations: { - links: { - related: '/v1/node/test-node/allocations', + out: { + data: { + id: 'test-node', + type: 'node', + attributes: { + isDraining: false, + httpAddr: '867.53.0.9:4646', + drivers: [ + { + name: 'docker', + detected: true, + healthy: false, + }, + ], + }, + relationships: { + allocations: { + links: { + related: '/v1/node/test-node/allocations', + }, }, }, }, }, }, - }, - { - name: 'Dots in driver names', - in: { - ID: 'test-node', - HTTPAddr: '867.53.0.9:4646', - Drain: false, - Drivers: { - 'my.driver': { - Detected: true, - Healthy: false, - }, - 'my.other.driver': { - Detected: false, - Healthy: false, + { + name: 'Dots in driver names', + in: { + ID: 'test-node', + HTTPAddr: '867.53.0.9:4646', + Drain: false, + Drivers: { + 'my.driver': { + Detected: true, + Healthy: false, + }, + 'my.other.driver': { + Detected: false, + Healthy: false, + }, }, }, - }, - out: { - data: { - id: 'test-node', - type: 'node', - attributes: { - isDraining: false, - httpAddr: '867.53.0.9:4646', - drivers: [ - { - name: 'my.driver', - detected: true, - healthy: false, - }, - { - name: 'my.other.driver', - detected: false, - healthy: false, - }, - ], - }, - relationships: { - allocations: { - links: { - related: '/v1/node/test-node/allocations', + out: { + data: { + id: 'test-node', + type: 'node', + attributes: { + isDraining: false, + httpAddr: '867.53.0.9:4646', + drivers: [ + { + name: 'my.driver', + detected: true, + healthy: false, + }, + { + name: 'my.other.driver', + detected: false, + healthy: false, + }, + ], + }, + relationships: { + allocations: { + links: { + related: '/v1/node/test-node/allocations', + }, }, }, }, }, }, - }, -]; + ]; -normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { - assert.deepEqual(this.subject().normalize(NodeModel, testCase.in), testCase.out); + normalizationTestCases.forEach(testCase => { + test(`normalization: ${testCase.name}`, function(assert) { + assert.deepEqual(this.subject().normalize(NodeModel, testCase.in), testCase.out); + }); }); }); From 205797dcc0650d58b71db96e32844b152dd9e232 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 23:42:57 -0700 Subject: [PATCH 14/46] Upgrade ember-power-select --- ui/package.json | 2 +- ui/yarn.lock | 1054 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 1012 insertions(+), 44 deletions(-) diff --git a/ui/package.json b/ui/package.json index a41f288804b..436caae35ca 100644 --- a/ui/package.json +++ b/ui/package.json @@ -63,7 +63,7 @@ "ember-maybe-import-regenerator": "^0.1.6", "ember-moment": "^7.5.0", "ember-native-dom-helpers": "^0.5.4", - "ember-power-select": "^1.10.4", + "ember-power-select": "^2.2.3", "ember-resolver": "^4.5.0", "ember-responsive": "^3.0.0", "ember-sinon": "^1.0.1", diff --git a/ui/yarn.lock b/ui/yarn.lock index 500340dc9b3..2f608e1a4aa 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2,6 +2,621 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.0.0", "@babel/core@^7.3.3": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" + integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.3.4" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.3.4" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.4" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" + integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg== + dependencies: + "@babel/types" "^7.3.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" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@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" + integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" + integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.3.4.tgz#a795208e9b911a6eeb08e5891faacf06e7013e13" + integrity sha512-pvObL9WVf2ADs+ePg0jrqlhHoxRXlOa+SHRHzAXIz2xkYuOHfGl+fKxPMaS4Fq+uje8JQPobnertBBvyrWnQ1A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.3.4" + "@babel/types" "^7.3.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" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.2.0": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.3.1.tgz#949eec9ea4b45d3210feb7dc1c22db664c9e44b9" + integrity sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA== + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.3.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.2.2", "@babel/parser@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" + integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.4.tgz#47f73cf7f2a721aad5c0261205405c642e424654" + integrity sha512-j7VQmbbkA+qrzNqbKHrBsW3ddFnOeva6wzSe/zB7T+xaxGc+RCpwo44wCmRixAIGRoIpmVgvzFzNJqQcO3/9RA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" + integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.3.4.tgz#4e45408d3c3da231c0e7b823f407a53a7eb3048c" + integrity sha512-Y7nCzv2fw/jEZ9f678MuKdMo99MFDJMT/PvD9LisrR5JDFcJH6vYeH6RnjVt3p5tceyGRvTtEN0VOlU+rgHZjA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.3.4.tgz#5c22c339de234076eee96c8783b2fed61202c5c4" + integrity sha512-blRr2O8IOZLAOJklXLV4WhcEzpYafYQKSGT3+R26lWG41u/FODJuBggehtOwilVAcFu393v3OFj+HmaE6tVjhA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.3.4.tgz#dc173cb999c6c5297e0b5f2277fdaaec3739d0cc" + integrity sha512-J9fAvCFBkXEvBimgYxCjvaVDzL6thk0j0dBvCeZmIUDBwyt+nv6HfbImsSrWsYXfDNDivyANgJlFXDUWRTZBuA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.3.4" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.2.0": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz#f2f5520be055ba1c38c41c0e094d8a461dd78f2d" + integrity sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" + integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" + integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" + integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" + integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.3.4.tgz#813b34cd9acb6ba70a84939f3680be0eb2e58861" + integrity sha512-VZ4+jlGOF36S7TjKs8g4ojp4MEI+ebCQZdswWb/T9I4X84j8OtFAyjXjt/M16iIm5RIZn0UMQgg/VgIwo/87vw== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz#140b52985b2d6ef0cb092ef3b29502b990f9cd50" + integrity sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw== + dependencies: + regexp-tree "^0.1.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.2.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.3.3.tgz#3a873e07114e1a5bee17d04815662c8317f10e30" + integrity sha512-IrIP25VvXWu/VlBWTpsjGptpomtIkYrN/3aDp4UKm7xK6UxZY88kcJ1UwETbzHAlwN21MnNfwlar0u8y3KpiXw== + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.3.4.tgz#1601655c362f5b38eead6a52631f5106b29fa46a" + integrity sha512-hvJg8EReQvXT6G9H2MvNPXkv9zK36Vxa1+csAVTpE1J3j0zlHplw76uudEbJxgvqZzAq9Yh45FLD4pk5mKRFQA== + dependencies: + regenerator-transform "^0.13.4" + +"@babel/plugin-transform-runtime@^7.2.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.3.4.tgz#57805ac8c1798d102ecd75c03b024a5b3ea9b431" + integrity sha512-PaoARuztAdd5MgeVjAxnIDAIUet5KpogqaefQvPOmPYCxYoaPhautxDh3aO8a4xHsKgT/b9gSxR0BKK1MIewPA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" + integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/polyfill@^7.0.0": + version "7.2.5" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.2.5.tgz#6c54b964f71ad27edddc567d065e57e87ed7fa7d" + integrity sha512-8Y/t3MWThtMLYr0YNC/Q76tqN1w30+b0uQMeFUYauG2UGTR19zyUtFrAzT23zNtBxPp+LbE5E/nwV/q/r3y6ug== + dependencies: + core-js "^2.5.7" + regenerator-runtime "^0.12.0" + +"@babel/preset-env@^7.0.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.4.tgz#887cf38b6d23c82f19b5135298bdb160062e33e1" + integrity sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.3.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.3.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.3.4" + "@babel/plugin-transform-classes" "^7.3.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.3.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.3.4" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/runtime@^7.2.0": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" + integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" + integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" + integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.3.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.3.4" + "@babel/types" "^7.3.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" + integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + "@ember/test-helpers@^0.7.9": version "0.7.13" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.13.tgz#89523a101b5bd731e9dcaf7d0c57155b6386a4e3" @@ -23,6 +638,11 @@ dependencies: "@glimmer/di" "^0.2.0" +"@types/minimatch@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + "@webassemblyjs/ast@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" @@ -307,6 +927,14 @@ amd-name-resolver@1.2.0: dependencies: ensure-posix-path "^1.0.1" +amd-name-resolver@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.3.1.tgz#ffe71c683c6e7191fc4ae1bb3aaed15abea135d9" + integrity sha512-26qTEWqZQ+cxSYygZ4Cf8tsjDBLceJahhtewxtKZA3SRa4PluuqYCuheemDQD+7Mf5B7sr+zhTDWAHDh02a1Dw== + dependencies: + ensure-posix-path "^1.0.1" + object-hash "^1.3.1" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -914,6 +1542,13 @@ babel-plugin-debug-macros@^0.2.0-beta.6: dependencies: semver "^5.3.0" +babel-plugin-debug-macros@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.0.tgz#7a025944faef0777804ef3518c54e8b040197397" + integrity sha512-D6qYBI/3+FvcKVnRnH6FBUwXPp/5o/jnJNVFKqVaZpYAWx88+R8jNNyaEX7iQFs7UfCib6rcY/9+ICR4jhjFCQ== + dependencies: + semver "^5.3.0" + babel-plugin-ember-modules-api-polyfill@^1.4.2: version "1.6.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-1.6.0.tgz#abd1afa4237b3121cb51222f9bf3283cad8990aa" @@ -928,7 +1563,7 @@ babel-plugin-ember-modules-api-polyfill@^2.3.0: dependencies: ember-rfc176-data "^0.3.0" -babel-plugin-ember-modules-api-polyfill@^2.6.0: +babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.7.0.tgz#dcd6a9999da0d47d8c9185362bda6244ca525f4a" integrity sha512-+QXPqmRngp13d7nKWrBcL6iIixpuyMNq107XV1dKvsvAO5BGFQ0mSk7Dl6/OgG+z2F1KquxkFfdXYBwbREQI6A== @@ -970,6 +1605,17 @@ babel-plugin-member-expression-literals@^1.0.1: resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" integrity sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM= +babel-plugin-module-resolver@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" + integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA== + dependencies: + find-babel-config "^1.1.0" + glob "^7.1.2" + pkg-up "^2.0.0" + reselect "^3.0.1" + resolve "^1.4.0" + babel-plugin-property-literals@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" @@ -1699,6 +2345,23 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" +broccoli-babel-transpiler@^7.1.2: + version "7.2.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.2.0.tgz#5c0d694c4055106abb385e2d3d88936d35b7cb18" + integrity sha512-lkP9dNFfK810CRHHWsNl9rjyYqcXH3qg0kArnA6tV9Owx3nlZm3Eyr0cGo6sMUQCNLH+2oKrRjOdUGSc6Um6Cw== + dependencies: + "@babel/core" "^7.3.3" + "@babel/polyfill" "^7.0.0" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + broccoli-persistent-filter "^2.2.1" + clone "^2.1.2" + hash-for-dep "^1.4.7" + heimdalljs-logger "^0.1.9" + json-stable-stringify "^1.0.1" + rsvp "^4.8.4" + workerpool "^3.1.1" + broccoli-builder@^0.18.8: version "0.18.10" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.10.tgz#9767e0061ff5b5e6eb1619d1a972ef2c7fd07631" @@ -1895,6 +2558,25 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" +broccoli-funnel@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75" + integrity sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ== + dependencies: + array-equal "^1.0.0" + blank-object "^1.0.1" + broccoli-plugin "^1.3.0" + debug "^2.2.0" + fast-ordered-set "^1.0.0" + fs-tree-diff "^0.5.3" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + mkdirp "^0.5.0" + path-posix "^1.0.0" + rimraf "^2.4.3" + symlink-or-copy "^1.0.0" + walk-sync "^0.3.1" + broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@^0.2.6, broccoli-kitchen-sink-helpers@~0.2.0, broccoli-kitchen-sink-helpers@~0.2.4: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" @@ -1954,7 +2636,7 @@ broccoli-merge-trees@^3.0.0: broccoli-plugin "^1.3.0" merge-trees "^2.0.0" -broccoli-merge-trees@^3.0.1: +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== @@ -1989,6 +2671,25 @@ broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" +broccoli-persistent-filter@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.2.2.tgz#e0180e75ede5dd05d4c702f24f6c049e93fba915" + integrity sha512-PW12RD1yY+x5SASUADuUMJce+dVSmjBO3pV1rLNHmT1C31rp1P++TvX7AgUObFmGhL7qlwviSdhMbBkY1v3G2w== + dependencies: + async-disk-cache "^1.2.1" + async-promise-queue "^1.0.3" + broccoli-plugin "^1.0.0" + fs-tree-diff "^1.0.2" + hash-for-dep "^1.5.0" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rimraf "^2.6.1" + rsvp "^4.7.0" + symlink-or-copy "^1.0.1" + walk-sync "^1.0.0" + broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" @@ -2226,6 +2927,15 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" +browserslist@^4.3.4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.2.tgz#6ea8a74d6464bb0bd549105f659b41197d8f0ba2" + integrity sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg== + dependencies: + caniuse-lite "^1.0.30000939" + electron-to-chromium "^1.3.113" + node-releases "^1.1.8" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -2401,6 +3111,11 @@ caniuse-lite@^1.0.30000844: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000945.tgz#d51e3750416dd05126d5ac94a9c57d1c26c6fd21" integrity sha512-PSGwYChNIXJ4FZr9Z9mrVzBCB1TF3yyiRmIDRIdKDHZ6u+1jYH6xeR28XaquxnMwcZVX3f48S9zi7eswO/G1nQ== +caniuse-lite@^1.0.30000939: + version "1.0.30000946" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000946.tgz#ac50a3331bb805b483478bbc26a0ab71bb6d0509" + integrity sha512-ZVXtMoZ3Mfq69Ikv587Av+5lwGVJsG98QKUucVmtFBf0tl1kOCfLQ5o6Z2zBNis4Mx3iuH77WxEUpdP6t7f2CQ== + capture-exit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -2668,6 +3383,11 @@ clone@^2.0.0: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -2962,6 +3682,11 @@ core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= +core-js@^2.5.7: + version "2.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" + integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== + core-object@^3.1.3: version "3.1.5" resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" @@ -3262,6 +3987,13 @@ debug@^3.1.0: dependencies: ms "2.0.0" +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3479,16 +4211,16 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.3.113, electron-to-chromium@^1.3.47: + version "1.3.115" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.115.tgz#fdaa56c19b9f7386dbf29abc1cc632ff5468ff3b" + integrity sha512-mN2qeapQWdi2B9uddxTZ4nl80y46hbyKY5Wt9Yjih+QZFQLdaujEDK4qJky35WhyxMzHF3ZY41Lgjd2BPDuBhg== + electron-to-chromium@^1.3.18: version "1.3.18" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.18.tgz#3dcc99da3e6b665f6abbc71c28ad51a2cd731a9c" integrity sha1-PcyZ2j5rZl9qu8ccKK1Ros1zGpw= -electron-to-chromium@^1.3.47: - version "1.3.115" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.115.tgz#fdaa56c19b9f7386dbf29abc1cc632ff5468ff3b" - integrity sha512-mN2qeapQWdi2B9uddxTZ4nl80y46hbyKY5Wt9Yjih+QZFQLdaujEDK4qJky35WhyxMzHF3ZY41Lgjd2BPDuBhg== - elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -3541,15 +4273,14 @@ ember-auto-import@^1.0.1: walk-sync "^0.3.2" webpack "^4.12.0" -ember-basic-dropdown@^0.34.0: - version "0.34.0" - resolved "https://registry.yarnpkg.com/ember-basic-dropdown/-/ember-basic-dropdown-0.34.0.tgz#a0371b7c06756cdd3170e7d4a9ed4f4890bc2d59" - integrity sha512-C3WxWMImNPP3s7L30yoJ+9yMthpZ2CNMBRPS23D4bSrxw7EdjPdY0U4GgaQ/OazYlzFdYvTGnKOqGJCAJfYRkg== +ember-basic-dropdown@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ember-basic-dropdown/-/ember-basic-dropdown-1.1.2.tgz#6558eb2aa34d2feeb66e9de1feea560d46edc697" + integrity sha512-l38MNIUOI1nAKxSUlDI1wrP52a55HxN2dikDUwJOqx7NytK0/woPyy3uVUe7gfT2gJ4HCbRlL/7y0csvP0iMPg== dependencies: - ember-cli-babel "^6.8.2" - ember-cli-htmlbars "^2.0.3" - ember-native-dom-helpers "^0.5.4" - ember-wormhole "^0.5.2" + ember-cli-babel "^7.2.0" + ember-cli-htmlbars "^3.0.1" + ember-maybe-in-element "^0.2.0" ember-cli-babel@^5.1.6: version "5.2.4" @@ -3600,6 +4331,30 @@ ember-cli-babel@^6.16.0, ember-cli-babel@^6.8.0: ember-cli-version-checker "^2.1.2" semver "^5.5.0" +ember-cli-babel@^7.1.0, ember-cli-babel@^7.2.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.5.0.tgz#af654dcef23630391d2efe85aaa3bdf8b6ca17b7" + integrity sha512-wWXqPPQNRxCtEHvYaLBNiIVgCVCy8YqZ0tM8Dpql1D5nGnPDbaK073sS1vlOYBP7xe5Ab2nXhvQkFwUxFacJ2g== + dependencies: + "@babel/core" "^7.0.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.7.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-version-checker "^2.1.2" + ensure-posix-path "^1.0.2" + semver "^5.5.0" + ember-cli-broccoli-sane-watcher@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" @@ -3675,7 +4430,7 @@ ember-cli-htmlbars@^1.0.3, ember-cli-htmlbars@^1.1.1, ember-cli-htmlbars@^1.3.0: json-stable-stringify "^1.0.0" strip-bom "^2.0.0" -ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.3: +ember-cli-htmlbars@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" integrity sha512-oyWtJebOwxAqWZwMc0NKFJ8FJdxVixM7zl0FaXq1vTAG6bOgnU7yAhXEASlaO5f+PptZueZfOpdpvRwZW/Gk1A== @@ -3685,6 +4440,16 @@ ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.3: json-stable-stringify "^1.0.0" strip-bom "^3.0.0" +ember-cli-htmlbars@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.0.1.tgz#01e21f0fd05e0a6489154f26614b1041769e3e58" + integrity sha512-pyyB2s52vKTXDC5svU3IjU7GRLg2+5O81o9Ui0ZSiBS14US/bZl46H2dwcdSJAK+T+Za36ZkQM9eh1rNwOxfoA== + dependencies: + broccoli-persistent-filter "^1.4.3" + hash-for-dep "^1.2.3" + json-stable-stringify "^1.0.0" + strip-bom "^3.0.0" + ember-cli-import-polyfill@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ember-cli-import-polyfill/-/ember-cli-import-polyfill-0.2.0.tgz#c1a08a8affb45c97b675926272fe78cf4ca166f2" @@ -4045,6 +4810,15 @@ ember-concurrency@^0.8.12: ember-getowner-polyfill "^2.0.0" ember-maybe-import-regenerator "^0.1.5" +ember-concurrency@^0.8.26: + version "0.8.27" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.27.tgz#6dd1b9928cf5d13d5ae9c8cd3d5869f6ff81a9a9" + integrity sha512-2IujJ0Y79a+sHvEOPhUtZ7Ga8HDrwjbQqO7aZ88b0KCsXPro7birQFB508njQSQ0mxrsR9qzDv/KS5V67Cy5dA== + dependencies: + babel-core "^6.24.1" + ember-cli-babel "^6.8.2" + ember-maybe-import-regenerator "^0.1.5" + ember-data-model-fragments@3.0.0-beta.1: version "3.0.0-beta.1" resolved "https://registry.yarnpkg.com/ember-data-model-fragments/-/ember-data-model-fragments-3.0.0-beta.1.tgz#0be50b9e7db33acbc350389a68610e1e01f2d378" @@ -4230,6 +5004,13 @@ ember-maybe-import-regenerator@^0.1.5, ember-maybe-import-regenerator@^0.1.6: ember-cli-babel "^6.0.0-beta.4" regenerator-runtime "^0.9.5" +ember-maybe-in-element@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ember-maybe-in-element/-/ember-maybe-in-element-0.2.0.tgz#9ac51cbbd9d83d6230ad996c11e33f0eca3032e0" + integrity sha512-R5e6N8yDbfNbA/3lMZsFs2KEzv/jt80TsATiKMCqdqKuSG82KrD25cRdU5VkaE8dTQbziyBeuJs90bBiqOnakQ== + dependencies: + ember-cli-babel "^7.1.0" + ember-moment@^7.5.0: version "7.5.0" resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-7.5.0.tgz#9ed25b32ae941b2f1d9116c44f518a52bdb01722" @@ -4247,17 +5028,17 @@ ember-native-dom-helpers@^0.5.3, ember-native-dom-helpers@^0.5.4: broccoli-funnel "^1.1.0" ember-cli-babel "^6.6.0" -ember-power-select@^1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/ember-power-select/-/ember-power-select-1.10.4.tgz#7f0bb8c55279375391f2d97591ed65f727061579" - integrity sha512-Xtr+pNVn4XQZm95oG7WhBKsU9F7pdZ1dvVdr43nMtmU4C3vXtJmXld5daWaC26eo3cytjGAAc51OKL/H0tJ0iw== +ember-power-select@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/ember-power-select/-/ember-power-select-2.2.3.tgz#ab23ba0c1bcf743b60703afb0655788ccb0912e4" + integrity sha512-Y1sgUD7e78szL5bSdmqIFI175NNF1iw92JsDFY56AxYXQk/0se58P07fiyHgWQ5YgC5ilS3bHmkWJ6hAw6Q1lA== dependencies: - ember-basic-dropdown "^0.34.0" - ember-cli-babel "^6.10.0" - ember-cli-htmlbars "^2.0.1" - ember-concurrency "^0.8.12" - ember-text-measurer "^0.4.0" - ember-truth-helpers "^2.0.0" + ember-basic-dropdown "^1.1.0" + ember-cli-babel "^7.2.0" + ember-cli-htmlbars "^3.0.1" + ember-concurrency "^0.8.26" + ember-text-measurer "^0.5.0" + ember-truth-helpers "^2.1.0" ember-qunit@^3.2.2: version "3.2.2" @@ -4360,12 +5141,12 @@ ember-test-selectors@^0.3.8: ember-cli-babel "^6.8.2" ember-cli-version-checker "^2.0.0" -ember-text-measurer@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/ember-text-measurer/-/ember-text-measurer-0.4.0.tgz#a676195378d4eb4c1617678c2d198a2344b4d12b" - integrity sha512-gfDb1Id/SH4j5aD52foDD6Pa0xB5Z8pY51FBxKzt6w91NBIgFKN3i8mhCXlp4ue572xax46+vrcel3tbBhD0eA== +ember-text-measurer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/ember-text-measurer/-/ember-text-measurer-0.5.0.tgz#b907aeb8cbc04560e5070dc0347cdd35d0040d0d" + integrity sha512-YhcOcce8kaHp4K0frKW7xlPJxz82RegGQCVNTcFftEL/jpEflZyFJx17FWVINfDFRL4K8wXtlzDXFgMOg8vmtQ== dependencies: - ember-cli-babel "^6.8.2" + ember-cli-babel "^7.1.0" ember-truth-helpers@^2.0.0: version "2.0.0" @@ -4374,6 +5155,13 @@ ember-truth-helpers@^2.0.0: dependencies: ember-cli-babel "^6.8.2" +ember-truth-helpers@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-2.1.0.tgz#d4dab4eee7945aa2388126485977baeb33ca0798" + integrity sha512-BQlU8aTNl1XHKTYZ243r66yqtR9JU7XKWQcmMA+vkqfkE/c9WWQ9hQZM8YABihCmbyxzzZsngvldokmeX5GhAw== + dependencies: + ember-cli-babel "^6.6.0" + ember-weakmap@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/ember-weakmap/-/ember-weakmap-3.1.1.tgz#2ae6e0080b5b80cf0d108f7752dc69ea9603dbd7" @@ -4392,14 +5180,6 @@ ember-welcome-page@^3.0.0: ember-cli-babel "^6.0.0-beta.9" ember-cli-htmlbars "^1.0.3" -ember-wormhole@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/ember-wormhole/-/ember-wormhole-0.5.2.tgz#cc0ceb7db4f8b8da0fd852edc81d75cb1dcd92f1" - integrity sha1-zAzrfbT4uNoP2FLtyB11yx3NkvE= - dependencies: - ember-cli-babel "^6.0.0" - ember-cli-htmlbars "^1.1.1" - emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -4473,6 +5253,11 @@ ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" integrity sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI= +ensure-posix-path@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" + integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== + entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -5081,6 +5866,14 @@ finalhandler@~1.0.4: statuses "~1.3.1" unpipe "~1.0.0" +find-babel-config@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" + integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" @@ -5293,6 +6086,16 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 path-posix "^1.0.0" symlink-or-copy "^1.1.8" +fs-tree-diff@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-1.0.2.tgz#0e2931733a85b55feb3472c0b89a20b0c03ac0de" + integrity sha512-Zro2ACaPVDgVOx9+s5s5AfPlAD0kMJdbwGvTGF6KC1SjxjiGWxJvV4mUTDkFVSy3OUw2C/f1qpdjF81hGqSBAw== + dependencies: + heimdalljs-logger "^0.1.7" + object-assign "^4.1.0" + path-posix "^1.0.0" + symlink-or-copy "^1.1.8" + fs-updater@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b" @@ -5503,6 +6306,11 @@ globals@^11.0.1: resolved "https://registry.yarnpkg.com/globals/-/globals-11.1.0.tgz#632644457f5f0e3ae711807183700ebf2e4633e4" integrity sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ== +globals@^11.1.0: + version "11.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" + integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== + globals@^6.4.0: version "6.4.1" resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" @@ -5688,7 +6496,7 @@ hash-for-dep@^1.0.2: heimdalljs-logger "^0.1.7" resolve "^1.4.0" -hash-for-dep@^1.2.3: +hash-for-dep@^1.2.3, hash-for-dep@^1.4.7, hash-for-dep@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.0.tgz#02dacb5a3ee14e45d06f5aa039d142c970940476" integrity sha512-Jtp264IRh25UmNHBNjB9jgYQGOpUVFMzt8E2MS6dJyR5uAO14bq4B9q5znOStkKpOpcxNUrYtg3hgpOSjQSONw== @@ -6379,6 +7187,11 @@ js-base64@^2.1.8: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" integrity sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4= +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + js-reporters@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.0.tgz#7cf2cb698196684790350d0c4ca07f4aed9ec17e" @@ -6399,6 +7212,11 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@0.3.x: version "0.3.7" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-0.3.7.tgz#d739d8ee86461e54b354d6a7d7d1f2ad9a167f62" @@ -6440,6 +7258,11 @@ jsesc@^2.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + jsesc@~0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.3.0.tgz#1bf5ee63b4539fe2e26d0c1e99c240b97a457972" @@ -6507,6 +7330,13 @@ json5@^0.5.0, json5@^0.5.1: resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -7228,6 +8058,11 @@ lodash@^4.17.10: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== +lodash@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -7395,6 +8230,13 @@ matcher-collection@^1.0.5: dependencies: minimatch "^3.0.2" +matcher-collection@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838" + integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g== + dependencies: + minimatch "^3.0.2" + md5-hex@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" @@ -7740,6 +8582,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + mustache@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" @@ -7936,6 +8783,13 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" +node-releases@^1.1.8: + version "1.1.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.10.tgz#5dbeb6bc7f4e9c85b899e2e7adcc0635c9b2adf7" + integrity sha512-KbUPCpfoBvb3oBkej9+nrU0/7xPlVhmhhUJ1PZqwIP5/1dJkRWKWD3OONjo6M2J7tSCBtDCumLwwqeI+DWWaLQ== + dependencies: + semver "^5.3.0" + node-sass@^4.1.0: version "4.5.3" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.5.3.tgz#d09c9d1179641239d1b97ffc6231fdcec53e1568" @@ -8097,6 +8951,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-hash@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -8506,6 +9365,13 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" @@ -8903,11 +9769,23 @@ redeyed@~1.0.0: dependencies: esprima "~3.0.0" +regenerate-unicode-properties@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" + integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ== + dependencies: + regenerate "^1.4.0" + regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" integrity sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA= +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" @@ -8918,6 +9796,11 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" integrity sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A== +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + regenerator-runtime@^0.9.5: version "0.9.6" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" @@ -8932,6 +9815,13 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" +regenerator-transform@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" + integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A== + dependencies: + private "^0.1.6" + regenerator@0.8.40: version "0.8.40" resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" @@ -8960,6 +9850,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp-tree@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.5.tgz#7cd71fca17198d04b4176efd79713f2998009397" + integrity sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ== + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -8969,6 +9864,18 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + regexpu@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" @@ -8985,6 +9892,11 @@ regjsgen@^0.2.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" @@ -8992,6 +9904,13 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -9077,6 +9996,11 @@ requires-port@1.x.x: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +reselect@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= + resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" @@ -9117,7 +10041,7 @@ resolve@^1.1.2, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.3, resolve@^1.4.0, dependencies: path-parse "^1.0.5" -resolve@^1.10.0: +resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== @@ -9220,7 +10144,7 @@ rsvp@^4.6.1, rsvp@^4.7.0: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.7.0.tgz#dc1b0b1a536f7dec9d2be45e0a12ad4197c9fd96" integrity sha1-3BsLGlNvfeydK+ReChKtQZfJ/ZY= -rsvp@^4.8.2: +rsvp@^4.8.2, rsvp@^4.8.4: version "4.8.4" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== @@ -9374,7 +10298,7 @@ semver@5.3.0, semver@~5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= -semver@^5.5.0: +semver@^5.5.0, semver@^5.5.1: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== @@ -10251,6 +11175,11 @@ to-fast-properties@^1.0.0, to-fast-properties@^1.0.3: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -10444,6 +11373,29 @@ underscore@>=1.8.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -10652,6 +11604,15 @@ walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" +walk-sync@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.3.tgz#3b7b6468f068b5eba2278c931c57db3d39092969" + integrity sha512-23ivbET0Q/389y3EHpiIgxx881AS2mwdXA7iBqUDNSymoTPYb2jWlF3gkuuAP1iLgdNXmiHw/kZ/wZwrELU6Ag== + dependencies: + "@types/minimatch" "^3.0.3" + ensure-posix-path "^1.1.0" + matcher-collection "^1.1.1" + walker@1.x, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -10842,6 +11803,13 @@ workerpool@^2.3.0: dependencies: object-assign "4.1.1" +workerpool@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-3.1.1.tgz#9decea76b73c2f91de1b5bec1019f8a474b3a620" + integrity sha512-VzYD/kM3Gk9L7GR0LtrcyiZA8+h8Fse503aq4WkYwRBXreHTixVEcqKLjiFS6gM0fyaEt0pjSLf1ANGQXM27cg== + dependencies: + object-assign "4.1.1" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" From acddf2b8ade3343e7c368612e2c072bcdd0949c8 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 23:43:20 -0700 Subject: [PATCH 15/46] Update the test index.html file --- ui/tests/index.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ui/tests/index.html b/ui/tests/index.html index 86ae48892dc..a75e239bcc0 100644 --- a/ui/tests/index.html +++ b/ui/tests/index.html @@ -1,18 +1,18 @@ - - - Ui Tests - - + + + Nomad UI Tests + + {{content-for "head"}} {{content-for "test-head"}} - - - + + + {{content-for "head-footer"}} {{content-for "test-head-footer"}} From f3acad360ea5711a097b451f0d773ce5c95449b5 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 23:43:46 -0700 Subject: [PATCH 16/46] Fix scoping issue with the jobs list page object --- ui/tests/pages/jobs/list.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/tests/pages/jobs/list.js b/ui/tests/pages/jobs/list.js index 620a6cec445..2de345e8d21 100644 --- a/ui/tests/pages/jobs/list.js +++ b/ui/tests/pages/jobs/list.js @@ -54,6 +54,8 @@ export default create({ isPresent: isPresent('[data-test-namespace-switcher]'), open: clickable('[data-test-namespace-switcher] .ember-power-select-trigger'), options: collection('.ember-power-select-option', { + testContainer: '#ember-testing', + resetScope: true, label: text(), }), }, From f959aa8eee6f46a981ea8e90b624e3c1aa7b3e08 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 23:44:17 -0700 Subject: [PATCH 17/46] Adapt the codemirror helper for the hooks model --- ui/tests/helpers/codemirror.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/ui/tests/helpers/codemirror.js b/ui/tests/helpers/codemirror.js index 247eb769915..0cc9674fe2d 100644 --- a/ui/tests/helpers/codemirror.js +++ b/ui/tests/helpers/codemirror.js @@ -1,5 +1,3 @@ -import { registerHelper } from '@ember/test'; - const invariant = (truthy, error) => { if (!truthy) throw new Error(error); }; @@ -18,9 +16,16 @@ export function getCodeMirrorInstance(container) { }; } -export default function registerCodeMirrorHelpers() { - registerHelper('getCodeMirrorInstance', function(app, selector) { - const helper = getCodeMirrorInstance(app.__container__); - return helper(selector); +export default function setupCodeMirror(hooks) { + hooks.beforeEach(function() { + this.getCodeMirrorInstance = getCodeMirrorInstance(this.owner); + + // Expose to window for access from page objects + window.getCodeMirrorInstance = this.getCodeMirrorInstance; + }); + + hooks.afterEach(function() { + delete window.getCodeMirrorInstance; + delete this.getCodeMirrorInstance; }); } From a4ef45379e5bc8c2a7f9cae57184758567c7e9bd Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 23:44:53 -0700 Subject: [PATCH 18/46] Fix page object issues with acceptance tests that couldn't be codemodded --- ui/tests/acceptance/allocation-detail-test.js | 55 ++-- .../acceptance/application-errors-test.js | 26 +- ui/tests/acceptance/client-detail-test.js | 103 ++++---- ui/tests/acceptance/clients-list-test.js | 219 +++++++-------- ui/tests/acceptance/job-allocations-test.js | 28 +- ui/tests/acceptance/job-definition-test.js | 38 +-- ui/tests/acceptance/job-deployments-test.js | 44 ++-- ui/tests/acceptance/job-detail-test.js | 55 ++-- ui/tests/acceptance/job-evaluations-test.js | 14 +- ui/tests/acceptance/job-run-test.js | 26 +- ui/tests/acceptance/job-versions-test.js | 12 +- ui/tests/acceptance/jobs-list-test.js | 249 ++++++++---------- ui/tests/acceptance/namespaces-test.js | 29 +- ui/tests/acceptance/regions-test.js | 74 +++--- ui/tests/acceptance/server-detail-test.js | 16 +- ui/tests/acceptance/servers-list-test.js | 23 +- ui/tests/acceptance/task-detail-test.js | 81 +++--- ui/tests/acceptance/task-group-detail-test.js | 42 +-- ui/tests/acceptance/task-logs-test.js | 8 +- ui/tests/acceptance/token-test.js | 72 +++-- ui/tests/helpers/module-for-job.js | 46 ++-- 21 files changed, 601 insertions(+), 659 deletions(-) diff --git a/ui/tests/acceptance/allocation-detail-test.js b/ui/tests/acceptance/allocation-detail-test.js index aed30693c08..009b1a17198 100644 --- a/ui/tests/acceptance/allocation-detail-test.js +++ b/ui/tests/acceptance/allocation-detail-test.js @@ -14,7 +14,7 @@ module('Acceptance | allocation detail', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('agent'); node = server.create('node'); @@ -36,10 +36,10 @@ module('Acceptance | allocation detail', function(hooks) { driver: 'docker', }); - Allocation.visit({ id: allocation.id }); + await Allocation.visit({ id: allocation.id }); }); - test('/allocation/:id should name the allocation and link to the corresponding job and node', function(assert) { + test('/allocation/:id should name the allocation and link to the corresponding job and node', async function(assert) { assert.ok(Allocation.title.includes(allocation.name), 'Allocation name is in the heading'); assert.equal(Allocation.details.job, job.name, 'Job name is in the subheading'); assert.equal( @@ -48,24 +48,22 @@ module('Acceptance | allocation detail', function(hooks) { 'Node short id is in the subheading' ); - Allocation.details.visitJob(); - + await Allocation.details.visitJob(); assert.equal(currentURL(), `/jobs/${job.id}`, 'Job link navigates to the job'); - Allocation.visit({ id: allocation.id }); - - Allocation.details.visitClient(); + await Allocation.visit({ id: allocation.id }); + await Allocation.details.visitClient(); assert.equal(currentURL(), `/clients/${node.id}`, 'Client link navigates to the client'); }); - test('/allocation/:id should include resource utilization graphs', function(assert) { + test('/allocation/:id should include resource utilization graphs', async function(assert) { assert.equal(Allocation.resourceCharts.length, 2, 'Two resource utilization graphs'); assert.equal(Allocation.resourceCharts.objectAt(0).name, 'CPU', 'First chart is CPU'); assert.equal(Allocation.resourceCharts.objectAt(1).name, 'Memory', 'Second chart is Memory'); }); - test('/allocation/:id should list all tasks for the allocation', function(assert) { + test('/allocation/:id should list all tasks for the allocation', async function(assert) { assert.equal( Allocation.tasks.length, server.db.taskStates.where({ allocationId: allocation.id }).length, @@ -74,7 +72,7 @@ module('Acceptance | allocation detail', function(hooks) { assert.notOk(Allocation.isEmpty, 'Task table empty state is not shown'); }); - test('each task row should list high-level information for the task', function(assert) { + test('each task row should list high-level information for the task', async function(assert) { const task = server.db.taskStates.where({ allocationId: allocation.id }).sortBy('name')[0]; const taskResources = allocation.taskResourcesIds .map(id => server.db.taskResources.find(id)) @@ -108,10 +106,10 @@ module('Acceptance | allocation detail', function(hooks) { }); }); - test('each task row should link to the task detail page', function(assert) { + test('each task row should link to the task detail page', async function(assert) { const task = server.db.taskStates.where({ allocationId: allocation.id }).sortBy('name')[0]; - Allocation.tasks.objectAt(0).clickLink(); + await Allocation.tasks.objectAt(0).clickLink(); assert.equal( currentURL(), @@ -119,9 +117,8 @@ module('Acceptance | allocation detail', function(hooks) { 'Task name in task row links to task detail' ); - Allocation.visit({ id: allocation.id }); - - Allocation.tasks.objectAt(0).clickRow(); + await Allocation.visit({ id: allocation.id }); + await Allocation.tasks.objectAt(0).clickRow(); assert.equal( currentURL(), @@ -130,24 +127,24 @@ module('Acceptance | allocation detail', function(hooks) { ); }); - test('tasks with an unhealthy driver have a warning icon', function(assert) { + test('tasks with an unhealthy driver have a warning icon', async function(assert) { assert.ok(Allocation.firstUnhealthyTask().hasUnhealthyDriver, 'Warning is shown'); }); - test('when there are no tasks, an empty state is shown', function(assert) { + test('when there are no tasks, an empty state is shown', async function(assert) { // Make sure the allocation is pending in order to ensure there are no tasks allocation = server.create('allocation', 'withTaskWithPorts', { clientStatus: 'pending' }); - Allocation.visit({ id: allocation.id }); + await Allocation.visit({ id: allocation.id }); assert.ok(Allocation.isEmpty, 'Task table empty state is shown'); }); - test('when the allocation has not been rescheduled, the reschedule events section is not rendered', function(assert) { + test('when the allocation has not been rescheduled, the reschedule events section is not rendered', async function(assert) { assert.notOk(Allocation.hasRescheduleEvents, 'Reschedule Events section exists'); }); - test('when the allocation is not found, an error message is shown, but the URL persists', function(assert) { - Allocation.visit({ id: 'not-a-real-allocation' }); + test('when the allocation is not found, an error message is shown, but the URL persists', async function(assert) { + await Allocation.visit({ id: 'not-a-real-allocation' }); assert.equal( server.pretender.handledRequests.findBy('status', 404).url, @@ -162,36 +159,38 @@ module('Acceptance | allocation detail', function(hooks) { module('Acceptance | allocation detail (rescheduled)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('agent'); node = server.create('node'); job = server.create('job', { createAllocations: false }); allocation = server.create('allocation', 'rescheduled'); - Allocation.visit({ id: allocation.id }); + await Allocation.visit({ id: allocation.id }); }); - test('when the allocation has been rescheduled, the reschedule events section is rendered', function(assert) { + test('when the allocation has been rescheduled, the reschedule events section is rendered', async function(assert) { assert.ok(Allocation.hasRescheduleEvents, 'Reschedule Events section exists'); }); }); module('Acceptance | allocation detail (not running)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('agent'); node = server.create('node'); job = server.create('job', { createAllocations: false }); allocation = server.create('allocation', { clientStatus: 'pending' }); - Allocation.visit({ id: allocation.id }); + await Allocation.visit({ id: allocation.id }); }); - test('when the allocation is not running, the utilization graphs are replaced by an empty message', function(assert) { + test('when the allocation is not running, the utilization graphs are replaced by an empty message', async function(assert) { assert.equal(Allocation.resourceCharts.length, 0, 'No resource charts'); assert.equal( Allocation.resourceEmptyMessage, diff --git a/ui/tests/acceptance/application-errors-test.js b/ui/tests/acceptance/application-errors-test.js index 3cdf4943f30..773c2d8b203 100644 --- a/ui/tests/acceptance/application-errors-test.js +++ b/ui/tests/acceptance/application-errors-test.js @@ -16,28 +16,27 @@ module('Acceptance | application errors ', function(hooks) { server.create('job'); }); - test('transitioning away from an error page resets the global error', function(assert) { + test('transitioning away from an error page resets the global error', async function(assert) { server.pretender.get('/v1/nodes', () => [500, {}, null]); - ClientsList.visit(); - + await ClientsList.visit(); assert.ok(ClientsList.error.isPresent, 'Application has errored'); - JobsList.visit(); - + await JobsList.visit(); assert.notOk(JobsList.error.isPresent, 'Application is no longer in an error state'); }); - test('the 403 error page links to the ACL tokens page', function(assert) { + test('the 403 error page links to the ACL tokens page', async function(assert) { const job = server.db.jobs[0]; server.pretender.get(`/v1/job/${job.id}`, () => [403, {}, null]); - Job.visit({ id: job.id }); + await Job.visit({ id: job.id }); assert.ok(Job.error.isPresent, 'Error message is shown'); assert.equal(Job.error.title, 'Not Authorized', 'Error message is for 403'); - Job.error.seekHelp(); + + await Job.error.seekHelp(); assert.equal( currentURL(), '/settings/tokens', @@ -45,10 +44,10 @@ module('Acceptance | application errors ', function(hooks) { ); }); - test('the no leader error state gets its own error message', function(assert) { + test('the no leader error state gets its own error message', async function(assert) { server.pretender.get('/v1/jobs', () => [500, {}, 'No cluster leader']); - JobsList.visit(); + await JobsList.visit(); assert.ok(JobsList.error.isPresent, 'An error is shown'); assert.equal( @@ -62,12 +61,15 @@ module('Acceptance | application errors ', function(hooks) { await visit('/a/non-existent/page'); assert.ok(JobsList.error.isPresent, 'An error is shown'); - JobsList.error.gotoJobs(); + + await JobsList.error.gotoJobs(); assert.equal(currentURL(), '/jobs', 'Now on the jobs page'); assert.notOk(JobsList.error.isPresent, 'The error is gone now'); + await visit('/a/non-existent/page'); assert.ok(JobsList.error.isPresent, 'An error is shown'); - JobsList.error.gotoClients(); + + await JobsList.error.gotoClients(); assert.equal(currentURL(), '/clients', 'Now on the clients page'); assert.notOk(JobsList.error.isPresent, 'The error is gone now'); }); diff --git a/ui/tests/acceptance/client-detail-test.js b/ui/tests/acceptance/client-detail-test.js index 077af82e5fb..5750ee6e2c3 100644 --- a/ui/tests/acceptance/client-detail-test.js +++ b/ui/tests/acceptance/client-detail-test.js @@ -26,8 +26,8 @@ module('Acceptance | client detail', function(hooks) { server.createList('allocation', 3, { nodeId: node.id, clientStatus: 'running' }); }); - test('/clients/:id should have a breadcrumb trail linking back to clients', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id should have a breadcrumb trail linking back to clients', async function(assert) { + await ClientDetail.visit({ id: node.id }); assert.equal( ClientDetail.breadcrumbFor('clients.index').text, @@ -39,12 +39,12 @@ module('Acceptance | client detail', function(hooks) { node.id.split('-')[0], 'Second breadcrumb says the node short id' ); - ClientDetail.breadcrumbFor('clients.index').visit(); + await ClientDetail.breadcrumbFor('clients.index').visit(); assert.equal(currentURL(), '/clients', 'First breadcrumb links back to clients'); }); - test('/clients/:id should list immediate details for the node in the title', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id should list immediate details for the node in the title', async function(assert) { + await ClientDetail.visit({ id: node.id }); assert.ok(ClientDetail.title.includes(node.name), 'Title includes name'); assert.ok(ClientDetail.title.includes(node.id), 'Title includes id'); @@ -55,8 +55,8 @@ module('Acceptance | client detail', function(hooks) { ); }); - test('/clients/:id should list additional detail for the node below the title', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id should list additional detail for the node below the title', async function(assert) { + await ClientDetail.visit({ id: node.id }); assert.ok( ClientDetail.statusDefinition.includes(node.status), @@ -84,18 +84,18 @@ module('Acceptance | client detail', function(hooks) { ); }); - test('/clients/:id should include resource utilization graphs', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id should include resource utilization graphs', async function(assert) { + await ClientDetail.visit({ id: node.id }); assert.equal(ClientDetail.resourceCharts.length, 2, 'Two resource utilization graphs'); assert.equal(ClientDetail.resourceCharts.objectAt(0).name, 'CPU', 'First chart is CPU'); assert.equal(ClientDetail.resourceCharts.objectAt(1).name, 'Memory', 'Second chart is Memory'); }); - test('/clients/:id should list all allocations on the node', function(assert) { + test('/clients/:id should list all allocations on the node', async function(assert) { const allocationsCount = server.db.allocations.where({ nodeId: node.id }).length; - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); assert.equal( ClientDetail.allocations.length, @@ -104,7 +104,7 @@ module('Acceptance | client detail', function(hooks) { ); }); - test('each allocation should have high-level details for the allocation', function(assert) { + test('each allocation should have high-level details for the allocation', async function(assert) { const allocation = server.db.allocations .where({ nodeId: node.id }) .sortBy('modifyIndex') @@ -120,7 +120,7 @@ module('Acceptance | client detail', function(hooks) { const cpuUsed = tasks.reduce((sum, task) => sum + task.Resources.CPU, 0); const memoryUsed = tasks.reduce((sum, task) => sum + task.Resources.MemoryMB, 0); - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); const allocationRow = ClientDetail.allocations.objectAt(0); @@ -161,22 +161,22 @@ module('Acceptance | client detail', function(hooks) { ); }); - test('each allocation should show job information even if the job is incomplete and already in the store', function(assert) { + test('each allocation should show job information even if the job is incomplete and already in the store', async function(assert) { // First, visit clients to load the allocations for each visible node. // Don't load the job belongsTo of the allocation! Leave it unfulfilled. - Clients.visit(); + await Clients.visit(); // Then, visit jobs to load all jobs, which should implicitly fulfill // the job belongsTo of each allocation pointed at each job. - Jobs.visit(); + await Jobs.visit(); // Finally, visit a node to assert that the job name and task group name are // present. This will require reloading the job, since task groups aren't a // part of the jobs list response. - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); const allocationRow = ClientDetail.allocations.objectAt(0); const allocation = server.db.allocations @@ -188,15 +188,14 @@ module('Acceptance | client detail', function(hooks) { assert.ok(allocationRow.taskGroup.includes(allocation.taskGroup), 'Task group name'); }); - test('each allocation should link to the allocation detail page', function(assert) { + test('each allocation should link to the allocation detail page', async function(assert) { const allocation = server.db.allocations .where({ nodeId: node.id }) .sortBy('modifyIndex') .reverse()[0]; - ClientDetail.visit({ id: node.id }); - - ClientDetail.allocations.objectAt(0).visit(); + await ClientDetail.visit({ id: node.id }); + await ClientDetail.allocations.objectAt(0).visit(); assert.equal( currentURL(), @@ -205,13 +204,13 @@ module('Acceptance | client detail', function(hooks) { ); }); - test('each allocation should link to the job the allocation belongs to', function(assert) { - ClientDetail.visit({ id: node.id }); + test('each allocation should link to the job the allocation belongs to', async function(assert) { + await ClientDetail.visit({ id: node.id }); const allocation = server.db.allocations.where({ nodeId: node.id })[0]; const job = server.db.jobs.find(allocation.jobId); - ClientDetail.allocations.objectAt(0).visitJob(); + await ClientDetail.allocations.objectAt(0).visitJob(); assert.equal( currentURL(), @@ -220,16 +219,16 @@ module('Acceptance | client detail', function(hooks) { ); }); - test('/clients/:id should list all attributes for the node', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id should list all attributes for the node', async function(assert) { + await ClientDetail.visit({ id: node.id }); assert.ok(ClientDetail.attributesTable, 'Attributes table is on the page'); }); - test('/clients/:id lists all meta attributes', function(assert) { + test('/clients/:id lists all meta attributes', async function(assert) { node = server.create('node', 'forceIPv4', 'withMeta'); - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); assert.ok(ClientDetail.metaTable, 'Meta attributes table is on the page'); assert.notOk(ClientDetail.emptyMetaMessage, 'Meta attributes is not empty'); @@ -248,15 +247,15 @@ module('Acceptance | client detail', function(hooks) { ); }); - test('/clients/:id shows an empty message when there is no meta data', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id shows an empty message when there is no meta data', async function(assert) { + await ClientDetail.visit({ id: node.id }); assert.notOk(ClientDetail.metaTable, 'Meta attributes table is not on the page'); assert.ok(ClientDetail.emptyMetaMessage, 'Meta attributes is empty'); }); - test('when the node is not found, an error message is shown, but the URL persists', function(assert) { - ClientDetail.visit({ id: 'not-a-real-node' }); + test('when the node is not found, an error message is shown, but the URL persists', async function(assert) { + await ClientDetail.visit({ id: 'not-a-real-node' }); assert.equal( server.pretender.handledRequests.findBy('status', 404).url, @@ -268,19 +267,19 @@ module('Acceptance | client detail', function(hooks) { assert.equal(ClientDetail.error.title, 'Not Found', 'Error message is for 404'); }); - test('/clients/:id shows the recent events list', function(assert) { - ClientDetail.visit({ id: node.id }); + test('/clients/:id shows the recent events list', async function(assert) { + await ClientDetail.visit({ id: node.id }); assert.ok(ClientDetail.hasEvents, 'Client events section exists'); }); - test('each node event shows basic node event information', function(assert) { + test('each node event shows basic node event information', async function(assert) { const event = server.db.nodeEvents .where({ nodeId: node.id }) .sortBy('time') .reverse()[0]; - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); const eventRow = ClientDetail.events.objectAt(0); assert.equal( @@ -292,7 +291,7 @@ module('Acceptance | client detail', function(hooks) { assert.equal(eventRow.message, event.message, 'Event message'); }); - test('/clients/:id shows the driver status of every driver for the node', function(assert) { + test('/clients/:id shows the driver status of every driver for the node', async function(assert) { // Set the drivers up so health and detection is well tested const nodeDrivers = node.drivers; const undetectedDriver = 'raw_exec'; @@ -310,7 +309,7 @@ module('Acceptance | client detail', function(hooks) { assert.ok(drivers.length > 0, 'Node has drivers'); - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); drivers.forEach((driver, index) => { const driverHead = ClientDetail.driverHeads.objectAt(index); @@ -346,7 +345,7 @@ module('Acceptance | client detail', function(hooks) { }); }); - test('each driver can be opened to see a message and attributes', function(assert) { + test('each driver can be opened to see a message and attributes', async function(assert) { // Only detected drivers can be expanded const nodeDrivers = node.drivers; Object.values(nodeDrivers).forEach(driver => { @@ -358,13 +357,14 @@ module('Acceptance | client detail', function(hooks) { .map(driverName => assign({ Name: driverName }, node.drivers[driverName])) .sortBy('Name')[0]; - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); const driverHead = ClientDetail.driverHeads.objectAt(0); const driverBody = ClientDetail.driverBodies.objectAt(0); assert.notOk(driverBody.descriptionIsShown, 'Driver health description is not shown'); assert.notOk(driverBody.attributesAreShown, 'Driver attributes section is not shown'); - driverHead.toggle(); + + await driverHead.toggle(); assert.equal( driverBody.description, driver.HealthDescription, @@ -373,12 +373,12 @@ module('Acceptance | client detail', function(hooks) { assert.ok(driverBody.attributesAreShown, 'Driver attributes section is now shown'); }); - test('the status light indicates when the node is ineligible for scheduling', function(assert) { + test('the status light indicates when the node is ineligible for scheduling', async function(assert) { node = server.create('node', { schedulingEligibility: 'ineligible', }); - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); assert.equal( ClientDetail.statusLight.objectAt(0).id, @@ -387,7 +387,7 @@ module('Acceptance | client detail', function(hooks) { ); }); - test('when the node has a drain strategy with a positive deadline, the drain stategy section prints the duration', function(assert) { + test('when the node has a drain strategy with a positive deadline, the drain stategy section prints the duration', async function(assert) { const deadline = 5400000000000; // 1.5 hours in nanoseconds const forceDeadline = moment().add(1, 'd'); @@ -401,7 +401,7 @@ module('Acceptance | client detail', function(hooks) { }, }); - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); assert.ok( ClientDetail.drain.deadline.includes(formatDuration(deadline)), @@ -424,7 +424,7 @@ module('Acceptance | client detail', function(hooks) { ); }); - test('when the node has a drain stategy with no deadline, the drain stategy section mentions that and omits the force deadline', function(assert) { + test('when the node has a drain stategy with no deadline, the drain stategy section mentions that and omits the force deadline', async function(assert) { const deadline = 0; node = server.create('node', { @@ -437,7 +437,7 @@ module('Acceptance | client detail', function(hooks) { }, }); - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); assert.ok( ClientDetail.drain.deadline.includes('No deadline'), @@ -455,7 +455,7 @@ module('Acceptance | client detail', function(hooks) { ); }); - test('when the node has a drain stategy with a negative deadline, the drain strategy section shows the force badge', function(assert) { + test('when the node has a drain stategy with a negative deadline, the drain strategy section shows the force badge', async function(assert) { const deadline = -1; node = server.create('node', { @@ -468,7 +468,7 @@ module('Acceptance | client detail', function(hooks) { }, }); - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); assert.equal(ClientDetail.drain.badgeLabel, 'Forced Drain', 'Forced Drain badge is described'); assert.ok(ClientDetail.drain.badgeIsDangerous, 'Forced Drain is shown in a red badge'); @@ -487,6 +487,7 @@ module('Acceptance | client detail', function(hooks) { module('Acceptance | client detail (multi-namespace)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('node', 'forceIPv4', { schedulingEligibility: 'eligible' }); @@ -510,10 +511,10 @@ module('Acceptance | client detail (multi-namespace)', function(hooks) { }); }); - test('when the node has allocations on different namespaces, the associated jobs are fetched correctly', function(assert) { + test('when the node has allocations on different namespaces, the associated jobs are fetched correctly', async function(assert) { window.localStorage.nomadActiveNamespace = 'other-namespace'; - ClientDetail.visit({ id: node.id }); + await ClientDetail.visit({ id: node.id }); assert.equal( ClientDetail.allocations.length, diff --git a/ui/tests/acceptance/clients-list-test.js b/ui/tests/acceptance/clients-list-test.js index d698a4873cc..7a4bb50a9b1 100644 --- a/ui/tests/acceptance/clients-list-test.js +++ b/ui/tests/acceptance/clients-list-test.js @@ -13,7 +13,7 @@ module('Acceptance | clients list', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); - test('/clients should list one page of clients', function(assert) { + test('/clients should list one page of clients', async function(assert) { // Make sure to make more nodes than 1 page to assert that pagination is working const nodesCount = 10; const pageSize = 8; @@ -21,7 +21,7 @@ module('Acceptance | clients list', function(hooks) { server.createList('node', nodesCount); server.createList('agent', 1); - ClientsList.visit(); + await ClientsList.visit(); assert.equal(ClientsList.nodes.length, pageSize); assert.ok(ClientsList.hasPagination, 'Pagination found on the page'); @@ -33,11 +33,11 @@ module('Acceptance | clients list', function(hooks) { }); }); - test('each client record should show high-level info of the client', function(assert) { + test('each client record should show high-level info of the client', async function(assert) { minimumSetup(); const node = server.db.nodes[0]; - ClientsList.visit(); + await ClientsList.visit(); const nodeRow = ClientsList.nodes.objectAt(0); const allocations = server.db.allocations.where({ nodeId: node.id }); @@ -52,47 +52,46 @@ module('Acceptance | clients list', function(hooks) { assert.equal(nodeRow.allocations, allocations.length, '# Allocations'); }); - test('each client should link to the client detail page', function(assert) { + test('each client should link to the client detail page', async function(assert) { minimumSetup(); const node = server.db.nodes[0]; - ClientsList.visit(); - - ClientsList.nodes.objectAt(0).clickRow(); + await ClientsList.visit(); + await ClientsList.nodes.objectAt(0).clickRow(); assert.equal(currentURL(), `/clients/${node.id}`); }); - test('when there are no clients, there is an empty message', function(assert) { + test('when there are no clients, there is an empty message', async function(assert) { server.createList('agent', 1); - ClientsList.visit(); + await ClientsList.visit(); assert.ok(ClientsList.isEmpty); assert.equal(ClientsList.empty.headline, 'No Clients'); }); - test('when there are clients, but no matches for a search term, there is an empty message', function(assert) { + test('when there are clients, but no matches for a search term, there is an empty message', async function(assert) { server.createList('agent', 1); server.create('node', { name: 'node' }); - ClientsList.visit(); + await ClientsList.visit(); - ClientsList.search('client'); + await ClientsList.search('client'); assert.ok(ClientsList.isEmpty); assert.equal(ClientsList.empty.headline, 'No Matches'); }); - test('when accessing clients is forbidden, show a message with a link to the tokens page', function(assert) { + test('when accessing clients is forbidden, show a message with a link to the tokens page', async function(assert) { server.create('agent'); server.create('node', { name: 'node' }); server.pretender.get('/v1/nodes', () => [403, {}, null]); - ClientsList.visit(); + await ClientsList.visit(); assert.equal(ClientsList.error.title, 'Not Authorized'); - ClientsList.error.seekHelp(); + await ClientsList.error.seekHelp(); assert.equal(currentURL(), '/settings/tokens'); }); @@ -103,12 +102,12 @@ module('Acceptance | clients list', function(hooks) { expectedOptions(nodes) { return Array.from(new Set(nodes.mapBy('nodeClass'))).sort(); }, - beforeEach() { + async beforeEach() { server.create('agent'); server.createList('node', 2, { nodeClass: 'nc-one' }); server.createList('node', 2, { nodeClass: 'nc-two' }); server.createList('node', 2, { nodeClass: 'nc-three' }); - ClientsList.visit(); + await ClientsList.visit(); }, filter: (node, selection) => selection.includes(node.nodeClass), }); @@ -117,12 +116,12 @@ module('Acceptance | clients list', function(hooks) { facet: ClientsList.facets.status, paramName: 'status', expectedOptions: ['Initializing', 'Ready', 'Down'], - beforeEach() { + async beforeEach() { server.create('agent'); server.createList('node', 2, { status: 'initializing' }); server.createList('node', 2, { status: 'ready' }); server.createList('node', 2, { status: 'down' }); - ClientsList.visit(); + await ClientsList.visit(); }, filter: (node, selection) => selection.includes(node.status), }); @@ -133,12 +132,12 @@ module('Acceptance | clients list', function(hooks) { expectedOptions(nodes) { return Array.from(new Set(nodes.mapBy('datacenter'))).sort(); }, - beforeEach() { + async beforeEach() { server.create('agent'); server.createList('node', 2, { datacenter: 'pdx-1' }); server.createList('node', 2, { datacenter: 'nyc-1' }); server.createList('node', 2, { datacenter: 'ams-1' }); - ClientsList.visit(); + await ClientsList.visit(); }, filter: (node, selection) => selection.includes(node.datacenter), }); @@ -147,12 +146,12 @@ module('Acceptance | clients list', function(hooks) { facet: ClientsList.facets.flags, paramName: 'flags', expectedOptions: ['Ineligible', 'Draining'], - beforeEach() { + async beforeEach() { server.create('agent'); server.createList('node', 2, { schedulingEligibility: 'eligible', drain: false }); server.createList('node', 2, { schedulingEligibility: 'ineligible', drain: false }); server.createList('node', 2, { schedulingEligibility: 'ineligible', drain: true }); - ClientsList.visit(); + await ClientsList.visit(); }, filter: (node, selection) => { if (selection.includes('draining') && !node.drain) return false; @@ -162,142 +161,116 @@ module('Acceptance | clients list', function(hooks) { }, }); - test('when the facet selections result in no matches, the empty state states why', function(assert) { + test('when the facet selections result in no matches, the empty state states why', async function(assert) { server.create('agent'); server.createList('node', 2, { status: 'ready' }); - ClientsList.visit(); + await ClientsList.visit(); - ClientsList.facets.status.toggle(); - ClientsList.facets.status.options.objectAt(0).toggle(); + await ClientsList.facets.status.toggle(); + await ClientsList.facets.status.options.objectAt(0).toggle(); assert.ok(ClientsList.isEmpty, 'There is an empty message'); assert.equal(ClientsList.empty.headline, 'No Matches', 'The message is appropriate'); }); - test('the clients list is immediately filtered based on query params', function(assert) { + test('the clients list is immediately filtered based on query params', async function(assert) { server.create('agent'); server.create('node', { nodeClass: 'omg-large' }); server.create('node', { nodeClass: 'wtf-tiny' }); - ClientsList.visit({ class: JSON.stringify(['wtf-tiny']) }); + await ClientsList.visit({ class: JSON.stringify(['wtf-tiny']) }); assert.equal(ClientsList.nodes.length, 1, 'Only one client shown due to query param'); }); function testFacet(label, { facet, paramName, beforeEach, filter, expectedOptions }) { - test(`the ${label} facet has the correct options`, function(assert) { - beforeEach(); - - andThen(() => { - facet.toggle(); - }); - - andThen(() => { - let expectation; - if (typeof expectedOptions === 'function') { - expectation = expectedOptions(server.db.nodes); - } else { - expectation = expectedOptions; - } - - assert.deepEqual( - facet.options.map(option => option.label.trim()), - expectation, - 'Options for facet are as expected' - ); - }); + test(`the ${label} facet has the correct options`, async function(assert) { + await beforeEach(); + await facet.toggle(); + + let expectation; + if (typeof expectedOptions === 'function') { + expectation = expectedOptions(server.db.nodes); + } else { + expectation = expectedOptions; + } + + assert.deepEqual( + facet.options.map(option => option.label.trim()), + expectation, + 'Options for facet are as expected' + ); }); - test(`the ${label} facet filters the nodes list by ${label}`, function(assert) { + test(`the ${label} facet filters the nodes list by ${label}`, async function(assert) { let option; - beforeEach(); + await beforeEach(); - andThen(() => { - facet.toggle(); - }); + await facet.toggle(); + option = facet.options.objectAt(0); + await option.toggle(); - andThen(() => { - option = facet.options.objectAt(0); - option.toggle(); - }); + const selection = [option.key]; + const expectedNodes = server.db.nodes + .filter(node => filter(node, selection)) + .sortBy('modifyIndex') + .reverse(); - andThen(() => { - const selection = [option.key]; - const expectedNodes = server.db.nodes - .filter(node => filter(node, selection)) - .sortBy('modifyIndex') - .reverse(); - - ClientsList.nodes.forEach((node, index) => { - assert.equal( - node.id, - expectedNodes[index].id.split('-')[0], - `Node at ${index} is ${expectedNodes[index].id}` - ); - }); + ClientsList.nodes.forEach((node, index) => { + assert.equal( + node.id, + expectedNodes[index].id.split('-')[0], + `Node at ${index} is ${expectedNodes[index].id}` + ); }); }); - test(`selecting multiple options in the ${label} facet results in a broader search`, function(assert) { + test(`selecting multiple options in the ${label} facet results in a broader search`, async function(assert) { const selection = []; - beforeEach(); + await beforeEach(); + await facet.toggle(); - andThen(() => { - facet.toggle(); - }); + const option1 = facet.options.objectAt(0); + const option2 = facet.options.objectAt(1); + await option1.toggle(); + selection.push(option1.key); + await option2.toggle(); + selection.push(option2.key); - andThen(() => { - const option1 = facet.options.objectAt(0); - const option2 = facet.options.objectAt(1); - option1.toggle(); - selection.push(option1.key); - option2.toggle(); - selection.push(option2.key); - }); + const expectedNodes = server.db.nodes + .filter(node => filter(node, selection)) + .sortBy('modifyIndex') + .reverse(); - andThen(() => { - const expectedNodes = server.db.nodes - .filter(node => filter(node, selection)) - .sortBy('modifyIndex') - .reverse(); - - ClientsList.nodes.forEach((node, index) => { - assert.equal( - node.id, - expectedNodes[index].id.split('-')[0], - `Node at ${index} is ${expectedNodes[index].id}` - ); - }); + ClientsList.nodes.forEach((node, index) => { + assert.equal( + node.id, + expectedNodes[index].id.split('-')[0], + `Node at ${index} is ${expectedNodes[index].id}` + ); }); }); - test(`selecting options in the ${label} facet updates the ${paramName} query param`, function(assert) { + test(`selecting options in the ${label} facet updates the ${paramName} query param`, async function(assert) { const selection = []; - beforeEach(); - - andThen(() => { - facet.toggle(); - }); - - andThen(() => { - const option1 = facet.options.objectAt(0); - const option2 = facet.options.objectAt(1); - option1.toggle(); - selection.push(option1.key); - option2.toggle(); - selection.push(option2.key); - }); - - andThen(() => { - assert.equal( - currentURL(), - `/clients?${paramName}=${encodeURIComponent(JSON.stringify(selection))}`, - 'URL has the correct query param key and value' - ); - }); + await beforeEach(); + await facet.toggle(); + + const option1 = facet.options.objectAt(0); + const option2 = facet.options.objectAt(1); + await option1.toggle(); + selection.push(option1.key); + await option2.toggle(); + selection.push(option2.key); + + assert.equal( + currentURL(), + `/clients?${paramName}=${encodeURIComponent(JSON.stringify(selection))}`, + 'URL has the correct query param key and value' + ); }); } }); diff --git a/ui/tests/acceptance/job-allocations-test.js b/ui/tests/acceptance/job-allocations-test.js index ee51a00816e..66ee00b86e3 100644 --- a/ui/tests/acceptance/job-allocations-test.js +++ b/ui/tests/acceptance/job-allocations-test.js @@ -27,11 +27,11 @@ module('Acceptance | job allocations', function(hooks) { job = server.create('job', { noFailedPlacements: true, createAllocations: false }); }); - test('lists all allocations for the job', function(assert) { + test('lists all allocations for the job', async function(assert) { server.createList('allocation', Allocations.pageSize - 1); allocations = server.schema.allocations.where({ jobId: job.id }).models; - Allocations.visit({ id: job.id }); + await Allocations.visit({ id: job.id }); assert.equal( Allocations.allocations.length, @@ -47,13 +47,12 @@ module('Acceptance | job allocations', function(hooks) { }); }); - test('allocations table is sortable', function(assert) { + test('allocations table is sortable', async function(assert) { server.createList('allocation', Allocations.pageSize - 1); allocations = server.schema.allocations.where({ jobId: job.id }).models; - Allocations.visit({ id: job.id }); - - Allocations.sortBy('taskGroupName'); + await Allocations.visit({ id: job.id }); + await Allocations.sortBy('taskGroupName'); assert.equal( currentURL(), @@ -71,24 +70,25 @@ module('Acceptance | job allocations', function(hooks) { }); }); - test('allocations table is searchable', function(assert) { + test('allocations table is searchable', async function(assert) { makeSearchAllocations(server); allocations = server.schema.allocations.where({ jobId: job.id }).models; - Allocations.visit({ id: job.id }); - Allocations.search('ffffff'); + await Allocations.visit({ id: job.id }); + await Allocations.search('ffffff'); assert.equal(Allocations.allocations.length, 5, 'List is filtered by search term'); }); - test('when a search yields no results, the search box remains', function(assert) { + test('when a search yields no results, the search box remains', async function(assert) { makeSearchAllocations(server); allocations = server.schema.allocations.where({ jobId: job.id }).models; - Allocations.visit({ id: job.id }); - Allocations.search('^nothing will ever match this long regex$'); + await Allocations.visit({ id: job.id }); + await Allocations.search('^nothing will ever match this long regex$'); + assert.equal( Allocations.emptyState.headline, 'No Matches', @@ -98,8 +98,8 @@ module('Acceptance | job allocations', function(hooks) { assert.ok(Allocations.hasSearchBox, 'Search box is still shown'); }); - test('when the job for the allocations is not found, an error message is shown, but the URL persists', function(assert) { - Allocations.visit({ id: 'not-a-real-job' }); + test('when the job for the allocations is not found, an error message is shown, but the URL persists', async function(assert) { + await Allocations.visit({ id: 'not-a-real-job' }); assert.equal( server.pretender.handledRequests.findBy('status', 404).url, diff --git a/ui/tests/acceptance/job-definition-test.js b/ui/tests/acceptance/job-definition-test.js index 594dcd3f8c6..0b69f11e2e5 100644 --- a/ui/tests/acceptance/job-definition-test.js +++ b/ui/tests/acceptance/job-definition-test.js @@ -2,6 +2,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; +import setupCodeMirror from 'nomad-ui/tests/helpers/codemirror'; import Definition from 'nomad-ui/tests/pages/jobs/job/definition'; let job; @@ -9,23 +10,24 @@ let job; module('Acceptance | job definition', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupCodeMirror(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('node'); server.create('job'); job = server.db.jobs[0]; - Definition.visit({ id: job.id }); + await Definition.visit({ id: job.id }); }); - test('visiting /jobs/:job_id/definition', function(assert) { + test('visiting /jobs/:job_id/definition', async function(assert) { assert.equal(currentURL(), `/jobs/${job.id}/definition`); }); - test('the job definition page contains a json viewer component', function(assert) { + test('the job definition page contains a json viewer component', async function(assert) { assert.ok(Definition.jsonViewer, 'JSON viewer found'); }); - test('the job definition page requests the job to display in an unmutated form', function(assert) { + test('the job definition page requests the job to display in an unmutated form', async function(assert) { const jobURL = `/v1/job/${job.id}`; const jobRequests = server.pretender.handledRequests .map(req => req.url.split('?')[0]) @@ -33,29 +35,29 @@ module('Acceptance | job definition', function(hooks) { assert.ok(jobRequests.length === 2, 'Two requests for the job were made'); }); - test('the job definition can be edited', function(assert) { + test('the job definition can be edited', async function(assert) { assert.notOk(Definition.editor.isPresent, 'Editor is not shown on load'); - Definition.edit(); + await Definition.edit(); assert.ok(Definition.editor.isPresent, 'Editor is shown after clicking edit'); assert.notOk(Definition.jsonViewer, 'Editor replaces the JSON viewer'); }); - test('when in editing mode, the action can be canceled, showing the read-only definition again', function(assert) { - Definition.edit(); + test('when in editing mode, the action can be canceled, showing the read-only definition again', async function(assert) { + await Definition.edit(); - Definition.editor.cancelEditing(); + await Definition.editor.cancelEditing(); assert.ok(Definition.jsonViewer, 'The JSON Viewer is back'); assert.notOk(Definition.editor.isPresent, 'The editor is gone'); }); - test('when in editing mode, the editor is prepopulated with the job definition', function(assert) { + test('when in editing mode, the editor is prepopulated with the job definition', async function(assert) { const requests = server.pretender.handledRequests; const jobDefinition = requests.findBy('url', `/v1/job/${job.id}`).responseText; const formattedJobDefinition = JSON.stringify(JSON.parse(jobDefinition), null, 2); - Definition.edit(); + await Definition.edit(); assert.equal( Definition.editor.editor.contents, @@ -64,16 +66,16 @@ module('Acceptance | job definition', function(hooks) { ); }); - test('when changes are submitted, the site redirects to the job overview page', function(assert) { - Definition.edit(); + test('when changes are submitted, the site redirects to the job overview page', async function(assert) { + await Definition.edit(); - Definition.editor.plan(); - Definition.editor.run(); + await Definition.editor.plan(); + await Definition.editor.run(); assert.equal(currentURL(), `/jobs/${job.id}`, 'Now on the job overview page'); }); - test('when the job for the definition is not found, an error message is shown, but the URL persists', function(assert) { - Definition.visit({ id: 'not-a-real-job' }); + test('when the job for the definition is not found, an error message is shown, but the URL persists', async function(assert) { + await Definition.visit({ id: 'not-a-real-job' }); assert.equal( server.pretender.handledRequests.findBy('status', 404).url, diff --git a/ui/tests/acceptance/job-deployments-test.js b/ui/tests/acceptance/job-deployments-test.js index 07bd792033f..3293b35e952 100644 --- a/ui/tests/acceptance/job-deployments-test.js +++ b/ui/tests/acceptance/job-deployments-test.js @@ -33,8 +33,8 @@ module('Acceptance | job deployments', function(hooks) { }); }); - test('/jobs/:id/deployments should list all job deployments', function(assert) { - Deployments.visit({ id: job.id }); + test('/jobs/:id/deployments should list all job deployments', async function(assert) { + await Deployments.visit({ id: job.id }); assert.ok( Deployments.deployments.length, @@ -43,8 +43,8 @@ module('Acceptance | job deployments', function(hooks) { ); }); - test('each deployment mentions the deployment shortId, status, version, and time since it was submitted', function(assert) { - Deployments.visit({ id: job.id }); + test('each deployment mentions the deployment shortId, status, version, and time since it was submitted', async function(assert) { + await Deployments.visit({ id: job.id }); const deployment = sortedDeployments.models[0]; const version = server.db.jobVersions.findBy({ @@ -66,7 +66,7 @@ module('Acceptance | job deployments', function(hooks) { ); }); - test('when the deployment is running and needs promotion, the deployment item says so', function(assert) { + test('when the deployment is running and needs promotion, the deployment item says so', async function(assert) { // Ensure the deployment needs deployment const deployment = sortedDeployments.models[0]; const taskGroupSummary = deployment.deploymentTaskGroupSummaryIds.map(id => @@ -84,26 +84,24 @@ module('Acceptance | job deployments', function(hooks) { taskGroupSummary.save(); - Deployments.visit({ id: job.id }); + await Deployments.visit({ id: job.id }); const deploymentRow = Deployments.deployments.objectAt(0); assert.ok(deploymentRow.promotionIsRequired, 'Requires Promotion badge found'); }); - test('each deployment item can be opened to show details', function(assert) { - Deployments.visit({ id: job.id }); + test('each deployment item can be opened to show details', async function(assert) { + await Deployments.visit({ id: job.id }); const deploymentRow = Deployments.deployments.objectAt(0); - assert.notOk(deploymentRow.hasDetails, 'No deployment body'); - deploymentRow.toggle(); - + await deploymentRow.toggle(); assert.ok(deploymentRow.hasDetails, 'Deployment body found'); }); - test('when open, a deployment shows the deployment metrics', function(assert) { - Deployments.visit({ id: job.id }); + test('when open, a deployment shows the deployment metrics', async function(assert) { + await Deployments.visit({ id: job.id }); const deployment = sortedDeployments.models[0]; const deploymentRow = Deployments.deployments.objectAt(0); @@ -111,7 +109,7 @@ module('Acceptance | job deployments', function(hooks) { server.db.deploymentTaskGroupSummaries.find(id) ); - deploymentRow.toggle(); + await deploymentRow.toggle(); assert.equal( deploymentRow.metricFor('canaries').text, @@ -153,8 +151,8 @@ module('Acceptance | job deployments', function(hooks) { ); }); - test('when open, a deployment shows a list of all task groups and their respective stats', function(assert) { - Deployments.visit({ id: job.id }); + test('when open, a deployment shows a list of all task groups and their respective stats', async function(assert) { + await Deployments.visit({ id: job.id }); const deployment = sortedDeployments.models[0]; const deploymentRow = Deployments.deployments.objectAt(0); @@ -162,7 +160,7 @@ module('Acceptance | job deployments', function(hooks) { server.db.deploymentTaskGroupSummaries.find(id) ); - deploymentRow.toggle(); + await deploymentRow.toggle(); assert.ok(deploymentRow.hasTaskGroups, 'Task groups found'); @@ -197,8 +195,8 @@ module('Acceptance | job deployments', function(hooks) { ); }); - test('when open, a deployment shows a list of all allocations for the deployment', function(assert) { - Deployments.visit({ id: job.id }); + test('when open, a deployment shows a list of all allocations for the deployment', async function(assert) { + await Deployments.visit({ id: job.id }); const deployment = sortedDeployments.models[0]; const deploymentRow = Deployments.deployments.objectAt(0); @@ -206,11 +204,9 @@ module('Acceptance | job deployments', function(hooks) { // TODO: Make this less brittle. This logic is copied from the mirage config, // since there is no reference to allocations on the deployment model. const allocations = server.db.allocations.where({ jobId: deployment.jobId }).slice(0, 3); - - deploymentRow.toggle(); + await deploymentRow.toggle(); assert.ok(deploymentRow.hasAllocations, 'Allocations found'); - assert.equal(deploymentRow.allocations.length, allocations.length, 'One row per allocation'); const allocation = allocations[0]; @@ -219,8 +215,8 @@ module('Acceptance | job deployments', function(hooks) { assert.equal(allocationRow.shortId, allocation.id.split('-')[0], 'Allocation is as expected'); }); - test('when the job for the deployments is not found, an error message is shown, but the URL persists', function(assert) { - Deployments.visit({ id: 'not-a-real-job' }); + test('when the job for the deployments is not found, an error message is shown, but the URL persists', async function(assert) { + await Deployments.visit({ id: 'not-a-real-job' }); assert.equal( server.pretender.handledRequests.findBy('status', 404).url, diff --git a/ui/tests/acceptance/job-detail-test.js b/ui/tests/acceptance/job-detail-test.js index 08142b04e28..b9c1c6ac884 100644 --- a/ui/tests/acceptance/job-detail-test.js +++ b/ui/tests/acceptance/job-detail-test.js @@ -1,6 +1,8 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import { selectChoose } from 'ember-power-select/test-support'; +import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import moduleForJob from 'nomad-ui/tests/helpers/module-for-job'; import JobDetail from 'nomad-ui/tests/pages/jobs/detail'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; @@ -34,34 +36,33 @@ moduleForJob( 'allocations', () => server.create('job', { type: 'service' }), { - 'the subnav links to deployment': (job, assert) => { - JobDetail.tabFor('deployments').visit(); - andThen(() => { - assert.equal(currentURL(), `/jobs/${job.id}/deployments`); - }); + 'the subnav links to deployment': async (job, assert) => { + await JobDetail.tabFor('deployments').visit(); + assert.equal(currentURL(), `/jobs/${job.id}/deployments`); + }, + 'when the job is not found, an error message is shown, but the URL persists': async ( + job, + assert + ) => { + await JobDetail.visit({ id: 'not-a-real-job' }); + + assert.equal( + server.pretender.handledRequests.findBy('status', 404).url, + '/v1/job/not-a-real-job', + 'A request to the nonexistent job is made' + ); + assert.equal(currentURL(), '/jobs/not-a-real-job', 'The URL persists'); + assert.ok(JobDetail.error.isPresent, 'Error message is shown'); + assert.equal(JobDetail.error.title, 'Not Found', 'Error message is for 404'); }, } ); -let job; - -test('when the job is not found, an error message is shown, but the URL persists', function(assert) { - JobDetail.visit({ id: 'not-a-real-job' }); - - andThen(() => { - assert.equal( - server.pretender.handledRequests.findBy('status', 404).url, - '/v1/job/not-a-real-job', - 'A request to the nonexistent job is made' - ); - assert.equal(currentURL(), '/jobs/not-a-real-job', 'The URL persists'); - assert.ok(JobDetail.error.isPresent, 'Error message is shown'); - assert.equal(JobDetail.error.title, 'Not Found', 'Error message is for 404'); - }); -}); - module('Acceptance | job detail (with namespaces)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); + + let job; hooks.beforeEach(function() { server.createList('namespace', 2); @@ -70,22 +71,22 @@ module('Acceptance | job detail (with namespaces)', function(hooks) { server.createList('job', 3, { namespaceId: server.db.namespaces[0].name }); }); - test('when there are namespaces, the job detail page states the namespace for the job', function(assert) { + test('when there are namespaces, the job detail page states the namespace for the job', async function(assert) { const namespace = server.db.namespaces.find(job.namespaceId); - JobDetail.visit({ id: job.id, namespace: namespace.name }); + await JobDetail.visit({ id: job.id, namespace: namespace.name }); assert.ok(JobDetail.statFor('namespace').text, 'Namespace included in stats'); }); - test('when switching namespaces, the app redirects to /jobs with the new namespace', function(assert) { + test('when switching namespaces, the app redirects to /jobs with the new namespace', async function(assert) { const namespace = server.db.namespaces.find(job.namespaceId); const otherNamespace = server.db.namespaces.toArray().find(ns => ns !== namespace).name; const label = otherNamespace === 'default' ? 'Default Namespace' : otherNamespace; - JobDetail.visit({ id: job.id, namespace: namespace.name }); + await JobDetail.visit({ id: job.id, namespace: namespace.name }); // TODO: Migrate to Page Objects - selectChoose('[data-test-namespace-switcher]', label); + await selectChoose('[data-test-namespace-switcher]', label); assert.equal(currentURL().split('?')[0], '/jobs', 'Navigated to /jobs'); const jobs = server.db.jobs diff --git a/ui/tests/acceptance/job-evaluations-test.js b/ui/tests/acceptance/job-evaluations-test.js index 9a76d369a18..9a7752b372b 100644 --- a/ui/tests/acceptance/job-evaluations-test.js +++ b/ui/tests/acceptance/job-evaluations-test.js @@ -11,14 +11,14 @@ module('Acceptance | job evaluations', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { job = server.create('job', { noFailedPlacements: true, createAllocations: false }); evaluations = server.db.evaluations.where({ jobId: job.id }); - Evaluations.visit({ id: job.id }); + await Evaluations.visit({ id: job.id }); }); - test('lists all evaluations for the job', function(assert) { + test('lists all evaluations for the job', async function(assert) { assert.equal(Evaluations.evaluations.length, evaluations.length, 'All evaluations are listed'); const sortedEvaluations = evaluations.sortBy('modifyIndex').reverse(); @@ -29,8 +29,8 @@ module('Acceptance | job evaluations', function(hooks) { }); }); - test('evaluations table is sortable', function(assert) { - Evaluations.sortBy('priority'); + test('evaluations table is sortable', async function(assert) { + await Evaluations.sortBy('priority'); assert.equal( currentURL(), @@ -48,8 +48,8 @@ module('Acceptance | job evaluations', function(hooks) { }); }); - test('when the job for the evaluations is not found, an error message is shown, but the URL persists', function(assert) { - Evaluations.visit({ id: 'not-a-real-job' }); + test('when the job for the evaluations is not found, an error message is shown, but the URL persists', async function(assert) { + await Evaluations.visit({ id: 'not-a-real-job' }); assert.equal( server.pretender.handledRequests.findBy('status', 404).url, diff --git a/ui/tests/acceptance/job-run-test.js b/ui/tests/acceptance/job-run-test.js index 9e783562d90..fed997f480f 100644 --- a/ui/tests/acceptance/job-run-test.js +++ b/ui/tests/acceptance/job-run-test.js @@ -3,6 +3,7 @@ import { assign } from '@ember/polyfills'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; +import setupCodeMirror from 'nomad-ui/tests/helpers/codemirror'; import JobRun from 'nomad-ui/tests/pages/jobs/run'; const newJobName = 'new-job'; @@ -39,26 +40,27 @@ const jsonJob = overrides => { module('Acceptance | job run', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupCodeMirror(hooks); hooks.beforeEach(function() { // Required for placing allocations (a result of creating jobs) server.create('node'); }); - test('visiting /jobs/run', function(assert) { - JobRun.visit(); + test('visiting /jobs/run', async function(assert) { + await JobRun.visit(); assert.equal(currentURL(), '/jobs/run'); }); - test('when submitting a job, the site redirects to the new job overview page', function(assert) { + test('when submitting a job, the site redirects to the new job overview page', async function(assert) { const spec = jsonJob(); - JobRun.visit(); + await JobRun.visit(); - JobRun.editor.editor.fillIn(spec); - JobRun.editor.plan(); - JobRun.editor.run(); + await JobRun.editor.editor.fillIn(spec); + await JobRun.editor.plan(); + await JobRun.editor.run(); assert.equal( currentURL(), `/jobs/${newJobName}`, @@ -66,17 +68,17 @@ module('Acceptance | job run', function(hooks) { ); }); - test('when submitting a job to a different namespace, the redirect to the job overview page takes namespace into account', function(assert) { + test('when submitting a job to a different namespace, the redirect to the job overview page takes namespace into account', async function(assert) { const newNamespace = 'second-namespace'; server.create('namespace', { id: newNamespace }); const spec = jsonJob({ Namespace: newNamespace }); - JobRun.visit(); + await JobRun.visit(); - JobRun.editor.editor.fillIn(spec); - JobRun.editor.plan(); - JobRun.editor.run(); + await JobRun.editor.editor.fillIn(spec); + await JobRun.editor.plan(); + await JobRun.editor.run(); assert.equal( currentURL(), `/jobs/${newJobName}?namespace=${newNamespace}`, diff --git a/ui/tests/acceptance/job-versions-test.js b/ui/tests/acceptance/job-versions-test.js index 8232e5aa26c..a06cf8a97ad 100644 --- a/ui/tests/acceptance/job-versions-test.js +++ b/ui/tests/acceptance/job-versions-test.js @@ -12,18 +12,18 @@ module('Acceptance | job versions', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { job = server.create('job', { createAllocations: false }); versions = server.db.jobVersions.where({ jobId: job.id }); - Versions.visit({ id: job.id }); + await Versions.visit({ id: job.id }); }); - test('/jobs/:id/versions should list all job versions', function(assert) { + test('/jobs/:id/versions should list all job versions', async function(assert) { assert.ok(Versions.versions.length, versions.length, 'Each version gets a row in the timeline'); }); - test('each version mentions the version number, the stability, and the submitted time', function(assert) { + test('each version mentions the version number, the stability, and the submitted time', async function(assert) { const version = versions.sortBy('submitTime').reverse()[0]; const formattedSubmitTime = moment(version.submitTime / 1000000).format( "MMM DD, 'YY HH:mm:ss ZZ" @@ -35,8 +35,8 @@ module('Acceptance | job versions', function(hooks) { assert.equal(versionRow.submitTime, formattedSubmitTime, 'Submit time'); }); - test('when the job for the versions is not found, an error message is shown, but the URL persists', function(assert) { - Versions.visit({ id: 'not-a-real-job' }); + test('when the job for the versions is not found, an error message is shown, but the URL persists', async function(assert) { + await Versions.visit({ id: 'not-a-real-job' }); assert.equal( server.pretender.handledRequests.findBy('status', 404).url, diff --git a/ui/tests/acceptance/jobs-list-test.js b/ui/tests/acceptance/jobs-list-test.js index b3d199a68d7..cb7d7e5add0 100644 --- a/ui/tests/acceptance/jobs-list-test.js +++ b/ui/tests/acceptance/jobs-list-test.js @@ -13,17 +13,17 @@ module('Acceptance | jobs list', function(hooks) { server.create('node'); }); - test('visiting /jobs', function(assert) { - JobsList.visit(); + test('visiting /jobs', async function(assert) { + await JobsList.visit(); assert.equal(currentURL(), '/jobs'); }); - test('/jobs should list the first page of jobs sorted by modify index', function(assert) { + test('/jobs should list the first page of jobs sorted by modify index', async function(assert) { const jobsCount = JobsList.pageSize + 1; server.createList('job', jobsCount, { createAllocations: false }); - JobsList.visit(); + await JobsList.visit(); const sortedJobs = server.db.jobs.sortBy('modifyIndex').reverse(); assert.equal(JobsList.jobs.length, JobsList.pageSize); @@ -32,12 +32,12 @@ module('Acceptance | jobs list', function(hooks) { }); }); - test('each job row should contain information about the job', function(assert) { + test('each job row should contain information about the job', async function(assert) { server.createList('job', 2); const job = server.db.jobs.sortBy('modifyIndex').reverse()[0]; const taskGroups = server.db.taskGroups.where({ jobId: job.id }); - JobsList.visit(); + await JobsList.visit(); const jobRow = JobsList.jobs.objectAt(0); @@ -49,79 +49,78 @@ module('Acceptance | jobs list', function(hooks) { assert.equal(jobRow.taskGroups, taskGroups.length, '# Groups'); }); - test('each job row should link to the corresponding job', function(assert) { + test('each job row should link to the corresponding job', async function(assert) { server.create('job'); const job = server.db.jobs[0]; - JobsList.visit(); - - JobsList.jobs.objectAt(0).clickName(); + await JobsList.visit(); + await JobsList.jobs.objectAt(0).clickName(); assert.equal(currentURL(), `/jobs/${job.id}`); }); - test('the new job button transitions to the new job page', function(assert) { - JobsList.visit(); - - JobsList.runJob(); + test('the new job button transitions to the new job page', async function(assert) { + await JobsList.visit(); + await JobsList.runJob(); assert.equal(currentURL(), '/jobs/run'); }); - test('when there are no jobs, there is an empty message', function(assert) { - JobsList.visit(); + test('when there are no jobs, there is an empty message', async function(assert) { + await JobsList.visit(); assert.ok(JobsList.isEmpty, 'There is an empty message'); assert.equal(JobsList.emptyState.headline, 'No Jobs', 'The message is appropriate'); }); - test('when there are jobs, but no matches for a search result, there is an empty message', function(assert) { + test('when there are jobs, but no matches for a search result, there is an empty message', async function(assert) { server.create('job', { name: 'cat 1' }); server.create('job', { name: 'cat 2' }); - JobsList.visit(); + await JobsList.visit(); - JobsList.search('dog'); + await JobsList.search('dog'); assert.ok(JobsList.isEmpty, 'The empty message is shown'); assert.equal(JobsList.emptyState.headline, 'No Matches', 'The message is appropriate'); }); - test('searching resets the current page', function(assert) { + test('searching resets the current page', async function(assert) { server.createList('job', JobsList.pageSize + 1, { createAllocations: false }); - JobsList.visit(); - JobsList.nextPage(); + await JobsList.visit(); + await JobsList.nextPage(); + assert.equal(currentURL(), '/jobs?page=2', 'Page query param captures page=2'); - JobsList.search('foobar'); + + await JobsList.search('foobar'); + assert.equal(currentURL(), '/jobs?search=foobar', 'No page query param'); }); - test('when the namespace query param is set, only matching jobs are shown and the namespace value is forwarded to app state', function(assert) { + test('when the namespace query param is set, only matching jobs are shown and the namespace value is forwarded to app state', async function(assert) { server.createList('namespace', 2); const job1 = server.create('job', { namespaceId: server.db.namespaces[0].id }); const job2 = server.create('job', { namespaceId: server.db.namespaces[1].id }); - JobsList.visit(); + await JobsList.visit(); assert.equal(JobsList.jobs.length, 1, 'One job in the default namespace'); assert.equal(JobsList.jobs.objectAt(0).name, job1.name, 'The correct job is shown'); const secondNamespace = server.db.namespaces[1]; - JobsList.visit({ namespace: secondNamespace.id }); + await JobsList.visit({ namespace: secondNamespace.id }); assert.equal(JobsList.jobs.length, 1, `One job in the ${secondNamespace.name} namespace`); assert.equal(JobsList.jobs.objectAt(0).name, job2.name, 'The correct job is shown'); }); - test('when accessing jobs is forbidden, show a message with a link to the tokens page', function(assert) { + test('when accessing jobs is forbidden, show a message with a link to the tokens page', async function(assert) { server.pretender.get('/v1/jobs', () => [403, {}, null]); - JobsList.visit(); - + await JobsList.visit(); assert.equal(JobsList.error.title, 'Not Authorized'); - JobsList.error.seekHelp(); - + await JobsList.error.seekHelp(); assert.equal(currentURL(), '/settings/tokens'); }); @@ -129,8 +128,8 @@ module('Acceptance | jobs list', function(hooks) { return job.periodic ? 'periodic' : job.parameterized ? 'parameterized' : job.type; } - test('the jobs list page has appropriate faceted search options', function(assert) { - JobsList.visit(); + test('the jobs list page has appropriate faceted search options', async function(assert) { + await JobsList.visit(); assert.ok(JobsList.facets.type.isPresent, 'Type facet found'); assert.ok(JobsList.facets.status.isPresent, 'Status facet found'); @@ -142,7 +141,7 @@ module('Acceptance | jobs list', function(hooks) { facet: JobsList.facets.type, paramName: 'type', expectedOptions: ['Batch', 'Parameterized', 'Periodic', 'Service', 'System'], - beforeEach() { + async beforeEach() { server.createList('job', 2, { createAllocations: false, type: 'batch' }); server.createList('job', 2, { createAllocations: false, @@ -157,7 +156,7 @@ module('Acceptance | jobs list', function(hooks) { childrenCount: 0, }); server.createList('job', 2, { createAllocations: false, type: 'service' }); - JobsList.visit(); + await JobsList.visit(); }, filter(job, selection) { let displayType = job.type; @@ -171,7 +170,7 @@ module('Acceptance | jobs list', function(hooks) { facet: JobsList.facets.status, paramName: 'status', expectedOptions: ['Pending', 'Running', 'Dead'], - beforeEach() { + async beforeEach() { server.createList('job', 2, { status: 'pending', createAllocations: false, @@ -183,7 +182,7 @@ module('Acceptance | jobs list', function(hooks) { childrenCount: 0, }); server.createList('job', 2, { status: 'dead', createAllocations: false, childrenCount: 0 }); - JobsList.visit(); + await JobsList.visit(); }, filter: (job, selection) => selection.includes(job.status), }); @@ -197,7 +196,7 @@ module('Acceptance | jobs list', function(hooks) { ); return Array.from(allDatacenters).sort(); }, - beforeEach() { + async beforeEach() { server.create('job', { datacenters: ['pdx', 'lax'], createAllocations: false, @@ -219,7 +218,7 @@ module('Acceptance | jobs list', function(hooks) { childrenCount: 0, }); server.create('job', { datacenters: ['pdx'], createAllocations: false, childrenCount: 0 }); - JobsList.visit(); + await JobsList.visit(); }, filter: (job, selection) => job.datacenters.find(dc => selection.includes(dc)), }); @@ -228,7 +227,7 @@ module('Acceptance | jobs list', function(hooks) { facet: JobsList.facets.prefix, paramName: 'prefix', expectedOptions: ['hashi (3)', 'nmd (2)', 'pre (2)'], - beforeEach() { + async beforeEach() { [ 'pre-one', 'hashi-one', @@ -242,145 +241,119 @@ module('Acceptance | jobs list', function(hooks) { ].forEach(name => { server.create('job', { name, createAllocations: false, childrenCount: 0 }); }); - JobsList.visit(); + await JobsList.visit(); }, filter: (job, selection) => selection.find(prefix => job.name.startsWith(prefix)), }); - test('when the facet selections result in no matches, the empty state states why', function(assert) { + test('when the facet selections result in no matches, the empty state states why', async function(assert) { server.createList('job', 2, { status: 'pending', createAllocations: false, childrenCount: 0 }); - JobsList.visit(); + await JobsList.visit(); - JobsList.facets.status.toggle(); - JobsList.facets.status.options.objectAt(1).toggle(); + await JobsList.facets.status.toggle(); + await JobsList.facets.status.options.objectAt(1).toggle(); assert.ok(JobsList.isEmpty, 'There is an empty message'); assert.equal(JobsList.emptyState.headline, 'No Matches', 'The message is appropriate'); }); - test('the jobs list is immediately filtered based on query params', function(assert) { + test('the jobs list is immediately filtered based on query params', async function(assert) { server.create('job', { type: 'batch', createAllocations: false }); server.create('job', { type: 'service', createAllocations: false }); - JobsList.visit({ type: JSON.stringify(['batch']) }); + await JobsList.visit({ type: JSON.stringify(['batch']) }); assert.equal(JobsList.jobs.length, 1, 'Only one job shown due to query param'); }); function testFacet(label, { facet, paramName, beforeEach, filter, expectedOptions }) { - test(`the ${label} facet has the correct options`, function(assert) { - beforeEach(); - - andThen(() => { - facet.toggle(); - }); - - andThen(() => { - let expectation; - if (typeof expectedOptions === 'function') { - expectation = expectedOptions(server.db.jobs); - } else { - expectation = expectedOptions; - } - - assert.deepEqual( - facet.options.map(option => option.label.trim()), - expectation, - 'Options for facet are as expected' - ); - }); + test(`the ${label} facet has the correct options`, async function(assert) { + await beforeEach(); + await facet.toggle(); + + let expectation; + if (typeof expectedOptions === 'function') { + expectation = expectedOptions(server.db.jobs); + } else { + expectation = expectedOptions; + } + + assert.deepEqual( + facet.options.map(option => option.label.trim()), + expectation, + 'Options for facet are as expected' + ); }); - test(`the ${label} facet filters the jobs list by ${label}`, function(assert) { + test(`the ${label} facet filters the jobs list by ${label}`, async function(assert) { let option; - beforeEach(); + await beforeEach(); + await facet.toggle(); - andThen(() => { - facet.toggle(); - }); + option = facet.options.objectAt(0); + await option.toggle(); - andThen(() => { - option = facet.options.objectAt(0); - option.toggle(); - }); + const selection = [option.key]; + const expectedJobs = server.db.jobs + .filter(job => filter(job, selection)) + .sortBy('modifyIndex') + .reverse(); - andThen(() => { - const selection = [option.key]; - const expectedJobs = server.db.jobs - .filter(job => filter(job, selection)) - .sortBy('modifyIndex') - .reverse(); - - JobsList.jobs.forEach((job, index) => { - assert.equal( - job.id, - expectedJobs[index].id, - `Job at ${index} is ${expectedJobs[index].id}` - ); - }); + JobsList.jobs.forEach((job, index) => { + assert.equal( + job.id, + expectedJobs[index].id, + `Job at ${index} is ${expectedJobs[index].id}` + ); }); }); - test(`selecting multiple options in the ${label} facet results in a broader search`, function(assert) { + test(`selecting multiple options in the ${label} facet results in a broader search`, async function(assert) { const selection = []; - beforeEach(); + await beforeEach(); + await facet.toggle(); - andThen(() => { - facet.toggle(); - }); + const option1 = facet.options.objectAt(0); + const option2 = facet.options.objectAt(1); + await option1.toggle(); + selection.push(option1.key); + await option2.toggle(); + selection.push(option2.key); - andThen(() => { - const option1 = facet.options.objectAt(0); - const option2 = facet.options.objectAt(1); - option1.toggle(); - selection.push(option1.key); - option2.toggle(); - selection.push(option2.key); - }); + const expectedJobs = server.db.jobs + .filter(job => filter(job, selection)) + .sortBy('modifyIndex') + .reverse(); - andThen(() => { - const expectedJobs = server.db.jobs - .filter(job => filter(job, selection)) - .sortBy('modifyIndex') - .reverse(); - - JobsList.jobs.forEach((job, index) => { - assert.equal( - job.id, - expectedJobs[index].id, - `Job at ${index} is ${expectedJobs[index].id}` - ); - }); + JobsList.jobs.forEach((job, index) => { + assert.equal( + job.id, + expectedJobs[index].id, + `Job at ${index} is ${expectedJobs[index].id}` + ); }); }); - test(`selecting options in the ${label} facet updates the ${paramName} query param`, function(assert) { + test(`selecting options in the ${label} facet updates the ${paramName} query param`, async function(assert) { const selection = []; - beforeEach(); + await beforeEach(); + await facet.toggle(); - andThen(() => { - facet.toggle(); - }); - - andThen(() => { - const option1 = facet.options.objectAt(0); - const option2 = facet.options.objectAt(1); - option1.toggle(); - selection.push(option1.key); - option2.toggle(); - selection.push(option2.key); - }); + const option1 = facet.options.objectAt(0); + const option2 = facet.options.objectAt(1); + await option1.toggle(); + selection.push(option1.key); + await option2.toggle(); + selection.push(option2.key); - andThen(() => { - assert.equal( - currentURL(), - `/jobs?${paramName}=${encodeURIComponent(JSON.stringify(selection))}`, - 'URL has the correct query param key and value' - ); - }); + assert.equal( + currentURL(), + `/jobs?${paramName}=${encodeURIComponent(JSON.stringify(selection))}`, + 'URL has the correct query param key and value' + ); }); } }); diff --git a/ui/tests/acceptance/namespaces-test.js b/ui/tests/acceptance/namespaces-test.js index 4de7840534c..b8750fb6560 100644 --- a/ui/tests/acceptance/namespaces-test.js +++ b/ui/tests/acceptance/namespaces-test.js @@ -1,6 +1,7 @@ import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; +import { selectChoose } from 'ember-power-select/test-support'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; module('Acceptance | namespaces (disabled)', function(hooks) { @@ -13,14 +14,13 @@ module('Acceptance | namespaces (disabled)', function(hooks) { server.createList('job', 5); }); - test('the namespace switcher is not in the gutter menu', function(assert) { - JobsList.visit(); - + test('the namespace switcher is not in the gutter menu', async function(assert) { + await JobsList.visit(); assert.notOk(JobsList.namespaceSwitcher.isPresent, 'No namespace switcher found'); }); - test('the jobs request is made with no query params', function(assert) { - JobsList.visit(); + test('the jobs request is made with no query params', async function(assert) { + await JobsList.visit(); const request = server.pretender.handledRequests.findBy('url', '/v1/jobs'); assert.equal(request.queryParams.namespace, undefined, 'No namespace query param'); @@ -29,6 +29,7 @@ module('Acceptance | namespaces (disabled)', function(hooks) { module('Acceptance | namespaces (enabled)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.createList('namespace', 3); @@ -37,13 +38,13 @@ module('Acceptance | namespaces (enabled)', function(hooks) { server.createList('job', 5); }); - test('the namespace switcher lists all namespaces', function(assert) { + test('the namespace switcher lists all namespaces', async function(assert) { const namespaces = server.db.namespaces; - JobsList.visit(); + await JobsList.visit(); assert.ok(JobsList.namespaceSwitcher.isPresent, 'Namespace switcher found'); - JobsList.namespaceSwitcher.open(); + await JobsList.namespaceSwitcher.open(); // TODO this selector should be scoped to only the namespace switcher options, // but ember-wormhole makes that difficult. assert.equal( @@ -67,12 +68,12 @@ module('Acceptance | namespaces (enabled)', function(hooks) { }); }); - test('changing the namespace sets the namespace in localStorage', function(assert) { + test('changing the namespace sets the namespace in localStorage', async function(assert) { const namespace = server.db.namespaces[1]; - JobsList.visit(); + await JobsList.visit(); + await selectChoose('[data-test-namespace-switcher]', namespace.name); - selectChoose('[data-test-namespace-switcher]', namespace.name); assert.equal( window.localStorage.nomadActiveNamespace, namespace.id, @@ -80,10 +81,10 @@ module('Acceptance | namespaces (enabled)', function(hooks) { ); }); - test('changing the namespace refreshes the jobs list when on the jobs page', function(assert) { + test('changing the namespace refreshes the jobs list when on the jobs page', async function(assert) { const namespace = server.db.namespaces[1]; - JobsList.visit(); + await JobsList.visit(); let requests = server.pretender.handledRequests.filter(req => req.url.startsWith('/v1/jobs')); assert.equal(requests.length, 1, 'First request to jobs'); @@ -94,7 +95,7 @@ module('Acceptance | namespaces (enabled)', function(hooks) { ); // TODO: handle this with Page Objects - selectChoose('[data-test-namespace-switcher]', namespace.name); + await selectChoose('[data-test-namespace-switcher]', namespace.name); requests = server.pretender.handledRequests.filter(req => req.url.startsWith('/v1/jobs')); assert.equal(requests.length, 2, 'Second request to jobs'); diff --git a/ui/tests/acceptance/regions-test.js b/ui/tests/acceptance/regions-test.js index 9c925a21b05..6c1e1715c94 100644 --- a/ui/tests/acceptance/regions-test.js +++ b/ui/tests/acceptance/regions-test.js @@ -1,6 +1,7 @@ import { currentURL } from '@ember/test-helpers'; import { module, test } from 'qunit'; import { setupApplicationTest } from 'ember-qunit'; +import { selectChoose } from 'ember-power-select/test-support'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import JobsList from 'nomad-ui/tests/pages/jobs/list'; import ClientsList from 'nomad-ui/tests/pages/clients/list'; @@ -17,43 +18,43 @@ module('Acceptance | regions (only one)', function(hooks) { server.createList('job', 5); }); - test('when there is only one region, the region switcher is not shown in the nav bar', function(assert) { + test('when there is only one region, the region switcher is not shown in the nav bar', async function(assert) { server.create('region', { id: 'global' }); - JobsList.visit(); + await JobsList.visit(); assert.notOk(PageLayout.navbar.regionSwitcher.isPresent, 'No region switcher'); }); - test('when the only region is not named "global", the region switcher still is not shown', function(assert) { + test('when the only region is not named "global", the region switcher still is not shown', async function(assert) { server.create('region', { id: 'some-region' }); - JobsList.visit(); + await JobsList.visit(); assert.notOk(PageLayout.navbar.regionSwitcher.isPresent, 'No region switcher'); }); - test('pages do not include the region query param', function(assert) { - let jobId; - + test('pages do not include the region query param', async function(assert) { server.create('region', { id: 'global' }); - JobsList.visit(); + await JobsList.visit(); assert.equal(currentURL(), '/jobs', 'No region query param'); - jobId = JobsList.jobs.objectAt(0).id; - JobsList.jobs.objectAt(0).clickRow(); + + const jobId = JobsList.jobs.objectAt(0).id; + await JobsList.jobs.objectAt(0).clickRow(); assert.equal(currentURL(), `/jobs/${jobId}`, 'No region query param'); - ClientsList.visit(); + + await ClientsList.visit(); assert.equal(currentURL(), '/clients', 'No region query param'); }); - test('api requests do not include the region query param', function(assert) { + test('api requests do not include the region query param', async function(assert) { server.create('region', { id: 'global' }); - JobsList.visit(); - JobsList.jobs.objectAt(0).clickRow(); - PageLayout.gutter.visitClients(); - PageLayout.gutter.visitServers(); + await JobsList.visit(); + await JobsList.jobs.objectAt(0).clickRow(); + await PageLayout.gutter.visitClients(); + await PageLayout.gutter.visitServers(); server.pretender.handledRequests.forEach(req => { assert.notOk(req.url.includes('region='), req.url); }); @@ -62,6 +63,7 @@ module('Acceptance | regions (only one)', function(hooks) { module('Acceptance | regions (many)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); hooks.beforeEach(function() { server.create('agent'); @@ -71,25 +73,25 @@ module('Acceptance | regions (many)', function(hooks) { server.create('region', { id: 'region-2' }); }); - test('the region switcher is rendered in the nav bar', function(assert) { - JobsList.visit(); + test('the region switcher is rendered in the nav bar', async function(assert) { + await JobsList.visit(); assert.ok(PageLayout.navbar.regionSwitcher.isPresent, 'Region switcher is shown'); }); - test('when on the default region, pages do not include the region query param', function(assert) { - JobsList.visit(); + test('when on the default region, pages do not include the region query param', async function(assert) { + await JobsList.visit(); assert.equal(currentURL(), '/jobs', 'No region query param'); assert.equal(window.localStorage.nomadActiveRegion, 'global', 'Region in localStorage'); }); - test('switching regions sets localStorage and the region query param', function(assert) { + test('switching regions sets localStorage and the region query param', async function(assert) { const newRegion = server.db.regions[1].id; - JobsList.visit(); + await JobsList.visit(); - selectChoose('[data-test-region-switcher]', newRegion); + await selectChoose('[data-test-region-switcher]', newRegion); assert.ok( currentURL().includes(`region=${newRegion}`), @@ -98,13 +100,13 @@ module('Acceptance | regions (many)', function(hooks) { assert.equal(window.localStorage.nomadActiveRegion, newRegion, 'New region in localStorage'); }); - test('switching regions to the default region, unsets the region query param', function(assert) { + test('switching regions to the default region, unsets the region query param', async function(assert) { const startingRegion = server.db.regions[1].id; const defaultRegion = server.db.regions[0].id; - JobsList.visit({ region: startingRegion }); + await JobsList.visit({ region: startingRegion }); - selectChoose('[data-test-region-switcher]', defaultRegion); + await selectChoose('[data-test-region-switcher]', defaultRegion); assert.notOk(currentURL().includes('region='), 'No region query param for the default region'); assert.equal( @@ -114,20 +116,20 @@ module('Acceptance | regions (many)', function(hooks) { ); }); - test('switching regions on deep pages redirects to the application root', function(assert) { + test('switching regions on deep pages redirects to the application root', async function(assert) { const newRegion = server.db.regions[1].id; - Allocation.visit({ id: server.db.allocations[0].id }); + await Allocation.visit({ id: server.db.allocations[0].id }); - selectChoose('[data-test-region-switcher]', newRegion); + await selectChoose('[data-test-region-switcher]', newRegion); assert.ok(currentURL().includes('/jobs?'), 'Back at the jobs page'); }); - test('navigating directly to a page with the region query param sets the application to that region', function(assert) { + test('navigating directly to a page with the region query param sets the application to that region', async function(assert) { const allocation = server.db.allocations[0]; const region = server.db.regions[1].id; - Allocation.visit({ id: allocation.id, region }); + await Allocation.visit({ id: allocation.id, region }); assert.equal( currentURL(), @@ -141,14 +143,14 @@ module('Acceptance | regions (many)', function(hooks) { ); }); - test('when the region is not the default region, all api requests include the region query param', function(assert) { + test('when the region is not the default region, all api requests include the region query param', async function(assert) { const region = server.db.regions[1].id; - JobsList.visit({ region }); + await JobsList.visit({ region }); - JobsList.jobs.objectAt(0).clickRow(); - PageLayout.gutter.visitClients(); - PageLayout.gutter.visitServers(); + await JobsList.jobs.objectAt(0).clickRow(); + await PageLayout.gutter.visitClients(); + await PageLayout.gutter.visitServers(); const [regionsRequest, defaultRegionRequest, ...appRequests] = server.pretender.handledRequests; assert.notOk( diff --git a/ui/tests/acceptance/server-detail-test.js b/ui/tests/acceptance/server-detail-test.js index 4d0c41da172..3ae9ae3a632 100644 --- a/ui/tests/acceptance/server-detail-test.js +++ b/ui/tests/acceptance/server-detail-test.js @@ -10,17 +10,17 @@ module('Acceptance | server detail', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.createList('agent', 3); agent = server.db.agents[0]; - ServerDetail.visit({ name: agent.name }); + await ServerDetail.visit({ name: agent.name }); }); - test('visiting /servers/:server_name', function(assert) { + test('visiting /servers/:server_name', async function(assert) { assert.equal(currentURL(), `/servers/${encodeURIComponent(agent.name)}`); }); - test('the server detail page should list all tags for the server', function(assert) { + test('the server detail page should list all tags for the server', async function(assert) { const tags = Object.keys(agent.tags) .map(name => ({ name, value: agent.tags[name] })) .sortBy('name'); @@ -33,19 +33,19 @@ module('Acceptance | server detail', function(hooks) { }); }); - test('the list of servers from /servers should still be present', function(assert) { + test('the list of servers from /servers should still be present', async function(assert) { assert.equal(ServerDetail.servers.length, server.db.agents.length, '# of servers'); }); - test('the active server should be denoted in the table', function(assert) { + test('the active server should be denoted in the table', async function(assert) { const activeServers = ServerDetail.servers.filter(server => server.isActive); assert.equal(activeServers.length, 1, 'Only one active server'); assert.equal(ServerDetail.activeServer.name, agent.name, 'Active server matches current route'); }); - test('when the server is not found, an error message is shown, but the URL persists', function(assert) { - ServerDetail.visit({ name: 'not-a-real-server' }); + test('when the server is not found, an error message is shown, but the URL persists', async function(assert) { + await ServerDetail.visit({ name: 'not-a-real-server' }); assert.equal(currentURL(), '/servers/not-a-real-server', 'The URL persists'); assert.equal(ServerDetail.error.title, 'Not Found', 'Error message is for 404'); diff --git a/ui/tests/acceptance/servers-list-test.js b/ui/tests/acceptance/servers-list-test.js index 41127a363db..f1750c0022d 100644 --- a/ui/tests/acceptance/servers-list-test.js +++ b/ui/tests/acceptance/servers-list-test.js @@ -23,14 +23,14 @@ module('Acceptance | servers list', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); - test('/servers should list all servers', function(assert) { + test('/servers should list all servers', async function(assert) { server.createList('node', 1); server.createList('agent', 10); const leader = findLeader(server.schema); const sortedAgents = server.db.agents.sort(agentSort(leader)).reverse(); - ServersList.visit(); + await ServersList.visit(); assert.equal(ServersList.servers.length, ServersList.pageSize, 'List is stopped at pageSize'); @@ -39,11 +39,11 @@ module('Acceptance | servers list', function(hooks) { }); }); - test('each server should show high-level info of the server', function(assert) { + test('each server should show high-level info of the server', async function(assert) { minimumSetup(); const agent = server.db.agents[0]; - ServersList.visit(); + await ServersList.visit(); const agentRow = ServersList.servers.objectAt(0); @@ -55,27 +55,24 @@ module('Acceptance | servers list', function(hooks) { assert.equal(agentRow.datacenter, agent.tags.dc, 'Datacenter'); }); - test('each server should link to the server detail page', function(assert) { + test('each server should link to the server detail page', async function(assert) { minimumSetup(); const agent = server.db.agents[0]; - ServersList.visit(); - - ServersList.servers.objectAt(0).clickRow(); + await ServersList.visit(); + await ServersList.servers.objectAt(0).clickRow(); assert.equal(currentURL(), `/servers/${agent.name}`, 'Now at the server detail page'); }); - test('when accessing servers is forbidden, show a message with a link to the tokens page', function(assert) { + test('when accessing servers is forbidden, show a message with a link to the tokens page', async function(assert) { server.create('agent'); server.pretender.get('/v1/agent/members', () => [403, {}, null]); - ServersList.visit(); - + await ServersList.visit(); assert.equal(ServersList.error.title, 'Not Authorized'); - ServersList.error.seekHelp(); - + await ServersList.error.seekHelp(); assert.equal(currentURL(), '/settings/tokens'); }); }); diff --git a/ui/tests/acceptance/task-detail-test.js b/ui/tests/acceptance/task-detail-test.js index 1fb7c6ce883..806ce094860 100644 --- a/ui/tests/acceptance/task-detail-test.js +++ b/ui/tests/acceptance/task-detail-test.js @@ -12,17 +12,17 @@ module('Acceptance | task detail', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('agent'); server.create('node'); server.create('job', { createAllocations: false }); allocation = server.create('allocation', 'withTaskWithPorts', { clientStatus: 'running' }); task = server.db.taskStates.where({ allocationId: allocation.id })[0]; - Task.visit({ id: allocation.id, name: task.name }); + await Task.visit({ id: allocation.id, name: task.name }); }); - test('/allocation/:id/:task_name should name the task and list high-level task information', function(assert) { + test('/allocation/:id/:task_name should name the task and list high-level task information', async function(assert) { assert.ok(Task.title.includes(task.name), 'Task name'); assert.ok(Task.state.includes(task.state), 'Task state'); @@ -32,7 +32,7 @@ module('Acceptance | task detail', function(hooks) { ); }); - test('breadcrumbs match jobs / job / task group / allocation / task', function(assert) { + test('breadcrumbs match jobs / job / task group / allocation / task', async function(assert) { const { jobId, taskGroup } = allocation; const job = server.db.jobs.find(jobId); @@ -60,20 +60,23 @@ module('Acceptance | task detail', function(hooks) { 'Task name is the fifth breadcrumb' ); - Task.breadcrumbFor('jobs.index').visit(); + await Task.breadcrumbFor('jobs.index').visit(); assert.equal(currentURL(), '/jobs', 'Jobs breadcrumb links correctly'); - Task.visit({ id: allocation.id, name: task.name }); - Task.breadcrumbFor('jobs.job.index').visit(); + + await Task.visit({ id: allocation.id, name: task.name }); + await Task.breadcrumbFor('jobs.job.index').visit(); assert.equal(currentURL(), `/jobs/${job.id}`, 'Job breadcrumb links correctly'); - Task.visit({ id: allocation.id, name: task.name }); - Task.breadcrumbFor('jobs.job.task-group').visit(); + + await Task.visit({ id: allocation.id, name: task.name }); + await Task.breadcrumbFor('jobs.job.task-group').visit(); assert.equal( currentURL(), `/jobs/${job.id}/${taskGroup}`, 'Task Group breadcrumb links correctly' ); - Task.visit({ id: allocation.id, name: task.name }); - Task.breadcrumbFor('allocations.allocation').visit(); + + await Task.visit({ id: allocation.id, name: task.name }); + await Task.breadcrumbFor('allocations.allocation').visit(); assert.equal( currentURL(), `/allocations/${allocation.id}`, @@ -81,13 +84,13 @@ module('Acceptance | task detail', function(hooks) { ); }); - test('/allocation/:id/:task_name should include resource utilization graphs', function(assert) { + test('/allocation/:id/:task_name should include resource utilization graphs', async function(assert) { assert.equal(Task.resourceCharts.length, 2, 'Two resource utilization graphs'); assert.equal(Task.resourceCharts.objectAt(0).name, 'CPU', 'First chart is CPU'); assert.equal(Task.resourceCharts.objectAt(1).name, 'Memory', 'Second chart is Memory'); }); - test('the addresses table lists all reserved and dynamic ports', function(assert) { + test('the addresses table lists all reserved and dynamic ports', async function(assert) { const taskResources = allocation.taskResourcesIds .map(id => server.db.taskResources.find(id)) .find(resources => resources.name === task.name); @@ -98,7 +101,7 @@ module('Acceptance | task detail', function(hooks) { assert.equal(Task.addresses.length, addresses.length, 'All addresses are listed'); }); - test('each address row shows the label and value of the address', function(assert) { + test('each address row shows the label and value of the address', async function(assert) { const taskResources = allocation.taskResourcesIds .map(id => server.db.taskResources.find(id)) .findBy('name', task.name); @@ -117,13 +120,13 @@ module('Acceptance | task detail', function(hooks) { assert.equal(addressRow.address, `${networkAddress}:${address.Value}`, 'Value'); }); - test('the events table lists all recent events', function(assert) { + test('the events table lists all recent events', async function(assert) { const events = server.db.taskEvents.where({ taskStateId: task.id }); assert.equal(Task.events.length, events.length, `Lists ${events.length} events`); }); - test('each recent event should list the time, type, and description of the event', function(assert) { + test('each recent event should list the time, type, and description of the event', async function(assert) { const event = server.db.taskEvents.where({ taskStateId: task.id })[0]; const recentEvent = Task.events.objectAt(Task.events.length - 1); @@ -136,8 +139,8 @@ module('Acceptance | task detail', function(hooks) { assert.equal(recentEvent.message, event.displayMessage, 'Event message'); }); - test('when the allocation is not found, the application errors', function(assert) { - Task.visit({ id: 'not-a-real-allocation', name: task.name }); + test('when the allocation is not found, the application errors', async function(assert) { + await Task.visit({ id: 'not-a-real-allocation', name: task.name }); assert.equal( server.pretender.handledRequests.findBy('status', 404).url, @@ -153,8 +156,8 @@ module('Acceptance | task detail', function(hooks) { assert.equal(Task.error.title, 'Not Found', 'Error message is for 404'); }); - test('when the allocation is found but the task is not, the application errors', function(assert) { - Task.visit({ id: allocation.id, name: 'not-a-real-task-name' }); + test('when the allocation is found but the task is not, the application errors', async function(assert) { + await Task.visit({ id: allocation.id, name: 'not-a-real-task-name' }); assert.ok( server.pretender.handledRequests @@ -175,26 +178,28 @@ module('Acceptance | task detail', function(hooks) { module('Acceptance | task detail (no addresses)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('agent'); server.create('node'); server.create('job'); allocation = server.create('allocation', 'withoutTaskWithPorts', { clientStatus: 'running' }); task = server.db.taskStates.where({ allocationId: allocation.id })[0]; - Task.visit({ id: allocation.id, name: task.name }); + await Task.visit({ id: allocation.id, name: task.name }); }); - test('when the task has no addresses, the addresses table is not shown', function(assert) { + test('when the task has no addresses, the addresses table is not shown', async function(assert) { assert.notOk(Task.hasAddresses, 'No addresses table'); }); }); module('Acceptance | task detail (different namespace)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('agent'); server.create('node'); server.create('namespace'); @@ -203,35 +208,38 @@ module('Acceptance | task detail (different namespace)', function(hooks) { allocation = server.create('allocation', 'withTaskWithPorts', { clientStatus: 'running' }); task = server.db.taskStates.where({ allocationId: allocation.id })[0]; - Task.visit({ id: allocation.id, name: task.name }); + await Task.visit({ id: allocation.id, name: task.name }); }); - test('breadcrumbs match jobs / job / task group / allocation / task', function(assert) { + test('breadcrumbs match jobs / job / task group / allocation / task', async function(assert) { const { jobId, taskGroup } = allocation; const job = server.db.jobs.find(jobId); - Task.breadcrumbFor('jobs.index').visit(); + await Task.breadcrumbFor('jobs.index').visit(); assert.equal( currentURL(), '/jobs?namespace=other-namespace', 'Jobs breadcrumb links correctly' ); - Task.visit({ id: allocation.id, name: task.name }); - Task.breadcrumbFor('jobs.job.index').visit(); + + await Task.visit({ id: allocation.id, name: task.name }); + await Task.breadcrumbFor('jobs.job.index').visit(); assert.equal( currentURL(), `/jobs/${job.id}?namespace=other-namespace`, 'Job breadcrumb links correctly' ); - Task.visit({ id: allocation.id, name: task.name }); - Task.breadcrumbFor('jobs.job.task-group').visit(); + + await Task.visit({ id: allocation.id, name: task.name }); + await Task.breadcrumbFor('jobs.job.task-group').visit(); assert.equal( currentURL(), `/jobs/${job.id}/${taskGroup}?namespace=other-namespace`, 'Task Group breadcrumb links correctly' ); - Task.visit({ id: allocation.id, name: task.name }); - Task.breadcrumbFor('allocations.allocation').visit(); + + await Task.visit({ id: allocation.id, name: task.name }); + await Task.breadcrumbFor('allocations.allocation').visit(); assert.equal( currentURL(), `/allocations/${allocation.id}`, @@ -242,8 +250,9 @@ module('Acceptance | task detail (different namespace)', function(hooks) { module('Acceptance | task detail (not running)', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('agent'); server.create('node'); server.create('namespace'); @@ -252,10 +261,10 @@ module('Acceptance | task detail (not running)', function(hooks) { allocation = server.create('allocation', 'withTaskWithPorts', { clientStatus: 'complete' }); task = server.db.taskStates.where({ allocationId: allocation.id })[0]; - Task.visit({ id: allocation.id, name: task.name }); + await Task.visit({ id: allocation.id, name: task.name }); }); - test('when the allocation for a task is not running, the resource utilization graphs are replaced by an empty message', function(assert) { + test('when the allocation for a task is not running, the resource utilization graphs are replaced by an empty message', async function(assert) { assert.equal(Task.resourceCharts.length, 0, 'No resource charts'); assert.equal(Task.resourceEmptyMessage, "Task isn't running", 'Empty message is appropriate'); }); diff --git a/ui/tests/acceptance/task-group-detail-test.js b/ui/tests/acceptance/task-group-detail-test.js index 0f65ab5e38c..fbfca4f78a9 100644 --- a/ui/tests/acceptance/task-group-detail-test.js +++ b/ui/tests/acceptance/task-group-detail-test.js @@ -18,7 +18,7 @@ module('Acceptance | task group detail', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('agent'); server.create('node', 'forceIPv4'); @@ -61,10 +61,10 @@ module('Acceptance | task group detail', function(hooks) { previousAllocation: allocations[0].id, }); - TaskGroup.visit({ id: job.id, name: taskGroup.name }); + await TaskGroup.visit({ id: job.id, name: taskGroup.name }); }); - test('/jobs/:id/:task-group should list high-level metrics for the allocation', function(assert) { + test('/jobs/:id/:task-group should list high-level metrics for the allocation', async function(assert) { const totalCPU = tasks.mapBy('Resources.CPU').reduce(sum, 0); const totalMemory = tasks.mapBy('Resources.MemoryMB').reduce(sum, 0); const totalDisk = taskGroup.ephemeralDisk.SizeMB; @@ -87,7 +87,7 @@ module('Acceptance | task group detail', function(hooks) { ); }); - test('/jobs/:id/:task-group should have breadcrumbs for job and jobs', function(assert) { + test('/jobs/:id/:task-group should have breadcrumbs for job and jobs', async function(assert) { assert.equal(TaskGroup.breadcrumbFor('jobs.index').text, 'Jobs', 'First breadcrumb says jobs'); assert.equal( TaskGroup.breadcrumbFor('jobs.job.index').text, @@ -101,13 +101,13 @@ module('Acceptance | task group detail', function(hooks) { ); }); - test('/jobs/:id/:task-group first breadcrumb should link to jobs', function(assert) { - TaskGroup.breadcrumbFor('jobs.index').visit(); + test('/jobs/:id/:task-group first breadcrumb should link to jobs', async function(assert) { + await TaskGroup.breadcrumbFor('jobs.index').visit(); assert.equal(currentURL(), '/jobs', 'First breadcrumb links back to jobs'); }); - test('/jobs/:id/:task-group second breadcrumb should link to the job for the task group', function(assert) { - TaskGroup.breadcrumbFor('jobs.job.index').visit(); + test('/jobs/:id/:task-group second breadcrumb should link to the job for the task group', async function(assert) { + await TaskGroup.breadcrumbFor('jobs.job.index').visit(); assert.equal( currentURL(), `/jobs/${job.id}`, @@ -115,15 +115,15 @@ module('Acceptance | task group detail', function(hooks) { ); }); - test('/jobs/:id/:task-group should list one page of allocations for the task group', function(assert) { + test('/jobs/:id/:task-group should list one page of allocations for the task group', async function(assert) { server.createList('allocation', TaskGroup.pageSize, { jobId: job.id, taskGroup: taskGroup.name, clientStatus: 'running', }); - JobsList.visit(); - TaskGroup.visit({ id: job.id, name: taskGroup.name }); + await JobsList.visit(); + await TaskGroup.visit({ id: job.id, name: taskGroup.name }); assert.ok( server.db.allocations.where({ jobId: job.id }).length > TaskGroup.pageSize, @@ -137,7 +137,7 @@ module('Acceptance | task group detail', function(hooks) { ); }); - test('each allocation should show basic information about the allocation', function(assert) { + test('each allocation should show basic information about the allocation', async function(assert) { const allocation = allocations.sortBy('modifyIndex').reverse()[0]; const allocationRow = TaskGroup.allocations.objectAt(0); @@ -160,12 +160,12 @@ module('Acceptance | task group detail', function(hooks) { 'Node ID' ); - allocationRow.visitClient(); + await allocationRow.visitClient(); assert.equal(currentURL(), `/clients/${allocation.nodeId}`, 'Node links to node page'); }); - test('each allocation should show stats about the allocation', function(assert) { + test('each allocation should show stats about the allocation', async function(assert) { const allocation = allocations.sortBy('name')[0]; const allocationRow = TaskGroup.allocations.objectAt(0); @@ -200,8 +200,8 @@ module('Acceptance | task group detail', function(hooks) { ); }); - test('when the allocation search has no matches, there is an empty message', function(assert) { - TaskGroup.search('zzzzzz'); + test('when the allocation search has no matches, there is an empty message', async function(assert) { + await TaskGroup.search('zzzzzz'); assert.ok(TaskGroup.isEmpty, 'Empty state is shown'); assert.equal( @@ -211,7 +211,7 @@ module('Acceptance | task group detail', function(hooks) { ); }); - test('when the allocation has reschedule events, the allocation row is denoted with an icon', function(assert) { + test('when the allocation has reschedule events, the allocation row is denoted with an icon', async function(assert) { const rescheduleRow = TaskGroup.allocationFor(allocations[0].id); const normalRow = TaskGroup.allocationFor(allocations[1].id); @@ -219,8 +219,8 @@ module('Acceptance | task group detail', function(hooks) { assert.notOk(normalRow.rescheduled, 'Normal row has no reschedule icon'); }); - test('when the job for the task group is not found, an error message is shown, but the URL persists', function(assert) { - TaskGroup.visit({ id: 'not-a-real-job', name: 'not-a-real-task-group' }); + test('when the job for the task group is not found, an error message is shown, but the URL persists', async function(assert) { + await TaskGroup.visit({ id: 'not-a-real-job', name: 'not-a-real-task-group' }); assert.equal( server.pretender.handledRequests.findBy('status', 404).url, @@ -232,8 +232,8 @@ module('Acceptance | task group detail', function(hooks) { assert.equal(TaskGroup.error.title, 'Not Found', 'Error message is for 404'); }); - test('when the task group is not found on the job, an error message is shown, but the URL persists', function(assert) { - TaskGroup.visit({ id: job.id, name: 'not-a-real-task-group' }); + test('when the task group is not found on the job, an error message is shown, but the URL persists', async function(assert) { + await TaskGroup.visit({ id: job.id, name: 'not-a-real-task-group' }); assert.ok( server.pretender.handledRequests diff --git a/ui/tests/acceptance/task-logs-test.js b/ui/tests/acceptance/task-logs-test.js index cf6355c6d21..df2ca3f735f 100644 --- a/ui/tests/acceptance/task-logs-test.js +++ b/ui/tests/acceptance/task-logs-test.js @@ -12,7 +12,7 @@ module('Acceptance | task logs', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('agent'); server.create('node', 'forceIPv4'); const job = server.create('job', { createAllocations: false }); @@ -21,15 +21,15 @@ module('Acceptance | task logs', function(hooks) { task = server.db.taskStates.where({ allocationId: allocation.id })[0]; run.later(run, run.cancelTimers, 1000); - TaskLogs.visit({ id: allocation.id, name: task.name }); + await TaskLogs.visit({ id: allocation.id, name: task.name }); }); - test('/allocation/:id/:task_name/logs should have a log component', function(assert) { + test('/allocation/:id/:task_name/logs should have a log component', async function(assert) { assert.equal(currentURL(), `/allocations/${allocation.id}/${task.name}/logs`, 'No redirect'); assert.ok(TaskLogs.hasTaskLog, 'Task log component found'); }); - test('the stdout log immediately starts streaming', function(assert) { + test('the stdout log immediately starts streaming', async function(assert) { const node = server.db.nodes.find(allocation.nodeId); const logUrlRegex = new RegExp(`${node.httpAddr}/v1/client/fs/logs/${allocation.id}`); assert.ok( diff --git a/ui/tests/acceptance/token-test.js b/ui/tests/acceptance/token-test.js index 8fdf4590964..9c11a6a4e7e 100644 --- a/ui/tests/acceptance/token-test.js +++ b/ui/tests/acceptance/token-test.js @@ -17,6 +17,9 @@ module('Acceptance | tokens', function(hooks) { setupMirage(hooks); hooks.beforeEach(function() { + localStorage.clear(); + sessionStorage.clear(); + server.create('agent'); node = server.create('node'); job = server.create('job'); @@ -24,25 +27,23 @@ module('Acceptance | tokens', function(hooks) { clientToken = server.create('token'); }); - test('the token form sets the token in local storage', function(assert) { + test('the token form sets the token in local storage', async function(assert) { const { secretId } = managementToken; - Tokens.visit(); - + await Tokens.visit(); assert.ok(window.localStorage.nomadTokenSecret == null, 'No token secret set'); - Tokens.secret(secretId).submit(); - + await Tokens.secret(secretId).submit(); assert.equal(window.localStorage.nomadTokenSecret, secretId, 'Token secret was set'); }); // TODO: unskip once store.unloadAll reliably waits for in-flight requests to settle - skip('the X-Nomad-Token header gets sent with requests once it is set', function(assert) { + skip('the X-Nomad-Token header gets sent with requests once it is set', async function(assert) { const { secretId } = managementToken; let requestPosition = 0; - JobDetail.visit({ id: job.id }); - ClientDetail.visit({ id: node.id }); + await JobDetail.visit({ id: job.id }); + await ClientDetail.visit({ id: node.id }); andThen(() => { assert.ok(server.pretender.handledRequests.length > 1, 'Requests have been made'); @@ -54,27 +55,23 @@ module('Acceptance | tokens', function(hooks) { requestPosition = server.pretender.handledRequests.length; }); - Tokens.visit(); + await Tokens.visit(); - andThen(() => { - Tokens.secret(secretId).submit(); - }); + await Tokens.secret(secretId).submit(); - JobDetail.visit({ id: job.id }); - ClientDetail.visit({ id: node.id }); + await JobDetail.visit({ id: job.id }); + await ClientDetail.visit({ id: node.id }); - andThen(() => { - const newRequests = server.pretender.handledRequests.slice(requestPosition); - assert.ok(newRequests.length > 1, 'New requests have been made'); + const newRequests = server.pretender.handledRequests.slice(requestPosition); + assert.ok(newRequests.length > 1, 'New requests have been made'); - // Cross-origin requests can't have a token - newRequests.forEach(req => { - assert.equal(getHeader(req, 'X-Nomad-Token'), secretId, `Token set for ${req.url}`); - }); + // Cross-origin requests can't have a token + newRequests.forEach(req => { + assert.equal(getHeader(req, 'X-Nomad-Token'), secretId, `Token set for ${req.url}`); }); }); - test('an error message is shown when authenticating a token fails', function(assert) { + test('an error message is shown when authenticating a token fails', async function(assert) { const { secretId } = managementToken; const bogusSecret = 'this-is-not-the-secret'; assert.notEqual( @@ -83,9 +80,8 @@ module('Acceptance | tokens', function(hooks) { 'bogus secret is not somehow coincidentally equal to the real secret' ); - Tokens.visit(); - - Tokens.secret(bogusSecret).submit(); + await Tokens.visit(); + await Tokens.secret(bogusSecret).submit(); assert.ok(window.localStorage.nomadTokenSecret == null, 'Token secret is discarded on failure'); assert.ok(Tokens.errorMessage, 'Token error message is shown'); @@ -93,12 +89,11 @@ module('Acceptance | tokens', function(hooks) { assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); }); - test('a success message and a special management token message are shown when authenticating succeeds', function(assert) { + test('a success message and a special management token message are shown when authenticating succeeds', async function(assert) { const { secretId } = managementToken; - Tokens.visit(); - - Tokens.secret(secretId).submit(); + await Tokens.visit(); + await Tokens.secret(secretId).submit(); assert.ok(Tokens.successMessage, 'Token success message is shown'); assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); @@ -106,14 +101,13 @@ module('Acceptance | tokens', function(hooks) { assert.equal(Tokens.policies.length, 0, 'No token policies are shown'); }); - test('a success message and associated policies are shown when authenticating succeeds', function(assert) { + test('a success message and associated policies are shown when authenticating succeeds', async function(assert) { const { secretId } = clientToken; const policy = clientToken.policies.models[0]; policy.update('description', 'Make sure there is a description'); - Tokens.visit(); - - Tokens.secret(secretId).submit(); + await Tokens.visit(); + await Tokens.secret(secretId).submit(); assert.ok(Tokens.successMessage, 'Token success message is shown'); assert.notOk(Tokens.errorMessage, 'Token error message is not shown'); @@ -131,22 +125,20 @@ module('Acceptance | tokens', function(hooks) { assert.equal(policyElement.rules, policy.rules, 'Policy Rules'); }); - test('setting a token clears the store', function(assert) { + test('setting a token clears the store', async function(assert) { const { secretId } = clientToken; - Jobs.visit(); - + await Jobs.visit(); assert.ok(find('.job-row'), 'Jobs found'); - Tokens.visit(); - - Tokens.secret(secretId).submit(); + await Tokens.visit(); + await Tokens.secret(secretId).submit(); server.pretender.get('/v1/jobs', function() { return [200, {}, '[]']; }); - Jobs.visit(); + await Jobs.visit(); // If jobs are lingering in the store, they would show up assert.notOk(find('[data-test-job-row]'), 'No jobs found'); diff --git a/ui/tests/helpers/module-for-job.js b/ui/tests/helpers/module-for-job.js index 9dfa94b4ca4..75beffc9ce5 100644 --- a/ui/tests/helpers/module-for-job.js +++ b/ui/tests/helpers/module-for-job.js @@ -18,53 +18,45 @@ export default function moduleForJob(title, context, jobFactory, additionalTests } }); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { server.create('node'); job = jobFactory(); - JobDetail.visit({ id: job.id }); + await JobDetail.visit({ id: job.id }); }); - test('visiting /jobs/:job_id', function(assert) { + test('visiting /jobs/:job_id', async function(assert) { assert.equal(currentURL(), `/jobs/${job.id}`); }); - test('the subnav links to overview', function(assert) { - JobDetail.tabFor('overview').visit(); - andThen(() => { - assert.equal(currentURL(), `/jobs/${job.id}`); - }); + test('the subnav links to overview', async function(assert) { + await JobDetail.tabFor('overview').visit(); + assert.equal(currentURL(), `/jobs/${job.id}`); }); - test('the subnav links to definition', function(assert) { - JobDetail.tabFor('definition').visit(); - andThen(() => { - assert.equal(currentURL(), `/jobs/${job.id}/definition`); - }); + test('the subnav links to definition', async function(assert) { + await JobDetail.tabFor('definition').visit(); + assert.equal(currentURL(), `/jobs/${job.id}/definition`); }); - test('the subnav links to versions', function(assert) { - JobDetail.tabFor('versions').visit(); - andThen(() => { - assert.equal(currentURL(), `/jobs/${job.id}/versions`); - }); + test('the subnav links to versions', async function(assert) { + await JobDetail.tabFor('versions').visit(); + assert.equal(currentURL(), `/jobs/${job.id}/versions`); }); - test('the subnav links to evaluations', function(assert) { - JobDetail.tabFor('evaluations').visit(); - andThen(() => { - assert.equal(currentURL(), `/jobs/${job.id}/evaluations`); - }); + test('the subnav links to evaluations', async function(assert) { + await JobDetail.tabFor('evaluations').visit(); + assert.equal(currentURL(), `/jobs/${job.id}/evaluations`); }); if (context === 'allocations') { - test('allocations for the job are shown in the overview', function(assert) { + test('allocations for the job are shown in the overview', async function(assert) { assert.ok(JobDetail.allocationsSummary, 'Allocations are shown in the summary section'); assert.notOk(JobDetail.childrenSummary, 'Children are not shown in the summary section'); }); } if (context === 'children') { - test('children for the job are shown in the overview', function(assert) { + test('children for the job are shown in the overview', async function(assert) { assert.ok(JobDetail.childrenSummary, 'Children are shown in the summary section'); assert.notOk( JobDetail.allocationsSummary, @@ -74,8 +66,8 @@ export default function moduleForJob(title, context, jobFactory, additionalTests } for (var testName in additionalTests) { - test(testName, function(assert) { - additionalTests[testName](job, assert); + test(testName, async function(assert) { + await additionalTests[testName](job, assert); }); } }); From bebc9b8f1144525ddc060133187c66e973868259 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Wed, 13 Mar 2019 23:45:15 -0700 Subject: [PATCH 19/46] Fix integration tests that had test failures --- ui/tests/integration/job-editor-test.js | 426 ++++++++++-------------- ui/tests/integration/task-log-test.js | 151 +++++---- 2 files changed, 257 insertions(+), 320 deletions(-) diff --git a/ui/tests/integration/job-editor-test.js b/ui/tests/integration/job-editor-test.js index 2b0f7e6869d..fd942a91194 100644 --- a/ui/tests/integration/job-editor-test.js +++ b/ui/tests/integration/job-editor-test.js @@ -7,39 +7,33 @@ import hbs from 'htmlbars-inline-precompile'; import { create } from 'ember-cli-page-object'; import sinon from 'sinon'; import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; -import { getCodeMirrorInstance } from 'nomad-ui/tests/helpers/codemirror'; import jobEditor from 'nomad-ui/tests/pages/components/job-editor'; import { initialize as fragmentSerializerInitializer } from 'nomad-ui/initializers/fragment-serializer'; +import setupCodeMirror from 'nomad-ui/tests/helpers/codemirror'; const Editor = create(jobEditor()); module('Integration | Component | job-editor', function(hooks) { setupRenderingTest(hooks); + setupCodeMirror(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { window.localStorage.clear(); fragmentSerializerInitializer(this.owner); - // Normally getCodeMirrorInstance is a registered test helper, - // but those registered test helpers only work in acceptance tests. - window._getCodeMirrorInstance = window.getCodeMirrorInstance; - window.getCodeMirrorInstance = getCodeMirrorInstance(this.owner); - this.store = this.owner.lookup('service:store'); this.server = startMirage(); // Required for placing allocations (a result of creating jobs) this.server.create('node'); - Editor.setContext(this); + await Editor.setContext(this); }); - hooks.afterEach(function() { + hooks.afterEach(async function() { this.server.shutdown(); - Editor.removeContext(); - window.getCodeMirrorInstance = window._getCodeMirrorInstance; - delete window._getCodeMirrorInstance; + await Editor.removeContext(); }); const newJobName = 'new-job'; @@ -99,62 +93,55 @@ module('Integration | Component | job-editor', function(hooks) { onCancel=onCancel}} `; - const renderNewJob = (component, job) => () => { + const renderNewJob = async (component, job) => { component.setProperties({ job, onSubmit: sinon.spy(), context: 'new' }); component.render(commonTemplate); - return settled(); + await settled(); }; - const renderEditJob = (component, job) => () => { + const renderEditJob = async (component, job) => { component.setProperties({ job, onSubmit: sinon.spy(), onCancel: sinon.spy(), context: 'edit' }); - component.render(cancelableTemplate); + await component.render(cancelableTemplate); }; - const planJob = spec => () => { - Editor.editor.fillIn(spec); - return settled().then(() => { - Editor.plan(); - return settled(); - }); + const planJob = async spec => { + await Editor.editor.fillIn(spec); + await settled(); + await Editor.plan(); + await settled(); }; - test('the default state is an editor with an explanation popup', function(assert) { + test('the default state is an editor with an explanation popup', async function(assert) { let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(() => { - assert.ok(Editor.editorHelp.isPresent, 'Editor explanation popup is present'); - assert.ok(Editor.editor.isPresent, 'Editor is present'); - }); + await settled(); + await renderNewJob(this, job); + assert.ok(Editor.editorHelp.isPresent, 'Editor explanation popup is present'); + assert.ok(Editor.editor.isPresent, 'Editor is present'); }); - test('the explanation popup can be dismissed', function(assert) { + test('the explanation popup can be dismissed', async function(assert) { let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(() => { - Editor.editorHelp.dismiss(); - return settled(); - }) - .then(() => { - assert.notOk(Editor.editorHelp.isPresent, 'Editor explanation popup is gone'); - assert.equal( - window.localStorage.nomadMessageJobEditor, - 'false', - 'Dismissal is persisted in localStorage' - ); - }); + await settled(); + await renderNewJob(this, job); + await Editor.editorHelp.dismiss(); + await settled(); + assert.notOk(Editor.editorHelp.isPresent, 'Editor explanation popup is gone'); + assert.equal( + window.localStorage.nomadMessageJobEditor, + 'false', + 'Dismissal is persisted in localStorage' + ); }); - test('the explanation popup is not shown once the dismissal state is set in localStorage', function(assert) { + test('the explanation popup is not shown once the dismissal state is set in localStorage', async function(assert) { window.localStorage.nomadMessageJobEditor = 'false'; let job; @@ -162,96 +149,77 @@ module('Integration | Component | job-editor', function(hooks) { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(() => { - assert.notOk(Editor.editorHelp.isPresent, 'Editor explanation popup is gone'); - }); + await settled(); + await renderNewJob(this, job); + assert.notOk(Editor.editorHelp.isPresent, 'Editor explanation popup is gone'); }); - test('submitting a json job skips the parse endpoint', function(assert) { + test('submitting a json job skips the parse endpoint', async function(assert) { const spec = jsonJob(); let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - const requests = this.server.pretender.handledRequests.mapBy('url'); - assert.notOk(requests.includes('/v1/jobs/parse'), 'JSON job spec is not parsed'); - assert.ok( - requests.includes(`/v1/job/${newJobName}/plan`), - 'JSON job spec is still planned' - ); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + const requests = this.server.pretender.handledRequests.mapBy('url'); + assert.notOk(requests.includes('/v1/jobs/parse'), 'JSON job spec is not parsed'); + assert.ok(requests.includes(`/v1/job/${newJobName}/plan`), 'JSON job spec is still planned'); }); - test('submitting an hcl job requires the parse endpoint', function(assert) { + test('submitting an hcl job requires the parse endpoint', async function(assert) { const spec = hclJob(); let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - const requests = this.server.pretender.handledRequests.mapBy('url'); - assert.ok(requests.includes('/v1/jobs/parse'), 'HCL job spec is parsed first'); - assert.ok(requests.includes(`/v1/job/${newJobName}/plan`), 'HCL job spec is planned'); - assert.ok( - requests.indexOf('/v1/jobs/parse') < requests.indexOf(`/v1/job/${newJobName}/plan`), - 'Parse comes before Plan' - ); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + const requests = this.server.pretender.handledRequests.mapBy('url'); + assert.ok(requests.includes('/v1/jobs/parse'), 'HCL job spec is parsed first'); + assert.ok(requests.includes(`/v1/job/${newJobName}/plan`), 'HCL job spec is planned'); + assert.ok( + requests.indexOf('/v1/jobs/parse') < requests.indexOf(`/v1/job/${newJobName}/plan`), + 'Parse comes before Plan' + ); }); - test('when a job is successfully parsed and planned, the plan is shown to the user', function(assert) { + test('when a job is successfully parsed and planned, the plan is shown to the user', async function(assert) { const spec = hclJob(); let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - assert.ok(Editor.planOutput, 'The plan is outputted'); - assert.notOk(Editor.editor.isPresent, 'The editor is replaced with the plan output'); - assert.ok(Editor.planHelp.isPresent, 'The plan explanation popup is shown'); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + assert.ok(Editor.planOutput, 'The plan is outputted'); + assert.notOk(Editor.editor.isPresent, 'The editor is replaced with the plan output'); + assert.ok(Editor.planHelp.isPresent, 'The plan explanation popup is shown'); }); - test('from the plan screen, the cancel button goes back to the editor with the job still in tact', function(assert) { + test('from the plan screen, the cancel button goes back to the editor with the job still in tact', async function(assert) { const spec = hclJob(); let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - Editor.cancel(); - return settled(); - }) - .then(() => { - assert.ok(Editor.editor.isPresent, 'The editor is shown again'); - assert.equal( - Editor.editor.contents, - spec, - 'The spec that was planned is still in the editor' - ); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + await Editor.cancel(); + await settled(); + assert.ok(Editor.editor.isPresent, 'The editor is shown again'); + assert.equal(Editor.editor.contents, spec, 'The spec that was planned is still in the editor'); }); - test('when parse fails, the parse error message is shown', function(assert) { + test('when parse fails, the parse error message is shown', async function(assert) { const spec = hclJob(); const errorMessage = 'Parse Failed!! :o'; @@ -262,23 +230,21 @@ module('Integration | Component | job-editor', function(hooks) { this.server.pretender.post('/v1/jobs/parse', () => [400, {}, errorMessage]); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - assert.notOk(Editor.planError.isPresent, 'Plan error is not shown'); - assert.notOk(Editor.runError.isPresent, 'Run error is not shown'); - - assert.ok(Editor.parseError.isPresent, 'Parse error is shown'); - assert.equal( - Editor.parseError.message, - errorMessage, - 'The error message from the server is shown in the error in the UI' - ); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + assert.notOk(Editor.planError.isPresent, 'Plan error is not shown'); + assert.notOk(Editor.runError.isPresent, 'Run error is not shown'); + + assert.ok(Editor.parseError.isPresent, 'Parse error is shown'); + assert.equal( + Editor.parseError.message, + errorMessage, + 'The error message from the server is shown in the error in the UI' + ); }); - test('when plan fails, the plan error message is shown', function(assert) { + test('when plan fails, the plan error message is shown', async function(assert) { const spec = hclJob(); const errorMessage = 'Plan Failed!! :o'; @@ -289,23 +255,21 @@ module('Integration | Component | job-editor', function(hooks) { this.server.pretender.post(`/v1/job/${newJobName}/plan`, () => [400, {}, errorMessage]); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - assert.notOk(Editor.parseError.isPresent, 'Parse error is not shown'); - assert.notOk(Editor.runError.isPresent, 'Run error is not shown'); - - assert.ok(Editor.planError.isPresent, 'Plan error is shown'); - assert.equal( - Editor.planError.message, - errorMessage, - 'The error message from the server is shown in the error in the UI' - ); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + assert.notOk(Editor.parseError.isPresent, 'Parse error is not shown'); + assert.notOk(Editor.runError.isPresent, 'Run error is not shown'); + + assert.ok(Editor.planError.isPresent, 'Plan error is shown'); + assert.equal( + Editor.planError.message, + errorMessage, + 'The error message from the server is shown in the error in the UI' + ); }); - test('when run fails, the run error message is shown', function(assert) { + test('when run fails, the run error message is shown', async function(assert) { const spec = hclJob(); const errorMessage = 'Run Failed!! :o'; @@ -316,182 +280,150 @@ module('Integration | Component | job-editor', function(hooks) { this.server.pretender.post('/v1/jobs', () => [400, {}, errorMessage]); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - Editor.run(); - return settled(); - }) - .then(() => { - assert.notOk(Editor.planError.isPresent, 'Plan error is not shown'); - assert.notOk(Editor.parseError.isPresent, 'Parse error is not shown'); - - assert.ok(Editor.runError.isPresent, 'Run error is shown'); - assert.equal( - Editor.runError.message, - errorMessage, - 'The error message from the server is shown in the error in the UI' - ); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + await Editor.run(); + await settled(); + assert.notOk(Editor.planError.isPresent, 'Plan error is not shown'); + assert.notOk(Editor.parseError.isPresent, 'Parse error is not shown'); + + assert.ok(Editor.runError.isPresent, 'Run error is shown'); + assert.equal( + Editor.runError.message, + errorMessage, + 'The error message from the server is shown in the error in the UI' + ); }); - test('when the scheduler dry-run has warnings, the warnings are shown to the user', function(assert) { + test('when the scheduler dry-run has warnings, the warnings are shown to the user', async function(assert) { const spec = jsonJob({ Unschedulable: true }); let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - assert.ok( - Editor.dryRunMessage.errored, - 'The scheduler dry-run message is in the warning state' - ); - assert.notOk( - Editor.dryRunMessage.succeeded, - 'The success message is not shown in addition to the warning message' - ); - assert.ok( - Editor.dryRunMessage.body.includes(newJobTaskGroupName), - 'The scheduler dry-run message includes the warning from send back by the API' - ); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + assert.ok( + Editor.dryRunMessage.errored, + 'The scheduler dry-run message is in the warning state' + ); + assert.notOk( + Editor.dryRunMessage.succeeded, + 'The success message is not shown in addition to the warning message' + ); + assert.ok( + Editor.dryRunMessage.body.includes(newJobTaskGroupName), + 'The scheduler dry-run message includes the warning from send back by the API' + ); }); - test('when the scheduler dry-run has no warnings, a success message is shown to the user', function(assert) { + test('when the scheduler dry-run has no warnings, a success message is shown to the user', async function(assert) { const spec = hclJob(); let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - assert.ok( - Editor.dryRunMessage.succeeded, - 'The scheduler dry-run message is in the success state' - ); - assert.notOk( - Editor.dryRunMessage.errored, - 'The warning message is not shown in addition to the success message' - ); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + assert.ok( + Editor.dryRunMessage.succeeded, + 'The scheduler dry-run message is in the success state' + ); + assert.notOk( + Editor.dryRunMessage.errored, + 'The warning message is not shown in addition to the success message' + ); }); - test('when a job is submitted in the edit context, a POST request is made to the update job endpoint', function(assert) { + test('when a job is submitted in the edit context, a POST request is made to the update job endpoint', async function(assert) { const spec = hclJob(); let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderEditJob(this, job)) - .then(planJob(spec)) - .then(() => { - Editor.run(); - }) - .then(() => { - const requests = this.server.pretender.handledRequests - .filterBy('method', 'POST') - .mapBy('url'); - assert.ok(requests.includes(`/v1/job/${newJobName}`), 'A request was made to job update'); - assert.notOk(requests.includes('/v1/jobs'), 'A request was not made to job create'); - }); + await settled(); + await renderEditJob(this, job); + await planJob(spec); + await Editor.run(); + const requests = this.server.pretender.handledRequests.filterBy('method', 'POST').mapBy('url'); + assert.ok(requests.includes(`/v1/job/${newJobName}`), 'A request was made to job update'); + assert.notOk(requests.includes('/v1/jobs'), 'A request was not made to job create'); }); - test('when a job is submitted in the new context, a POST request is made to the create job endpoint', function(assert) { + test('when a job is submitted in the new context, a POST request is made to the create job endpoint', async function(assert) { const spec = hclJob(); let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - Editor.run(); - }) - .then(() => { - const requests = this.server.pretender.handledRequests - .filterBy('method', 'POST') - .mapBy('url'); - assert.ok(requests.includes('/v1/jobs'), 'A request was made to job create'); - assert.notOk( - requests.includes(`/v1/job/${newJobName}`), - 'A request was not made to job update' - ); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + await Editor.run(); + const requests = this.server.pretender.handledRequests.filterBy('method', 'POST').mapBy('url'); + assert.ok(requests.includes('/v1/jobs'), 'A request was made to job create'); + assert.notOk( + requests.includes(`/v1/job/${newJobName}`), + 'A request was not made to job update' + ); }); - test('when a job is successfully submitted, the onSubmit hook is called', function(assert) { + test('when a job is successfully submitted, the onSubmit hook is called', async function(assert) { const spec = hclJob(); let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(planJob(spec)) - .then(() => { - Editor.run(); - return settled(); - }) - .then(() => { - assert.ok( - this.get('onSubmit').calledWith(newJobName, 'default'), - 'The onSubmit hook was called with the correct arguments' - ); - }); + await settled(); + await renderNewJob(this, job); + await planJob(spec); + await Editor.run(); + await settled(); + assert.ok( + this.get('onSubmit').calledWith(newJobName, 'default'), + 'The onSubmit hook was called with the correct arguments' + ); }); - test('when the job-editor cancelable flag is false, there is no cancel button in the header', function(assert) { + test('when the job-editor cancelable flag is false, there is no cancel button in the header', async function(assert) { let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderNewJob(this, job)) - .then(() => { - assert.notOk(Editor.cancelEditingIsAvailable, 'No way to cancel editing'); - }); + await settled(); + await renderNewJob(this, job); + assert.notOk(Editor.cancelEditingIsAvailable, 'No way to cancel editing'); }); - test('when the job-editor cancelable flag is true, there is a cancel button in the header', function(assert) { + test('when the job-editor cancelable flag is true, there is a cancel button in the header', async function(assert) { let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderEditJob(this, job)) - .then(() => { - assert.ok(Editor.cancelEditingIsAvailable, 'Cancel editing button exists'); - }); + await settled(); + await renderEditJob(this, job); + assert.ok(Editor.cancelEditingIsAvailable, 'Cancel editing button exists'); }); - test('when the job-editor cancel button is clicked, the onCancel hook is called', function(assert) { + test('when the job-editor cancel button is clicked, the onCancel hook is called', async function(assert) { let job; run(() => { job = this.store.createRecord('job'); }); - return settled() - .then(renderEditJob(this, job)) - .then(() => { - Editor.cancelEditing(); - }) - .then(() => { - assert.ok(this.get('onCancel').calledOnce, 'The onCancel hook was called'); - }); + await settled(); + await renderEditJob(this, job); + await Editor.cancelEditing(); + assert.ok(this.get('onCancel').calledOnce, 'The onCancel hook was called'); }); }); diff --git a/ui/tests/integration/task-log-test.js b/ui/tests/integration/task-log-test.js index 53f8d3aa628..b2d17209db7 100644 --- a/ui/tests/integration/task-log-test.js +++ b/ui/tests/integration/task-log-test.js @@ -68,6 +68,8 @@ module('Integration | Component | task log', function(hooks) { }); test('Basic appearance', async function(assert) { + run.later(run, run.cancelTimers, commonProps.interval); + this.setProperties(commonProps); await render(hbs`{{task-log allocation=allocation task=task}}`); @@ -79,7 +81,10 @@ module('Integration | Component | task log', function(hooks) { assert.ok(find('[data-test-log-box].is-full-bleed.is-dark'), 'Body is full-bleed and dark'); - assert.ok(find('pre.cli-window'), 'Cli is preformatted and using the cli-window component class'); + assert.ok( + find('pre.cli-window'), + 'Cli is preformatted and using the cli-window component class' + ); }); test('Streaming starts on creation', async function(assert) { @@ -94,50 +99,53 @@ module('Integration | Component | task log', function(hooks) { 'Log requests were made' ); - return settled().then(() => { - assert.equal( - find('[data-test-log-cli]').textContent, - streamFrames[0], - 'First chunk of streaming log is shown' - ); - }); + await settled(); + assert.equal( + find('[data-test-log-cli]').textContent, + streamFrames[0], + 'First chunk of streaming log is shown' + ); }); test('Clicking Head loads the log head', async function(assert) { + run.later(run, run.cancelTimers, commonProps.interval); + this.setProperties(commonProps); await render(hbs`{{task-log allocation=allocation task=task}}`); click('[data-test-log-action="head"]'); - return settled().then(() => { - assert.ok( - this.server.handledRequests.find( - ({ queryParams: qp }) => qp.origin === 'start' && qp.plain === 'true' && qp.offset === '0' - ), - 'Log head request was made' - ); - assert.equal(find('[data-test-log-cli]').textContent, logHead[0], 'Head of the log is shown'); - }); + await settled(); + assert.ok( + this.server.handledRequests.find( + ({ queryParams: qp }) => qp.origin === 'start' && qp.plain === 'true' && qp.offset === '0' + ), + 'Log head request was made' + ); + assert.equal(find('[data-test-log-cli]').textContent, logHead[0], 'Head of the log is shown'); }); test('Clicking Tail loads the log tail', async function(assert) { + run.later(run, run.cancelTimers, commonProps.interval); + this.setProperties(commonProps); await render(hbs`{{task-log allocation=allocation task=task}}`); click('[data-test-log-action="tail"]'); - return settled().then(() => { - assert.ok( - this.server.handledRequests.find( - ({ queryParams: qp }) => qp.origin === 'end' && qp.plain === 'true' - ), - 'Log tail request was made' - ); - assert.equal(find('[data-test-log-cli]').textContent, logTail[0], 'Tail of the log is shown'); - }); + await settled(); + assert.ok( + this.server.handledRequests.find( + ({ queryParams: qp }) => qp.origin === 'end' && qp.plain === 'true' + ), + 'Log tail request was made' + ); + assert.equal(find('[data-test-log-cli]').textContent, logTail[0], 'Tail of the log is shown'); }); test('Clicking toggleStream starts and stops the log stream', async function(assert) { + run.later(run, run.cancelTimers, commonProps.interval); + const { interval } = commonProps; this.setProperties(commonProps); await render(hbs`{{task-log allocation=allocation task=task interval=interval}}`); @@ -146,42 +154,41 @@ module('Integration | Component | task log', function(hooks) { click('[data-test-log-action="toggle-stream"]'); }, interval); - return settled().then(() => { - assert.equal(find('[data-test-log-cli]').textContent, streamFrames[0], 'First frame loaded'); - - run.later(() => { - assert.equal( - find('[data-test-log-cli]').textContent, - streamFrames[0], - 'Still only first frame' - ); - click('[data-test-log-action="toggle-stream"]'); - run.later(run, run.cancelTimers, interval * 2); - }, interval * 2); - - return settled().then(() => { - assert.equal( - find('[data-test-log-cli]').textContent, - streamFrames[0] + streamFrames[0] + streamFrames[1], - 'Now includes second frame' - ); - }); - }); + await settled(); + assert.equal(find('[data-test-log-cli]').textContent, streamFrames[0], 'First frame loaded'); + + run.later(() => { + assert.equal( + find('[data-test-log-cli]').textContent, + streamFrames[0], + 'Still only first frame' + ); + click('[data-test-log-action="toggle-stream"]'); + run.later(run, run.cancelTimers, interval * 2); + }, interval * 2); + + await settled(); + assert.equal( + find('[data-test-log-cli]').textContent, + streamFrames[0] + streamFrames[0] + streamFrames[1], + 'Now includes second frame' + ); }); test('Clicking stderr switches the log to standard error', async function(assert) { + run.later(run, run.cancelTimers, commonProps.interval); + this.setProperties(commonProps); await render(hbs`{{task-log allocation=allocation task=task}}`); click('[data-test-log-action="stderr"]'); run.later(run, run.cancelTimers, commonProps.interval); - return settled().then(() => { - assert.ok( - this.server.handledRequests.filter(req => req.queryParams.type === 'stderr').length, - 'stderr log requests were made' - ); - }); + await settled(); + assert.ok( + this.server.handledRequests.filter(req => req.queryParams.type === 'stderr').length, + 'stderr log requests were made' + ); }); test('When the client is inaccessible, task-log falls back to requesting logs through the server', async function(assert) { @@ -207,13 +214,12 @@ module('Integration | Component | task log', function(hooks) { 'Log request was initially made directly to the client' ); - return settled().then(() => { - const serverUrl = `/v1/client/fs/logs/${commonProps.allocation.id}`; - assert.ok( - this.server.handledRequests.filter(req => req.url.startsWith(serverUrl)).length, - 'Log request was later made to the server' - ); - }); + await settled(); + const serverUrl = `/v1/client/fs/logs/${commonProps.allocation.id}`; + assert.ok( + this.server.handledRequests.filter(req => req.url.startsWith(serverUrl)).length, + 'Log request was later made to the server' + ); }); test('When both the client and the server are inaccessible, an error message is shown', async function(assert) { @@ -238,18 +244,17 @@ module('Integration | Component | task log', function(hooks) { clientTimeout=clientTimeout serverTimeout=serverTimeout}}`); - return settled().then(() => { - const clientUrlRegex = new RegExp(`${HOST}/v1/client/fs/logs/${commonProps.allocation.id}`); - assert.ok( - this.server.handledRequests.filter(req => clientUrlRegex.test(req.url)).length, - 'Log request was initially made directly to the client' - ); - const serverUrl = `/v1/client/fs/logs/${commonProps.allocation.id}`; - assert.ok( - this.server.handledRequests.filter(req => req.url.startsWith(serverUrl)).length, - 'Log request was later made to the server' - ); - assert.ok(find('[data-test-connection-error]'), 'An error message is shown'); - }); + await settled(); + const clientUrlRegex = new RegExp(`${HOST}/v1/client/fs/logs/${commonProps.allocation.id}`); + assert.ok( + this.server.handledRequests.filter(req => clientUrlRegex.test(req.url)).length, + 'Log request was initially made directly to the client' + ); + const serverUrl = `/v1/client/fs/logs/${commonProps.allocation.id}`; + assert.ok( + this.server.handledRequests.filter(req => req.url.startsWith(serverUrl)).length, + 'Log request was later made to the server' + ); + assert.ok(find('[data-test-connection-error]'), 'An error message is shown'); }); }); From 1e669bb56b5a8bc58da55f434e5e3d2fc5d50ea0 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Thu, 14 Mar 2019 00:03:30 -0700 Subject: [PATCH 20/46] Fix bug in the stats-tracker-frame-mising behavior --- ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js b/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js index 80c6adc30a8..e72f8360137 100644 --- a/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js +++ b/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js @@ -23,7 +23,7 @@ export default function statsTrackerFrameMissing({ let shouldFail = false; const fetch = () => { - return resolve(shouldFail ? { ok: false } : new MockResponse(frame)); + return resolve(shouldFail ? { ok: false } : MockResponse(frame)); }; const resource = ResourceConstructor(); From 2474ecae4dc306874638a8c1e0d75c4ff7332e1c Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Thu, 14 Mar 2019 11:35:46 -0700 Subject: [PATCH 21/46] Remove all andThen and .then usages (except for integration tests) Since a future ember version does way with the need to manually making runloop runs, I'm holding off on those tests --- ui/tests/acceptance/token-test.js | 14 +- .../integration/job-page/parts/body-test.js | 38 ++- ui/tests/unit/adapters/job-test.js | 270 ++++++++---------- ui/tests/unit/adapters/node-test.js | 134 ++++----- ui/tests/unit/serializers/allocation-test.js | 2 +- ui/tests/unit/serializers/deployment-test.js | 2 +- ui/tests/unit/serializers/evaluation-test.js | 2 +- ui/tests/unit/serializers/job-plan-test.js | 2 +- ui/tests/unit/serializers/job-summary-test.js | 2 +- ui/tests/unit/serializers/job-test.js | 4 +- ui/tests/unit/serializers/node-test.js | 35 ++- .../utils/allocation-stats-tracker-test.js | 31 +- .../behaviors/stats-tracker-frame-missing.js | 89 +++--- ui/tests/unit/utils/log-test.js | 29 +- .../unit/utils/node-stats-tracker-test.js | 29 +- 15 files changed, 312 insertions(+), 371 deletions(-) diff --git a/ui/tests/acceptance/token-test.js b/ui/tests/acceptance/token-test.js index 9c11a6a4e7e..c02864e7ecb 100644 --- a/ui/tests/acceptance/token-test.js +++ b/ui/tests/acceptance/token-test.js @@ -40,23 +40,19 @@ module('Acceptance | tokens', function(hooks) { // TODO: unskip once store.unloadAll reliably waits for in-flight requests to settle skip('the X-Nomad-Token header gets sent with requests once it is set', async function(assert) { const { secretId } = managementToken; - let requestPosition = 0; await JobDetail.visit({ id: job.id }); await ClientDetail.visit({ id: node.id }); - andThen(() => { - assert.ok(server.pretender.handledRequests.length > 1, 'Requests have been made'); + assert.ok(server.pretender.handledRequests.length > 1, 'Requests have been made'); - server.pretender.handledRequests.forEach(req => { - assert.notOk(getHeader(req, 'X-Nomad-Token'), `No token for ${req.url}`); - }); - - requestPosition = server.pretender.handledRequests.length; + server.pretender.handledRequests.forEach(req => { + assert.notOk(getHeader(req, 'X-Nomad-Token'), `No token for ${req.url}`); }); - await Tokens.visit(); + const requestPosition = server.pretender.handledRequests.length; + await Tokens.visit(); await Tokens.secret(secretId).submit(); await JobDetail.visit({ id: job.id }); diff --git a/ui/tests/integration/job-page/parts/body-test.js b/ui/tests/integration/job-page/parts/body-test.js index 5f79f3978b9..788fa915152 100644 --- a/ui/tests/integration/job-page/parts/body-test.js +++ b/ui/tests/integration/job-page/parts/body-test.js @@ -29,9 +29,8 @@ module('Integration | Component | job-page/parts/body', function(hooks) { {{/job-page/parts/body}} `); - return settled().then(() => { - assert.ok(find('[data-test-subnav="job"]'), 'Job subnav is rendered'); - }); + await settled(); + assert.ok(find('[data-test-subnav="job"]'), 'Job subnav is rendered'); }); test('the subnav includes the deployments link when the job is a service', async function(assert) { @@ -53,12 +52,11 @@ module('Integration | Component | job-page/parts/body', function(hooks) { {{/job-page/parts/body}} `); - return settled().then(() => { - const subnavLabels = findAll('[data-test-tab]').map(anchor => anchor.textContent); - assert.ok(subnavLabels.some(label => label === 'Definition'), 'Definition link'); - assert.ok(subnavLabels.some(label => label === 'Versions'), 'Versions link'); - assert.ok(subnavLabels.some(label => label === 'Deployments'), 'Deployments link'); - }); + await settled(); + const subnavLabels = findAll('[data-test-tab]').map(anchor => anchor.textContent); + assert.ok(subnavLabels.some(label => label === 'Definition'), 'Definition link'); + assert.ok(subnavLabels.some(label => label === 'Versions'), 'Versions link'); + assert.ok(subnavLabels.some(label => label === 'Deployments'), 'Deployments link'); }); test('the subnav does not include the deployments link when the job is not a service', async function(assert) { @@ -80,12 +78,11 @@ module('Integration | Component | job-page/parts/body', function(hooks) { {{/job-page/parts/body}} `); - return settled().then(() => { - const subnavLabels = findAll('[data-test-tab]').map(anchor => anchor.textContent); - assert.ok(subnavLabels.some(label => label === 'Definition'), 'Definition link'); - assert.ok(subnavLabels.some(label => label === 'Versions'), 'Versions link'); - assert.notOk(subnavLabels.some(label => label === 'Deployments'), 'Deployments link'); - }); + await settled(); + const subnavLabels = findAll('[data-test-tab]').map(anchor => anchor.textContent); + assert.ok(subnavLabels.some(label => label === 'Definition'), 'Definition link'); + assert.ok(subnavLabels.some(label => label === 'Versions'), 'Versions link'); + assert.notOk(subnavLabels.some(label => label === 'Deployments'), 'Deployments link'); }); test('body yields content to a section after the subnav', async function(assert) { @@ -97,11 +94,10 @@ module('Integration | Component | job-page/parts/body', function(hooks) { {{/job-page/parts/body}} `); - return settled().then(() => { - assert.ok( - find('[data-test-subnav="job"] + .section > .inner-content'), - 'Content is rendered immediately after the subnav' - ); - }); + await settled(); + assert.ok( + find('[data-test-subnav="job"] + .section > .inner-content'), + 'Content is rendered immediately after the subnav' + ); }); }); diff --git a/ui/tests/unit/adapters/job-test.js b/ui/tests/unit/adapters/job-test.js index df50742e700..ba500aa7452 100644 --- a/ui/tests/unit/adapters/job-test.js +++ b/ui/tests/unit/adapters/job-test.js @@ -44,24 +44,23 @@ module('Unit | Adapter | Job', function(hooks) { this.server.shutdown(); }); - test('The job endpoint is the only required endpoint for fetching a job', function(assert) { + test('The job endpoint is the only required endpoint for fetching a job', async function(assert) { const { pretender } = this.server; const jobName = 'job-1'; const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); + this.subject().findRecord(null, { modelName: 'job' }, jobId); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}`], - 'The only request made is /job/:id' - ); - }); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}`], + 'The only request made is /job/:id' + ); }); - test('When a namespace is set in localStorage but a job in the default namespace is requested, the namespace query param is not present', function(assert) { + test('When a namespace is set in localStorage but a job in the default namespace is requested, the namespace query param is not present', async function(assert) { window.localStorage.nomadActiveNamespace = 'some-namespace'; const { pretender } = this.server; @@ -70,18 +69,17 @@ module('Unit | Adapter | Job', function(hooks) { const jobId = JSON.stringify([jobName, jobNamespace]); this.system.get('namespaces'); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); - - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}`], - 'The only request made is /job/:id with no namespace query param' - ); - }); + await settled(); + this.subject().findRecord(null, { modelName: 'job' }, jobId); + + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}`], + 'The only request made is /job/:id with no namespace query param' + ); }); - test('When a namespace is in localStorage and the requested job is in the default namespace, the namespace query param is left out', function(assert) { + test('When a namespace is in localStorage and the requested job is in the default namespace, the namespace query param is left out', async function(assert) { window.localStorage.nomadActiveNamespace = 'red-herring'; const { pretender } = this.server; @@ -89,67 +87,63 @@ module('Unit | Adapter | Job', function(hooks) { const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); + this.subject().findRecord(null, { modelName: 'job' }, jobId); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}`], - 'The request made is /job/:id with no namespace query param' - ); - }); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}`], + 'The request made is /job/:id with no namespace query param' + ); }); - test('When the job has a namespace other than default, it is in the URL', function(assert) { + test('When the job has a namespace other than default, it is in the URL', async function(assert) { const { pretender } = this.server; const jobName = 'job-2'; const jobNamespace = 'some-namespace'; const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); + this.subject().findRecord(null, { modelName: 'job' }, jobId); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}?namespace=${jobNamespace}`], - 'The only request made is /job/:id?namespace=:namespace' - ); - }); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}?namespace=${jobNamespace}`], + 'The only request made is /job/:id?namespace=:namespace' + ); }); - test('When there is no token set in the token service, no x-nomad-token header is set', function(assert) { + test('When there is no token set in the token service, no x-nomad-token header is set', async function(assert) { const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); + this.subject().findRecord(null, { modelName: 'job' }, jobId); - assert.notOk( - pretender.handledRequests.mapBy('requestHeaders').some(headers => headers['X-Nomad-Token']), - 'No token header present on either job request' - ); - }); + assert.notOk( + pretender.handledRequests.mapBy('requestHeaders').some(headers => headers['X-Nomad-Token']), + 'No token header present on either job request' + ); }); - test('When a token is set in the token service, then x-nomad-token header is set', function(assert) { + test('When a token is set in the token service, then x-nomad-token header is set', async function(assert) { const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); const secret = 'here is the secret'; - return settled().then(() => { - this.subject().set('token.secret', secret); - this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); + this.subject().set('token.secret', secret); + this.subject().findRecord(null, { modelName: 'job' }, jobId); - assert.ok( - pretender.handledRequests - .mapBy('requestHeaders') - .every(headers => headers['X-Nomad-Token'] === secret), - 'The token header is present on both job requests' - ); - }); + assert.ok( + pretender.handledRequests + .mapBy('requestHeaders') + .every(headers => headers['X-Nomad-Token'] === secret), + 'The token header is present on both job requests' + ); }); - test('findAll can be watched', function(assert) { + test('findAll can be watched', async function(assert) { const { pretender } = this.server; const request = () => @@ -165,19 +159,18 @@ module('Unit | Adapter | Job', function(hooks) { 'Second request is a blocking request for jobs' ); - return settled().then(() => { - request(); - assert.equal( - pretender.handledRequests[1].url, - '/v1/jobs?index=2', - 'Third request is a blocking request with an incremented index param' - ); + await settled(); + request(); + assert.equal( + pretender.handledRequests[1].url, + '/v1/jobs?index=2', + 'Third request is a blocking request with an incremented index param' + ); - return settled(); - }); + await settled(); }); - test('findRecord can be watched', function(assert) { + test('findRecord can be watched', async function(assert) { const jobId = JSON.stringify(['job-1', 'default']); const { pretender } = this.server; @@ -194,34 +187,32 @@ module('Unit | Adapter | Job', function(hooks) { 'Second request is a blocking request for job-1' ); - return settled().then(() => { - request(); - assert.equal( - pretender.handledRequests[1].url, - '/v1/job/job-1?index=2', - 'Third request is a blocking request with an incremented index param' - ); + await settled(); + request(); + assert.equal( + pretender.handledRequests[1].url, + '/v1/job/job-1?index=2', + 'Third request is a blocking request with an incremented index param' + ); - return settled(); - }); + await settled(); }); - test('relationships can be reloaded', function(assert) { + test('relationships can be reloaded', async function(assert) { const { pretender } = this.server; const plainId = 'job-1'; const mockModel = makeMockModel(plainId); this.subject().reloadRelationship(mockModel, 'summary'); - return settled().then(() => { - assert.equal( - pretender.handledRequests[0].url, - `/v1/job/${plainId}/summary`, - 'Relationship was reloaded' - ); - }); + await settled(); + assert.equal( + pretender.handledRequests[0].url, + `/v1/job/${plainId}/summary`, + 'Relationship was reloaded' + ); }); - test('relationship reloads can be watched', function(assert) { + test('relationship reloads can be watched', async function(assert) { const { pretender } = this.server; const plainId = 'job-1'; const mockModel = makeMockModel(plainId); @@ -233,17 +224,16 @@ module('Unit | Adapter | Job', function(hooks) { 'First request is a blocking request for job-1 summary relationship' ); - return settled().then(() => { - this.subject().reloadRelationship(mockModel, 'summary', true); - assert.equal( - pretender.handledRequests[1].url, - '/v1/job/job-1/summary?index=2', - 'Second request is a blocking request with an incremented index param' - ); - }); + await settled(); + this.subject().reloadRelationship(mockModel, 'summary', true); + assert.equal( + pretender.handledRequests[1].url, + '/v1/job/job-1/summary?index=2', + 'Second request is a blocking request with an incremented index param' + ); }); - test('findAll can be canceled', function(assert) { + test('findAll can be canceled', async function(assert) { const { pretender } = this.server; pretender.get('/v1/jobs', () => [200, {}, '[]'], true); @@ -262,12 +252,11 @@ module('Unit | Adapter | Job', function(hooks) { this.subject().cancelFindAll('job'); }); - return settled().then(() => { - assert.ok(xhr.aborted, 'Request was aborted'); - }); + await settled(); + assert.ok(xhr.aborted, 'Request was aborted'); }); - test('findRecord can be canceled', function(assert) { + test('findRecord can be canceled', async function(assert) { const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); @@ -286,12 +275,11 @@ module('Unit | Adapter | Job', function(hooks) { this.subject().cancelFindRecord('job', jobId); }); - return settled().then(() => { - assert.ok(xhr.aborted, 'Request was aborted'); - }); + await settled(); + assert.ok(xhr.aborted, 'Request was aborted'); }); - test('relationship reloads can be canceled', function(assert) { + test('relationship reloads can be canceled', async function(assert) { const { pretender } = this.server; const plainId = 'job-1'; const mockModel = makeMockModel(plainId); @@ -307,12 +295,11 @@ module('Unit | Adapter | Job', function(hooks) { this.subject().cancelReloadRelationship(mockModel, 'summary'); }); - return settled().then(() => { - assert.ok(xhr.aborted, 'Request was aborted'); - }); + await settled(); + assert.ok(xhr.aborted, 'Request was aborted'); }); - test('requests can be canceled even if multiple requests for the same URL were made', function(assert) { + test('requests can be canceled even if multiple requests for the same URL were made', async function(assert) { const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); @@ -342,12 +329,11 @@ module('Unit | Adapter | Job', function(hooks) { this.subject().cancelFindRecord('job', jobId); }); - return settled().then(() => { - assert.ok(xhr.aborted, 'Request was aborted'); - }); + await settled(); + assert.ok(xhr.aborted, 'Request was aborted'); }); - test('canceling a find record request will never cancel a request with the same url but different method', function(assert) { + test('canceling a find record request will never cancel a request with the same url but different method', async function(assert) { const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); @@ -371,31 +357,29 @@ module('Unit | Adapter | Job', function(hooks) { this.subject().cancelFindRecord('job', jobId); }); - return settled().then(() => { - assert.ok(getXHR.aborted, 'Get request was aborted'); - assert.notOk(deleteXHR.aborted, 'Delete request was aborted'); - }); + await settled(); + assert.ok(getXHR.aborted, 'Get request was aborted'); + assert.notOk(deleteXHR.aborted, 'Delete request was aborted'); }); - test('when there is no region set, requests are made without the region query param', function(assert) { + test('when there is no region set, requests are made without the region query param', async function(assert) { const { pretender } = this.server; const jobName = 'job-1'; const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); - this.subject().findAll(null, { modelName: 'job' }, null); + await settled(); + this.subject().findRecord(null, { modelName: 'job' }, jobId); + this.subject().findAll(null, { modelName: 'job' }, null); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}`, '/v1/jobs'], - 'No requests include the region query param' - ); - }); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}`, '/v1/jobs'], + 'No requests include the region query param' + ); }); - test('when there is a region set, requests are made with the region query param', function(assert) { + test('when there is a region set, requests are made with the region query param', async function(assert) { const region = 'region-2'; window.localStorage.nomadActiveRegion = region; @@ -404,19 +388,18 @@ module('Unit | Adapter | Job', function(hooks) { const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); - this.subject().findAll(null, { modelName: 'job' }, null); + await settled(); + this.subject().findRecord(null, { modelName: 'job' }, jobId); + this.subject().findAll(null, { modelName: 'job' }, null); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}?region=${region}`, `/v1/jobs?region=${region}`], - 'Requests include the region query param' - ); - }); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}?region=${region}`, `/v1/jobs?region=${region}`], + 'Requests include the region query param' + ); }); - test('when the region is set to the default region, requests are made without the region query param', function(assert) { + test('when the region is set to the default region, requests are made without the region query param', async function(assert) { window.localStorage.nomadActiveRegion = 'region-1'; const { pretender } = this.server; @@ -424,16 +407,15 @@ module('Unit | Adapter | Job', function(hooks) { const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - return settled().then(() => { - this.subject().findRecord(null, { modelName: 'job' }, jobId); - this.subject().findAll(null, { modelName: 'job' }, null); + await settled(); + this.subject().findRecord(null, { modelName: 'job' }, jobId); + this.subject().findAll(null, { modelName: 'job' }, null); - assert.deepEqual( - pretender.handledRequests.mapBy('url'), - [`/v1/job/${jobName}`, '/v1/jobs'], - 'No requests include the region query param' - ); - }); + assert.deepEqual( + pretender.handledRequests.mapBy('url'), + [`/v1/job/${jobName}`, '/v1/jobs'], + 'No requests include the region query param' + ); }); }); diff --git a/ui/tests/unit/adapters/node-test.js b/ui/tests/unit/adapters/node-test.js index d0c1356de04..9dc020a55d8 100644 --- a/ui/tests/unit/adapters/node-test.js +++ b/ui/tests/unit/adapters/node-test.js @@ -26,86 +26,64 @@ module('Unit | Adapter | Node', function(hooks) { this.server.shutdown(); }); - test('findHasMany removes old related models from the store', function(assert) { - let node; - run(() => { - // Fetch the model - this.store.findRecord('node', 'node-1').then(model => { - node = model; - - // Fetch the related allocations - return findHasMany(model, 'allocations').then(allocations => { - assert.equal( - allocations.get('length'), - this.server.db.allocations.where({ nodeId: node.get('id') }).length, - 'Allocations returned from the findHasMany matches the db state' - ); - }); - }); - }); - - return settled().then(() => { - server.db.allocations.remove('node-1-1'); - - run(() => { - // Reload the related allocations now that one was removed server-side - return findHasMany(node, 'allocations').then(allocations => { - const dbAllocations = this.server.db.allocations.where({ nodeId: node.get('id') }); - assert.equal( - allocations.get('length'), - dbAllocations.length, - 'Allocations returned from the findHasMany matches the db state' - ); - assert.equal( - this.store.peekAll('allocation').get('length'), - dbAllocations.length, - 'Server-side deleted allocation was removed from the store' - ); - }); - }); - }); + test('findHasMany removes old related models from the store', async function(assert) { + // Fetch the model and related allocations + let node = await run(() => this.store.findRecord('node', 'node-1')); + let allocations = await run(() => findHasMany(node, 'allocations')); + assert.equal( + allocations.get('length'), + this.server.db.allocations.where({ nodeId: node.get('id') }).length, + 'Allocations returned from the findHasMany matches the db state' + ); + + await settled(); + server.db.allocations.remove('node-1-1'); + + allocations = await run(() => findHasMany(node, 'allocations')); + const dbAllocations = this.server.db.allocations.where({ nodeId: node.get('id') }); + assert.equal( + allocations.get('length'), + dbAllocations.length, + 'Allocations returned from the findHasMany matches the db state' + ); + assert.equal( + this.store.peekAll('allocation').get('length'), + dbAllocations.length, + 'Server-side deleted allocation was removed from the store' + ); }); - test('findHasMany does not remove old unrelated models from the store', function(assert) { - let node; - - run(() => { - // Fetch the first node and related allocations - this.store.findRecord('node', 'node-1').then(model => { - node = model; - return findHasMany(model, 'allocations'); - }); - - // Also fetch the second node and related allocations; - this.store.findRecord('node', 'node-2').then(model => findHasMany(model, 'allocations')); - }); - - return settled().then(() => { - assert.deepEqual( - this.store - .peekAll('allocation') - .mapBy('id') - .sort(), - ['node-1-1', 'node-1-2', 'node-2-1', 'node-2-2'], - 'All allocations for the first and second node are in the store' - ); - - server.db.allocations.remove('node-1-1'); - - run(() => { - // Reload the related allocations now that one was removed server-side - return findHasMany(node, 'allocations').then(() => { - assert.deepEqual( - this.store - .peekAll('allocation') - .mapBy('id') - .sort(), - ['node-1-2', 'node-2-1', 'node-2-2'], - 'The deleted allocation is removed from the store and the allocations associated with the other node are untouched' - ); - }); - }); - }); + test('findHasMany does not remove old unrelated models from the store', async function(assert) { + // Fetch the first node and related allocations + const node = await run(() => this.store.findRecord('node', 'node-1')); + await run(() => findHasMany(node, 'allocations')); + + // Also fetch the second node and related allocations; + const node2 = await run(() => this.store.findRecord('node', 'node-2')); + await run(() => findHasMany(node2, 'allocations')); + + await settled(); + assert.deepEqual( + this.store + .peekAll('allocation') + .mapBy('id') + .sort(), + ['node-1-1', 'node-1-2', 'node-2-1', 'node-2-2'], + 'All allocations for the first and second node are in the store' + ); + + server.db.allocations.remove('node-1-1'); + + // Reload the related allocations now that one was removed server-side + await run(() => findHasMany(node, 'allocations')); + assert.deepEqual( + this.store + .peekAll('allocation') + .mapBy('id') + .sort(), + ['node-1-2', 'node-2-1', 'node-2-2'], + 'The deleted allocation is removed from the store and the allocations associated with the other node are untouched' + ); }); }); diff --git a/ui/tests/unit/serializers/allocation-test.js b/ui/tests/unit/serializers/allocation-test.js index 75b467c2622..db928953152 100644 --- a/ui/tests/unit/serializers/allocation-test.js +++ b/ui/tests/unit/serializers/allocation-test.js @@ -132,7 +132,7 @@ module('Unit | Serializer | Allocation', function(hooks) { ]; normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { + test(`normalization: ${testCase.name}`, async function(assert) { assert.deepEqual(this.subject().normalize(AllocationModel, testCase.in), testCase.out); }); }); diff --git a/ui/tests/unit/serializers/deployment-test.js b/ui/tests/unit/serializers/deployment-test.js index 486986a2d9c..faebc9b66ec 100644 --- a/ui/tests/unit/serializers/deployment-test.js +++ b/ui/tests/unit/serializers/deployment-test.js @@ -120,7 +120,7 @@ module('Unit | Serializer | Deployment', function(hooks) { ]; normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { + test(`normalization: ${testCase.name}`, async function(assert) { assert.deepEqual(this.subject().normalize(DeploymentModel, testCase.in), testCase.out); }); }); diff --git a/ui/tests/unit/serializers/evaluation-test.js b/ui/tests/unit/serializers/evaluation-test.js index 82e0175a5cb..a31209b4da0 100644 --- a/ui/tests/unit/serializers/evaluation-test.js +++ b/ui/tests/unit/serializers/evaluation-test.js @@ -95,7 +95,7 @@ module('Unit | Serializer | Evaluation', function(hooks) { ]; normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { + test(`normalization: ${testCase.name}`, async function(assert) { assert.deepEqual(this.subject().normalize(EvaluationModel, testCase.in), testCase.out); }); }); diff --git a/ui/tests/unit/serializers/job-plan-test.js b/ui/tests/unit/serializers/job-plan-test.js index 8fa49f58f10..d56690c3ebb 100644 --- a/ui/tests/unit/serializers/job-plan-test.js +++ b/ui/tests/unit/serializers/job-plan-test.js @@ -85,7 +85,7 @@ module('Unit | Serializer | JobPlan', function(hooks) { ]; normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { + test(`normalization: ${testCase.name}`, async function(assert) { assert.deepEqual(this.subject().normalize(JobPlanModel, testCase.in), testCase.out); }); }); diff --git a/ui/tests/unit/serializers/job-summary-test.js b/ui/tests/unit/serializers/job-summary-test.js index d7aff79228e..94ef7e2ac47 100644 --- a/ui/tests/unit/serializers/job-summary-test.js +++ b/ui/tests/unit/serializers/job-summary-test.js @@ -95,7 +95,7 @@ module('Unit | Serializer | JobSummary', function(hooks) { ]; normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { + test(`normalization: ${testCase.name}`, async function(assert) { assert.deepEqual(this.subject().normalize(JobSummaryModel, testCase.in), testCase.out); }); }); diff --git a/ui/tests/unit/serializers/job-test.js b/ui/tests/unit/serializers/job-test.js index b552d2cbb3d..ab2b393cd72 100644 --- a/ui/tests/unit/serializers/job-test.js +++ b/ui/tests/unit/serializers/job-test.js @@ -9,7 +9,7 @@ module('Unit | Serializer | Job', function(hooks) { this.subject = () => this.store.serializerFor('job'); }); - test('`default` is used as the namespace in the job ID when there is no namespace in the payload', function(assert) { + test('`default` is used as the namespace in the job ID when there is no namespace in the payload', async function(assert) { const original = { ID: 'example', Name: 'example', @@ -19,7 +19,7 @@ module('Unit | Serializer | Job', function(hooks) { assert.equal(data.id, JSON.stringify([data.attributes.name, 'default'])); }); - test('The ID of the record is a composite of both the name and the namespace', function(assert) { + test('The ID of the record is a composite of both the name and the namespace', async function(assert) { const original = { ID: 'example', Name: 'example', diff --git a/ui/tests/unit/serializers/node-test.js b/ui/tests/unit/serializers/node-test.js index 30cb48db49d..5eb41fb3a8b 100644 --- a/ui/tests/unit/serializers/node-test.js +++ b/ui/tests/unit/serializers/node-test.js @@ -12,7 +12,7 @@ module('Unit | Serializer | Node', function(hooks) { this.subject = () => this.store.serializerFor('node'); }); - test('local store is culled to reflect the state of findAll requests', function(assert) { + test('local store is culled to reflect the state of findAll requests', async function(assert) { const findAllResponse = [ makeNode('1', 'One', '127.0.0.1:4646'), makeNode('2', 'Two', '127.0.0.2:4646'), @@ -53,24 +53,23 @@ module('Unit | Serializer | Node', function(hooks) { }); pushPayloadToStore(this.store, newPayload, NodeModel.modelName); - return settled().then(() => { - assert.equal( - newPayload.data.length, - newFindAllResponse.length, - 'Each new record is returned in the response' - ); + await settled(); + assert.equal( + newPayload.data.length, + newFindAllResponse.length, + 'Each new record is returned in the response' + ); - assert.equal( - this.store - .peekAll('node') - .filterBy('id') - .get('length'), - newFindAllResponse.length, - 'The node length in the store reflects the new response' - ); + assert.equal( + this.store + .peekAll('node') + .filterBy('id') + .get('length'), + newFindAllResponse.length, + 'The node length in the store reflects the new response' + ); - assert.notOk(this.store.peekAll('node').findBy('id', '1'), 'Record One is no longer found'); - }); + assert.notOk(this.store.peekAll('node').findBy('id', '1'), 'Record One is no longer found'); }); function makeNode(id, name, ip) { @@ -167,7 +166,7 @@ module('Unit | Serializer | Node', function(hooks) { ]; normalizationTestCases.forEach(testCase => { - test(`normalization: ${testCase.name}`, function(assert) { + test(`normalization: ${testCase.name}`, async function(assert) { assert.deepEqual(this.subject().normalize(NodeModel, testCase.in), testCase.out); }); }); diff --git a/ui/tests/unit/utils/allocation-stats-tracker-test.js b/ui/tests/unit/utils/allocation-stats-tracker-test.js index 3518242a79c..967983b328a 100644 --- a/ui/tests/unit/utils/allocation-stats-tracker-test.js +++ b/ui/tests/unit/utils/allocation-stats-tracker-test.js @@ -89,7 +89,7 @@ module('Unit | Util | AllocationStatsTracker', function() { Timestamp: refDate + step * 1000, }); - test('the AllocationStatsTracker constructor expects a fetch definition and an allocation', function(assert) { + test('the AllocationStatsTracker constructor expects a fetch definition and an allocation', async function(assert) { const tracker = AllocationStatsTracker.create(); assert.throws( () => { @@ -100,7 +100,7 @@ module('Unit | Util | AllocationStatsTracker', function() { ); }); - test('the url property is computed based off the allocation id', function(assert) { + test('the url property is computed based off the allocation id', async function(assert) { const allocation = MockAllocation(); const tracker = AllocationStatsTracker.create({ fetch, allocation }); @@ -111,7 +111,7 @@ module('Unit | Util | AllocationStatsTracker', function() { ); }); - test('reservedCPU and reservedMemory properties come from the allocation', function(assert) { + test('reservedCPU and reservedMemory properties come from the allocation', async function(assert) { const allocation = MockAllocation(); const tracker = AllocationStatsTracker.create({ fetch, allocation }); @@ -127,7 +127,7 @@ module('Unit | Util | AllocationStatsTracker', function() { ); }); - test('the tasks list comes from the allocation', function(assert) { + test('the tasks list comes from the allocation', async function(assert) { const allocation = MockAllocation(); const tracker = AllocationStatsTracker.create({ fetch, allocation }); @@ -147,7 +147,7 @@ module('Unit | Util | AllocationStatsTracker', function() { }); }); - test('poll results in requesting the url and calling append with the resulting JSON', function(assert) { + test('poll results in requesting the url and calling append with the resulting JSON', async function(assert) { const allocation = MockAllocation(); const tracker = AllocationStatsTracker.create({ fetch, allocation, append: sinon.spy() }); const mockFrame = { @@ -170,17 +170,16 @@ module('Unit | Util | AllocationStatsTracker', function() { 'The correct URL was requested' ); - return settled().then(() => { - assert.ok( - tracker.append.calledWith(mockFrame), - 'The JSON response was passed onto append as a POJO' - ); + await settled(); + assert.ok( + tracker.append.calledWith(mockFrame), + 'The JSON response was passed onto append as a POJO' + ); - server.shutdown(); - }); + server.shutdown(); }); - test('append appropriately maps a data frame to the tracked stats for cpu and memory for the allocation as well as individual tasks', function(assert) { + test('append appropriately maps a data frame to the tracked stats for cpu and memory for the allocation as well as individual tasks', async function(assert) { const allocation = MockAllocation(); const tracker = AllocationStatsTracker.create({ fetch, allocation }); @@ -328,7 +327,7 @@ module('Unit | Util | AllocationStatsTracker', function() { ); }); - test('each stat list has maxLength equal to bufferSize', function(assert) { + test('each stat list has maxLength equal to bufferSize', async function(assert) { const allocation = MockAllocation(); const bufferSize = 10; const tracker = AllocationStatsTracker.create({ fetch, allocation, bufferSize }); @@ -406,7 +405,7 @@ module('Unit | Util | AllocationStatsTracker', function() { ); }); - test('the stats computed property macro constructs an AllocationStatsTracker based on an allocationProp and a fetch definition', function(assert) { + test('the stats computed property macro constructs an AllocationStatsTracker based on an allocationProp and a fetch definition', async function(assert) { const allocation = MockAllocation(); const fetchSpy = sinon.spy(); @@ -433,7 +432,7 @@ module('Unit | Util | AllocationStatsTracker', function() { ); }); - test('changing the value of the allocationProp constructs a new AllocationStatsTracker', function(assert) { + test('changing the value of the allocationProp constructs a new AllocationStatsTracker', async function(assert) { const alloc1 = MockAllocation(); const alloc2 = MockAllocation(); const SomeClass = EmberObject.extend({ diff --git a/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js b/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js index e72f8360137..4807c3be2ee 100644 --- a/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js +++ b/ui/tests/unit/utils/behaviors/stats-tracker-frame-missing.js @@ -17,7 +17,7 @@ export default function statsTrackerFrameMissing({ mockFrame, compileResources, }) { - test('a bad response from a fetch request is handled gracefully', function(assert) { + test('a bad response from a fetch request is handled gracefully', async function(assert) { const frame = mockFrame(1); const [compiledCPU, compiledMemory] = compileResources(frame); @@ -30,37 +30,33 @@ export default function statsTrackerFrameMissing({ const tracker = TrackerConstructor.create({ fetch, [resourceName]: resource }); tracker.get('poll').perform(); + await settled(); - return settled() - .then(() => { - assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'One frame of cpu'); - assert.deepEqual(tracker.get('memory'), [compiledMemory], 'One frame of memory'); - - shouldFail = true; - tracker.get('poll').perform(); - return settled(); - }) - .then(() => { - assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'Still one frame of cpu'); - assert.deepEqual(tracker.get('memory'), [compiledMemory], 'Still one frame of memory'); - assert.equal(tracker.get('frameMisses'), 1, 'Frame miss is tracked'); - - shouldFail = false; - tracker.get('poll').perform(); - return settled(); - }) - .then(() => { - assert.deepEqual(tracker.get('cpu'), [compiledCPU, compiledCPU], 'Still one frame of cpu'); - assert.deepEqual( - tracker.get('memory'), - [compiledMemory, compiledMemory], - 'Still one frame of memory' - ); - assert.equal(tracker.get('frameMisses'), 0, 'Frame misses is reset'); - }); + assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'One frame of cpu'); + assert.deepEqual(tracker.get('memory'), [compiledMemory], 'One frame of memory'); + + shouldFail = true; + tracker.get('poll').perform(); + await settled(); + + assert.deepEqual(tracker.get('cpu'), [compiledCPU], 'Still one frame of cpu'); + assert.deepEqual(tracker.get('memory'), [compiledMemory], 'Still one frame of memory'); + assert.equal(tracker.get('frameMisses'), 1, 'Frame miss is tracked'); + + shouldFail = false; + tracker.get('poll').perform(); + await settled(); + + assert.deepEqual(tracker.get('cpu'), [compiledCPU, compiledCPU], 'Still one frame of cpu'); + assert.deepEqual( + tracker.get('memory'), + [compiledMemory, compiledMemory], + 'Still one frame of memory' + ); + assert.equal(tracker.get('frameMisses'), 0, 'Frame misses is reset'); }); - test('enough bad responses from fetch consecutively (as set by maxFrameMisses) results in a pause', function(assert) { + test('enough bad responses from fetch consecutively (as set by maxFrameMisses) results in a pause', async function(assert) { const fetch = () => { return resolve({ ok: false }); }; @@ -74,24 +70,21 @@ export default function statsTrackerFrameMissing({ }); tracker.get('poll').perform(); - return settled() - .then(() => { - assert.equal(tracker.get('frameMisses'), 1, 'Tick misses'); - assert.notOk(tracker.pause.called, 'Pause not called yet'); - - tracker.get('poll').perform(); - return settled(); - }) - .then(() => { - assert.equal(tracker.get('frameMisses'), 2, 'Tick misses'); - assert.notOk(tracker.pause.called, 'Pause still not called yet'); - - tracker.get('poll').perform(); - return settled(); - }) - .then(() => { - assert.equal(tracker.get('frameMisses'), 0, 'Misses reset'); - assert.ok(tracker.pause.called, 'Pause called now that frameMisses == maxFrameMisses'); - }); + await settled(); + + assert.equal(tracker.get('frameMisses'), 1, 'Tick misses'); + assert.notOk(tracker.pause.called, 'Pause not called yet'); + + tracker.get('poll').perform(); + await settled(); + + assert.equal(tracker.get('frameMisses'), 2, 'Tick misses'); + assert.notOk(tracker.pause.called, 'Pause still not called yet'); + + tracker.get('poll').perform(); + await settled(); + + assert.equal(tracker.get('frameMisses'), 0, 'Misses reset'); + assert.ok(tracker.pause.called, 'Pause called now that frameMisses == maxFrameMisses'); }); } diff --git a/ui/tests/unit/utils/log-test.js b/ui/tests/unit/utils/log-test.js index 6de9b36bb33..59793669ae2 100644 --- a/ui/tests/unit/utils/log-test.js +++ b/ui/tests/unit/utils/log-test.js @@ -67,14 +67,14 @@ module('Unit | Util | Log', function(hooks) { }, }); - test('logStreamer is created on init', function(assert) { + test('logStreamer is created on init', async function(assert) { const log = Log.create(makeMocks('')); assert.ok(log.get('logStreamer'), 'logStreamer property is defined'); assert.ok(initSpy.calledOnce, 'logStreamer init was called'); }); - test('gotoHead builds the correct URL', function(assert) { + test('gotoHead builds the correct URL', async function(assert) { const mocks = makeMocks(''); const expectedUrl = `${mocks.url}?a=param&another=one&offset=0&origin=start&plain=true`; const log = Log.create(mocks); @@ -85,7 +85,7 @@ module('Unit | Util | Log', function(hooks) { }); }); - test('When gotoHead returns too large of a log, the log is truncated', function(assert) { + test('When gotoHead returns too large of a log, the log is truncated', async function(assert) { const longLog = Array(50001) .fill('a') .join(''); @@ -99,17 +99,16 @@ module('Unit | Util | Log', function(hooks) { log.get('gotoHead').perform(); }); - return settled().then(() => { - assert.ok(log.get('output').endsWith(truncationMessage), 'Truncation message is shown'); - assert.equal( - log.get('output').length, - 50000 + truncationMessage.length, - 'Output is truncated the appropriate amount' - ); - }); + await settled(); + assert.ok(log.get('output').endsWith(truncationMessage), 'Truncation message is shown'); + assert.equal( + log.get('output').length, + 50000 + truncationMessage.length, + 'Output is truncated the appropriate amount' + ); }); - test('gotoTail builds the correct URL', function(assert) { + test('gotoTail builds the correct URL', async function(assert) { const mocks = makeMocks(''); const expectedUrl = `${mocks.url}?a=param&another=one&offset=50000&origin=end&plain=true`; const log = Log.create(mocks); @@ -120,7 +119,7 @@ module('Unit | Util | Log', function(hooks) { }); }); - test('startStreaming starts the log streamer', function(assert) { + test('startStreaming starts the log streamer', async function(assert) { const log = Log.create(makeMocks('')); log.startStreaming(); @@ -128,7 +127,7 @@ module('Unit | Util | Log', function(hooks) { assert.equal(log.get('logPointer'), 'tail', 'Streaming points the log to the tail'); }); - test('When the log streamer calls `write`, the output is appended', function(assert) { + test('When the log streamer calls `write`, the output is appended', async function(assert) { const log = Log.create(makeMocks('')); const chunk1 = 'Hello'; const chunk2 = ' World'; @@ -147,7 +146,7 @@ module('Unit | Util | Log', function(hooks) { assert.equal(log.get('output'), chunk1 + chunk2 + chunk3, 'Third chunk written'); }); - test('stop stops the log streamer', function(assert) { + test('stop stops the log streamer', async function(assert) { const log = Log.create(makeMocks('')); log.stop(); diff --git a/ui/tests/unit/utils/node-stats-tracker-test.js b/ui/tests/unit/utils/node-stats-tracker-test.js index a4cb89d3378..55871280e29 100644 --- a/ui/tests/unit/utils/node-stats-tracker-test.js +++ b/ui/tests/unit/utils/node-stats-tracker-test.js @@ -33,7 +33,7 @@ module('Unit | Util | NodeStatsTracker', function() { Timestamp: refDate + step, }); - test('the NodeStatsTracker constructor expects a fetch definition and a node', function(assert) { + test('the NodeStatsTracker constructor expects a fetch definition and a node', async function(assert) { const tracker = NodeStatsTracker.create(); assert.throws( () => { @@ -44,7 +44,7 @@ module('Unit | Util | NodeStatsTracker', function() { ); }); - test('the url property is computed based off the node id', function(assert) { + test('the url property is computed based off the node id', async function(assert) { const node = MockNode(); const tracker = NodeStatsTracker.create({ fetch, node }); @@ -55,7 +55,7 @@ module('Unit | Util | NodeStatsTracker', function() { ); }); - test('reservedCPU and reservedMemory properties come from the node', function(assert) { + test('reservedCPU and reservedMemory properties come from the node', async function(assert) { const node = MockNode(); const tracker = NodeStatsTracker.create({ fetch, node }); @@ -67,7 +67,7 @@ module('Unit | Util | NodeStatsTracker', function() { ); }); - test('poll results in requesting the url and calling append with the resulting JSON', function(assert) { + test('poll results in requesting the url and calling append with the resulting JSON', async function(assert) { const node = MockNode(); const tracker = NodeStatsTracker.create({ fetch, node, append: sinon.spy() }); const mockFrame = { @@ -90,17 +90,16 @@ module('Unit | Util | NodeStatsTracker', function() { 'The correct URL was requested' ); - return settled().then(() => { - assert.ok( - tracker.append.calledWith(mockFrame), - 'The JSON response was passed into append as a POJO' - ); + await settled(); + assert.ok( + tracker.append.calledWith(mockFrame), + 'The JSON response was passed into append as a POJO' + ); - server.shutdown(); - }); + server.shutdown(); }); - test('append appropriately maps a data frame to the tracked stats for cpu and memory for the node', function(assert) { + test('append appropriately maps a data frame to the tracked stats for cpu and memory for the node', async function(assert) { const node = MockNode(); const tracker = NodeStatsTracker.create({ fetch, node }); @@ -142,7 +141,7 @@ module('Unit | Util | NodeStatsTracker', function() { ); }); - test('each stat list has maxLength equal to bufferSize', function(assert) { + test('each stat list has maxLength equal to bufferSize', async function(assert) { const node = MockNode(); const bufferSize = 10; const tracker = NodeStatsTracker.create({ fetch, node, bufferSize }); @@ -174,7 +173,7 @@ module('Unit | Util | NodeStatsTracker', function() { ); }); - test('the stats computed property macro constructs a NodeStatsTracker based on a nodeProp and a fetch definition', function(assert) { + test('the stats computed property macro constructs a NodeStatsTracker based on a nodeProp and a fetch definition', async function(assert) { const node = MockNode(); const fetchSpy = sinon.spy(); @@ -201,7 +200,7 @@ module('Unit | Util | NodeStatsTracker', function() { ); }); - test('changing the value of the nodeProp constructs a new NodeStatsTracker', function(assert) { + test('changing the value of the nodeProp constructs a new NodeStatsTracker', async function(assert) { const node1 = MockNode(); const node2 = MockNode(); const SomeClass = EmberObject.extend({ From 2fce7c74958e0c2bb9e66d6e8150dcdc5fe016a7 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Fri, 15 Mar 2019 13:26:18 -0700 Subject: [PATCH 22/46] Upgrade to Ember 3.4 --- .gitignore | 5 +++ ui/.eslintrc.js | 2 + ui/.template-lintrc.js | 5 +++ ui/README.md | 10 +++++ ui/config/optional-features.json | 3 ++ ui/package.json | 67 +++++++++++++++++++------------- ui/testem.js | 19 +++++---- 7 files changed, 76 insertions(+), 35 deletions(-) create mode 100644 ui/.template-lintrc.js create mode 100644 ui/config/optional-features.json diff --git a/.gitignore b/.gitignore index 130072463fe..b8db21e09ec 100644 --- a/.gitignore +++ b/.gitignore @@ -87,6 +87,11 @@ rkt-* /ui/testem.log .ignore +# ember-try +/ui/.node_modules.ember-try/ +/ui/bower.json.ember-try +/ui/package.json.ember-try + # generated routes file command/agent/bindata_assetfs.go diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js index 9cf8e868a6f..f75da3c33ea 100644 --- a/ui/.eslintrc.js +++ b/ui/.eslintrc.js @@ -31,8 +31,10 @@ module.exports = { { files: [ '.eslintrc.js', + '.template-lintrc.js', 'ember-cli-build.js', 'testem.js', + 'blueprints/*/index.js', 'config/**/*.js', 'lib/*/index.js', ], diff --git a/ui/.template-lintrc.js b/ui/.template-lintrc.js new file mode 100644 index 00000000000..b45e96ffddc --- /dev/null +++ b/ui/.template-lintrc.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + extends: 'recommended' +}; diff --git a/ui/README.md b/ui/README.md index 813f63d6fe1..f3a3c885acc 100644 --- a/ui/README.md +++ b/ui/README.md @@ -49,6 +49,16 @@ Nomad UI tests can be run independently of Nomad golang tests. * `ember test` (single run, headless browser) * `ember test --server` (watches for changes, runs in a full browser) + + +### Linting + +Linting should happen automatically in your editor and when committing changes, but it can also be invoked manually. + +* `npm run lint:hbs` +* `npm run lint:js` +* `npm run lint:js -- --fix` + ### Building Typically `make release` or `make dev-ui` will be the desired build workflow, but in the event that build artifacts need to be inspected, `ember build` will output compiled files in `ui/dist`. diff --git a/ui/config/optional-features.json b/ui/config/optional-features.json new file mode 100644 index 00000000000..21f1dc719e1 --- /dev/null +++ b/ui/config/optional-features.json @@ -0,0 +1,3 @@ +{ + "jquery-integration": true +} diff --git a/ui/package.json b/ui/package.json index 436caae35ca..79092e3b876 100644 --- a/ui/package.json +++ b/ui/package.json @@ -2,25 +2,34 @@ "name": "nomad-ui", "version": "0.0.0", "description": "The web ui for Nomad, by HashiCorp.", + "repository": "", "directories": { "doc": "doc", "test": "tests" }, - "repository": "", "scripts": { "build": "./node_modules/ember-cli/bin/ember build -prod", - "start": "./node_modules/ember-cli/bin/ember server", - "test": "./node_modules/ember-cli/bin/ember test", "precommit": "lint-staged", - "lint:js": "eslint ." + "lint:hbs": "ember-template-lint .", + "lint:js": "eslint .", + "start": "./node_modules/ember-cli/bin/ember server", + "test": "./node_modules/ember-cli/bin/ember test" }, "lint-staged": { - "'{app,tests,config,lib,mirage}/**/*.js'": ["prettier --write", "git add"], - "'app/styles/**/*.*'": ["prettier --write", "git add"] + "'{app,tests,config,lib,mirage}/**/*.js'": [ + "prettier --write", + "git add" + ], + "'app/styles/**/*.*'": [ + "prettier --write", + "git add" + ] }, "devDependencies": { + "@ember/jquery": "^0.5.2", + "@ember/optional-features": "^0.6.3", "babel-plugin-transform-object-rest-spread": "^6.26.0", - "broccoli-asset-rev": "^2.4.5", + "broccoli-asset-rev": "^2.7.0", "bulma": "0.6.1", "core-js": "^2.4.1", "d3-array": "^1.2.0", @@ -31,63 +40,67 @@ "d3-shape": "^1.2.0", "d3-time-format": "^2.1.0", "d3-transition": "^1.1.0", - "ember-ajax": "^3.0.0", + "ember-ajax": "^3.1.0", "ember-auto-import": "^1.0.1", - "ember-cli": "~3.0.4", - "ember-cli-babel": "^6.0.0", - "ember-cli-dependency-checker": "^2.1.0", + "ember-cli": "~3.4.4", + "ember-cli-babel": "^6.16.0", + "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deprecation-workflow": "^1.0.1", "ember-cli-eslint": "^4.2.3", "ember-cli-funnel": "^0.6.0", - "ember-cli-htmlbars": "^2.0.3", - "ember-cli-htmlbars-inline-precompile": "^1.0.2", - "ember-cli-inject-live-reload": "^1.4.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-mirage": "^0.4.3", "ember-cli-moment-shim": "^3.5.0", "ember-cli-page-object": "^1.15.1", - "ember-cli-qunit": "^4.2.1", + "ember-cli-qunit": "^4.3.2", "ember-cli-sass": "^7.1.2", - "ember-cli-shims": "^1.2.0", - "ember-cli-sri": "^2.1.0", + "ember-cli-sri": "^2.1.1", "ember-cli-string-helpers": "^1.5.0", - "ember-cli-uglify": "^2.0.0", + "ember-cli-template-lint": "^1.0.0-beta.1", + "ember-cli-uglify": "^2.1.0", "ember-composable-helpers": "^2.0.3", "ember-concurrency": "^0.8.12", - "ember-data": "~3.0.0", + "ember-data": "~3.4.0", "ember-data-model-fragments": "3.0.0-beta.1", "ember-export-application-global": "^2.0.0", "ember-fetch": "^3.4.3", "ember-freestyle": "~0.6.2", "ember-inline-svg": "^0.1.11", - "ember-load-initializers": "^1.0.0", + "ember-load-initializers": "^1.1.0", "ember-maybe-import-regenerator": "^0.1.6", "ember-moment": "^7.5.0", "ember-native-dom-helpers": "^0.5.4", "ember-power-select": "^2.2.3", - "ember-resolver": "^4.5.0", + "ember-resolver": "^5.0.1", "ember-responsive": "^3.0.0", "ember-sinon": "^1.0.1", - "ember-source": "~3.0.0", + "ember-source": "~3.4.0", "ember-test-selectors": "^0.3.8", "ember-truth-helpers": "^2.0.0", - "ember-welcome-page": "^3.0.0", + "ember-welcome-page": "^3.2.0", "eslint": "^4.13.1", "flat": "^4.0.0", "fuse.js": "~3.2.0", "husky": "^0.14.3", "ivy-codemirror": "^2.1.0", "lint-staged": "^6.0.0", - "loader.js": "^4.2.3", + "loader.js": "^4.7.0", "lodash.intersection": "^4.4.0", "prettier": "^1.4.4", - "query-string": "^5.0.0" + "query-string": "^5.0.0", + "qunit-dom": "^0.7.1" }, "engines": { - "node": ">= 4" + "node": "6.* || 8.* || >= 10.*" }, "private": true, "ember-addon": { - "paths": ["lib/bulma", "lib/calendar"] + "paths": [ + "lib/bulma", + "lib/calendar" + ] }, "dependencies": { "lru_map": "^0.3.3" diff --git a/ui/testem.js b/ui/testem.js index 919ed563a1b..3015d63d24d 100644 --- a/ui/testem.js +++ b/ui/testem.js @@ -10,14 +10,17 @@ module.exports = { // ci: ['--headless', '--disable-gpu', '--remote-debugging-port=9222', '--window-size=1440,900'], // }, Chrome: { - mode: 'ci', - args: [ + ci: [ + // --no-sandbox is needed when running Chrome inside a container + process.env.CI ? '--no-sandbox' : null, '--headless', - '--no-sandbox', '--disable-gpu', - '--remote-debugging-port=9222', - '--window-size=1440,900', - ], - }, - }, + '--disable-dev-shm-usage', + '--disable-software-rasterizer', + '--mute-audio', + '--remote-debugging-port=0', + '--window-size=1440,900' + ].filter(Boolean) + } + } }; From c408a212d7804dbfe32ba59de00a548888f00baf Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Fri, 15 Mar 2019 13:35:36 -0700 Subject: [PATCH 23/46] Update ember-data-model-fragments --- ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/package.json b/ui/package.json index 79092e3b876..55075384f71 100644 --- a/ui/package.json +++ b/ui/package.json @@ -63,7 +63,7 @@ "ember-composable-helpers": "^2.0.3", "ember-concurrency": "^0.8.12", "ember-data": "~3.4.0", - "ember-data-model-fragments": "3.0.0-beta.1", + "ember-data-model-fragments": "3.3.0", "ember-export-application-global": "^2.0.0", "ember-fetch": "^3.4.3", "ember-freestyle": "~0.6.2", From 467a7b3c9052a14cb80e3f389cce22e24c47a466 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Fri, 15 Mar 2019 17:18:26 -0700 Subject: [PATCH 24/46] Upgrade miscellaneous packages --- ui/ember-cli-build.js | 2 +- ui/package.json | 19 +- ui/yarn.lock | 4661 ++++++++++++++++++++++------------------- 3 files changed, 2494 insertions(+), 2188 deletions(-) diff --git a/ui/ember-cli-build.js b/ui/ember-cli-build.js index 931e201f7a7..15e814594dd 100644 --- a/ui/ember-cli-build.js +++ b/ui/ember-cli-build.js @@ -24,7 +24,7 @@ module.exports = function(defaults) { ], }, babel: { - plugins: ['transform-object-rest-spread'], + plugins: ['@babel/plugin-proposal-object-rest-spread'], }, 'ember-cli-babel': { includePolyfill: isProd, diff --git a/ui/package.json b/ui/package.json index 55075384f71..58fb276f819 100644 --- a/ui/package.json +++ b/ui/package.json @@ -26,9 +26,9 @@ ] }, "devDependencies": { + "@babel/plugin-proposal-object-rest-spread": "^7.3.4", "@ember/jquery": "^0.5.2", "@ember/optional-features": "^0.6.3", - "babel-plugin-transform-object-rest-spread": "^6.26.0", "broccoli-asset-rev": "^2.7.0", "bulma": "0.6.1", "core-js": "^2.4.1", @@ -40,14 +40,14 @@ "d3-shape": "^1.2.0", "d3-time-format": "^2.1.0", "d3-transition": "^1.1.0", - "ember-ajax": "^3.1.0", - "ember-auto-import": "^1.0.1", + "ember-ajax": "^4.0.1", + "ember-auto-import": "^1.2.21", "ember-cli": "~3.4.4", - "ember-cli-babel": "^6.16.0", + "ember-cli-babel": "^7.1.2", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deprecation-workflow": "^1.0.1", "ember-cli-eslint": "^4.2.3", - "ember-cli-funnel": "^0.6.0", + "ember-cli-funnel": "^0.6.1", "ember-cli-htmlbars": "^3.0.0", "ember-cli-htmlbars-inline-precompile": "^1.0.3", "ember-cli-inject-live-reload": "^1.8.2", @@ -66,8 +66,8 @@ "ember-data-model-fragments": "3.3.0", "ember-export-application-global": "^2.0.0", "ember-fetch": "^3.4.3", - "ember-freestyle": "~0.6.2", - "ember-inline-svg": "^0.1.11", + "ember-freestyle": "~0.10.0", + "ember-inline-svg": "^0.2.1", "ember-load-initializers": "^1.1.0", "ember-maybe-import-regenerator": "^0.1.6", "ember-moment": "^7.5.0", @@ -77,7 +77,7 @@ "ember-responsive": "^3.0.0", "ember-sinon": "^1.0.1", "ember-source": "~3.4.0", - "ember-test-selectors": "^0.3.8", + "ember-test-selectors": "^2.1.0", "ember-truth-helpers": "^2.0.0", "ember-welcome-page": "^3.2.0", "eslint": "^4.13.1", @@ -98,8 +98,7 @@ "private": true, "ember-addon": { "paths": [ - "lib/bulma", - "lib/calendar" + "lib/bulma" ] }, "dependencies": { diff --git a/ui/yarn.lock b/ui/yarn.lock index 2f608e1a4aa..243a45dc780 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -9,7 +9,7 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.0", "@babel/core@^7.3.3": +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.3.3": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== @@ -593,7 +593,7 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.3.4": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== @@ -608,7 +608,7 @@ globals "^11.1.0" lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4": +"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4": version "7.3.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== @@ -617,20 +617,71 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" -"@ember/test-helpers@^0.7.9": - version "0.7.13" - resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.13.tgz#89523a101b5bd731e9dcaf7d0c57155b6386a4e3" - integrity sha512-bdvZPD7iP3wCY3Cfk2fZgfJpVTOywycURDbFJUXdmPtVIWUrioAPaYWjQhkUGyQs9laWBD1bgyMLtbhhqK890A== +"@ember/jquery@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.5.2.tgz#fe312c03ada0022fa092d23f7cd7e2eb0374b53a" + integrity sha1-/jEsA62gAi+gktI/fNfi6wN0tTo= + dependencies: + broccoli-funnel "^2.0.1" + ember-cli-babel "^6.6.0" + jquery "^3.3.1" + resolve "^1.7.1" + +"@ember/optional-features@^0.6.3": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-0.6.4.tgz#8199f853c1781234fcb1f05090cddd0b822bff69" + integrity sha512-nKmKxMk+Q/BGE8cmfq8KTHnYHVgrU3GHhy/eZ/OTj/fUvzXZhxaEVFOfAXssiOzV3FOQDJjznpbua2TEtHaQRw== + dependencies: + chalk "^2.3.0" + co "^4.6.0" + ember-cli-version-checker "^2.1.0" + glob "^7.1.2" + inquirer "^3.3.0" + mkdirp "^0.5.1" + silent-error "^1.1.0" + util.promisify "^1.0.0" + +"@ember/ordered-set@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-2.0.3.tgz#2ac1ca73b3bd116063cae814898832ef434a57f9" + integrity sha512-F4yfVk6WMc4AUHxeZsC3CaKyTvO0qSZJy7WWHCFTlVDQw6vubn+FvnGdhzpN1F00EiXMI4Tv1tJdSquHcCnYrA== + dependencies: + ember-cli-babel "^6.16.0" + ember-compatibility-helpers "^1.1.1" + +"@ember/test-helpers@^0.7.26": + version "0.7.27" + resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.27.tgz#c622cabd0cbb95b34efc1e1b6274ab5a14edc138" + integrity sha512-AQESk0FTFxRY6GyZ8PharR4SC7Fju0rXqNkfNYIntAjzefZ8xEqEM4iXDj5h7gAvfx/8dA69AQ9+p7ubc+KvJg== dependencies: broccoli-funnel "^2.0.1" - ember-cli-babel "^6.10.0" + ember-assign-polyfill "~2.4.0" + ember-cli-babel "^6.12.0" ember-cli-htmlbars-inline-precompile "^1.0.0" +"@glimmer/compiler@^0.38.0": + version "0.38.1" + resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.38.1.tgz#03b43a2a8a04b1ed39517862158e8897d0f6798b" + integrity sha512-V4wRYRPH6FSVZw9dNfZn3IRxBofUBL0oGeBLm7wNdUOg4oXE26BMmxRVtYzTsBmmSj7SqB+B6VKuH1jEuvOOhQ== + dependencies: + "@glimmer/interfaces" "^0.38.1" + "@glimmer/syntax" "^0.38.1" + "@glimmer/util" "^0.38.1" + "@glimmer/wire-format" "^0.38.1" + "@glimmer/di@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" integrity sha1-c7/Upu5BSKgL8JLopdKbysnUzn4= +"@glimmer/interfaces@^0.38.1": + version "0.38.1" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.38.1.tgz#5b1c174363396b99d6a6bddb35538151e4c4c989" + integrity sha512-YXnzRR7IviHdN+k2Llp8rQ+ADrdzme++A5EFZRxcUoD14Eu1u2S3al7FlLLfwHhp5R2leO+x3zSYoWsuzfvsqw== + dependencies: + "@glimmer/wire-format" "^0.38.1" + "@simple-dom/interface" "1.4.0" + "@glimmer/resolver@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.1.tgz#cd9644572c556e7e799de1cf8eff2b999cf5b878" @@ -638,178 +689,250 @@ dependencies: "@glimmer/di" "^0.2.0" -"@types/minimatch@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@webassemblyjs/ast@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" - integrity sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA== +"@glimmer/syntax@^0.38.1": + version "0.38.1" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.38.1.tgz#625875da5f1e827ad5806fdaa23e2cd00369fda8" + integrity sha512-tzc1NeUd7hbBWqIlgSY5Oq8bEiMpp7ClawVt8hWUarbr9G+qR0toDEQYqZmeRtCXjHAIh9M9oYbpbzLP6+iiag== dependencies: - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - debug "^3.1.0" - mamacro "^0.0.3" + "@glimmer/interfaces" "^0.38.1" + "@glimmer/util" "^0.38.1" + handlebars "^4.0.6" + simple-html-tokenizer "^0.5.6" -"@webassemblyjs/floating-point-hex-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" - integrity sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA== +"@glimmer/util@^0.38.1": + version "0.38.1" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.38.1.tgz#41ca0544f95ec980bc492f4f0e5a85564964c028" + integrity sha512-WAe+bqJSFBR8EmA/NsxcqWmyi2AfOyW9x1jpWczZHJiBkvssiRF6nre39CJVwwMPlFDtdKzvnRQkWVl8ZBhcNw== -"@webassemblyjs/helper-api-error@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" - integrity sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg== +"@glimmer/wire-format@^0.38.1": + version "0.38.1" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.38.1.tgz#a77963cf7193ab23cbce242116aac613f17cd3dc" + integrity sha512-AT1dToybQxbY29XpkNra9/j7svq65ZNnSXmRs1zUKAarvgh6qxOBsnYeVBNrxBFduNuNJOxP8G0Y+nXEGrUoRQ== + dependencies: + "@glimmer/util" "^0.38.1" -"@webassemblyjs/helper-buffer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" - integrity sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA== +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== dependencies: - debug "^3.1.0" + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@webassemblyjs/helper-code-frame@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" - integrity sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ== +"@simple-dom/interface@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" + integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA== + +"@types/acorn@^4.0.3": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.5.tgz#e29fdf884695e77be4e99e67d748f5147255752d" + integrity sha512-603sPiZ4GVRHPvn6vNgEAvJewKsy+zwRWYS2MeIMemgoAtcjlw2G3lALxrb9OPA17J28bkB71R33yXlQbUatCA== dependencies: - "@webassemblyjs/wast-printer" "1.5.13" + "@types/estree" "*" -"@webassemblyjs/helper-fsm@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" - integrity sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg== +"@types/estree@*", "@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== -"@webassemblyjs/helper-module-context@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" - integrity sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ== +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== dependencies: - debug "^3.1.0" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" - integrity sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw== - -"@webassemblyjs/helper-wasm-section@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" - integrity sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - debug "^3.1.0" + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" -"@webassemblyjs/ieee754@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" - integrity sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg== - dependencies: - ieee754 "^1.1.11" - -"@webassemblyjs/leb128@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" - integrity sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg== - dependencies: - long "4.0.0" - -"@webassemblyjs/utf8@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" - integrity sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng== - -"@webassemblyjs/wasm-edit@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" - integrity sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/helper-wasm-section" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - "@webassemblyjs/wast-printer" "1.5.13" - debug "^3.1.0" +"@types/minimatch@*", "@types/minimatch@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@webassemblyjs/wasm-gen@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" - integrity sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" - -"@webassemblyjs/wasm-opt@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" - integrity sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - debug "^3.1.0" +"@types/node@*": + version "11.11.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.3.tgz#7c6b0f8eaf16ae530795de2ad1b85d34bf2f5c58" + integrity sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg== + +"@types/node@^9.6.0": + version "9.6.46" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.46.tgz#bb2eeb0eeb58e401ef9e4e29abc4f81003ee767c" + integrity sha512-W8W76mPzOkN1KuzB25yFIqv1ESj2gp8MILJByUnLcDhOZsuSaDhY8vXLEP9+6OWCqNe7W+3zh2L+rb8kg9rsFA== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@webassemblyjs/ast@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" + integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== + dependencies: + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + +"@webassemblyjs/floating-point-hex-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" + integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== + +"@webassemblyjs/helper-api-error@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" + integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== + +"@webassemblyjs/helper-buffer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" + integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== + +"@webassemblyjs/helper-code-frame@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" + integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== + dependencies: + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/helper-fsm@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" + integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== + +"@webassemblyjs/helper-module-context@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" + integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== + +"@webassemblyjs/helper-wasm-bytecode@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" + integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== + +"@webassemblyjs/helper-wasm-section@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" + integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + +"@webassemblyjs/ieee754@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" + integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" + integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== + dependencies: + "@xtuc/long" "4.2.1" + +"@webassemblyjs/utf8@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" + integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== + +"@webassemblyjs/wasm-edit@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" + integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/helper-wasm-section" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-opt" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/wasm-gen@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" + integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wasm-opt@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" + integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + +"@webassemblyjs/wasm-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" + integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wast-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" + integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/floating-point-hex-parser" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-code-frame" "1.7.11" + "@webassemblyjs/helper-fsm" "1.7.11" + "@xtuc/long" "4.2.1" + +"@webassemblyjs/wast-printer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" + integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + "@xtuc/long" "4.2.1" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== -"@webassemblyjs/wasm-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" - integrity sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" - -"@webassemblyjs/wast-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" - integrity sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/floating-point-hex-parser" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-code-frame" "1.5.13" - "@webassemblyjs/helper-fsm" "1.5.13" - long "^3.2.0" - mamacro "^0.0.3" - -"@webassemblyjs/wast-printer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" - integrity sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - long "^3.2.0" +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== abbrev@1: version "1.1.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" integrity sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8= -accepts@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" - integrity sha1-w8p0NJOGSMPg2cHjKN1otiLChMo= - dependencies: - mime-types "~2.1.11" - negotiator "0.6.1" - accepts@~1.3.3: version "1.3.4" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" @@ -818,6 +941,14 @@ accepts@~1.3.3: mime-types "~2.1.16" negotiator "0.6.1" +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + acorn-dynamic-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" @@ -842,15 +973,20 @@ acorn@^5.0.0, acorn@^5.6.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== -acorn@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" - integrity sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w== +acorn@^5.2.1, acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -after@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" - integrity sha1-q11PuIP1loFtNRX495HAr0ht1ic= +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^1.0.0: version "1.5.1" @@ -899,13 +1035,6 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" -alter@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz#c7588808617572034aae62480af26b1d4d1cb3cd" - integrity sha1-x1iICGF1cgNKrmJICvJrHU0cs80= - dependencies: - stable "~0.1.3" - amd-name-resolver@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" @@ -913,13 +1042,6 @@ amd-name-resolver@0.0.7: dependencies: ensure-posix-path "^1.0.1" -amd-name-resolver@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.0.0.tgz#0e593b28d6fa3326ab1798107edaea961046e8d8" - integrity sha1-Dlk7KNb6MyarF5gQftrqlhBG6Ng= - dependencies: - ensure-posix-path "^1.0.1" - amd-name-resolver@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" @@ -927,7 +1049,7 @@ amd-name-resolver@1.2.0: dependencies: ensure-posix-path "^1.0.1" -amd-name-resolver@^1.2.1: +amd-name-resolver@^1.2.0, amd-name-resolver@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.3.1.tgz#ffe71c683c6e7191fc4ae1bb3aaed15abea135d9" integrity sha512-26qTEWqZQ+cxSYygZ4Cf8tsjDBLceJahhtewxtKZA3SRa4PluuqYCuheemDQD+7Mf5B7sr+zhTDWAHDh02a1Dw== @@ -950,6 +1072,11 @@ ansi-escapes@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" integrity sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs= +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" @@ -999,14 +1126,6 @@ any-observable@^0.2.0: resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242" integrity sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI= -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -1055,25 +1174,18 @@ are-we-there-yet@~1.1.2: readable-stream "^2.0.6" argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - integrity sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY= + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -1110,7 +1222,7 @@ array-to-sentence@^1.1.0: resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= -array-union@^1.0.1: +array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= @@ -1122,20 +1234,15 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -arraybuffer.slice@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" - integrity sha1-8zshWfBTKj8xB6JywMz70a0peco= +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== arrify@^1.0.0: version "1.0.1" @@ -1178,25 +1285,15 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -ast-traverse@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" - integrity sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY= - -ast-types@0.8.12: - version "0.8.12" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" - integrity sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w= - ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= async-disk-cache@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.2.tgz#ac53d6152843df202c9406e28d774362608d74dd" - integrity sha1-rFPWFShD3yAslAbijXdDYmCNdN0= + version "1.3.4" + resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.4.tgz#a5c9f72f199a9933583659f57a0e11377884f816" + integrity sha512-qsIvGJ/XYZ5bSGf5vHt2aEQHZnyuehmk/+51rCJhpkZl4LtvOZ+STbhLbdFAJGYO+dLzUT5Bb4nLKqHBX83vhw== dependencies: debug "^2.1.3" heimdalljs "^0.2.3" @@ -1204,7 +1301,7 @@ async-disk-cache@^1.2.1: mkdirp "^0.5.0" rimraf "^2.5.3" rsvp "^3.0.18" - username-sync "1.0.1" + username-sync "^1.0.2" async-each@^1.0.0: version "1.0.1" @@ -1216,7 +1313,12 @@ async-foreach@^0.1.3: resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= -async-promise-queue@^1.0.3: +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async-promise-queue@^1.0.3, async-promise-queue@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" integrity sha512-GQ5X3DT+TefYuFPHdvIPXFTlKnh39U7dwtl+aUBGeKjMea9nBpv3c91DXgeyBQmY07vQ97f3Sr9XHqkamEameQ== @@ -1229,12 +1331,12 @@ async@^1.4.0, async@^1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.4.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" - integrity sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw== +async@^2.4.1, async@^2.5.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== dependencies: - lodash "^4.14.0" + lodash "^4.17.11" async@~0.2.9: version "0.2.10" @@ -1275,58 +1377,6 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^5.0.0: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558" - integrity sha1-H8ruedfmG3ULALjlT238nQr4ZVg= - dependencies: - babel-plugin-constant-folding "^1.0.1" - babel-plugin-dead-code-elimination "^1.0.2" - babel-plugin-eval "^1.0.1" - babel-plugin-inline-environment-variables "^1.0.1" - babel-plugin-jscript "^1.0.4" - babel-plugin-member-expression-literals "^1.0.1" - babel-plugin-property-literals "^1.0.1" - babel-plugin-proto-to-assign "^1.0.3" - babel-plugin-react-constant-elements "^1.0.3" - babel-plugin-react-display-name "^1.0.3" - babel-plugin-remove-console "^1.0.1" - babel-plugin-remove-debugger "^1.0.1" - babel-plugin-runtime "^1.0.7" - babel-plugin-undeclared-variables-check "^1.0.2" - babel-plugin-undefined-to-void "^1.1.6" - babylon "^5.8.38" - bluebird "^2.9.33" - chalk "^1.0.0" - convert-source-map "^1.1.0" - core-js "^1.0.0" - debug "^2.1.1" - detect-indent "^3.0.0" - esutils "^2.0.0" - fs-readdir-recursive "^0.1.0" - globals "^6.4.0" - home-or-tmp "^1.0.0" - is-integer "^1.0.4" - js-tokens "1.0.1" - json5 "^0.4.0" - lodash "^3.10.0" - minimatch "^2.0.3" - output-file-sync "^1.1.0" - path-exists "^1.0.0" - path-is-absolute "^1.0.0" - private "^0.1.6" - regenerator "0.8.40" - regexpu "^1.3.0" - repeating "^1.1.2" - resolve "^1.1.6" - shebang-regex "^1.0.0" - slash "^1.0.0" - source-map "^0.5.0" - source-map-support "^0.2.10" - to-fast-properties "^1.0.0" - trim-right "^1.0.0" - try-resolve "^1.0.0" - babel-core@^6.14.0, babel-core@^6.24.1, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" @@ -1518,16 +1568,6 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-constant-folding@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz#8361d364c98e449c3692bdba51eff0844290aa8e" - integrity sha1-g2HTZMmORJw2kr26Ue/whEKQqo4= - -babel-plugin-dead-code-elimination@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" - integrity sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U= - babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" @@ -1535,7 +1575,7 @@ 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-beta.6: +babel-plugin-debug-macros@^0.2.0, babel-plugin-debug-macros@^0.2.0-beta.6: 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== @@ -1549,13 +1589,6 @@ babel-plugin-debug-macros@^0.3.0: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^1.4.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-1.6.0.tgz#abd1afa4237b3121cb51222f9bf3283cad8990aa" - integrity sha512-HIOU4QBiselFqEvx6QaKrS/zxnfRQygQyA8wGdVUd42zO26G0jUqbEr1IE/NkTAbP4zsF0sY/ZLtVpjYiVB3VQ== - dependencies: - ember-rfc176-data "^0.2.0" - babel-plugin-ember-modules-api-polyfill@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" @@ -1570,10 +1603,12 @@ babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-p dependencies: ember-rfc176-data "^0.3.7" -babel-plugin-eval@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" - integrity sha1-ovrtJc5r5preS/7CY/cBaRlZUNo= +babel-plugin-ember-modules-api-polyfill@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.8.0.tgz#70244800f750bf1c9f380910c1b2eed1db80ab4a" + integrity sha512-3dlBH92qx8so2pRoks73+gwnuX97d0ajirOr96GwTZMnZxFzVR02c/PQbKWBcxpPqoL8CJSE2onuWM8PWezhOQ== + dependencies: + ember-rfc176-data "^0.3.8" babel-plugin-feature-flags@^0.3.1: version "0.3.1" @@ -1590,20 +1625,10 @@ babel-plugin-htmlbars-inline-precompile@^0.2.3: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" integrity sha1-zTZeJ4r0Cb+mvncExDVL7udCRGs= -babel-plugin-inline-environment-variables@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe" - integrity sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4= - -babel-plugin-jscript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz#8f342c38276e87a47d5fa0a8bd3d5eb6ccad8fcc" - integrity sha1-jzQsOCduh6R9X6CovT1etsytj8w= - -babel-plugin-member-expression-literals@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" - integrity sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM= +babel-plugin-htmlbars-inline-precompile@^0.2.5: + version "0.2.6" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" + integrity sha512-H4H75TKGUFij8ukwEYWEERAgrUf16R8NSK1uDPe3QwxT8mnE1K8+/s6DVjUqbM5Pv6lSIcE4XufXdlSX+DTB6g== babel-plugin-module-resolver@^3.1.1: version "3.2.0" @@ -1616,58 +1641,21 @@ babel-plugin-module-resolver@^3.1.1: reselect "^3.0.1" resolve "^1.4.0" -babel-plugin-property-literals@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" - integrity sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY= - -babel-plugin-proto-to-assign@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz#c49e7afd02f577bc4da05ea2df002250cf7cd123" - integrity sha1-xJ56/QL1d7xNoF6i3wAiUM980SM= - dependencies: - lodash "^3.9.3" - -babel-plugin-react-constant-elements@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz#946736e8378429cbc349dcff62f51c143b34e35a" - integrity sha1-lGc26DeEKcvDSdz/YvUcFDs041o= - -babel-plugin-react-display-name@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz#754fe38926e8424a4e7b15ab6ea6139dee0514fc" - integrity sha1-dU/jiSboQkpOexWrbqYTne4FFPw= - -babel-plugin-remove-console@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz#d8f24556c3a05005d42aaaafd27787f53ff013a7" - integrity sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c= - -babel-plugin-remove-debugger@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz#fd2ea3cd61a428ad1f3b9c89882ff4293e8c14c7" - integrity sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc= - -babel-plugin-runtime@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf" - integrity sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8= - babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + integrity sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo= + babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" @@ -1696,7 +1684,7 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: +babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= @@ -1881,14 +1869,6 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" @@ -1904,18 +1884,6 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-undeclared-variables-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz#5cf1aa539d813ff64e99641290af620965f65dee" - integrity sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4= - dependencies: - leven "^1.0.2" - -babel-plugin-undefined-to-void@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" - integrity sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E= - babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" @@ -2064,11 +2032,6 @@ babel6-plugin-strip-heimdall@^6.0.1: resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" integrity sha1-NfgO3ewff//cAJgR371G2ZZQcrY= -babylon@^5.8.38: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" - integrity sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0= - babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -2101,10 +2064,10 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" integrity sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw== -base64id@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" - integrity sha1-As4P3u4M709ACA4ec+g08LG/zj8= +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= base@^0.11.1: version "0.11.2" @@ -2119,10 +2082,12 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -basic-auth@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" - integrity sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ= +basic-auth@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" bcrypt-pbkdf@^1.0.0: version "1.0.1" @@ -2149,19 +2114,19 @@ binary-extensions@^1.0.0: integrity sha1-muuabF6IY4qtFx4Wf1kAq+JINdA= "binaryextensions@1 || 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.0.0.tgz#e597d1a7a6a3558a2d1c7241a16c99965e6aa40f" - integrity sha1-5ZfRp6ajVYotHHJBoWyZll5qpA8= + version "2.1.2" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.2.tgz#c83c3d74233ba7674e4f313cb2a2b70f54e94b7c" + integrity sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg== blank-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9" integrity sha1-+ZB5P76ajI3QE/syGUIL7IHV9Lk= -blob@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" - integrity sha1-vPEwUspURj8w+fx+lbmkdjCpSSE= +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== block-stream@*: version "0.0.9" @@ -2170,26 +2135,37 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^2.9.33: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE= - bluebird@^3.1.1, bluebird@^3.4.6: version "3.5.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw= -bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== +bluebird@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +body-parser@1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + body@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" @@ -2200,6 +2176,11 @@ body@^5.1.0: raw-body "~1.1.0" safe-json-parse "~1.0.1" +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" @@ -2223,23 +2204,14 @@ bower-endpoint-parser@0.2.2: resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6" integrity sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y= -brace-expansion@^1.0.0, brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - integrity sha1-wHshHHyVLsH479Uad+8NHTmQopI= +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - braces@^2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -2274,18 +2246,22 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -breakable@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" - integrity sha1-eEp5eRWjjq0nutRWtVcstLuqeME= +broccoli-amd-funnel@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-amd-funnel/-/broccoli-amd-funnel-1.3.0.tgz#c4426b4fce976e44295bd74f34725f53bdeb08e3" + integrity sha512-QLjCWblDW//a/5/ivDikVPRHiA+d/1K45meHZA6lAlpHC1c216rcZQYpdlo9PiOJiI4T3tKqDaaM1CDeFDCoVQ== + dependencies: + broccoli-plugin "^1.3.0" + symlink-or-copy "^1.2.0" -broccoli-asset-rev@^2.4.5: - version "2.6.0" - resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.6.0.tgz#0633fc3a0b2ba0c2c1d56fa9feb7b331fc83be6d" - integrity sha1-BjP8OgsroMLB1W+p/rezMfyDvm0= +broccoli-asset-rev@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.7.0.tgz#c73da1d97c4180366fa442a87624ca1b7fb99161" + integrity sha512-GZ7gU3Qo6HMAUqDeh1q+4UVCQPJPjCyGcpIY5s9Qp58a244FT4nZSiy8qYkVC4LLIWTZt59G7jFFsUcj/13IPQ== dependencies: broccoli-asset-rewrite "^1.1.0" broccoli-filter "^1.2.2" + broccoli-persistent-filter "^1.4.3" json-stable-stringify "^1.0.0" minimatch "^3.0.4" rsvp "^3.0.6" @@ -2297,23 +2273,7 @@ broccoli-asset-rewrite@^1.1.0: dependencies: broccoli-filter "^1.2.3" -broccoli-babel-transpiler@^5.6.2: - version "5.7.2" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.2.tgz#756c30544775144e984333b7115f42c916ba08e0" - integrity sha512-vFQ+aSR9J81fm3MXXQGgDxswYINHl2p5duLvRLVnpmgPDNdpdsa30gh3xnmhzR/GwWFBfUNle7aYxthlgvsN0w== - dependencies: - babel-core "^5.0.0" - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.0.0" - broccoli-persistent-filter "^1.4.2" - clone "^0.2.0" - hash-for-dep "^1.0.2" - heimdalljs-logger "^0.1.7" - json-stable-stringify "^1.0.0" - rsvp "^3.5.0" - workerpool "^2.2.1" - -broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: +broccoli-babel-transpiler@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.2.tgz#26019c045b5ea3e44cfef62821302f9bd483cabd" integrity sha512-o1OUe5RZ5EP5+QICEmRNvWlhMvIciMisVACHu6qUPt6dE0Q0UnI5lUpWTmuXg/X+QuznqD/s1PApIpahv/QMZw== @@ -2362,11 +2322,12 @@ broccoli-babel-transpiler@^7.1.2: rsvp "^4.8.4" workerpool "^3.1.1" -broccoli-builder@^0.18.8: - version "0.18.10" - resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.10.tgz#9767e0061ff5b5e6eb1619d1a972ef2c7fd07631" - integrity sha512-4U2jqaR5vxVR0ODxa9bWdrxz69k0WzhWfCGaTSIktJsKIVKmfD5kX1AMOUGBUaIJLJpUOd2t3XPHbXmwjnLCmQ== +broccoli-builder@^0.18.14: + version "0.18.14" + resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.14.tgz#4b79e2f844de11a4e1b816c3f49c6df4776c312d" + integrity sha1-S3ni+ETeEaThuBbD9Jxt9HdsMS0= dependencies: + broccoli-node-info "^1.1.0" heimdalljs "^0.2.0" promise-map-series "^0.2.1" quick-temp "^0.1.2" @@ -2426,7 +2387,25 @@ broccoli-concat@^3.2.2: lodash.uniq "^4.2.0" walk-sync "^0.3.1" -broccoli-config-loader@^1.0.0: +broccoli-concat@^3.5.1, broccoli-concat@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.3.tgz#0dca01311567ffb13180e6b4eb111824628e4885" + integrity sha512-2Ma9h81EJ0PRb9n4sW0i8KZlcnpTQfKxcj87zvi5DFe1fd8CTDEdseHDotK2beuA2l+LbgVPfd8EHaBJKm/Y8g== + dependencies: + broccoli-debug "^0.6.5" + broccoli-kitchen-sink-helpers "^0.3.1" + broccoli-plugin "^1.3.0" + ensure-posix-path "^1.0.2" + fast-sourcemap-concat "^1.4.0" + find-index "^1.1.0" + fs-extra "^4.0.3" + fs-tree-diff "^0.5.7" + lodash.merge "^4.3.1" + lodash.omit "^4.1.0" + lodash.uniq "^4.2.0" + walk-sync "^0.3.2" + +broccoli-config-loader@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz#d10aaf8ebc0cb45c1da5baa82720e1d88d28c80a" integrity sha512-MDKYQ50rxhn+g17DYdfzfEM9DjTuSGu42Db37A8TQHQe8geYEcUZ4SQqZRgzdAI3aRQNlA1yBHJfOeGmOjhLIg== @@ -2443,7 +2422,7 @@ broccoli-config-replace@^1.1.2: debug "^2.2.0" fs-extra "^0.24.0" -broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-debug@^0.6.4: +broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" integrity sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg== @@ -2455,7 +2434,19 @@ broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.3, broccoli-de symlink-or-copy "^1.1.8" tree-sync "^1.2.2" -broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: +broccoli-debug@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.5.tgz#164a5cdafd8936e525e702bf8f91f39d758e2e78" + integrity sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg== + dependencies: + broccoli-plugin "^1.2.1" + fs-tree-diff "^0.5.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + symlink-or-copy "^1.1.8" + tree-sync "^1.2.2" + +broccoli-file-creator@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" integrity sha1-GzW2fSFavfrdjUnutpSTw55sNFA= @@ -2504,15 +2495,13 @@ broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-flatiron@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/broccoli-flatiron/-/broccoli-flatiron-0.0.0.tgz#e97504016b56eea04813b5d862fda18b6f11a77f" - integrity sha1-6XUEAWtW7qBIE7XYYv2hi28Rp38= +broccoli-flatiron@0.1.3, broccoli-flatiron@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/broccoli-flatiron/-/broccoli-flatiron-0.1.3.tgz#fc7bd8faf7db429ed7199933aa2ec7ef84a8d943" + integrity sha512-dD/4ck+LKOLTBzFlxP2zX7fhWt1TFMVR/88b9/wd8LkAHUyAzWs1vBah94ObSvajYGZ7ic+XvMXw+OhmvdlYoQ== dependencies: - broccoli-kitchen-sink-helpers "~0.2.4" - broccoli-writer "~0.1.1" - mkdirp "^0.3.5" - rsvp "~3.0.6" + broccoli-plugin "^1.3.0" + mkdirp "^0.5.1" broccoli-funnel-reducer@^1.0.0: version "1.0.0" @@ -2539,10 +2528,10 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" - integrity sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg== +broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75" + integrity sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -2558,10 +2547,10 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75" - integrity sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ== +broccoli-funnel@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" + integrity sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg== dependencies: array-equal "^1.0.0" blank-object "^1.0.1" @@ -2577,7 +2566,7 @@ broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@^0.2.6, broccoli-kitchen-sink-helpers@~0.2.0, broccoli-kitchen-sink-helpers@~0.2.4: +broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@^0.2.6, broccoli-kitchen-sink-helpers@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= @@ -2621,9 +2610,9 @@ broccoli-merge-trees@^1.0.0, broccoli-merge-trees@^1.1.0, broccoli-merge-trees@^ symlink-or-copy "^1.0.0" broccoli-merge-trees@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz#10aea46dd5cebcc8b8f7d5a54f0a84a4f0bb90b9" - integrity sha1-EK6kbdXOvMi499WlTwqEpPC7kLk= + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-2.0.1.tgz#14d4b7fc1a90318c12b16f843e6ba2693808100c" + integrity sha512-WjaexJ+I8BxP5V5RNn6um/qDRSmKoiBC/QkRi79FT9ClHfldxRyCDs9mcV7mmoaPlsshmmPaUz5jdtcKA6DClQ== dependencies: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" @@ -2644,15 +2633,39 @@ broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2: broccoli-plugin "^1.3.0" merge-trees "^2.0.0" -broccoli-middleware@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-1.2.1.tgz#a21f255f8bfe5a21c2f0fbf2417addd9d24c9436" - integrity sha1-oh8lX4v+WiHC8PvyQXrd2dJMlDY= +broccoli-middleware@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-middleware/-/broccoli-middleware-2.0.1.tgz#093314f13e52fad7fa8c4254a4e4a4560c857a65" + integrity sha512-V/K5uozcEH/XJ09ZAL8aJt/W2UwJU8I8fA2FAg3u9gzs5dQrehHDtgSoKS2QjPjurRC1GSiYLcsMp36sezaQQg== dependencies: handlebars "^4.0.4" mime-types "^2.1.18" -broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.2, broccoli-persistent-filter@^1.4.3: +broccoli-module-normalizer@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-module-normalizer/-/broccoli-module-normalizer-1.3.0.tgz#f9982d9cbb776b4ed754161cc6547784d3eb19de" + integrity sha512-0idZCOtdVG6xXoQ36Psc1ApMCr3lW5DB+WEAOEwHcUoESIBHzwcRPQTxheGIjZ5o0hxpsRYAUH5x0ErtNezbrQ== + dependencies: + broccoli-plugin "^1.3.0" + merge-trees "^1.0.1" + rimraf "^2.6.2" + symlink-or-copy "^1.1.8" + +broccoli-module-unification-reexporter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/broccoli-module-unification-reexporter/-/broccoli-module-unification-reexporter-1.0.0.tgz#031909c5d3f159ec11d5f9e2346f2861db8acb3e" + integrity sha512-HTi9ua520M20aBZomaiBopsSt3yjL7J/paR3XPjieygK7+ShATBiZdn0B+ZPiniBi4I8JuMn1q0fNFUevtP//A== + dependencies: + broccoli-plugin "^1.3.0" + mkdirp "^0.5.1" + walk-sync "^0.3.2" + +broccoli-node-info@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" + integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= + +broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== @@ -2671,7 +2684,7 @@ broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.2.1: +broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.2.2.tgz#e0180e75ede5dd05d4c702f24f6c049e93fba915" integrity sha512-PW12RD1yY+x5SASUADuUMJce+dVSmjBO3pV1rLNHmT1C31rp1P++TvX7AgUObFmGhL7qlwviSdhMbBkY1v3G2w== @@ -2700,20 +2713,20 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" -broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#bee704a8e42da08cb58e513aaa436efb7f0ef1ee" - integrity sha1-vucEqOQtoIy1jlE6qkNu+38O8e4= +broccoli-plugin@^1.0.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" + integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" - integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== +broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#bee704a8e42da08cb58e513aaa436efb7f0ef1ee" + integrity sha1-vucEqOQtoIy1jlE6qkNu+38O8e4= dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" @@ -2729,20 +2742,20 @@ broccoli-replace@^0.12.0: broccoli-persistent-filter "^1.2.0" minimatch "^3.0.0" -broccoli-rollup@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-1.3.0.tgz#43a0a7798555bab54217009eb470a4ff5a056df0" - integrity sha1-Q6CneYVVurVCFwCetHCk/1oFbfA= +broccoli-rollup@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" + integrity sha512-aky/Ovg5DbsrsJEx2QCXxHLA6ZR+9u1TNVTf85soP4gL8CjGGKQ/JU8R3BZ2ntkWzo6/83RCKzX6O+nlNKR5MQ== dependencies: + "@types/node" "^9.6.0" + amd-name-resolver "^1.2.0" broccoli-plugin "^1.2.1" - es6-map "^0.1.4" - fs-extra "^0.30.0" fs-tree-diff "^0.5.2" heimdalljs "^0.2.1" heimdalljs-logger "^0.1.7" - md5-hex "^1.3.0" + magic-string "^0.24.0" node-modules-path "^1.0.1" - rollup "^0.41.4" + rollup "^0.57.1" symlink-or-copy "^1.1.8" walk-sync "^0.3.1" @@ -2781,7 +2794,7 @@ broccoli-sri-hash@^2.1.0: sri-toolbox "^0.2.0" symlink-or-copy "^1.0.1" -broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.4.0, broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: +broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" integrity sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw= @@ -2801,9 +2814,29 @@ broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.4.0, broccoli-stew@ symlink-or-copy "^1.1.8" walk-sync "^0.3.0" -broccoli-string-replace@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" +broccoli-stew@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" + integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== + dependencies: + broccoli-debug "^0.6.5" + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^3.0.1" + broccoli-persistent-filter "^2.1.1" + broccoli-plugin "^1.3.1" + chalk "^2.4.1" + debug "^3.1.0" + ensure-posix-path "^1.0.1" + fs-extra "^6.0.1" + minimatch "^3.0.4" + resolve "^1.8.1" + rsvp "^4.8.4" + symlink-or-copy "^1.2.0" + walk-sync "^0.3.3" + +broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" integrity sha1-HtkvhWgK+NUDAjkl51Tk4zZ2uR8= dependencies: broccoli-persistent-filter "^1.1.5" @@ -2818,11 +2851,12 @@ broccoli-templater@^1.0.0: broccoli-stew "^1.2.0" lodash.template "^3.3.2" -broccoli-uglify-sourcemap@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.0.1.tgz#e8f2f6c49e04b6e921f1ecd30e12f06fb75e585f" - integrity sha1-6PL2xJ4Etukh8ezTDhLwb7deWF8= +broccoli-uglify-sourcemap@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-2.2.0.tgz#2ff49389bdf342a550c3596750ba2dde95a8f7d4" + integrity sha1-L/STib3zQqVQw1lnULot3pWo99Q= dependencies: + async-promise-queue "^1.0.4" broccoli-plugin "^1.2.1" debug "^3.1.0" lodash.defaultsdeep "^4.6.0" @@ -2830,8 +2864,9 @@ broccoli-uglify-sourcemap@^2.0.0: mkdirp "^0.5.0" source-map-url "^0.4.0" symlink-or-copy "^1.0.1" - uglify-es "^3.1.3" + terser "^3.7.5" walk-sync "^0.3.2" + workerpool "^2.3.0" broccoli-unwatched-tree@^0.1.1: version "0.1.3" @@ -2943,6 +2978,24 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + buffer-from@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" @@ -3003,28 +3056,29 @@ bytes@1: resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= -bytes@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" - integrity sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo= - -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +cacache@^11.0.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" + ssri "^6.0.1" + unique-filename "^1.1.1" y18n "^4.0.0" cache-base@^1.0.1: @@ -3042,13 +3096,18 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -calculate-cache-key-for-tree@^1.0.0, calculate-cache-key-for-tree@^1.1.0: +calculate-cache-key-for-tree@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" integrity sha1-DD5CycE088neU1jA8WeTYn6pdtY= dependencies: json-stable-stringify "^1.0.1" +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -3074,7 +3133,7 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2, camelcase@^1.2.1: +camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= @@ -3116,7 +3175,7 @@ caniuse-lite@^1.0.30000939: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000946.tgz#ac50a3331bb805b483478bbc26a0ab71bb6d0509" integrity sha512-ZVXtMoZ3Mfq69Ikv587Av+5lwGVJsG98QKUucVmtFBf0tl1kOCfLQ5o6Z2zBNis4Mx3iuH77WxEUpdP6t7f2CQ== -capture-exit@^1.1.0: +capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= @@ -3180,7 +3239,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" -chalk@^2.3.1: +chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3196,22 +3255,6 @@ charm@^1.0.0: dependencies: inherits "^2.0.1" -chokidar@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" - integrity sha1-L0RHq16W5Q+z14n9kNTHLg5McMI= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" @@ -3237,6 +3280,11 @@ chownr@^1.0.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + chrome-trace-event@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" @@ -3249,6 +3297,11 @@ ci-info@^1.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" integrity sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ= +ci-info@^1.1.3: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -3262,13 +3315,6 @@ circular-json@^0.3.1: resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== - dependencies: - chalk "^1.1.3" - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -3368,22 +3414,21 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8= +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clone@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" - integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs= - -clone@^2.1.2: +clone@^2.0.0, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= @@ -3393,11 +3438,13 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= +coa@~2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" q "^1.1.2" code-point-at@^1.0.0: @@ -3452,6 +3499,11 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +commander@2.12.2: + version "2.12.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" + integrity sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA== + commander@2.8.x: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" @@ -3459,22 +3511,15 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= - dependencies: - graceful-readlink ">= 1.0.0" - -commander@^2.11.0, commander@^2.5.0, commander@^2.6.0, commander@^2.9.0, commander@~2.13.0: +commander@^2.11.0, commander@^2.6.0, commander@^2.9.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== -commander@~2.12.1: - version "2.12.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" - integrity sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA== +commander@^2.19.0, commander@~2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== common-tags@^1.4.0: version "1.6.0" @@ -3488,31 +3533,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -commoner@~0.10.3: - version "0.10.8" - resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" - integrity sha1-NPw2cs0kOT6LtH5wyqApOBH08sU= - dependencies: - commander "^2.5.0" - detective "^4.3.1" - glob "^5.0.15" - graceful-fs "^4.1.2" - iconv-lite "^0.4.5" - mkdirp "^0.5.0" - private "^0.1.6" - q "^1.1.2" - recast "^0.11.17" - component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= -component-emitter@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" - integrity sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM= - component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -3523,25 +3548,25 @@ component-inherit@0.0.3: resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= -compressible@~2.0.10: - version "2.0.11" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.11.tgz#16718a75de283ed8e604041625a2064586797d8a" - integrity sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo= +compressible@~2.0.14: + version "2.0.16" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.16.tgz#a49bf9858f3821b64ce1be0296afc7380466a77f" + integrity sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA== dependencies: - mime-db ">= 1.29.0 < 2" + mime-db ">= 1.38.0 < 2" -compression@^1.4.4: - version "1.7.0" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.0.tgz#030c9f198f1643a057d776a738e922da4373012d" - integrity sha1-AwyfGY8WQ6BX13anOOki2kNzAS0= +compression@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== dependencies: - accepts "~1.3.3" - bytes "2.5.0" - compressible "~2.0.10" - debug "2.6.8" + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" on-headers "~1.0.1" - safe-buffer "5.1.1" - vary "~1.1.1" + safe-buffer "5.1.2" + vary "~1.1.2" concat-map@0.0.1: version "0.0.1" @@ -3567,10 +3592,10 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -configstore@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" - integrity sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw== +configstore@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" + integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -3591,7 +3616,7 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -console-ui@^2.1.0: +console-ui@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.2.3.tgz#134b92e632f2c0088f78e52b20f1ca22a95b9a91" integrity sha512-aZm49rntsv264Fw/DM56Z2ehLg1DDxrqof2jFcZOgC03S0nRGSYFIVPx5TbGssrgBhgCvGBY+9mmk0+t/nWXEA== @@ -3603,10 +3628,10 @@ console-ui@^2.1.0: through "^2.3.8" user-info "^1.0.0" -consolidate@^0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" - integrity sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM= +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== dependencies: bluebird "^3.1.1" @@ -3625,12 +3650,24 @@ content-type@~1.0.2: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" integrity sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0= +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + continuable-cache@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= -convert-source-map@^1.1.0, convert-source-map@^1.5.0: +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" integrity sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU= @@ -3672,11 +3709,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" @@ -3687,7 +3719,7 @@ core-js@^2.5.7: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== -core-object@^3.1.3: +core-object@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" integrity sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg== @@ -3756,6 +3788,17 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -3792,18 +3835,58 @@ cson-parser@^1.1.0: dependencies: coffee-script "^1.10.0" +css-select-base-adapter@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@~1.3.0-rc0: + version "1.3.0-rc0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.3.0-rc0.tgz#6f93196aaae737666ea1036a8cb14a8fcb7a9231" + integrity sha1-b5MZaqrnN2ZuoQNqjLFKj8t6kjE= + dependencies: + boolbase "^1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "^1.0.1" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha25: + version "1.0.0-alpha25" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597" + integrity sha512-XC6xLW/JqIGirnZuUWHXCHRaAjje2b3OIB0Vj5RIJo6mIi/AdJo30quQl5LxUl0gkXDIrTrFGbMlcZjyFplz1A== + dependencies: + mdn-data "^1.0.0" + source-map "^0.5.3" + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + cssmin@0.3.x: version "0.3.2" resolved "https://registry.yarnpkg.com/cssmin/-/cssmin-0.3.2.tgz#ddce4c547b510ae0d594a8f1fbf8aaf8e2c5c00d" integrity sha1-3c5MVHtRCuDVlKjx+/iq+OLFwA0= -csso@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.0.0.tgz#178b43a44621221c27756086f531e02f42900ee8" - integrity sha1-F4tDpEYhIhwndWCG9THgL0KQDug= +csso@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== dependencies: - clap "^1.0.9" - source-map "^0.5.3" + css-tree "1.0.0-alpha.29" currently-unhandled@^0.4.1: version "0.4.1" @@ -3923,13 +4006,6 @@ d3-transition@^1.1.0: d3-selection "^1.1.0" d3-timer "1" -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= - dependencies: - es5-ext "^0.10.9" - dag-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68" @@ -3952,42 +4028,42 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= - dependencies: - ms "0.7.1" - -debug@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" - integrity sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w= +date-time@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" + integrity sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g== dependencies: - ms "0.7.2" + time-zone "^1.0.0" -debug@2.6.8, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.4.0, debug@^2.6.8, debug@~2.6.7: +debug@2.6.8, debug@^2.1.0, debug@^2.3.3, debug@^2.4.0: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= dependencies: ms "2.0.0" -debug@^2.1.2, debug@^2.6.9: +debug@2.6.9, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.1.0: +debug@^3.0.1, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -debug@^4.1.0: +debug@^4.1.0, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -4014,11 +4090,6 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - integrity sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8= - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -4031,6 +4102,13 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -4053,27 +4131,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - -defs@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/defs/-/defs-1.1.1.tgz#b22609f2c7a11ba7a3db116805c139b1caffa9d2" - integrity sha1-siYJ8sehG6ej2xFoBcE5scr/qdI= - dependencies: - alter "~0.2.0" - ast-traverse "~0.1.1" - breakable "~1.0.0" - esprima-fb "~15001.1001.0-dev-harmony-fb" - simple-fmt "~0.1.0" - simple-is "~0.2.0" - stringmap "~0.2.2" - stringset "~0.2.1" - tryor "~0.1.2" - yargs "~3.27.0" - del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -4097,11 +4154,16 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@1.1.1, depd@~1.1.0, depd@~1.1.1: +depd@1.1.1, depd@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -4115,21 +4177,10 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - integrity sha1-STXe39lIhkjgBrASlWbpOGcR6mM= - dependencies: - fs-exists-sync "^0.1.0" - -detect-indent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" - integrity sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U= - dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - repeating "^1.1.0" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detect-indent@^4.0.0: version "4.0.0" @@ -4138,24 +4189,26 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -detective@^4.3.1: - version "4.7.0" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.0.tgz#6276e150f9e50829ad1f90ace4d9a2304188afcf" - integrity sha512-4mBqSEdMfBpRAo/DQZnTcAXenpiSIJmVKbCMSotS+SFWWcrP/CKM6iBRPdTiEO+wZhlfEsoZlGqpG6ycl5vTqw== - dependencies: - acorn "^5.2.1" - defined "^1.0.0" - -diff@^3.1.0, diff@^3.2.0: +diff@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.0.tgz#056695150d7aa93237ca7e378ac3b1682b7963b9" integrity sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg== +diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + diffie-hellman@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" @@ -4165,6 +4218,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + doctrine@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.2.tgz#68f96ce8efc56cc42651f1faadb4f175273b0075" @@ -4172,11 +4232,32 @@ doctrine@^2.0.2: dependencies: esutils "^2.0.2" +dom-serializer@0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== +domelementtype@1, domelementtype@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" @@ -4202,9 +4283,9 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" editions@^1.1.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.3.tgz#0907101bdda20fac3cbe334c27cbd0688dc99a5b" - integrity sha1-CQcQG92iD6w8vjNMJ8vQaI3Jmls= + version "1.3.4" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== ee-first@1.1.1: version "1.1.1" @@ -4239,39 +4320,51 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -ember-ajax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.0.0.tgz#8f21e9da0c1d433cf879aa855fce464d517e9ab5" - integrity sha1-jyHp2gwdQzz4eaqFX85GTVF+mrU= +ember-ajax@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-4.0.2.tgz#ce86d52c24289657e0a230140b06a52fe453d655" + integrity sha512-YeeeAQizQc5ioCeraxFo30y3W6mmUxmndF0ShI/Wvwfe8IhVw40jL42itaUHbo2CxKsNRZzQ8x3re65dGM0CrA== dependencies: - ember-cli-babel "^6.0.0" + ember-cli-babel "^6.16.0" + najax "^1.0.3" -ember-auto-import@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.0.1.tgz#1b5bd09dfd5fc49422ddf711b4dd913c9dfa90b9" - integrity sha512-qgDAebk+8rKXa1wd3y5KAOo1OSOlUDXv0cLuuM/aLxUmsfo6fMBDOY+c8b4SPjD4ulC3JgCcK4+seADmQHS7pQ== +ember-assign-polyfill@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.4.0.tgz#acb00466f7d674b3e6b030acfe255b3b1f6472e1" + integrity sha512-0SnGQb9CenRqbZdIa1KFsEjT+1ijGWfAbCSaDbg5uVa5l6HPdppuTzOXK6sfEQMsd2nbrp27QWFy7W5VX6l4Ag== dependencies: + ember-cli-babel "^6.6.0" + ember-cli-version-checker "^2.0.0" + +ember-auto-import@^1.2.21: + version "1.2.21" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.2.21.tgz#e02ded183844faba66c3f2af97028ef35175b837" + integrity sha512-coHnqO3mRnlj/JAQSQBEqzX2wL8rH5YrfEJMzk1102X9MdSX1CWeaUYBcyjvI/pG8fHUhv+4VsD6rQuhTUyZUQ== + dependencies: + "@babel/core" "^7.1.6" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.1.6" babel-core "^6.26.3" + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-template "^6.26.0" babylon "^6.18.0" - broccoli-concat "^3.2.2" broccoli-debug "^0.6.4" - broccoli-merge-trees "^3.0.0" broccoli-plugin "^1.3.0" - broccoli-source "^1.1.0" debug "^3.1.0" ember-cli-babel "^6.6.0" enhanced-resolve "^4.0.0" - fs-tree-diff "^0.5.7" - handlebars "^4.0.11" + fs-extra "^6.0.1" + fs-tree-diff "^1.0.0" + handlebars "~4.0.13" js-string-escape "^1.0.1" lodash "^4.17.10" mkdirp "^0.5.1" - quick-temp "^0.1.8" + pkg-up "^2.0.0" resolve "^1.7.1" rimraf "^2.6.2" symlink-or-copy "^1.2.0" - walk-sync "^0.3.2" - webpack "^4.12.0" + walk-sync "^0.3.3" + webpack "~4.28" ember-basic-dropdown@^1.1.0: version "1.1.2" @@ -4282,18 +4375,7 @@ ember-basic-dropdown@^1.1.0: ember-cli-htmlbars "^3.0.1" ember-maybe-in-element "^0.2.0" -ember-cli-babel@^5.1.6: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-5.2.4.tgz#5ce4f46b08ed6f6d21e878619fb689719d6e8e13" - integrity sha1-XOT0awjtb20h6Hhhn7aJcZ1ujhM= - dependencies: - broccoli-babel-transpiler "^5.6.2" - broccoli-funnel "^1.0.0" - clone "^2.0.0" - ember-cli-version-checker "^1.0.2" - resolve "^1.1.2" - -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.3.0, ember-cli-babel@^6.4.1, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: +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.3.0, ember-cli-babel@^6.4.1, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.11.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" integrity sha512-lHQyl30lbAsMmMq2it1GO85HKrqr2gMpK5CFxmOgTJ3moBqOGMKsdV3Z0qXWpgh8Asy7pB9AACMShdgfQvSGPg== @@ -4312,7 +4394,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.0" semver "^5.4.1" -ember-cli-babel@^6.16.0, ember-cli-babel@^6.8.0: +ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -4355,23 +4437,48 @@ ember-cli-babel@^7.1.0, ember-cli-babel@^7.2.0: ensure-posix-path "^1.0.2" semver "^5.5.0" -ember-cli-broccoli-sane-watcher@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.0.4.tgz#f43f42f75b7509c212fb926cd9aea86ae19264c6" - integrity sha1-9D9C91t1CcIS+5Js2a6oauGSZMY= +ember-cli-babel@^7.1.2: + version "7.6.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.6.0.tgz#2e7f1df888fb62eb54d170defce4b6c536e8dfd3" + integrity sha512-2m400ZW9c4EE343g/j1U7beJgjJezTdDCgXM2koHdhpLlZB1Kz7iQw8S+t8gzXGwSGXlf7C7v0RHxP1/bo8frA== + dependencies: + "@babel/core" "^7.0.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-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.2.2" + resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.2.2.tgz#9bb1b04ddeb2c086aecd8693cbaeca1d88dc160c" + integrity sha512-9OLy8x3pdNKC/6xR00IjTL8XyiQU3rb2HLyQSAqHuaZpZcSTKkbAse2ERTsELSINoo/zi/W7qPP5vd5SsHsraw== dependencies: broccoli-slow-trees "^3.0.1" heimdalljs "^0.2.1" heimdalljs-logger "^0.1.7" rsvp "^3.0.18" - sane "^1.1.1" + sane "^2.4.1" -ember-cli-dependency-checker@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-2.1.0.tgz#9d66286a7c778e94733eaf21320d129c4fd0dd64" - integrity sha1-nWYoanx3jpRzPq8hMg0SnE/Q3WQ= +ember-cli-dependency-checker@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.1.0.tgz#b39c6b537a1457d77892edf5ddcfa025cd1401e2" + integrity sha512-Y/V2senOyIjQnZohYeZeXs59rWHI2m8KRF9IesMv1ypLRSc/h/QS6UX51wAyaZnxcgU6ljFXpqL5x38UxM3XzA== dependencies: - chalk "^1.1.3" + chalk "^2.3.0" + find-yarn-workspace-root "^1.1.0" is-git-url "^1.0.0" resolve "^1.5.0" semver "^5.3.0" @@ -4396,10 +4503,10 @@ ember-cli-eslint@^4.2.3: rsvp "^4.6.1" walk-sync "^0.3.0" -ember-cli-funnel@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/ember-cli-funnel/-/ember-cli-funnel-0.6.0.tgz#ee0c14c216991f7f62f91de62a52268590216b2f" - integrity sha512-jNu2W7PboTpmoCBEgTWl1gwqqC4+eXh0+w2qiMxm//REHptRZtW4pko7k8TfbMLS5RFPrPwZ86J2o77Pk+WJSg== +ember-cli-funnel@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/ember-cli-funnel/-/ember-cli-funnel-0.6.1.tgz#f8b248a35fb88bc3aea2ac6e2a74e3e6083b4283" + integrity sha512-QCY0qIGqgISvzbMewzHVhciDBUSxJHx3U4CWoUUGg3xtgXuMVe1WFVg0BvWokl+gTjOGS5imrFl6kbayUvb47A== dependencies: broccoli-funnel "^2.0.0" @@ -4408,7 +4515,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.2: +ember-cli-htmlbars-inline-precompile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.2.tgz#5b544f664d5d9911f08cd979c5f70d8cb0ca2add" integrity sha1-W1RPZk1dmRHwjNl5xfcNjLDKKt0= @@ -4419,16 +4526,16 @@ ember-cli-htmlbars-inline-precompile@^1.0.0, ember-cli-htmlbars-inline-precompil heimdalljs-logger "^0.1.7" silent-error "^1.1.0" -ember-cli-htmlbars@^1.0.3, ember-cli-htmlbars@^1.1.1, ember-cli-htmlbars@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-1.3.4.tgz#461289724b34af372a6a0c4b6635819156963353" - integrity sha512-5lycG6z35QHr3WZF1OkVvT+N/GGAVuemtM6m8NUgBWoeA2TqOgPFRcI0eRqoLA0HAfe0R2MReKmMI7y1LEM1+w== +ember-cli-htmlbars-inline-precompile@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.5.tgz#312e050c9e3dd301c55fb399fd706296cd0b1d6a" + integrity sha512-/CNEqPxroIcbY6qejrt704ZaghHLCntZKYLizFfJ2esirXoJx6fuYKBY1YyJ8GOgjfbHHKjBZuK4vFFJpkGqkQ== dependencies: - broccoli-persistent-filter "^1.0.3" - ember-cli-version-checker "^1.0.2" - hash-for-dep "^1.0.2" - json-stable-stringify "^1.0.0" - strip-bom "^2.0.0" + babel-plugin-htmlbars-inline-precompile "^0.2.5" + ember-cli-version-checker "^2.1.2" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.9" + silent-error "^1.1.0" ember-cli-htmlbars@^2.0.3: version "2.0.3" @@ -4440,7 +4547,7 @@ ember-cli-htmlbars@^2.0.3: json-stable-stringify "^1.0.0" strip-bom "^3.0.0" -ember-cli-htmlbars@^3.0.1: +ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.0.1.tgz#01e21f0fd05e0a6489154f26614b1041769e3e58" integrity sha512-pyyB2s52vKTXDC5svU3IjU7GRLg2+5O81o9Ui0ZSiBS14US/bZl46H2dwcdSJAK+T+Za36ZkQM9eh1rNwOxfoA== @@ -4455,21 +4562,19 @@ ember-cli-import-polyfill@^0.2.0: resolved "https://registry.yarnpkg.com/ember-cli-import-polyfill/-/ember-cli-import-polyfill-0.2.0.tgz#c1a08a8affb45c97b675926272fe78cf4ca166f2" integrity sha1-waCKiv+0XJe2dZJicv54z0yhZvI= -ember-cli-inject-live-reload@^1.4.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz#af94336e015336127dfb98080ad442bb233e37ed" - integrity sha512-+0zOwJlf4iR5NcvyeU7E7xU1qDfniP/+mXfNTfAEhHO2eE9sjQvasKV84O1sIIyLk2LMIjFPbGt7uv5fQcIGwg== +ember-cli-inject-live-reload@^1.8.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.10.2.tgz#43c59f7f1d1e717772da32e5e81d948fb9fe7c94" + integrity sha512-yFvZE4WFyWjzMJ6MTYIyjCXpcJNFMTaZP61JXITMkXhSkhuDkzMD/XfwR5+fr004TYcwrbNWpg1oGX5DbOgcaQ== + dependencies: + clean-base-url "^1.0.0" + ember-cli-version-checker "^2.1.2" ember-cli-is-package-missing@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz#6e6184cafb92635dd93ca6c946b104292d4e3390" integrity sha1-bmGEyvuSY13ZPKbJRrEEKS1OM5A= -ember-cli-lodash-subset@^1.0.7: - version "1.0.12" - resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-1.0.12.tgz#af2e77eba5dcb0d77f3308d3a6fd7d3450f6e537" - integrity sha1-ry5366XcsNd/MwjTpv19NFD25Tc= - ember-cli-lodash-subset@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-cli-lodash-subset/-/ember-cli-lodash-subset-2.0.1.tgz#20cb68a790fe0fde2488ddfd8efbb7df6fe766f2" @@ -4563,27 +4668,23 @@ ember-cli-path-utils@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= -ember-cli-preprocess-registry@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.1.1.tgz#38456c21c4d2b64945850cf9ec68db6ba769288a" - integrity sha1-OEVsIcTStklFhQz57Gjba6dpKIo= +ember-cli-preprocess-registry@^3.1.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.2.2.tgz#5d076ebeee9e28ccfc13c87c715b4330bb8d324c" + integrity sha512-Yp6gjErRyKigwYblhTHL/QduXbg9RbeEe9bGEv98eGcJKkNFHCl/l8o3yhPlGACmq5yK0QFgekNYki80aArsrg== dependencies: broccoli-clean-css "^1.1.0" - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.0.0" - debug "^2.2.0" - ember-cli-lodash-subset "^1.0.7" - exists-sync "0.0.3" + broccoli-funnel "^2.0.1" + debug "^3.0.1" process-relative-require "^1.0.0" - silent-error "^1.0.0" -ember-cli-qunit@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.2.1.tgz#89580e6eb157ee98b9eefbd48fba9bb75ea64544" - integrity sha1-iVgObrFX7pi57vvUj7qbt16mRUQ= +ember-cli-qunit@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.4.0.tgz#0edd7d651001d0d7ea200b9236a4733a5b7420f1" + integrity sha512-+gkx380AV4WXYjQeIuQi675STL9K12fHFtxs8B9u3EFbw45vJKrnYR4Vph3FujxhE/1pr/Je8kZEPAuezZAVLw== dependencies: - ember-cli-babel "^6.8.1" - ember-qunit "^3.2.2" + ember-cli-babel "^6.11.0" + ember-qunit "^3.5.0" ember-cli-sass@^6.1.3: version "6.2.0" @@ -4606,33 +4707,24 @@ ember-cli-sass@^7.1.2: broccoli-sass-source-maps "^2.1.0" ember-cli-version-checker "^1.0.2" -ember-cli-shims@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ember-cli-shims/-/ember-cli-shims-1.2.0.tgz#0f53aff0aab80b5f29da3a9731bac56169dd941f" - integrity sha1-D1Ov8Kq4C18p2jqXMbrFYWndlB8= - dependencies: - broccoli-file-creator "^1.1.1" - broccoli-merge-trees "^2.0.0" - ember-cli-version-checker "^2.0.0" - ember-rfc176-data "^0.3.1" - silent-error "^1.0.1" - -ember-cli-showdown@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/ember-cli-showdown/-/ember-cli-showdown-3.2.2.tgz#a0b1539bf84bf2f09671514664defde64bdabb07" - integrity sha1-oLFTm/hL8vCWcVFGZN795kvauwc= +ember-cli-showdown@^4.1.0: + version "4.4.4" + resolved "https://registry.yarnpkg.com/ember-cli-showdown/-/ember-cli-showdown-4.4.4.tgz#daf666369b1f35843dc5dc55a94da058e63f59c4" + integrity sha1-2vZmNpsfNYQ9xdxVqU2gWOY/WcQ= dependencies: - broccoli-funnel "^1.0.1" - broccoli-merge-trees "^1.1.1" + broccoli-funnel "^2.0.0" broccoli-source "^1.1.0" - broccoli-stew "^1.5.0" - ember-cli-babel "^6.0.0" - ember-cli-htmlbars "^1.1.1" + broccoli-string-replace "^0.1.2" + ember-cli-babel "^6.8.1" + ember-cli-htmlbars "^2.0.3" ember-cli-import-polyfill "^0.2.0" - ember-getowner-polyfill "^1.2.2" - showdown "^1.6.4" - -ember-cli-sri@^2.1.0: + ember-cli-version-checker "^2.1.2" + ember-getowner-polyfill "^2.0.1" + resolve "^1.8.1" + semver "^5.5.0" + showdown "^1.7.4" + +ember-cli-sri@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ember-cli-sri/-/ember-cli-sri-2.1.1.tgz#971620934a4b9183cf7923cc03e178b83aa907fd" integrity sha1-lxYgk0pLkYPPeSPMA+F4uDqpB/0= @@ -4652,6 +4744,23 @@ ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^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= +ember-cli-template-lint@^1.0.0-beta.1: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/ember-cli-template-lint/-/ember-cli-template-lint-1.0.0-beta.2.tgz#0ebd2f8c1f9ca47f9ee3b42755d66262440c14f6" + integrity sha512-i37mJhz+dll7eP/Y3Yh8oLw5aRqfdnIiutqdLsrvTSLb4VphDXbujXCO8XravvZtGeGBVYKXGsjTxobbPXgsgw== + dependencies: + aot-test-generators "^0.1.0" + broccoli-concat "^3.7.1" + broccoli-persistent-filter "^1.4.3" + chalk "^2.4.1" + debug "^3.1.0" + ember-cli-version-checker "^2.1.2" + ember-template-lint "^1.0.0-beta.5" + json-stable-stringify "^1.0.1" + md5-hex "^2.0.0" + strip-ansi "^4.0.0" + walk-sync "^0.3.3" + 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" @@ -4666,12 +4775,12 @@ ember-cli-test-loader@^2.2.0: dependencies: ember-cli-babel "^6.8.1" -ember-cli-uglify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.0.0.tgz#b096727d7d1718acc9bfe5d1bc81ce26cafdf6ca" - integrity sha1-sJZyfX0XGKzJv+XRvIHOJsr99so= +ember-cli-uglify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.1.0.tgz#4a0641fe4768d7ab7d4807aca9924cc77c544184" + integrity sha512-lDzdAUfhGx5AMBsgyR54ibENVp/LRQuHNWNaP2SDjkAXDyuYFgW0iXIAfGbxF6+nYaesJ9Tr9AKOfTPlwxZDSg== dependencies: - broccoli-uglify-sourcemap "^2.0.0" + broccoli-uglify-sourcemap "^2.1.1" lodash.defaultsdeep "^4.6.0" ember-cli-valid-component-name@^1.0.0: @@ -4696,7 +4805,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^2.1.2: +ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" integrity sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg== @@ -4704,93 +4813,115 @@ ember-cli-version-checker@^2.1.2: resolve "^1.3.3" semver "^5.3.0" -ember-cli@~3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.0.4.tgz#89275dd59994c64fa0ed5dcec24c83cd2935320b" - integrity sha512-c006otAzpUYzh0+BrwxW1cXnWE37EZxrlws2t+AqwiJKv/rETJY4uZYRSekUNoK1Xqb27zK9JtzgOyKuNJelYw== +ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.2.tgz#baee5cc621d5259d9011b5ef60fe6fbe61bd57c7" + integrity sha512-SNY7757cqj5GmES9dlWb43aWoGUcc+keniu+Rvsl/C/TnSK99edgL6eG4+Zr0ESeJ1hEcI3UrHN/8GIcK5eJUQ== dependencies: - amd-name-resolver "1.0.0" - babel-plugin-transform-es2015-modules-amd "^6.24.0" + resolve-package-path "^1.1.1" + semver "^5.6.0" + +ember-cli@~3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.4.4.tgz#8d25b223b2ef3b863310099192da92ab1feeef6b" + integrity sha512-opbdqt9AbNRPr/amemwqi9ENbx/HcqcprxJAW/y8nZAV1gAku+xPY4WNBF6KuClVEKkddbNi4jITLU59rlJcDA== + dependencies: + amd-name-resolver "^1.2.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" bower-config "^1.3.0" bower-endpoint-parser "0.2.2" - broccoli-babel-transpiler "^6.0.0" - broccoli-builder "^0.18.8" - broccoli-concat "^3.2.2" - broccoli-config-loader "^1.0.0" + broccoli-amd-funnel "^1.3.0" + broccoli-babel-transpiler "^6.5.0" + broccoli-builder "^0.18.14" + broccoli-concat "^3.5.1" + broccoli-config-loader "^1.0.1" broccoli-config-replace "^1.1.2" - broccoli-debug "^0.6.3" - broccoli-funnel "^2.0.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.1" broccoli-funnel-reducer "^1.0.0" - broccoli-merge-trees "^2.0.0" - broccoli-middleware "^1.2.1" + broccoli-merge-trees "^3.0.0" + broccoli-middleware "^2.0.1" + broccoli-module-normalizer "^1.3.0" + broccoli-module-unification-reexporter "^1.0.0" broccoli-source "^1.1.0" - broccoli-stew "^1.2.0" - calculate-cache-key-for-tree "^1.0.0" - capture-exit "^1.1.0" - chalk "^2.0.1" + broccoli-stew "^2.0.0" + calculate-cache-key-for-tree "^1.1.0" + capture-exit "^1.2.0" + chalk "^2.4.1" + ci-info "^1.1.3" clean-base-url "^1.0.0" - compression "^1.4.4" - configstore "^3.0.0" - console-ui "^2.1.0" - core-object "^3.1.3" + compression "^1.7.3" + configstore "^4.0.0" + console-ui "^2.2.2" + core-object "^3.1.5" dag-map "^2.0.2" - diff "^3.2.0" - ember-cli-broccoli-sane-watcher "^2.0.4" + diff "^3.5.0" + ember-cli-broccoli-sane-watcher "^2.1.1" ember-cli-is-package-missing "^1.0.0" ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" - ember-cli-preprocess-registry "^3.1.0" - ember-cli-string-utils "^1.0.0" + ember-cli-preprocess-registry "^3.1.2" + ember-cli-string-utils "^1.1.0" ensure-posix-path "^1.0.2" - execa "^0.8.0" - exists-sync "0.0.4" + execa "^0.10.0" exit "^0.1.2" - express "^4.12.3" - filesize "^3.1.3" - find-up "^2.1.0" - fs-extra "^4.0.0" - fs-tree-diff "^0.5.2" + express "^4.16.3" + filesize "^3.6.1" + find-up "^3.0.0" + find-yarn-workspace-root "^1.1.0" + fixturify-project "^1.5.3" + fs-extra "^7.0.0" + fs-tree-diff "^0.5.7" get-caller-file "^1.0.0" - git-repo-info "^1.4.1" - glob "7.1.1" - heimdalljs "^0.2.3" - heimdalljs-fs-monitor "^0.1.0" - heimdalljs-graph "^0.3.1" - heimdalljs-logger "^0.1.7" - http-proxy "^1.9.0" - inflection "^1.7.0" + git-repo-info "^2.0.0" + glob "^7.1.2" + heimdalljs "^0.2.5" + heimdalljs-fs-monitor "^0.2.2" + heimdalljs-graph "^0.3.4" + heimdalljs-logger "^0.1.9" + http-proxy "^1.17.0" + inflection "^1.12.0" is-git-url "^1.0.0" - isbinaryfile "^3.0.0" - js-yaml "^3.6.1" + isbinaryfile "^3.0.3" + js-yaml "^3.12.0" json-stable-stringify "^1.0.1" leek "0.0.24" - lodash.template "^4.2.5" - markdown-it "^8.3.0" + lodash.template "^4.4.0" + markdown-it "^8.4.2" markdown-it-terminal "0.1.0" - minimatch "^3.0.0" - morgan "^1.8.1" - node-modules-path "^1.0.0" + minimatch "^3.0.4" + morgan "^1.9.0" + node-modules-path "^1.0.1" nopt "^3.0.6" - npm-package-arg "^6.0.0" - portfinder "^1.0.7" - promise-map-series "^0.2.1" + npm-package-arg "^6.1.0" + portfinder "^1.0.15" + promise-map-series "^0.2.3" quick-temp "^0.1.8" - resolve "^1.3.0" - rsvp "^4.7.0" - sane "^2.2.0" - semver "^5.1.1" - silent-error "^1.0.0" - sort-package-json "^1.4.0" - symlink-or-copy "^1.1.8" + resolve "^1.8.1" + rsvp "^4.8.3" + sane "^3.0.0" + semver "^5.5.0" + silent-error "^1.1.0" + sort-package-json "^1.15.0" + symlink-or-copy "^1.2.0" temp "0.8.3" - testem "^2.0.0" - tiny-lr "^1.0.3" - tree-sync "^1.2.1" - uuid "^3.0.0" + testem "^2.9.2" + tiny-lr "^1.1.1" + tree-sync "^1.2.2" + uuid "^3.3.2" validate-npm-package-name "^3.0.0" - walk-sync "^0.3.0" + walk-sync "^0.3.2" watch-detector "^0.1.0" - yam "0.0.22" + yam "^0.0.24" + +ember-compatibility-helpers@^1.1.1: + 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" @@ -4819,55 +4950,57 @@ ember-concurrency@^0.8.26: ember-cli-babel "^6.8.2" ember-maybe-import-regenerator "^0.1.5" -ember-data-model-fragments@3.0.0-beta.1: - version "3.0.0-beta.1" - resolved "https://registry.yarnpkg.com/ember-data-model-fragments/-/ember-data-model-fragments-3.0.0-beta.1.tgz#0be50b9e7db33acbc350389a68610e1e01f2d378" - integrity sha512-svOInt6LI+CO1SF8sEUBQIyS8NC6ch6RmYiqd9cTUIhg1tURu15WxMkFNOfO+6ypXjGXE3EblpLuj5fQ4PlFQg== +ember-copy@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-copy/-/ember-copy-1.0.0.tgz#426554ba6cf65920f31d24d0a3ca2cb1be16e4aa" + integrity sha512-aiZNAvOmdemHdvZNn0b5b/0d9g3JFpcOsrDgfhYEbfd7SzE0b69YiaVK2y3wjqfjuuiA54vOllGN4pjSzECNSw== dependencies: - broccoli-file-creator "^1.1.1" - broccoli-merge-trees "^2.0.0" + ember-cli-babel "^6.6.0" + +ember-data-model-fragments@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ember-data-model-fragments/-/ember-data-model-fragments-3.3.0.tgz#93e3ddba6fab2150435f995e07d25a4d88694886" + integrity sha512-fzBGYCSooaF7sqhxrv08TqG7okye7btYjefGq0ATucaAqSVMkjDkmM9/304nQYHWbKpzWeAzX/qJKSMYaWpN6g== + dependencies: + broccoli-file-creator "^2.1.1" + broccoli-merge-trees "^3.0.0" calculate-cache-key-for-tree "^1.1.0" ember-cli-babel "^6.8.0" - eslint-plugin-ember "^5.0.3" - eslint-plugin-node "^5.2.1" - exists-sync "^0.0.4" - git-repo-info "^1.4.1" + ember-copy "1.0.0" + git-repo-info "^2.0.0" npm-git-info "^1.0.3" -ember-data@~3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.0.4.tgz#d66473727a87ea85a8561263d949cea89775172f" - integrity sha512-EMvYvp5Wly3y1TV+Vo81Uj2JNvQle8p9CnMyfSFEo4Q0f+8USnlmn/88HInTMrAW8uIAsvCHfJjari1z3UhdEw== +ember-data@~3.4.0: + version "3.4.4" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.4.4.tgz#a201c2db1d7ca2cbe59a23ddf3cb96281fce216f" + integrity sha512-5DE1CxR1Eobue0y2WCkGSRUaOuE8ebktNElhcyPUcrksbnILxniPsKPVRq15X+5wLjaEb+XiscH68NLBGbjUvQ== dependencies: - amd-name-resolver "0.0.7" - babel-plugin-ember-modules-api-polyfill "^1.4.2" + "@ember/ordered-set" "^2.0.0" babel-plugin-feature-flags "^0.3.1" babel-plugin-filter-imports "^0.3.1" - babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-block-scoping "^6.26.0" babel6-plugin-strip-class-callcheck "^6.0.0" babel6-plugin-strip-heimdall "^6.0.1" - broccoli-babel-transpiler "^6.0.0" - broccoli-debug "^0.6.2" - broccoli-file-creator "^1.0.0" - broccoli-funnel "^1.2.0" - broccoli-merge-trees "^2.0.0" - broccoli-rollup "^1.2.0" + broccoli-debug "^0.6.4" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.0" + broccoli-rollup "^2.1.1" calculate-cache-key-for-tree "^1.1.0" - chalk "^1.1.1" - ember-cli-babel "^6.8.2" + chalk "^2.4.1" + ember-cli-babel "^6.16.0" ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" - ember-cli-version-checker "^2.1.0" - ember-inflector "^2.0.0" - ember-runtime-enumerable-includes-polyfill "^2.0.0" - exists-sync "0.0.3" - git-repo-info "^1.1.2" + ember-cli-version-checker "^2.1.2" + ember-inflector "^3.0.0" + git-repo-info "^2.0.0" heimdalljs "^0.3.0" - inflection "^1.8.0" - npm-git-info "^1.0.0" - semver "^5.1.0" - silent-error "^1.0.0" + inflection "^1.12.0" + npm-git-info "^1.0.3" + resolve "^1.8.1" + semver "^5.5.0" + silent-error "^1.1.0" ember-debug-handlers-polyfill@^1.1.1: version "1.1.1" @@ -4900,21 +5033,19 @@ ember-fetch@^3.4.3: node-fetch "^2.0.0-alpha.9" whatwg-fetch "^2.0.3" -ember-freestyle@~0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/ember-freestyle/-/ember-freestyle-0.6.2.tgz#c325f96a32b4984b78e00cbd29e6dad23f0b1864" - integrity sha1-wyX5ajK0mEt44Ay9Keba0j8LGGQ= +ember-freestyle@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/ember-freestyle/-/ember-freestyle-0.10.0.tgz#4c1727925c80f79542051725d1285a253cb97cd3" + integrity sha512-KoQRWy6+ZIY2WsHtOwGtNNnBjkT1cTHmvVi044j3PrC1gxsPCchfXB96E6DahH9a6XfpISXIUeHkl8o4cI/d8g== dependencies: - broccoli-flatiron "0.0.0" - broccoli-merge-trees "^2.0.0" - broccoli-writer "^0.1.1" + broccoli-flatiron "0.1.3" + broccoli-merge-trees "^3.0.1" ember-cli-babel "^6.6.0" - ember-cli-htmlbars "^1.3.0" + ember-cli-htmlbars "^2.0.3" ember-cli-sass "^6.1.3" - ember-cli-showdown "^3.2.1" + ember-cli-showdown "^4.1.0" ember-runtime-enumerable-includes-polyfill "^2.0.0" - es6-promise "^4.1.0" - glob "^7.1.1" + glob "^7.1.3" ember-get-config@^0.2.2: version "0.2.4" @@ -4924,15 +5055,6 @@ ember-get-config@^0.2.2: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" -ember-getowner-polyfill@^1.2.2: - version "1.2.5" - resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-1.2.5.tgz#ceff8a09897d0d7e05c821bb71666a95eb26dc92" - integrity sha512-o8zK9AOfuW7CYS8CGKQG6miMj6I+sp/PeJmgfJyOoqT/24JYh4F0m8Fml4+Oljhc5BFihApnzGv++3FmL2CZwA== - dependencies: - ember-cli-babel "^5.1.6" - ember-cli-version-checker "^1.2.0" - ember-factory-for-polyfill "^1.1.0" - ember-getowner-polyfill@^2.0.0, ember-getowner-polyfill@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-2.0.1.tgz#9bfe2b4d527ed174e76fef2c8f30937d77cb66fb" @@ -4948,29 +5070,35 @@ ember-inflector@^2.0.0: dependencies: ember-cli-babel "^6.0.0" -ember-inline-svg@^0.1.11: - version "0.1.11" - resolved "https://registry.yarnpkg.com/ember-inline-svg/-/ember-inline-svg-0.1.11.tgz#bb5af24cef1db3ab2e1a8aec543bee262a368c37" - integrity sha1-u1ryTO8ds6suGorsVDvuJio2jDc= +ember-inflector@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.0.tgz#7e1ee8aaa0fa773ba0905d8b7c0786354d890ee1" + integrity sha512-tLWfYolZAkLnkTvvBkjizy4Wmj8yI8wqHZFK+leh0iScHiC3r1Yh5C4qO+OMGiBTMLwfTy+YqVoE/Nu3hGNkcA== + dependencies: + ember-cli-babel "^6.6.0" + +ember-inline-svg@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ember-inline-svg/-/ember-inline-svg-0.2.1.tgz#091f3fc27836e5ee0df1482c9e4a1a8adc9113f3" + integrity sha512-R7LsMZo1CrXbDgCX6sMnzUg+ggeosOwq8HTilWnNUpH11mb9pbMoG5s/Qm9iRMVW2iMesiCMnCaLsEkTiY8Yhw== dependencies: broccoli-caching-writer "^3.0.3" - broccoli-flatiron "0.0.0" - broccoli-funnel "^1.0.1" - broccoli-merge-trees "^2.0.0" - ember-cli-babel "^5.1.6" + broccoli-flatiron "~0.1.3" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.0" + ember-cli-babel "^6.16.0" merge "^1.2.0" mkdirp "^0.5.1" promise-map-series "^0.2.1" - rsvp "^3.2.1" - svgo "^0.6.3" + svgo "~1.0.5" walk-sync "^0.3.1" -ember-load-initializers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz#4919eaf06f6dfeca7e134633d8c05a6c9921e6e7" - integrity sha1-SRnq8G9t/sp+E0Yz2MBabJkh5uc= +ember-load-initializers@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.1.0.tgz#4edacc0f3a14d9f53d241ac3e5561804c8377978" + integrity sha512-WiciFi8IXOqjyJ65M4iBNIthqcy4uXXQq5n3WxeMMhvJVk5JNSd9hynNECNz3nqfEYuZQ9c04UWkmFIQXRfl4Q== dependencies: - ember-cli-babel "^6.0.0-beta.7" + ember-cli-babel "^6.6.0" ember-lodash@^4.17.3: version "4.17.5" @@ -5040,31 +5168,31 @@ ember-power-select@^2.2.3: ember-text-measurer "^0.5.0" ember-truth-helpers "^2.1.0" -ember-qunit@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.2.2.tgz#96c8818ecfa3894580a3dc805f7e7f1e82e07c4a" - integrity sha512-KPbYeOdBe2N3APQ8geckRS6ns7Uoqz/LESSPYQ2e1VIhnFYfdQJC19Jk5g+RWioMxCHw8E8U+VdusibGfSuqVQ== +ember-qunit@^3.5.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.5.3.tgz#bfd0bff8298c78c77e870cca43fe0826e78a0d09" + integrity sha512-FmXsI1bGsZ5th25x4KEle2fLCVURTptsQODfBt+Pg8tk9rX7y79cqny91PrhtkhE+giZ8p029tnq94SdpJ4ojg== dependencies: - "@ember/test-helpers" "^0.7.9" + "@ember/test-helpers" "^0.7.26" broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" common-tags "^1.4.0" - ember-cli-babel "^6.3.0" + ember-cli-babel "^6.8.2" ember-cli-test-loader "^2.2.0" - qunit "^2.4.1" + qunit "~2.6.0" -ember-resolver@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-4.5.0.tgz#9248bf534dfc197fafe3118fff538d436078bf99" - integrity sha512-BX8yvFWIbrh1IVZmpIY/14WUb7nD8tQzT5s0aUG/Nwq2LVqD/uNAEPcsq0XS2gLvKawwDQEQN30ptcvJApQBhA== +ember-resolver@^5.0.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-5.1.3.tgz#d2a5a856d53911552c022649cdc7b0408a7908ae" + integrity sha512-ud7Sw8R3hcGnGSvom96p56zdLEqEgVQEAo4HySJjBP0n7JT1lWSvLb7JrJwAZ7d9g1c2tm5ZlxBPUDwQrwMOuQ== dependencies: "@glimmer/resolver" "^0.4.1" babel-plugin-debug-macros "^0.1.10" - broccoli-funnel "^1.1.0" - broccoli-merge-trees "^2.0.0" - ember-cli-babel "^6.8.1" - ember-cli-version-checker "^2.0.0" - resolve "^1.3.3" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.0" + ember-cli-babel "^6.16.0" + ember-cli-version-checker "^3.0.0" + resolve "^1.10.0" ember-responsive@^3.0.0: version "3.0.0" @@ -5073,21 +5201,21 @@ ember-responsive@^3.0.0: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.2.0: - version "0.2.7" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.2.7.tgz#bd355bc9b473e08096b518784170a23388bc973b" - integrity sha512-pJE2w+sI22UDsYmudI4nCp3WcImpUzXwe9qHfpOcEu3yM/HD1nGpDRt6kZD0KUnDmqkLeik/nYyzEwN/NU6xxA== - -ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: +ember-rfc176-data@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== -ember-rfc176-data@^0.3.5, ember-rfc176-data@^0.3.7: +ember-rfc176-data@^0.3.7: version "0.3.7" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.7.tgz#ecff7d74987d09296d3703343fed934515a4be33" integrity sha512-AbTlD+q7sfyrD4diZqE7r9Y9/Je+HntVn7TlpHAe+nP5BNXxUXJIfDs5w5e3MxPcMs6Dz/yY90YfW8h1oKEvGg== +ember-rfc176-data@^0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.8.tgz#d46bbef9a0d57c803217b258cfd2e90d8e191848" + integrity sha512-SQup3iG7SDLZNuf7nMMx5BC5truO8AYKRi80gApeQ07NsbuXV4LH75i5eOaxF0i8l9+H1tzv34kGe6rEh0C1NQ== + ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" @@ -5113,13 +5241,14 @@ ember-sinon@^1.0.1: ember-cli-babel "^6.3.0" sinon "^3.2.1" -ember-source@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.0.0.tgz#51811cae98d2ceec53bcfbaa876d02b2b5b2159f" - integrity sha1-UYEcrpjSzuxTvPuqh20CsrWyFZ8= +ember-source@~3.4.0: + version "3.4.8" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.4.8.tgz#68677bf9bd222aff865100b241004649c3d3dda7" + integrity sha512-uiRqAzzFKvZ0P5zf5eOv2BrhBUNFJOnsUrri6dN8Ci7pxBkj/fyKVxwIu/+juQh4E/QRgrfze/+Cueq0FNf6rQ== dependencies: broccoli-funnel "^2.0.1" broccoli-merge-trees "^2.0.0" + chalk "^2.3.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" @@ -5129,17 +5258,28 @@ ember-source@~3.0.0: ember-cli-version-checker "^2.1.0" ember-router-generator "^1.2.3" inflection "^1.12.0" - jquery "^3.2.1" - resolve "^1.3.3" + jquery "^3.3.1" + resolve "^1.6.0" -ember-test-selectors@^0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-0.3.8.tgz#1e8ae3e78c64bacc4bbfe87f9973c85805699db2" - integrity sha1-Horj54xkusxLv+h/mXPIWAVpnbI= +ember-template-lint@^1.0.0-beta.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-1.1.0.tgz#312e101728452bf082f54cbe429ed9b52273ba64" + integrity sha512-DPEWdjaNVIC58wJqeJStvQzk2gyKN5/u6dJfDKQ7mRJaouoLP1hZjSZwwpyO9bj10E9/3OJZnLmx1jjJ9/nqWA== + dependencies: + "@glimmer/compiler" "^0.38.0" + chalk "^2.0.0" + globby "^9.0.0" + minimatch "^3.0.4" + resolve "^1.1.3" + strip-bom "^3.0.0" + +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: - broccoli-stew "^1.4.0" ember-cli-babel "^6.8.2" - ember-cli-version-checker "^2.0.0" + ember-cli-version-checker "^3.1.2" ember-text-measurer@^0.5.0: version "0.5.0" @@ -5171,14 +5311,14 @@ ember-weakmap@^3.0.0: debug "^3.1.0" ember-cli-babel "^6.3.0" -ember-welcome-page@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ember-welcome-page/-/ember-welcome-page-3.1.1.tgz#dead338443f24257c552bfa83ca84b0704b6c184" - integrity sha512-R1InphTnn8Ey7AtfPxT3aIy6gaF31F9BgFhE8Nh0C4zA9/SU8d7qVkqkCvsSiC3o3wN5a/odTDnVjIsI9gWMuQ== +ember-welcome-page@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ember-welcome-page/-/ember-welcome-page-3.2.0.tgz#fe9903dbbaccfb4a2a05f42c716b7d07470f2d78" + integrity sha512-aDUIGwPsAvv77K6jplnIvQamNBOuqRKlSXsaWaIkjpIi4ZTbDLnyDkuxMBgxCKiajr7wGhrghAelRQHbKUK5aw== dependencies: broccoli-funnel "^1.0.1" - ember-cli-babel "^6.0.0-beta.9" - ember-cli-htmlbars "^1.0.3" + ember-cli-babel "^6.6.0" + ember-cli-htmlbars "^2.0.3" emojis-list@^2.0.0: version "2.1.0" @@ -5190,6 +5330,11 @@ encodeurl@~1.0.1: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" integrity sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA= +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -5197,47 +5342,45 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -engine.io-client@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" - integrity sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w= +engine.io-client@~3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.2.tgz#04e068798d75beda14375a264bb3d742d7bc33aa" + integrity sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ== dependencies: component-emitter "1.2.1" component-inherit "0.0.3" - debug "2.3.3" - engine.io-parser "1.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.1" has-cors "1.1.0" indexof "0.0.1" - parsejson "0.0.3" parseqs "0.0.5" parseuri "0.0.5" - ws "1.1.1" - xmlhttprequest-ssl "1.5.3" + ws "~6.1.0" + xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" -engine.io-parser@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" - integrity sha1-lVTxrjMQfW+9FwylRm0vgz9qB88= +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" + integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== dependencies: - after "0.8.1" - arraybuffer.slice "0.0.6" + after "0.8.2" + arraybuffer.slice "~0.0.7" base64-arraybuffer "0.1.5" - blob "0.0.4" - has-binary "0.1.6" - wtf-8 "1.0.0" + blob "0.0.5" + has-binary2 "~1.0.2" -engine.io@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" - integrity sha1-PutfJky3XbvsG6rqJtYfWk6s4qo= +engine.io@~3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.3.2.tgz#18cbc8b6f36e9461c5c0f81df2b830de16058a59" + integrity sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w== dependencies: - accepts "1.3.3" - base64id "0.1.0" + accepts "~1.3.4" + base64id "1.0.0" cookie "0.3.1" - debug "2.3.3" - engine.io-parser "1.3.1" - ws "1.1.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~6.1.0" enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.0" @@ -5248,15 +5391,20 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" -ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: +ensure-posix-path@^1.0.0, ensure-posix-path@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" + integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== + +ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" integrity sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI= -ensure-posix-path@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" - integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@~1.1.1: version "1.1.1" @@ -5285,58 +5433,26 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" -es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.30" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939" - integrity sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk= +es-abstract@^1.12.0, es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== dependencies: - es6-iterator "2" - es6-symbol "~3.1" + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" -es6-iterator@2, es6-iterator@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" - integrity sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI= - dependencies: - d "1" - es5-ext "^0.10.14" - es6-symbol "^3.1" - -es6-map@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-promise@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" - integrity sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng== - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@~3.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== dependencies: - d "1" - es5-ext "~0.10.14" + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" escape-html@~1.0.3: version "1.0.3" @@ -5348,24 +5464,6 @@ escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-plugin-ember@^5.0.3: - version "5.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-5.4.0.tgz#2980a4389119b37d0450fff8e82d59c9aab126d0" - integrity sha512-tYMuxUrTad4f7Dq9gY9GUs9lXwKY+fZklzCJ0JoYbzK2PwSfdrPInr2Y4tHornc9dzPvNbRxsn5b26PrWp2iZg== - dependencies: - ember-rfc176-data "^0.3.5" - snake-case "^2.1.0" - -eslint-plugin-node@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz#80df3253c4d7901045ec87fa660a284e32bdca29" - integrity sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g== - dependencies: - ignore "^3.3.6" - minimatch "^3.0.4" - resolve "^1.3.3" - semver "5.3.0" - eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" @@ -5374,6 +5472,14 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" @@ -5430,16 +5536,6 @@ espree@^3.5.2: acorn "^5.2.1" acorn-jsx "^3.0.0" -esprima-fb@~15001.1001.0-dev-harmony-fb: - version "15001.1001.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" - integrity sha1-Q761fsJujPI3092LM+QlM1d/Jlk= - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -5475,7 +5571,12 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= -esutils@^2.0.0, esutils@^2.0.2: +estree-walker@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.0.tgz#5d865327c44a618dde5699f763891ae31f257dae" + integrity sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw== + +esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= @@ -5485,19 +5586,21 @@ etag@~1.8.0: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" integrity sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE= -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + events-to-array@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" @@ -5532,6 +5635,19 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -5558,13 +5674,13 @@ execa@^0.8.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" - integrity sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA== +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" + cross-spawn "^6.0.0" + get-stream "^4.0.0" is-stream "^1.1.0" npm-run-path "^2.0.0" p-finally "^1.0.0" @@ -5596,13 +5712,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -5616,21 +5725,14 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= dependencies: - os-homedir "^1.0.1" + homedir-polyfill "^1.0.1" -express@^4.10.7, express@^4.12.3: +express@^4.10.7: version "4.15.4" resolved "https://registry.yarnpkg.com/express/-/express-4.15.4.tgz#032e2253489cf8fce02666beca3d11ed7a2daed1" integrity sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE= @@ -5664,6 +5766,42 @@ express@^4.10.7, express@^4.12.3: utils-merge "1.0.0" vary "~1.1.1" +express@^4.16.3: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -5702,13 +5840,6 @@ external-editor@^2.0.4: jschardet "^1.4.2" tmp "^0.0.31" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -5753,6 +5884,18 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-glob@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" + integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -5785,6 +5928,20 @@ fast-sourcemap-concat@^1.0.1: source-map-url "^0.3.0" sourcemap-validator "^1.0.5" +fast-sourcemap-concat@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.4.0.tgz#122c330d4a2afaff16ad143bc9674b87cd76c8ad" + integrity sha512-x90Wlx/2C83lfyg7h4oguTZN4MyaVfaiUSJQNpU+YEA0Odf9u659Opo44b0LfoVg9G/bOE++GdID/dkyja+XcA== + dependencies: + chalk "^2.0.0" + fs-extra "^5.0.0" + heimdalljs-logger "^0.1.9" + memory-streams "^0.1.3" + mkdirp "^0.5.0" + source-map "^0.4.2" + source-map-url "^0.3.0" + sourcemap-validator "^1.1.0" + faye-websocket@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -5799,6 +5956,11 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -5822,26 +5984,10 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -filesize@^3.1.3: - version "3.5.10" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f" - integrity sha1-/I+iPdtO+eXgq24eZPZ5okpWdh8= - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== fill-range@^4.0.0: version "4.0.0" @@ -5853,6 +5999,19 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + finalhandler@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.4.tgz#18574f2e7c4b98b8ae3b230c21f201f31bdb3fb7" @@ -5874,14 +6033,14 @@ find-babel-config@^1.1.0: json5 "^0.5.1" path-exists "^3.0.0" -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== dependencies: commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" + make-dir "^2.0.0" + pkg-dir "^3.0.0" find-index@^1.1.0: version "1.1.0" @@ -5901,22 +6060,37 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" -findup-sync@0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" - integrity sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI= +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-yarn-workspace-root@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== + dependencies: + fs-extra "^4.0.3" + micromatch "^3.1.4" + +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= dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" fireworm@^0.7.0: version "0.7.1" @@ -5929,6 +6103,22 @@ fireworm@^0.7.0: lodash.flatten "^3.0.2" minimatch "^3.0.2" +fixturify-project@^1.5.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.8.0.tgz#c2b2d510afbb4c9ab6c94cf85659565b3794e1d1" + integrity sha512-D+UqEd/2vdK12CJTwKCoUyMOM3/iqevck8xvDQcHFkD7xPYzl4NIYi4uLp4O1Yi7HLNCHl/KfMg7ex8XwqbEfg== + dependencies: + fixturify "^0.3.4" + tmp "^0.0.33" + +fixturify@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" + integrity sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ== + dependencies: + fs-extra "^0.30.0" + matcher-collection "^1.0.4" + flat-cache@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" @@ -5954,18 +6144,18 @@ flush-write-stream@^1.0.0: inherits "^2.0.1" readable-stream "^2.0.4" -for-in@^1.0.1, for-in@^1.0.2: +follow-redirects@^1.0.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" + integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== + dependencies: + debug "^3.2.6" + +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -5992,6 +6182,11 @@ forwarded@~0.1.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" integrity sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M= +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -6004,6 +6199,11 @@ fresh@0.5.0: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" integrity sha1-9HTKXmqSRtb9jglTz6m5yAWvp44= +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" @@ -6012,11 +6212,6 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= - fs-extra@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.24.0.tgz#d4e4342a96675cb7846633a6099249332b539952" @@ -6055,7 +6250,7 @@ fs-extra@^2.0.0: graceful-fs "^4.1.2" jsonfile "^2.1.0" -fs-extra@^4.0.0: +fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== @@ -6064,6 +6259,33 @@ fs-extra@^4.0.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" + integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -6071,12 +6293,17 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-readdir-recursive@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" - integrity sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk= +fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4: + version "0.5.9" + resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" + integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw== + dependencies: + heimdalljs-logger "^0.1.7" + object-assign "^4.1.0" + path-posix "^1.0.0" + symlink-or-copy "^1.1.8" -fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7: +fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.7.tgz#315e2b098d5fe7f622880ac965b1b051868ac871" integrity sha512-dJwDX6NBH7IfdfFjZAdHCZ6fIKc8LwR7kzqUhYRFJuX4g9ctG/7cuqJuwegGQsyLEykp6Z4krq+yIFMQlt7d9Q== @@ -6086,7 +6313,7 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5 path-posix "^1.0.0" symlink-or-copy "^1.1.8" -fs-tree-diff@^1.0.2: +fs-tree-diff@^1.0.0, fs-tree-diff@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-1.0.2.tgz#0e2931733a85b55feb3472c0b89a20b0c03ac0de" integrity sha512-Zro2ACaPVDgVOx9+s5s5AfPlAD0kMJdbwGvTGF6KC1SjxjiGWxJvV4mUTDkFVSy3OUw2C/f1qpdjF81hGqSBAw== @@ -6122,14 +6349,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0, fsevents@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" - integrity sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q== - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" - fsevents@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" @@ -6138,16 +6357,15 @@ fsevents@^1.2.2: nan "^2.9.2" node-pre-gyp "^0.10.0" -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU= +fsevents@^1.2.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" + nan "^2.9.2" + node-pre-gyp "^0.10.0" -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: +fstream@^1.0.0, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= @@ -6157,6 +6375,11 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -6208,6 +6431,13 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -6220,25 +6450,10 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -git-repo-info@^1.1.2, git-repo-info@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943" - integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM= - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" +git-repo-info@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.0.tgz#13d1f753c75bc2994432e65a71e35377ff563813" + integrity sha512-+kigfDB7j3W80f74BoOUX+lKOmf4pR3/i2Ww6baKTCPe2hD4FRdjhV3s4P5Dy0Tak1uY1891QhKoYNtnyX2VvA== glob-parent@^3.1.0: version "3.1.0" @@ -6248,19 +6463,12 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@7.1.1, glob@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^5.0.10, glob@^5.0.15: +glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= @@ -6271,7 +6479,7 @@ glob@^5.0.10, glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.2, glob@~7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== @@ -6283,23 +6491,37 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= +glob@^7.0.5, glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: - homedir-polyfill "^1.0.0" + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" + is-windows "^1.0.1" + which "^1.2.14" globals@^11.0.1: version "11.1.0" @@ -6311,11 +6533,6 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== -globals@^6.4.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" - integrity sha1-hJgDKzttHMge68X3lpDY/in6v08= - globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -6333,6 +6550,20 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.1.0.tgz#e90f4d5134109e6d855abdd31bdb1b085428592e" + integrity sha512-VtYjhHr7ncls724Of5W6Kaahz0ag7dB4G62/2HsN+xEKG6SrPzM1AJMerGxQTwJGnN9reeyxdvXbuZYpfssCvg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.1" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + globule@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" @@ -6342,11 +6573,16 @@ globule@^1.0.0: lodash "~4.17.4" minimatch "~3.0.2" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= +graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -6357,17 +6593,6 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" - integrity sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw= - dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" - handlebars@^4.0.4: version "4.0.10" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" @@ -6379,6 +6604,28 @@ handlebars@^4.0.4: optionalDependencies: uglify-js "^2.6" +handlebars@^4.0.6: + version "4.1.0" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" + integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +handlebars@~4.0.13: + version "4.0.13" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.13.tgz#89fc17bf26f46fd7f6f99d341d92efaae64f997d" + integrity sha512-uydY0jy4Z3wy/iGXsi64UtLD4t1fFJe16c/NFxsYE4WdQis8ZCzOXUZaPQNG0e5bgtLQV41QTfqBindhEjnpyQ== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" @@ -6406,19 +6653,12 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-binary@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" - integrity sha1-JTJvOc+k9hath4eJTjryz7x7bhA= - dependencies: - isarray "0.0.1" - -has-binary@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" - integrity sha1-aOYesWIQyVRaClzOBqhzkS/h5ow= +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== dependencies: - isarray "0.0.1" + isarray "2.0.1" has-cors@1.1.0: version "1.1.0" @@ -6435,6 +6675,11 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -6471,6 +6716,13 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + hash-base@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" @@ -6486,17 +6738,7 @@ hash-base@^3.0.0: inherits "^2.0.1" safe-buffer "^5.0.1" -hash-for-dep@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.0.tgz#3bdb883aef0d34e82097ef2f7109b1b401cada6b" - integrity sha512-nTAMv4FEqSmV/u/LnPnw0YZJP0Qve7lLv5D8q5Zu441gI/lBZCq3BwnoZjlOn/HBLoK9DgyY+qVhCzxb1dAAiA== - dependencies: - broccoli-kitchen-sink-helpers "^0.3.1" - heimdalljs "^0.2.3" - heimdalljs-logger "^0.1.7" - resolve "^1.4.0" - -hash-for-dep@^1.2.3, hash-for-dep@^1.4.7, hash-for-dep@^1.5.0: +hash-for-dep@^1.0.2, hash-for-dep@^1.2.3, hash-for-dep@^1.4.7, hash-for-dep@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.0.tgz#02dacb5a3ee14e45d06f5aa039d142c970940476" integrity sha512-Jtp264IRh25UmNHBNjB9jgYQGOpUVFMzt8E2MS6dJyR5uAO14bq4B9q5znOStkKpOpcxNUrYtg3hgpOSjQSONw== @@ -6516,7 +6758,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hawk@3.1.3, hawk@~3.1.3: +hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= @@ -6526,20 +6768,28 @@ hawk@3.1.3, hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" -heimdalljs-fs-monitor@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.1.0.tgz#d404a65688c6714c485469ed3495da4853440272" - integrity sha1-1ASmVojGcUxIVGntNJXaSFNEAnI= +heimdalljs-fs-monitor@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.2.2.tgz#a76d98f52dbf3aa1b7c20cebb0132e2f5eeb9204" + integrity sha512-R/VhkWs8tm4x+ekLIp+oieR8b3xYK0oFDumEraGnwNMixpiKwO3+Ms5MJzDP5W5Ui1+H/57nGW5L3lHbxi20GA== dependencies: - heimdalljs "^0.2.0" + heimdalljs "^0.2.3" heimdalljs-logger "^0.1.7" -heimdalljs-graph@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.3.tgz#ea801dbba659c8d522fe1cb83b2d605726e4918f" - integrity sha1-6oAdu6ZZyNUi/hy4Oy1gVybkkY8= +heimdalljs-graph@^0.3.4: + version "0.3.5" + resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.5.tgz#420fbbc8fc3aec5963ddbbf1a5fb47921c4a5927" + integrity sha512-szOy9WZUc7eUInEBQEsoa1G2d+oYHrn6ndZPf76eh8A9ID1zWUCEEsxP3F+CvQx9+EDrg1srdyLUmfVAr8EB4g== + +heimdalljs-logger@^0.1.7: + version "0.1.10" + resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7" + integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g== + dependencies: + debug "^2.2.0" + heimdalljs "^0.2.6" -heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: +heimdalljs-logger@^0.1.9: version "0.1.9" resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz#d76ada4e45b7bb6f786fc9c010a68eb2e2faf176" integrity sha1-12raTkW3u294b8nAEKaOsuL68XY= @@ -6547,7 +6797,14 @@ heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: debug "^2.2.0" heimdalljs "^0.2.0" -heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5: +heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" + integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA== + dependencies: + rsvp "~3.2.1" + +heimdalljs@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" integrity sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw= @@ -6575,14 +6832,6 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= -home-or-tmp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" - integrity sha1-S58eQIAMPlDGwn94FnavzOcfOYU= - dependencies: - os-tmpdir "^1.0.1" - user-home "^1.1.1" - home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -6591,18 +6840,33 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: +hosted-git-info@^2.1.4: version "2.6.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" integrity sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw== +hosted-git-info@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +http-errors@1.6.3, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" @@ -6613,7 +6877,7 @@ http-errors@~1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-proxy@^1.13.1, http-proxy@^1.9.0: +http-proxy@^1.13.1: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" integrity sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I= @@ -6621,6 +6885,15 @@ http-proxy@^1.13.1, http-proxy@^1.9.0: eventemitter3 "1.x.x" requires-port "1.x.x" +http-proxy@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== + dependencies: + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -6644,22 +6917,17 @@ husky@^0.14.3: normalize-path "^1.0.0" strip-indent "^2.0.0" -iconv-lite@^0.4.17, iconv-lite@^0.4.5: - version "0.4.18" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" - integrity sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA== - -iconv-lite@^0.4.4: +iconv-lite@0.4.23, iconv-lite@^0.4.4: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.11: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== +iconv-lite@^0.4.17: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + integrity sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA== ieee754@^1.1.4: version "1.1.8" @@ -6683,10 +6951,10 @@ ignore@^3.3.3: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.4.tgz#85ab6d0a9ca8b27b31604c09efe1c14dc21ab872" integrity sha512-KjHyHxUgicfgFiTJaIA9DoeY3TIQz5thaKqm35re7RTVVB7zjF1fTMIDMXM4GUUBipR4FW8BvGnA115pZ/AxQQ== -ignore@^3.3.6: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== +ignore@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== imurmurhash@^0.1.4: version "0.1.4" @@ -6720,7 +6988,7 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= -inflection@^1.12.0, inflection@^1.7.0, inflection@^1.8.0: +inflection@^1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= @@ -6799,6 +7067,26 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" @@ -6816,6 +7104,11 @@ ipaddr.js@1.4.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" integrity sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA= +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -6854,6 +7147,11 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + is-ci@^1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" @@ -6875,6 +7173,11 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -6898,18 +7201,6 @@ is-directory@^0.3.1: resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -6922,11 +7213,6 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -6956,13 +7242,6 @@ is-git-url@^1.0.0: resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b" integrity sha1-U/aEzRQyhbUsMkS05vKCU1J69ms= -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -6977,20 +7256,6 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" -is-integer@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.7.tgz#6bde81aacddf78b659b6629d629cadc51a886d5c" - integrity sha1-a96Bqs3feLZZtmKdYpytxRqIbVw= - dependencies: - is-finite "^1.0.0" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -7048,21 +7313,25 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= +is-reference@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.1.tgz#bf2cda150a877f04d48caaf8fd70c03d8bed5e2d" + integrity sha512-URlByVARcyP2E2GC7d3Ur702g3vqW391VKCHuF5Goo/M8IT97k4RU/+56OYImwDdX1J/V/VRxECE/wJqB0I2tg== + dependencies: + "@types/estree" "0.0.39" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" @@ -7080,6 +7349,13 @@ is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + is-type@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/is-type/-/is-type-0.0.1.tgz#f651d85c365d44955d14a51d8d7061f3f6b4779c" @@ -7097,12 +7373,7 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= - -is-windows@^1.0.2: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -7117,10 +7388,17 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isbinaryfile@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" - integrity sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE= +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isbinaryfile@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" isexe@^2.0.0: version "2.0.0" @@ -7177,11 +7455,21 @@ jest-validate@^21.1.0: leven "^2.1.0" pretty-format "^21.2.1" +jquery-deferred@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" + integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= + jquery@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" integrity sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c= +jquery@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" + integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== + js-base64@^2.1.8: version "2.1.9" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" @@ -7192,21 +7480,16 @@ js-levenshtein@^1.1.3: resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== -js-reporters@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.0.tgz#7cf2cb698196684790350d0c4ca07f4aed9ec17e" - integrity sha1-fPLLaYGWaEeQNQ0MTKB/Su2ewX4= +js-reporters@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.1.tgz#f88c608e324a3373a95bcc45ad305e5c979c459b" + integrity sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs= js-string-escape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= -js-tokens@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" - integrity sha1-zENaXIuUrRWst5gxQPyAGCyJrq4= - js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -7222,7 +7505,15 @@ js-yaml@0.3.x: resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-0.3.7.tgz#d739d8ee86461e54b354d6a7d7d1f2ad9a167f62" integrity sha1-1znY7oZGHlSzVNan19HyrZoWf2I= -js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.6.1, js-yaml@^3.9.0, js-yaml@^3.9.1: +js-yaml@^3.12.0: + version "3.12.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" + integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.9.0, js-yaml@^3.9.1: version "3.9.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" integrity sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww== @@ -7230,13 +7521,13 @@ js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.6.1, js-yaml@^3.9.0, argparse "^1.0.7" esprima "^4.0.0" -js-yaml@~3.6.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" - integrity sha1-bl/mfYsgXOTSL60Ft3geja3MSzA= +js-yaml@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== dependencies: argparse "^1.0.7" - esprima "^2.6.0" + esprima "^4.0.0" jsbn@~0.1.0: version "0.1.1" @@ -7315,16 +7606,6 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= - -json5@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" - integrity sha1-BUNS5MTIDIbAkjh31EneF2pzLI0= - json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -7433,11 +7714,6 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" -leven@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" - integrity sha1-kUS27ryl8dBoAWnxpncNzqYLdcM= - leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -7536,10 +7812,10 @@ listr@^0.13.0: stream-to-observable "^0.2.0" strip-ansi "^3.0.1" -livereload-js@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" - integrity sha1-bIclfmSKtHW8JOoldFftzB+NC8I= +livereload-js@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" + integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== load-json-file@^1.0.0: version "1.1.0" @@ -7552,16 +7828,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -7576,10 +7842,15 @@ loader-utils@^1.1.0: emojis-list "^2.0.0" json5 "^0.5.0" -loader.js@^4.2.3: - version "4.6.0" - resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.6.0.tgz#b965663ddbe2d80da482454cb865efe496e93e22" - integrity sha512-NjAnzMq/BM2VlXA9er0Nx1Runocgi+hEU53ENhCtTx82GX6/l9NXwfIqg81om6QvmhUlv2zH+4R+N+wOoeXytQ== +loader.js@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.7.0.tgz#a1a52902001c83631efde9688b8ab3799325ef1f" + integrity sha512-9M2KvGT6duzGMgkOcTkWb+PR/Q2Oe54df/tLgHGVmFpAmtqJ553xJh6N63iFYI2yjo2PeJXbS5skHi/QpJq4vA== + +locate-character@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-2.0.5.tgz#f2d2614d49820ecb3c92d80d193b8db755f74c0f" + integrity sha512-n2GmejDXtOPBAZdIiEFy5dJ5N38xBCXLNOtw2WpB9kGh6pnrEuKlwYI+Tkpofc4wDtVXHtoAOJaMRlYG/oYaxg== locate-path@^2.0.0: version "2.0.0" @@ -7589,6 +7860,14 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash-es@^4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" @@ -7935,11 +8214,16 @@ lodash.keys@~2.3.0: lodash._shimkeys "~2.3.0" lodash.isobject "~2.3.0" -lodash.merge@^4.3.0, lodash.merge@^4.4.0, lodash.merge@^4.6.0: +lodash.merge@^4.3.0, lodash.merge@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" integrity sha1-aYhLoUSsM/5plzemCG3v+t0PicU= +lodash.merge@^4.3.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== + lodash.mergewith@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" @@ -7982,7 +8266,7 @@ lodash.template@^3.3.2: lodash.restparam "^3.0.0" lodash.templatesettings "^3.0.0" -lodash.template@^4.2.5: +lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= @@ -8043,12 +8327,12 @@ lodash.values@~2.3.0: dependencies: lodash.keys "~2.3.0" -lodash@^3.10.0, lodash@^3.9.3: +lodash@^3.10.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@~4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= @@ -8102,16 +8386,6 @@ lolex@^2.1.2: resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.1.tgz#3d2319894471ea0950ef64692ead2a5318cff362" integrity sha512-mQuW55GhduF3ppo+ZRUTz1PRjEh1hS5BbqU7d8D0ez2OKxHDod7StPPeAVKisZR5aLkHZjdGWSL42LSONUJsZw== -long@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= - longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -8132,11 +8406,6 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= - lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -8145,19 +8414,25 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -lru-cache@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" + yallist "^3.0.2" lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= +magic-string@^0.24.0: + version "0.24.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.24.1.tgz#7e38e5f126cae9f15e71f0cf8e450818ca7d5a8f" + integrity sha512-YBfNxbJiixMzxW40XqJEIldzHyh5f7CZKalo1uZffevyrPEX8Qgo9s0dmcORLHdV47UyvJg8/zD+6hQG3qvJrA== + dependencies: + sourcemap-codec "^1.4.1" + make-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" @@ -8165,6 +8440,14 @@ make-dir@^1.0.0: dependencies: pify "^2.3.0" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -8172,11 +8455,6 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -8205,7 +8483,7 @@ markdown-it-terminal@0.1.0: lodash.merge "^4.6.0" markdown-it "^8.3.1" -markdown-it@^8.3.0, markdown-it@^8.3.1: +markdown-it@^8.3.1: version "8.4.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" integrity sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA== @@ -8216,33 +8494,30 @@ markdown-it@^8.3.0, markdown-it@^8.3.1: mdurl "^1.0.1" uc.micro "^1.0.3" -matcher-collection@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.4.tgz#2f66ae0869996f29e43d0b62c83dd1d43e581755" - integrity sha1-L2auCGmZbynkPQtiyD3R1D5YF1U= - dependencies: - minimatch "^3.0.2" - -matcher-collection@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" - integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== +markdown-it@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" + integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== dependencies: - minimatch "^3.0.2" + argparse "^1.0.7" + entities "~1.1.1" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" -matcher-collection@^1.1.1: +matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838" integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g== dependencies: minimatch "^3.0.2" -md5-hex@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" - integrity sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ= +matcher-collection@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" + integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== dependencies: - md5-o-matic "^0.1.1" + minimatch "^3.0.2" md5-hex@^2.0.0: version "2.0.0" @@ -8264,6 +8539,16 @@ md5.js@^1.3.4: hash-base "^3.0.0" inherits "^2.0.1" +mdn-data@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.2.0.tgz#eadd28b0f2d307cf27e71524609bfb749ebfc0b6" + integrity sha512-esDqNvsJB2q5V28+u7NdtdMg6Rmg4khQmAVSjUiX7BY/7haIv0K2yWM43hYp0or+3nvG7+UaTF1JHz31hgU1TA== + +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -8296,6 +8581,13 @@ memory-streams@^0.1.0: dependencies: readable-stream "~1.0.2" +memory-streams@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" + integrity sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA== + dependencies: + readable-stream "~1.0.2" + meow@^3.4.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -8337,36 +8629,27 @@ merge-trees@^2.0.0: fs-updater "^1.0.4" heimdalljs "^0.2.5" -merge@^1.1.3, merge@^1.2.0: +merge2@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== + +merge@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.1.5, micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -8393,29 +8676,24 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.29.0 < 2": - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= +"mime-db@>= 1.38.0 < 2", mime-db@~1.38.0: + version "1.38.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" + integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== mime-db@~1.29.0: version "1.29.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" integrity sha1-SNJtI1WJZRcErFkWygYAGRQmaHg= -mime-db@~1.38.0: - version "1.38.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" - integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== - -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.7: version "2.1.16" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" integrity sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM= dependencies: mime-db "~1.29.0" -mime-types@^2.1.18: +mime-types@^2.1.18, mime-types@~2.1.18: version "2.1.22" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== @@ -8427,6 +8705,11 @@ mime@1.3.4: resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" integrity sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM= +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" @@ -8449,23 +8732,24 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimatch@^2.0.3: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= - dependencies: - brace-expansion "^1.0.0" - minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minipass@^2.2.0: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + minipass@^2.2.1, minipass@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" @@ -8481,10 +8765,10 @@ minizlib@^1.1.0: dependencies: minipass "^2.2.1" -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== dependencies: concat-stream "^1.5.0" duplexify "^3.4.2" @@ -8492,7 +8776,7 @@ mississippi@^2.0.0: flush-write-stream "^1.0.0" from2 "^2.1.0" parallel-transform "^1.1.0" - pump "^2.0.1" + pump "^3.0.0" pumpify "^1.3.3" stream-each "^1.1.0" through2 "^2.0.0" @@ -8539,14 +8823,14 @@ moo-server@*, moo-server@1.3.x: resolved "https://registry.yarnpkg.com/moo-server/-/moo-server-1.3.0.tgz#5dc79569565a10d6efed5439491e69d2392e58f1" integrity sha1-XceVaVZaENbv7VQ5SR5p0jkuWPE= -morgan@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.8.2.tgz#784ac7734e4a453a9c6e6e8680a9329275c8b687" - integrity sha1-eErHc05KRTqcbm6GgKkyknXItoc= +morgan@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" + integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== dependencies: - basic-auth "~1.1.0" - debug "2.6.8" - depd "~1.1.0" + basic-auth "~2.0.0" + debug "2.6.9" + depd "~1.1.2" on-finished "~2.3.0" on-headers "~1.0.1" @@ -8567,16 +8851,6 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= - -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - integrity sha1-riXPJRKziFodldfwN4aNhDESR2U= - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -8587,10 +8861,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -mustache@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" - integrity sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA= +mustache@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.0.1.tgz#873855f23aa8a95b150fb96d9836edbc5a1d248a" + integrity sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA== mute-stream@0.0.6: version "0.0.6" @@ -8602,7 +8876,16 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.3.0, nan@^2.3.2: +najax@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.4.tgz#63fd8dbf15d18f24dc895b3a16fec66c136b8084" + integrity sha512-wsSacA+RkgY1wxRxXCT3tdqzmamEv9PLeoV/ub9SlLf2RngbPMSqc3A7H35XJDfURC0twMmZsnPdsYPkuuFSVg== + dependencies: + jquery-deferred "^0.3.0" + lodash.defaultsdeep "^4.6.0" + qs "^6.2.0" + +nan@^2.3.2: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" integrity sha1-5P805slf37WuzAjeZZb0NgWn20U= @@ -8659,6 +8942,11 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" integrity sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA== +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + nise@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/nise/-/nise-1.2.0.tgz#079d6cadbbcb12ba30e38f1c999f36ad4d6baa53" @@ -8670,13 +8958,6 @@ nise@^1.0.1: path-to-regexp "^1.7.0" text-encoding "^0.6.4" -no-case@^2.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== - dependencies: - lower-case "^1.1.1" - node-fetch@^2.0.0-alpha.9: version "2.0.0-alpha.9" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.0.0-alpha.9.tgz#990c0634f510f76449a0d6f6eaec96b22f273628" @@ -8766,23 +9047,6 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" - integrity sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ== - dependencies: - detect-libc "^1.0.2" - hawk "3.1.3" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - node-releases@^1.1.8: version "1.1.10" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.10.tgz#5dbeb6bc7f4e9c85b899e2e7adcc0635c9b2adf7" @@ -8844,7 +9108,7 @@ normalize-path@^1.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -8856,19 +9120,19 @@ npm-bundled@^1.0.1: resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" integrity sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow== -npm-git-info@^1.0.0, npm-git-info@^1.0.3: +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@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.0.0.tgz#8cce04b49d3f9faec3f56b0fe5f4391aeb9d2fac" - integrity sha512-hwC7g81KLgRmchv9ol6f3Fx4Yyc9ARX5X5niDHVILgpuvf08JRIgOZcEfpFXli3BgESoTrkauqorXm6UbvSgSg== +npm-package-arg@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" + integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== dependencies: - hosted-git-info "^2.5.0" - osenv "^0.1.4" - semver "^5.4.1" + hosted-git-info "^2.6.0" + osenv "^0.1.5" + semver "^5.5.0" validate-npm-package-name "^3.0.0" npm-packlist@^1.1.6: @@ -8912,6 +9176,13 @@ npm-which@^3.0.1: gauge "~2.7.3" set-blocking "~2.0.0" +nth-check@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -8922,11 +9193,6 @@ oauth-sign@~0.8.1: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= -object-assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A= - object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -8956,6 +9222,11 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-keys@^1.0.12: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" + integrity sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -8963,13 +9234,13 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" + define-properties "^1.1.2" + es-abstract "^1.5.1" object.pick@^1.3.0: version "1.3.0" @@ -8978,6 +9249,16 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.values@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -8990,7 +9271,7 @@ on-headers@~1.0.1: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= -once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -9029,11 +9310,6 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= - ora@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" @@ -9087,7 +9363,7 @@ os-shim@^0.1.2: resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -9100,14 +9376,13 @@ osenv@0, osenv@^0.1.3, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= +osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: - graceful-fs "^4.1.4" - mkdirp "^0.5.1" - object-assign "^4.1.0" + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" p-finally@^1.0.0: version "1.0.0" @@ -9119,6 +9394,13 @@ p-limit@^1.1.0: resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" integrity sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw= +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -9126,11 +9408,23 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-map@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" integrity sha1-BfXkrpegaDcbwqXMhr+9vBnErno= +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" @@ -9156,16 +9450,6 @@ parse-asn1@^5.0.0: evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -9180,18 +9464,16 @@ parse-json@^3.0.0: dependencies: error-ex "^1.3.1" +parse-ms@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= -parsejson@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" - integrity sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs= - dependencies: - better-assert "~1.0.0" - parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" @@ -9211,6 +9493,11 @@ parseurl@~1.3.1: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" integrity sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY= +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -9233,11 +9520,6 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" - integrity sha1-1aiZjrce83p0w06w2eum6HjuoIE= - path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -9260,17 +9542,12 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.0: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= - -path-parse@^1.0.6: +path-parse@^1.0.5, path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -9313,12 +9590,12 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: - pify "^2.0.0" + pify "^3.0.0" pbkdf2@^3.0.3: version "3.0.14" @@ -9346,6 +9623,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -9358,12 +9640,12 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== dependencies: - find-up "^2.1.0" + find-up "^3.0.0" pkg-up@^2.0.0: version "2.0.0" @@ -9377,10 +9659,10 @@ pluralize@^7.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== -portfinder@^1.0.7: - version "1.0.13" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" - integrity sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek= +portfinder@^1.0.15: + version "1.0.20" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" + integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== dependencies: async "^1.5.2" debug "^2.2.0" @@ -9396,11 +9678,6 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - pretender@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.6.1.tgz#77d1e42ac8c6b298f5cd43534a87645df035db8c" @@ -9422,21 +9699,28 @@ pretty-format@^21.2.1: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -printf@^0.2.3: - version "0.2.5" - resolved "https://registry.yarnpkg.com/printf/-/printf-0.2.5.tgz#c438ca2ca33e3927671db4ab69c0e52f936a4f0f" - integrity sha1-xDjKLKM+OSdnHbSracDlL5NqTw8= +pretty-ms@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" + integrity sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q== + dependencies: + parse-ms "^1.0.0" -private@^0.1.6, private@^0.1.7, private@~0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" - integrity sha1-aM5eih7woju1cMwoU3tTMqumPvE= +printf@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.1.tgz#e0466788260859ed153006dc6867f09ddf240cf3" + integrity sha512-UaE/jO0hNsrvPGQEb4LyNzcrJv9Z00tsreBduOSxMtrebvoUhxiEJ4YCHX8YHf6akwfKsC2Gyv5zv47UXhMiLg== -private@^0.1.8: +private@^0.1.6, private@^0.1.8, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +private@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + integrity sha1-aM5eih7woju1cMwoU3tTMqumPvE= + process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -9469,7 +9753,7 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -promise-map-series@^0.2.1: +promise-map-series@^0.2.1, promise-map-series@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" integrity sha1-wtN3r8kyU/a9A9u3d1XriKsgqEc= @@ -9489,6 +9773,14 @@ proxy-addr@~1.1.5: forwarded "~0.1.0" ipaddr.js "1.4.0" +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -9510,7 +9802,7 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" -pump@^2.0.0, pump@^2.0.1: +pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== @@ -9518,6 +9810,14 @@ pump@^2.0.0, pump@^2.0.1: end-of-stream "^1.1.0" once "^1.3.1" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" @@ -9543,15 +9843,25 @@ punycode@^2.1.0: integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== q@^1.1.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" - integrity sha1-3QG6ydBtMObyGa7LglPunr3DCPE= + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qs@6.5.0, qs@^6.4.0: version "6.5.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" integrity sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg== +qs@6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +qs@^6.2.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" + integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA== + qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -9585,26 +9895,26 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic rimraf "^2.5.4" underscore.string "~3.3.4" -qunit@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.4.1.tgz#373c826b3b91795f3e5479cc94f0f6fa14dedc47" - integrity sha512-AWAubD4gvbcFsQzb9KkkxM/BUEygIaC6yiq1aPqXyW2UAGb1uxvtwxJQ2dC2YfDFgJiAWBQJdvosAQ518BPoeQ== +qunit-dom@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.7.1.tgz#2e6ad4a6453c034f88ef415250b37e82572460b9" + integrity sha512-8mwF7taWSqDrVRYHgp98nJmoTeE2z37K7RmHjV18pX0YoGxaJSYg+y1bRE0h3tsjSMs85W9gL/WR62yfoQN3VA== dependencies: - chokidar "1.6.1" - commander "2.9.0" - exists-stat "1.0.0" - findup-sync "0.4.3" - js-reporters "1.2.0" - resolve "1.3.2" - walk-sync "0.3.1" + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^2.0.0" -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - integrity sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how== +qunit@~2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.6.2.tgz#551210c5cf857258a4fe39a7fe15d9e14dfef22c" + integrity sha512-PHbKulmd4rrDhFto7iHicIstDTX7oMRvAcI7loHstvU8J7AOGwzcchONmy+EG4KU8HDk0K90o7vO0GhlYyKlOg== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + 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" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.0.5" @@ -9626,6 +9936,16 @@ range-parser@~1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + raw-body@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" @@ -9634,16 +9954,6 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -rc@^1.1.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" - integrity sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU= - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -9662,14 +9972,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -9679,15 +9981,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.4, readable-stream@^2.3.3, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -9701,7 +9994,7 @@ read-pkg@^2.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^2, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2: +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== @@ -9734,17 +10027,7 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -recast@0.10.33, recast@^0.10.10: - version "0.10.33" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" - integrity sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc= - dependencies: - ast-types "0.8.12" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - -recast@^0.11.17, recast@^0.11.3: +recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= @@ -9776,12 +10059,7 @@ regenerate-unicode-properties@^8.0.2: dependencies: regenerate "^1.4.0" -regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" - integrity sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA= - -regenerate@^1.4.0: +regenerate@^1.2.1, regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== @@ -9822,26 +10100,6 @@ regenerator-transform@^0.13.4: dependencies: private "^0.1.6" -regenerator@0.8.40: - version "0.8.40" - resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" - integrity sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg= - dependencies: - commoner "~0.10.3" - defs "~1.1.0" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - recast "0.10.33" - through "~2.3.8" - -regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" - integrity sha1-mxpsNdTQ3871cRrmUejp09cRQUU= - dependencies: - is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -9876,17 +10134,6 @@ regexpu-core@^4.1.3, regexpu-core@^4.2.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" -regexpu@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" - integrity sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0= - dependencies: - esprima "^2.6.0" - recast "^0.10.10" - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -9926,13 +10173,6 @@ repeat-string@^1.5.2, repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^1.1.0, repeating@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" - integrity sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw= - dependencies: - is-finite "^1.0.0" - repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -9940,7 +10180,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2, request@2.81.0, request@^2.79.0: +request@2, request@^2.79.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= @@ -9983,6 +10223,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= + require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -9991,7 +10236,7 @@ require-uncached@^1.0.3: caller-path "^0.1.0" resolve-from "^1.0.0" -requires-port@1.x.x: +requires-port@1.x.x, requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= @@ -10001,20 +10246,20 @@ reselect@^3.0.1: resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" + expand-tilde "^2.0.0" + global-modules "^1.0.0" resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= -resolve-package-path@^1.0.11: +resolve-package-path@^1.0.11, resolve-package-path@^1.1.1: version "1.2.4" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.4.tgz#814c5fcfb5f6e4151d95ec6e5653707c43706670" integrity sha512-AOIfR/AauBM1w1Oq9swqGxUjL4PW7bMztN7UCQ4KWg9AR2t03bGb9faegZbE0meAOHlntAni/4kXkcsQ7dWLPQ== @@ -10027,34 +10272,20 @@ 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.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235" - integrity sha1-HwRCyeDLuBNuh7kwX5MvRsfygjU= - dependencies: - path-parse "^1.0.5" - -resolve@^1.1.2, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0: +resolve@1.5.0, resolve@^1.1.7, resolve@^1.3.3, 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== dependencies: path-parse "^1.0.5" -resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.1.3, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.6.0, resolve@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: path-parse "^1.0.6" -resolve@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" - integrity sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q== - dependencies: - path-parse "^1.0.5" - resolve@^1.7.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" @@ -10090,13 +10321,20 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@2, rimraf@^2.4.4: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" integrity sha1-wjOOxkPfeht/5cVPqG9XQopV8z0= dependencies: glob "^7.0.5" +rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -10117,12 +10355,30 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^2.0.0" inherits "^2.0.1" -rollup@^0.41.4: - version "0.41.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" - integrity sha1-4NBUl4d6OYwQTYFtJzOnGKepTio= +rollup-pluginutils@^2.0.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.4.1.tgz#de43ab54965bbf47843599a7f3adceb723de38db" + integrity sha512-wesMQ9/172IJDIW/lYWm0vW0LiKe5Ekjws481R7z9WTRtmO59cqyM/2uUlxvf6yzm/fElFmHUobeQOYz46dZJw== + dependencies: + estree-walker "^0.6.0" + micromatch "^3.1.10" + +rollup@^0.57.1: + version "0.57.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.57.1.tgz#0bb28be6151d253f67cf4a00fea48fb823c74027" + integrity sha512-I18GBqP0qJoJC1K1osYjreqA8VAKovxuI3I81RSk0Dmr4TgloI0tAULjZaox8OsJ+n7XRrhH6i0G2By/pj1LCA== dependencies: - source-map-support "^0.4.0" + "@types/acorn" "^4.0.3" + acorn "^5.5.3" + acorn-dynamic-import "^3.0.0" + date-time "^2.1.0" + is-reference "^1.1.0" + locate-character "^2.0.5" + pretty-ms "^3.1.0" + require-relative "^0.8.7" + rollup-pluginutils "^2.0.1" + signal-exit "^3.0.2" + sourcemap-codec "^1.4.1" route-recognizer@^0.2.3: version "0.2.10" @@ -10134,7 +10390,7 @@ route-recognizer@^0.3.3: resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= -rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.2.1, rsvp@^3.3.3, rsvp@^3.5.0: +rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== @@ -10144,7 +10400,7 @@ rsvp@^4.6.1, rsvp@^4.7.0: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.7.0.tgz#dc1b0b1a536f7dec9d2be45e0a12ad4197c9fd96" integrity sha1-3BsLGlNvfeydK+ReChKtQZfJ/ZY= -rsvp@^4.8.2, rsvp@^4.8.4: +rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4: version "4.8.4" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== @@ -10197,16 +10453,16 @@ rxjs@^5.4.2: dependencies: symbol-observable "1.0.1" -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== - -safe-buffer@^5.1.2: +safe-buffer@5.1.2, safe-buffer@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== + safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" @@ -10229,33 +10485,38 @@ samsam@1.x, samsam@^1.1.3: resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" integrity sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc= -sane@^1.1.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" - integrity sha1-s1ebzLRclM8gNVzIESSZDf00bjA= +sane@^2.4.1, sane@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" + integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= dependencies: - anymatch "^1.3.0" + anymatch "^2.0.0" + capture-exit "^1.2.0" exec-sh "^0.2.0" fb-watchman "^2.0.0" - minimatch "^3.0.2" + micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" - watch "~0.10.0" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" -sane@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.0.tgz#6359cd676f5efd9988b264d8ce3b827dd6b27bec" - integrity sha512-glfKd7YH4UCrh/7dD+UESsr8ylKWRE7UQPoXuz28FgmcF0ViJQhCTCCZHICRKxf8G8O1KdLEn20dcICK54c7ew== +sane@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" + integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== dependencies: anymatch "^2.0.0" + capture-exit "^1.2.0" exec-sh "^0.2.0" + execa "^1.0.0" fb-watchman "^2.0.0" micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" watch "~0.18.0" optionalDependencies: - fsevents "^1.1.1" + fsevents "^1.2.3" sass-graph@^2.1.1: version "2.2.4" @@ -10267,12 +10528,12 @@ sass-graph@^2.1.1: scss-tokenizer "^0.2.3" yargs "^7.0.0" -sax@^1.2.4, sax@~1.2.1: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -schema-utils@^0.4.4, schema-utils@^0.4.5: +schema-utils@^0.4.4: version "0.4.5" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" integrity sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA== @@ -10280,6 +10541,15 @@ schema-utils@^0.4.4, schema-utils@^0.4.5: ajv "^6.1.0" ajv-keywords "^3.1.0" +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + scss-tokenizer@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" @@ -10288,21 +10558,21 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1: +"semver@2 || 3 || 4 || 5", semver@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -semver@5.3.0, semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - -semver@^5.5.0, semver@^5.5.1: +semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + send@0.15.4: version "0.15.4" resolved "https://registry.yarnpkg.com/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9" @@ -10322,6 +10592,25 @@ send@0.15.4: range-parser "~1.2.0" statuses "~1.3.1" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" @@ -10337,6 +10626,16 @@ serve-static@1.12.4: parseurl "~1.3.1" send "0.15.4" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -10377,6 +10676,11 @@ setprototypeof@1.0.3: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.9" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" @@ -10402,12 +10706,12 @@ shellwords@^0.1.0: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -showdown@^1.6.4: - version "1.7.3" - resolved "https://registry.yarnpkg.com/showdown/-/showdown-1.7.3.tgz#8d27f501a0850f33a0c25f1a6b7a10b9fc464633" - integrity sha1-jSf1AaCFDzOgwl8aa3oQufxGRjM= +showdown@^1.7.4: + version "1.9.0" + resolved "https://registry.yarnpkg.com/showdown/-/showdown-1.9.0.tgz#d49d2a0b6db21b7c2e96ef855f7b3b2a28ef46f4" + integrity sha512-x7xDCRIaOlicbC57nMhGfKamu+ghwsdVkHMttyn+DelwzuHOx4OHCVL/UW/2QOLH7BxfCcCCVVUix3boKXJKXQ== dependencies: - yargs "^8.0.1" + yargs "^10.0.3" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" @@ -10421,15 +10725,10 @@ silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: dependencies: debug "^2.2.0" -simple-fmt@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" - integrity sha1-GRv1ZqWeZTBILLJatTtKjchcOms= - -simple-is@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" - integrity sha1-Krt1qt453rXMgVzhDmGRFkhQuvA= +simple-html-tokenizer@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.7.tgz#8eca336ecfbe2b3c6166cbb31b2682088de79f40" + integrity sha512-APW9iYbkJ5cijjX4Ljhf3VG8SwYPUJT5gZrwci/wieMabQxWFiV5VwsrP5c6GMRvXKEQMGkAB1d9dvW66dTqpg== sinon@^3.2.1: version "3.3.0" @@ -10453,18 +10752,16 @@ 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== + slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= -snake-case@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" - integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= - dependencies: - no-case "^2.2.0" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -10502,65 +10799,64 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -socket.io-adapter@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" - integrity sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s= - dependencies: - debug "2.3.3" - socket.io-parser "2.3.1" +socket.io-adapter@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" + integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= -socket.io-client@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" - integrity sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM= +socket.io-client@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" + integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== dependencies: backo2 "1.0.2" + base64-arraybuffer "0.1.5" component-bind "1.0.0" component-emitter "1.2.1" - debug "2.3.3" - engine.io-client "1.8.0" - has-binary "0.1.7" + debug "~3.1.0" + engine.io-client "~3.3.1" + has-binary2 "~1.0.2" + has-cors "1.1.0" indexof "0.0.1" object-component "0.0.3" + parseqs "0.0.5" parseuri "0.0.5" - socket.io-parser "2.3.1" + socket.io-parser "~3.3.0" to-array "0.1.4" -socket.io-parser@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" - integrity sha1-3VMgJRA85Clpcya+/WQAX8/ltKA= +socket.io-parser@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" + integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== dependencies: - component-emitter "1.1.2" - debug "2.2.0" - isarray "0.0.1" - json3 "3.3.2" + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" -socket.io@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" - integrity sha1-PkDZMmN+a9kjmBslyvfFPoO24uE= - dependencies: - debug "2.3.3" - engine.io "1.8.0" - has-binary "0.1.7" - object-assign "4.1.0" - socket.io-adapter "0.5.0" - socket.io-client "1.6.0" - socket.io-parser "2.3.1" - -sort-object-keys@^1.1.1: +socket.io@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.2.0.tgz#f0f633161ef6712c972b307598ecd08c9b1b4d5b" + integrity sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w== + dependencies: + debug "~4.1.0" + engine.io "~3.3.1" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.2.0" + socket.io-parser "~3.3.0" + +sort-object-keys@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.2.tgz#d3a6c48dc2ac97e6bc94367696e03f6d09d37952" integrity sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI= -sort-package-json@^1.4.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.7.0.tgz#13b362ff6400c5b4eaa9ba220f9ea7c3d6644b5f" - integrity sha1-E7Ni/2QAxbTqqboiD56nw9ZkS18= +sort-package-json@^1.15.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.21.0.tgz#9501273da130693b4dd1ebe68882d1d289119546" + integrity sha512-G920kGKROov3kS32jnmf03YolcGTkdONKbOv+Hi1Db7D9lBXhNU5aNMZCE0j/hfDqd/zmPVmpSiuhSOt3Lv+4A== dependencies: - sort-object-keys "^1.1.1" + detect-indent "^5.0.0" + sort-object-keys "^1.1.2" source-list-map@^2.0.0: version "2.0.0" @@ -10578,20 +10874,21 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.2.10: - version "0.2.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" - integrity sha1-6lo5AKHByyUJagrozFwrSxDe09w= - dependencies: - source-map "0.1.32" - -source-map-support@^0.4.0, source-map-support@^0.4.15: +source-map-support@^0.4.15: version "0.4.16" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.16.tgz#16fecf98212467d017d586a2af68d628b9421cd8" integrity sha512-A6vlydY7H/ljr4L2UOhDSajQdZQ6dMD7cLH0pzwcmwLyc9u8PNI4WGtnfDDzX7uzGL6c/T+ORL97Zlh+S4iOrg== dependencies: source-map "^0.5.6" +source-map-support@~0.5.10: + version "0.5.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" + integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -10602,13 +10899,6 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@0.1.32, source-map@~0.1.x: - version "0.1.32" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" - integrity sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY= - dependencies: - amdefine ">=0.0.4" - source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" @@ -10621,11 +10911,23 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, sour resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@~0.1.x: + version "0.1.32" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" + integrity sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY= + dependencies: + amdefine ">=0.0.4" + +sourcemap-codec@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== + sourcemap-validator@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.5.tgz#f9b960f48c6469e288a19af305f005da3dc1df3a" @@ -10636,6 +10938,16 @@ sourcemap-validator@^1.0.5: lodash.template "~2.3.x" source-map "~0.1.x" +sourcemap-validator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.1.0.tgz#00454547d1682186e1498a7208e022e8dfa8738f" + integrity sha512-Hmdu39KL+EoAAZ69OTk7RXXJdPRRizJvOZOWhCW9jLGfEQflCNPTlSoCXFPdKWFwwf0uzLcGR/fc7EP/PT8vRQ== + dependencies: + jsesc "~0.3.x" + lodash.foreach "~2.3.x" + lodash.template "~2.3.x" + source-map "~0.1.x" + spawn-args@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" @@ -10674,9 +10986,9 @@ split-string@^3.0.1, split-string@^3.0.2: extend-shallow "^3.0.0" sprintf-js@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" - integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw= + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== sprintf-js@~1.0.2: version "1.0.3" @@ -10703,17 +11015,17 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== dependencies: - safe-buffer "^5.1.1" + figgy-pudding "^3.5.1" -stable@~0.1.3: - version "0.1.6" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10" - integrity sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA= +stable@~0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-trace@0.0.x: version "0.0.10" @@ -10738,6 +11050,16 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + stdout-stream@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" @@ -10803,7 +11125,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -10839,16 +11161,6 @@ stringify-object@^3.2.0: is-obj "^1.0.1" is-regexp "^1.0.0" -stringmap@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1" - integrity sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE= - -stringset@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5" - integrity sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU= - stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -10945,18 +11257,25 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -svgo@^0.6.3: - version "0.6.6" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.6.6.tgz#b340889036f20f9b447543077d0f5573ed044c08" - integrity sha1-s0CIkDbyD5tEdUMHfQ9Vc+0ETAg= +svgo@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.0.5.tgz#7040364c062a0538abacff4401cea6a26a7a389a" + integrity sha512-nYrifviB77aNKDNKKyuay3M9aYiK6Hv5gJVDdjj2ZXTQmI8WZc8+UPLR5IpVlktJfSu3co/4XcWgrgI6seGBPg== dependencies: - coa "~1.0.1" + coa "~2.0.1" colors "~1.1.2" - csso "~2.0.0" - js-yaml "~3.6.0" + css-select "~1.3.0-rc0" + css-select-base-adapter "~0.1.0" + css-tree "1.0.0-alpha25" + css-url-regex "^1.1.0" + csso "^3.5.0" + js-yaml "~3.10.0" mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" + object.values "^1.0.4" + sax "~1.2.4" + stable "~0.1.6" + unquote "~1.1.1" + util.promisify "~1.0.0" symbol-observable@1.0.1: version "1.0.1" @@ -10968,12 +11287,7 @@ symbol-observable@^0.2.2: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A= -symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.1.8.tgz#cabe61e0010c1c023c173b25ee5108b37f4b4aa3" - integrity sha1-yr5h4AEMHAI8Fzsl7lEIs39LSqM= - -symlink-or-copy@^1.2.0: +symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== @@ -10990,36 +11304,26 @@ table@^4.0.1: slice-ansi "0.0.4" string-width "^2.0.0" -tap-parser@^5.1.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-5.4.0.tgz#6907e89725d7b7fa6ae41ee2c464c3db43188aec" - integrity sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA== +tap-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-7.0.0.tgz#54db35302fda2c2ccc21954ad3be22b2cba42721" + integrity sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA== dependencies: events-to-array "^1.0.1" js-yaml "^3.2.7" - optionalDependencies: - readable-stream "^2" + minipass "^2.2.0" tapable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" integrity sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg== -tar-pack@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" - integrity sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ= - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.0.0, tar@^2.2.1: +tapable@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" + integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== + +tar@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= @@ -11049,17 +11353,40 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -testem@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/testem/-/testem-2.0.0.tgz#b05c96200c7ac98bae998d71c94c0c5345907d13" - integrity sha1-sFyWIAx6yYuumY1xyUwMU0WQfRM= +terser-webpack-plugin@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" + integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.16.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.16.1, terser@^3.7.5: + version "3.17.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== + dependencies: + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" + +testem@^2.9.2: + version "2.14.0" + resolved "https://registry.yarnpkg.com/testem/-/testem-2.14.0.tgz#418a9a15843f68381659c6a486abb4ea48d06c29" + integrity sha512-tldpNPCzXfibmxOoTMGOfr8ztUiHf9292zSXCu7SitBx9dCK83k7vEoa77qJBS9t3RGCQCRF+GNMUuiFw//Mbw== dependencies: backbone "^1.1.2" bluebird "^3.4.6" charm "^1.0.0" commander "^2.6.0" - consolidate "^0.14.0" - execa "^0.9.0" + consolidate "^0.15.1" + execa "^1.0.0" express "^4.10.7" fireworm "^0.7.0" glob "^7.0.4" @@ -11071,15 +11398,16 @@ testem@^2.0.0: lodash.find "^4.5.1" lodash.uniqby "^4.7.0" mkdirp "^0.5.1" - mustache "^2.2.1" + mustache "^3.0.0" node-notifier "^5.0.1" npmlog "^4.0.0" - printf "^0.2.3" + printf "^0.5.1" rimraf "^2.4.4" - socket.io "1.6.0" + socket.io "^2.1.0" spawn-args "^0.2.0" styled_string "0.0.1" - tap-parser "^5.1.0" + tap-parser "^7.0.0" + tmp "0.0.33" xmldom "^0.1.19" text-encoding@0.6.4, text-encoding@^0.6.4: @@ -11093,9 +11421,9 @@ text-table@~0.2.0: integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= "textextensions@1 || 2": - version "2.1.0" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.1.0.tgz#1be0dc2a0dc244d44be8a09af6a85afb93c4dbc3" - integrity sha1-G+DcKg3CRNRL6KCa9qha+5PE28M= + version "2.4.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.4.0.tgz#6a143a985464384cc2cff11aea448cd5b018e72b" + integrity sha512-qftQXnX1DzpSV8EddtHIT0eDDEiBF8ywhFYR2lI9xrGtxqKN+CvLXhACeCIGbCpQfxxERbrkZEFb8cZcDKbVZA== through2@^2.0.0: version "2.0.3" @@ -11105,11 +11433,16 @@ through2@^2.0.0: readable-stream "^2.1.5" xtend "~4.0.1" -through@^2.3.6, through@^2.3.8, through@~2.3.8: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +time-zone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= + timers-browserify@^2.0.4: version "2.0.10" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" @@ -11122,15 +11455,15 @@ timespan@2.x: resolved "https://registry.yarnpkg.com/timespan/-/timespan-2.3.0.tgz#4902ce040bd13d845c8f59b27e9d59bad6f39929" integrity sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk= -tiny-lr@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.0.5.tgz#21f40bf84ebd1f853056680375eef1670c334112" - integrity sha512-YrxUSiMgOVh3PnAqtdAUQuUVEVRnqcRCxJ3BHrl/aaWV2fplKKB60oClM0GH2Gio2hcXvkxMUxsC/vXZrQePlg== +tiny-lr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" + integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA== dependencies: body "^5.1.0" - debug "~2.6.7" + debug "^3.1.0" faye-websocket "~0.10.0" - livereload-js "^2.2.2" + livereload-js "^2.3.0" object-assign "^4.1.0" qs "^6.4.0" @@ -11141,6 +11474,13 @@ tmp@0.0.28: dependencies: os-tmpdir "~1.0.1" +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmp@^0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" @@ -11170,7 +11510,7 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-fast-properties@^1.0.0, to-fast-properties@^1.0.3: +to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= @@ -11212,7 +11552,7 @@ tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" -tree-sync@^1.2.1, tree-sync@^1.2.2: +tree-sync@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.2.tgz#2cf76b8589f59ffedb58db5a3ac7cb013d0158b7" integrity sha1-LPdrhYn1n/7bWNtaOsfLAT0BWLc= @@ -11228,26 +11568,16 @@ trim-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= -trim-right@^1.0.0, trim-right@^1.0.1: +trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -try-resolve@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" - integrity sha1-z95vq9ctY+V5fPqrhzq76OcA6RI= - tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" integrity sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics= -tryor@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" - integrity sha1-gUXkynyv9ArN48z5Rui4u3W0Fys= - tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -11290,6 +11620,14 @@ type-is@~1.6.15: media-typer "0.3.0" mime-types "~2.1.15" +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -11300,21 +11638,10 @@ uc.micro@^1.0.1, uc.micro@^1.0.3: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" integrity sha1-ftUNXg+an7ClczeSWfKndFjVAZI= -uglify-es@^3.1.3: - version "3.2.2" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.2.2.tgz#15c62b7775002c81b7987a1c49ecd3f126cace73" - integrity sha512-l+s5VLzFwGJfS+fbqaGf/Dfwo1MF13jLOF2ekL0PytzqEqQ6cVppvHf4jquqFok+35USMpKjqkYxy6pQyUcuug== - dependencies: - commander "~2.12.1" - source-map "~0.6.1" - -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== - dependencies: - commander "~2.13.0" - source-map "~0.6.1" +uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@1.x: version "1.3.5" @@ -11331,39 +11658,23 @@ uglify-js@^2.6: optionalDependencies: uglify-to-browserify "~1.0.0" +uglify-js@^3.1.4: + version "3.4.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" + integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= -uglifyjs-webpack-plugin@^1.2.4: - version "1.2.7" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" - integrity sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA== - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= - underscore.string@~3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" - integrity sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s= + version "3.3.5" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" + integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg== dependencies: sprintf-js "^1.0.3" util-deprecate "^1.0.2" @@ -11406,10 +11717,10 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" -unique-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" - integrity sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM= +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: unique-slug "^2.0.0" @@ -11432,11 +11743,16 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" integrity sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc= -unpipe@~1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -11484,11 +11800,6 @@ use@^3.1.0: dependencies: kind-of "^6.0.2" -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - user-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/user-info/-/user-info-1.0.0.tgz#81c82b7ed63e674c2475667653413b3c76fde239" @@ -11498,10 +11809,10 @@ user-info@^1.0.0: passwd-user "^1.2.1" username "^1.0.1" -username-sync@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" - integrity sha1-HN6H7vz5S4gimE2Ti6K3l0Jtrh8= +username-sync@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.2.tgz#0a3697909fb7b5768d29e2921f573acfdd427592" + integrity sha512-ayNkOJdoNSGNDBE46Nkc+l6IXmeugbzahZLSMkwvgRWv5y5ZqNY2IrzcgmkR4z32sj1W3tM3TuTUMqkqBzO+RA== username@^1.0.1: version "1.0.1" @@ -11515,6 +11826,14 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -11534,11 +11853,21 @@ utils-merge@1.0.0: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" integrity sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg= +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + uuid@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" integrity sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g== +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" @@ -11559,6 +11888,11 @@ vary@~1.1.1: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" integrity sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc= +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -11575,10 +11909,10 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" -walk-sync@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.1.tgz#558a16aeac8c0db59c028b73c66f397684ece465" - integrity sha1-VYoWrqyMDbWcAotzxm85doTs5GU= +walk-sync@0.3.2, 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" @@ -11596,10 +11930,10 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^0.3.0, walk-sync@^0.3.1, 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== +walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.4.tgz#cf78486cc567d3a96b5b2237c6108017a5ffb9a4" + integrity sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig== dependencies: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" @@ -11631,11 +11965,6 @@ watch-detector@^0.1.0: semver "^5.4.1" silent-error "^1.1.0" -watch@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" - integrity sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw= - watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" @@ -11660,7 +11989,7 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webpack-sources@^1.0.1, webpack-sources@^1.1.0: +webpack-sources@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" integrity sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw== @@ -11668,23 +11997,30 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.12.0: - version "4.15.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.15.1.tgz#dc716779a3b88827c369f18c71a6137fa7e582fd" - integrity sha512-UwfFQ2plA5EMhhzwi/hl5xpLk7mNK7p0853Ml04z1Bqw553pY+oS8Xke3funcVy7eG/yMpZPvnlFTUyGKyKoyw== +webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@~4.28: + version "4.28.4" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.28.4.tgz#1ddae6c89887d7efb752adf0c3cd32b9b07eacd0" + integrity sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw== dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/wasm-edit" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/wasm-edit" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" acorn "^5.6.2" acorn-dynamic-import "^3.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" chrome-trace-event "^1.0.0" enhanced-resolve "^4.1.0" - eslint-scope "^3.7.1" + eslint-scope "^4.0.0" json-parse-better-errors "^1.0.2" loader-runner "^2.3.0" loader-utils "^1.1.0" @@ -11694,10 +12030,10 @@ webpack@^4.12.0: neo-async "^2.5.0" node-libs-browser "^2.0.0" schema-utils "^0.4.4" - tapable "^1.0.0" - uglifyjs-webpack-plugin "^1.2.4" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" watchpack "^1.5.0" - webpack-sources "^1.0.1" + webpack-sources "^1.3.0" websocket-driver@>=0.5.1: version "0.6.5" @@ -11716,11 +12052,6 @@ whatwg-fetch@^2.0.3: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" integrity sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ= -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= - which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -11738,6 +12069,13 @@ which@1, which@^1.2.10, which@^1.2.12, which@^1.2.9: dependencies: isexe "^2.0.0" +which@^1.2.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" @@ -11750,11 +12088,6 @@ window-size@0.1.0: resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= -window-size@^0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= - winston@*: version "2.4.0" resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.0.tgz#808050b93d52661ed9fb6c26b3f0c826708b0aee" @@ -11789,14 +12122,7 @@ worker-farm@^1.5.2: dependencies: errno "~0.1.7" -workerpool@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.2.4.tgz#c9dbe01e103e92df0e8f55356fc860135fbd43b0" - integrity sha512-gE7StiPAOM6318V3EzlR0sFgedAF11PjDZ1xt3SpbuF/vTTDFX2XEnkbFUNqhIHBEKzBDFLPgJSIXyJKP4wZBQ== - dependencies: - object-assign "4.1.1" - -workerpool@^2.3.0: +workerpool@^2.2.1, workerpool@^2.3.0: version "2.3.3" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.3.tgz#49a70089bd55e890d68cc836a19419451d7c81d7" integrity sha512-L1ovlYHp6UObYqElXXpbd214GgbEKDED0d3sj7pRdFXjNkb2+un/AUcCkceHizO0IVI6SOGGncrcjozruCkRgA== @@ -11844,18 +12170,12 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -ws@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" - integrity sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg= +ws@~6.1.0: + version "6.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== dependencies: - options ">=0.0.5" - ultron "1.0.x" - -wtf-8@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" - integrity sha1-OS2LotDxw00e4tYw8V0O+2jhBIo= + async-limiter "~1.0.0" xdg-basedir@^3.0.0: version "3.0.0" @@ -11867,17 +12187,17 @@ xmldom@^0.1.19: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= -xmlhttprequest-ssl@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" - integrity sha1-GFqIjATspGw+QHDZn3tJ3jUomS0= +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -y18n@^3.2.0, y18n@^3.2.1: +y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= @@ -11897,13 +12217,13 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= -yam@0.0.22: - version "0.0.22" - resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.22.tgz#38a76cb79a19284d9206ed49031e359a1340bd06" - integrity sha1-OKdst5oZKE2SBu1JAx41mhNAvQY= +yam@^0.0.24: + version "0.0.24" + resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.24.tgz#11e9630444735f66a561d29221407de6d037cd95" + integrity sha512-llPF60oFLV8EQimNPR6+KorSaj59L32C4c1db4cr72GaWVWapnhTS2VZeK2K2xLyEOveWtRcNa+dLJBW7EfhYQ== dependencies: - fs-extra "^0.30.0" - lodash.merge "^4.4.0" + fs-extra "^4.0.2" + lodash.merge "^4.6.0" yargs-parser@^5.0.0: version "5.0.0" @@ -11912,13 +12232,31 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== dependencies: camelcase "^4.1.0" +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" @@ -11938,25 +12276,6 @@ yargs@^7.0.0: y18n "^3.2.1" yargs-parser "^5.0.0" -yargs@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" @@ -11967,18 +12286,6 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" -yargs@~3.27.0: - version "3.27.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.27.0.tgz#21205469316e939131d59f2da0c6d7f98221ea40" - integrity sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA= - dependencies: - camelcase "^1.2.1" - cliui "^2.1.0" - decamelize "^1.0.0" - os-locale "^1.4.0" - window-size "^0.1.2" - y18n "^3.2.0" - yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" From 67372fc12c4c9521fdb373feb45940c738d84ed1 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Fri, 15 Mar 2019 17:18:44 -0700 Subject: [PATCH 25/46] Override default template lintrc (borrowed this one from vault) --- ui/.template-lintrc.js | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/ui/.template-lintrc.js b/ui/.template-lintrc.js index b45e96ffddc..c16df0bf733 100644 --- a/ui/.template-lintrc.js +++ b/ui/.template-lintrc.js @@ -1,5 +1,40 @@ 'use strict'; module.exports = { - extends: 'recommended' + extends: 'recommended', + rules: { + // should definitely move to template only + // glimmer components for this one + 'no-partial': false, + + // these need to be looked into, but + // may be a bigger change + 'no-invalid-interactive': false, + 'simple-unless': false, + + 'self-closing-void-elements': false, + 'no-unnecessary-concat': false, + 'no-quoteless-attributes': false, + 'no-nested-interactive': false, + + // Only used in list-pager, which can be replaced with + // an angle-bracket component + 'no-attrs-in-components': false, + + // Used in practice with charts. Ideally this would be true + // except for a whitelist of chart files. + 'no-inline-styles': false, + + // not sure we'll ever want these on, + // would be nice but if prettier isn't doing + // it for us, then not sure it's worth it + 'attribute-indentation': false, + 'block-indentation': false, + quotes: false, + }, + + ignore: [ + 'app/templates/components/freestyle/**', + 'nomad-ui/templates/components/freestyle/**' + ] }; From 30bcacfb9271c446e2899aaf86b9caea0eb1f78c Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Mon, 25 Mar 2019 15:49:53 -0700 Subject: [PATCH 26/46] Address template linting issues --- .../allocations/allocation/task/index.hbs | 2 +- .../components/freestyle/sg-accordion.hbs | 20 +++++++++---------- ui/app/templates/components/task-row.hbs | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ui/app/templates/allocations/allocation/task/index.hbs b/ui/app/templates/allocations/allocation/task/index.hbs index a5496391ab9..518e8e58dc4 100644 --- a/ui/app/templates/allocations/allocation/task/index.hbs +++ b/ui/app/templates/allocations/allocation/task/index.hbs @@ -65,7 +65,7 @@ {{if row.model.isDynamic "Yes" "No"}} {{row.model.name}} - + {{network.ip}}:{{row.model.port}} diff --git a/ui/app/templates/components/freestyle/sg-accordion.hbs b/ui/app/templates/components/freestyle/sg-accordion.hbs index 13975dec941..1288be761e7 100644 --- a/ui/app/templates/components/freestyle/sg-accordion.hbs +++ b/ui/app/templates/components/freestyle/sg-accordion.hbs @@ -1,18 +1,18 @@ {{#freestyle-usage "accordion" title="Accordion"}} - {{#list-accordion source=products key="name" as |a|}} - {{#a.head buttonLabel="details"}} + {{#list-accordion source=products key="name" as |ac|}} + {{#ac.head buttonLabel="details"}}
-
{{a.item.name}}
+
{{ac.item.name}}
- {{a.item.lang}} + {{ac.item.lang}}
- {{/a.head}} - {{#a.body}} -

{{a.item.name}}

-

{{a.item.desc}}

-

Learn more...

- {{/a.body}} + {{/ac.head}} + {{#ac.body}} +

{{ac.item.name}}

+

{{ac.item.desc}}

+

Learn more...

+ {{/ac.body}} {{/list-accordion}} {{/freestyle-usage}} diff --git a/ui/app/templates/components/task-row.hbs b/ui/app/templates/components/task-row.hbs index 03d83201c1b..aaff844d5c3 100644 --- a/ui/app/templates/components/task-row.hbs +++ b/ui/app/templates/components/task-row.hbs @@ -25,13 +25,13 @@ {{#each network.reservedPorts as |port|}}
  • {{port.Label}}: - {{network.ip}}:{{port.Value}} + {{network.ip}}:{{port.Value}}
  • {{/each}} {{#each network.dynamicPorts as |port|}}
  • {{port.Label}}: - {{network.ip}}:{{port.Value}} + {{network.ip}}:{{port.Value}}
  • {{/each}} {{/with}} From cf44c5449c52039ff437f549b812edc7adc1afb5 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Mon, 25 Mar 2019 15:54:48 -0700 Subject: [PATCH 27/46] Address test failures --- ui/app/models/allocation.js | 2 +- .../reschedule-event-timeline-test.js | 33 ++++++++----------- ui/tests/unit/adapters/job-test.js | 14 ++++++-- ui/tests/unit/adapters/node-test.js | 3 +- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/ui/app/models/allocation.js b/ui/app/models/allocation.js index 5e370100b29..f00cf6006ae 100644 --- a/ui/app/models/allocation.js +++ b/ui/app/models/allocation.js @@ -86,7 +86,7 @@ export default Model.extend({ hasStoppedRescheduling: computed( 'nextAllocation', 'clientStatus', - 'followUpEvaluation', + 'followUpEvaluation.content', function() { return ( !this.get('nextAllocation.content') && diff --git a/ui/tests/integration/reschedule-event-timeline-test.js b/ui/tests/integration/reschedule-event-timeline-test.js index d274be37eaf..199f9fcf592 100644 --- a/ui/tests/integration/reschedule-event-timeline-test.js +++ b/ui/tests/integration/reschedule-event-timeline-test.js @@ -110,7 +110,7 @@ module('Integration | Component | reschedule event timeline', function(hooks) { }); }); - test('when the allocation has failed and there is no follow up evaluation, a warning is shown', function(assert) { + test('when the allocation has failed and there is no follow up evaluation, a warning is shown', async function(assert) { const attempts = 2; this.server.create('allocation', 'rescheduled', { @@ -127,27 +127,22 @@ module('Integration | Component | reschedule event timeline', function(hooks) { }).id, }); - this.store.findAll('allocation'); - let allocation; + await this.store.findAll('allocation'); + await settled(); - return settled() - .then(async () => { - allocation = this.store - .peekAll('allocation') - .find(alloc => !alloc.get('nextAllocation.content')); + let allocation = this.store + .peekAll('allocation') + .find(alloc => !alloc.get('nextAllocation.content')); + this.set('allocation', allocation); - this.set('allocation', allocation); - await render(commonTemplate); + await render(commonTemplate); + await settled(); - return settled(); - }) - .then(() => { - assert.ok( - find('[data-test-attempt-notice]'), - 'Reschedule notice is shown since the follow up eval says so' - ); - assert.notOk(find('[data-test-stop-warning]'), 'Stop warning is not shown'); - }); + assert.ok( + find('[data-test-attempt-notice]'), + 'Reschedule notice is shown since the follow up eval says so' + ); + assert.notOk(find('[data-test-stop-warning]'), 'Stop warning is not shown'); }); test('when the allocation has a next allocation already, it is shown in the timeline', function(assert) { diff --git a/ui/tests/unit/adapters/job-test.js b/ui/tests/unit/adapters/job-test.js index ba500aa7452..a5028ce1209 100644 --- a/ui/tests/unit/adapters/job-test.js +++ b/ui/tests/unit/adapters/job-test.js @@ -9,7 +9,7 @@ import { startMirage } from 'nomad-ui/initializers/ember-cli-mirage'; module('Unit | Adapter | Job', function(hooks) { setupTest(hooks); - hooks.beforeEach(function() { + hooks.beforeEach(async function() { this.store = this.owner.lookup('service:store'); this.subject = () => this.store.adapterFor('job'); @@ -31,9 +31,9 @@ module('Unit | Adapter | Job', function(hooks) { // Namespace, default region, and all regions are requests that all // job requests depend on. Fetching them ahead of time means testing // job adapter behavior in isolation. - this.system.get('namespaces'); + await this.system.get('namespaces'); this.system.get('shouldIncludeRegion'); - this.system.get('defaultRegion'); + await this.system.get('defaultRegion'); // Reset the handledRequests array to avoid accounting for this // namespaces request everywhere. @@ -383,6 +383,10 @@ module('Unit | Adapter | Job', function(hooks) { const region = 'region-2'; window.localStorage.nomadActiveRegion = region; + // Regions are fetched in the before hook, so manually dirty the activeRegion + // instead of repeating what is in the beforeEach here. + this.system.notifyPropertyChange('activeRegion'); + const { pretender } = this.server; const jobName = 'job-1'; const jobNamespace = 'default'; @@ -402,6 +406,10 @@ module('Unit | Adapter | Job', function(hooks) { test('when the region is set to the default region, requests are made without the region query param', async function(assert) { window.localStorage.nomadActiveRegion = 'region-1'; + // Regions are fetched in the before hook, so manually dirty the activeRegion + // instead of repeating what is in the beforeEach here. + this.system.notifyPropertyChange('activeRegion'); + const { pretender } = this.server; const jobName = 'job-1'; const jobNamespace = 'default'; diff --git a/ui/tests/unit/adapters/node-test.js b/ui/tests/unit/adapters/node-test.js index 9dc020a55d8..908fbf33b98 100644 --- a/ui/tests/unit/adapters/node-test.js +++ b/ui/tests/unit/adapters/node-test.js @@ -20,6 +20,7 @@ module('Unit | Adapter | Node', function(hooks) { this.server.create('allocation', { id: 'node-1-2', nodeId: 'node-1' }); this.server.create('allocation', { id: 'node-2-1', nodeId: 'node-2' }); this.server.create('allocation', { id: 'node-2-2', nodeId: 'node-2' }); + this.server.logging = true; }); hooks.afterEach(function() { @@ -91,5 +92,5 @@ module('Unit | Adapter | Node', function(hooks) { // findHasMany method as well normalizing the response and pushing it to the store function findHasMany(model, relationshipName) { const relationship = model.relationshipFor(relationshipName); - return model.hasMany(relationship.key).hasManyRelationship.fetchLink(); + return model.hasMany(relationship.key).reload(); } From 7e6a4f74fc90ec5400c3150447dff7af2f1e7723 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Mon, 25 Mar 2019 21:24:11 -0700 Subject: [PATCH 28/46] Address inflector deprecations --- ui/app/helpers/pluralize.js | 7 ++++--- ui/app/serializers/application.js | 8 ++++---- ui/app/utils/format-duration.js | 5 +++-- ui/package.json | 1 + 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/ui/app/helpers/pluralize.js b/ui/app/helpers/pluralize.js index fcab84cbee0..3ec48e20526 100644 --- a/ui/app/helpers/pluralize.js +++ b/ui/app/helpers/pluralize.js @@ -1,7 +1,8 @@ import Helper from '@ember/component/helper'; +import { pluralize } from 'ember-inflector'; -export function pluralize([term, count]) { - return count === 1 ? term : term.pluralize(); +export function pluralizeHelper([term, count]) { + return count === 1 ? term : pluralize(term); } -export default Helper.helper(pluralize); +export default Helper.helper(pluralizeHelper); diff --git a/ui/app/serializers/application.js b/ui/app/serializers/application.js index 8a296faea4d..34c6f6069a6 100644 --- a/ui/app/serializers/application.js +++ b/ui/app/serializers/application.js @@ -2,6 +2,7 @@ import { copy } from '@ember/object/internals'; import { get } from '@ember/object'; import { makeArray } from '@ember/array'; import JSONSerializer from 'ember-data/serializers/json'; +import { pluralize, singularize } from 'ember-inflector'; import removeRecord from '../utils/remove-record'; export default JSONSerializer.extend({ @@ -12,11 +13,10 @@ export default JSONSerializer.extend({ }, keyForRelationship(attr, relationshipType) { - const key = `${attr - .singularize() + const key = `${singularize(attr) .camelize() .capitalize()}ID`; - return relationshipType === 'hasMany' ? key.pluralize() : key; + return relationshipType === 'hasMany' ? pluralize(key) : key; }, // Modeled after the pushPayload for ember-data/serializers/rest @@ -68,6 +68,6 @@ export default JSONSerializer.extend({ }, modelNameFromPayloadKey(key) { - return key.dasherize().singularize(); + return singularize(key.dasherize()); }, }); diff --git a/ui/app/utils/format-duration.js b/ui/app/utils/format-duration.js index 11856bf4421..feed6b262b5 100644 --- a/ui/app/utils/format-duration.js +++ b/ui/app/utils/format-duration.js @@ -1,4 +1,5 @@ import moment from 'moment'; +import { pluralize } from 'ember-inflector'; /** * Metadata for all unit types @@ -26,10 +27,10 @@ const pluralizeUnits = (amount, unit, longForm) => { if (longForm && unit.longSuffix) { // Long form means always using full words (seconds insteand of s) which means // pluralization is necessary. - suffix = amount === 1 ? unit.longSuffix : unit.longSuffix.pluralize(); + suffix = amount === 1 ? unit.longSuffix : pluralize(unit.longSuffix); } else { // In the normal case, only pluralize based on the pluralizable flag - suffix = amount === 1 || !unit.pluralizable ? unit.suffix : unit.suffix.pluralize(); + suffix = amount === 1 || !unit.pluralizable ? unit.suffix : pluralize(unit.suffix); } // A space should go between the value and the unit when the unit is a full word diff --git a/ui/package.json b/ui/package.json index 58fb276f819..08d646286b3 100644 --- a/ui/package.json +++ b/ui/package.json @@ -67,6 +67,7 @@ "ember-export-application-global": "^2.0.0", "ember-fetch": "^3.4.3", "ember-freestyle": "~0.10.0", + "ember-inflector": "^3.0.0", "ember-inline-svg": "^0.2.1", "ember-load-initializers": "^1.1.0", "ember-maybe-import-regenerator": "^0.1.6", From 6d63a420bfd442e6b9152b7c616e6cea3250d0b6 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Mon, 25 Mar 2019 21:24:32 -0700 Subject: [PATCH 29/46] Commit the deprecation workflow to prevent fixed deprecations from creeping back in --- ui/config/deprecation-workflow.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 ui/config/deprecation-workflow.js diff --git a/ui/config/deprecation-workflow.js b/ui/config/deprecation-workflow.js new file mode 100644 index 00000000000..f195cdb81e4 --- /dev/null +++ b/ui/config/deprecation-workflow.js @@ -0,0 +1,10 @@ +/* global self */ +self.deprecationWorkflow = self.deprecationWorkflow || {}; +self.deprecationWorkflow.config = { + workflow: [ + { handler: 'throw', matchId: 'ember-inflector.globals' }, + { handler: 'silence', matchId: 'ember-runtime.deprecate-copy-copyable' }, + { handler: 'silence', matchId: 'ember-console.deprecate-logger' }, + { handler: 'silence', matchId: 'ember-component.send-action' }, + ], +}; From 23729ad5a7d0cb1c1383d8329303433bed5ddfe4 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Mon, 25 Mar 2019 21:55:06 -0700 Subject: [PATCH 30/46] Address the copy/copyable deprecation --- ui/app/components/distribution-bar.js | 3 ++- ui/app/serializers/application.js | 2 +- ui/app/serializers/task-group.js | 2 +- ui/app/serializers/token.js | 2 +- ui/app/services/watch-list.js | 2 +- ui/app/utils/json-with-default.js | 2 +- ui/config/deprecation-workflow.js | 2 +- ui/mirage/config.js | 3 +-- ui/package.json | 1 + ui/yarn.lock | 2 +- 10 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ui/app/components/distribution-bar.js b/ui/app/components/distribution-bar.js index c02b217ff40..e9e5e152830 100644 --- a/ui/app/components/distribution-bar.js +++ b/ui/app/components/distribution-bar.js @@ -2,7 +2,8 @@ import Component from '@ember/component'; import { computed, observer, set } from '@ember/object'; import { run } from '@ember/runloop'; import { assign } from '@ember/polyfills'; -import { guidFor, copy } from '@ember/object/internals'; +import { guidFor } from '@ember/object/internals'; +import { copy } from 'ember-copy'; import d3 from 'd3-selection'; import 'd3-transition'; import WindowResizable from '../mixins/window-resizable'; diff --git a/ui/app/serializers/application.js b/ui/app/serializers/application.js index 34c6f6069a6..9546f297256 100644 --- a/ui/app/serializers/application.js +++ b/ui/app/serializers/application.js @@ -1,4 +1,4 @@ -import { copy } from '@ember/object/internals'; +import { copy } from 'ember-copy'; import { get } from '@ember/object'; import { makeArray } from '@ember/array'; import JSONSerializer from 'ember-data/serializers/json'; diff --git a/ui/app/serializers/task-group.js b/ui/app/serializers/task-group.js index a834250c98e..1e52947c303 100644 --- a/ui/app/serializers/task-group.js +++ b/ui/app/serializers/task-group.js @@ -1,4 +1,4 @@ -import { copy } from '@ember/object/internals'; +import { copy } from 'ember-copy'; import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ diff --git a/ui/app/serializers/token.js b/ui/app/serializers/token.js index 7ac46e61157..06a73676cb3 100644 --- a/ui/app/serializers/token.js +++ b/ui/app/serializers/token.js @@ -1,4 +1,4 @@ -import { copy } from '@ember/object/internals'; +import { copy } from 'ember-copy'; import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ diff --git a/ui/app/services/watch-list.js b/ui/app/services/watch-list.js index 4387c40c43c..1b669dd0c8a 100644 --- a/ui/app/services/watch-list.js +++ b/ui/app/services/watch-list.js @@ -1,5 +1,5 @@ import { readOnly } from '@ember/object/computed'; -import { copy } from '@ember/object/internals'; +import { copy } from 'ember-copy'; import Service from '@ember/service'; let list = {}; diff --git a/ui/app/utils/json-with-default.js b/ui/app/utils/json-with-default.js index d71fa93ba9b..840fefb1465 100644 --- a/ui/app/utils/json-with-default.js +++ b/ui/app/utils/json-with-default.js @@ -1,4 +1,4 @@ -import { copy } from '@ember/object/internals'; +import { copy } from 'ember-copy'; // Used with fetch. // Fetch only goes into the promise catch if there is a network error. diff --git a/ui/config/deprecation-workflow.js b/ui/config/deprecation-workflow.js index f195cdb81e4..05794993ea4 100644 --- a/ui/config/deprecation-workflow.js +++ b/ui/config/deprecation-workflow.js @@ -3,7 +3,7 @@ self.deprecationWorkflow = self.deprecationWorkflow || {}; self.deprecationWorkflow.config = { workflow: [ { handler: 'throw', matchId: 'ember-inflector.globals' }, - { handler: 'silence', matchId: 'ember-runtime.deprecate-copy-copyable' }, + { handler: 'throw', matchId: 'ember-runtime.deprecate-copy-copyable' }, { handler: 'silence', matchId: 'ember-console.deprecate-logger' }, { handler: 'silence', matchId: 'ember-component.send-action' }, ], diff --git a/ui/mirage/config.js b/ui/mirage/config.js index c98588b5ce6..ef6e97ff956 100644 --- a/ui/mirage/config.js +++ b/ui/mirage/config.js @@ -4,8 +4,7 @@ import { HOSTS } from './common'; import { logFrames, logEncode } from './data/logs'; import { generateDiff } from './factories/job-version'; import { generateTaskGroupFailures } from './factories/evaluation'; - -const { copy } = Ember; +import { copy } from 'ember-copy'; export function findLeader(schema) { const agent = schema.agents.first(); diff --git a/ui/package.json b/ui/package.json index 08d646286b3..bbd5b285c97 100644 --- a/ui/package.json +++ b/ui/package.json @@ -62,6 +62,7 @@ "ember-cli-uglify": "^2.1.0", "ember-composable-helpers": "^2.0.3", "ember-concurrency": "^0.8.12", + "ember-copy": "^1.0.0", "ember-data": "~3.4.0", "ember-data-model-fragments": "3.3.0", "ember-export-application-global": "^2.0.0", diff --git a/ui/yarn.lock b/ui/yarn.lock index 243a45dc780..9fd5cfd74a1 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -4950,7 +4950,7 @@ ember-concurrency@^0.8.26: ember-cli-babel "^6.8.2" ember-maybe-import-regenerator "^0.1.5" -ember-copy@1.0.0: +ember-copy@1.0.0, ember-copy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-copy/-/ember-copy-1.0.0.tgz#426554ba6cf65920f31d24d0a3ca2cb1be16e4aa" integrity sha512-aiZNAvOmdemHdvZNn0b5b/0d9g3JFpcOsrDgfhYEbfd7SzE0b69YiaVK2y3wjqfjuuiA54vOllGN4pjSzECNSw== From e74873f9c171f15ea9f8d49c211ce14b074288b8 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Mon, 25 Mar 2019 22:27:47 -0700 Subject: [PATCH 31/46] Address the Ember.Logger deprecations --- ui/app/utils/classes/log.js | 4 ++-- ui/config/deprecation-workflow.js | 2 +- ui/package.json | 16 ++++--------- ui/yarn.lock | 39 +++++++++++++++++++++---------- 4 files changed, 34 insertions(+), 27 deletions(-) diff --git a/ui/app/utils/classes/log.js b/ui/app/utils/classes/log.js index 989570e9537..e97c1a02a03 100644 --- a/ui/app/utils/classes/log.js +++ b/ui/app/utils/classes/log.js @@ -1,4 +1,3 @@ -import Ember from 'ember'; import { alias } from '@ember/object/computed'; import { assert } from '@ember/debug'; import Evented from '@ember/object/evented'; @@ -11,7 +10,8 @@ import PollLogger from 'nomad-ui/utils/classes/poll-logger'; const MAX_OUTPUT_LENGTH = 50000; -export const fetchFailure = url => () => Ember.Logger.warn(`LOG FETCH: Couldn't connect to ${url}`); +// eslint-disable-next-line +export const fetchFailure = url => () => console.warn(`LOG FETCH: Couldn't connect to ${url}`); const Log = EmberObject.extend(Evented, { // Parameters diff --git a/ui/config/deprecation-workflow.js b/ui/config/deprecation-workflow.js index 05794993ea4..68e17d57a10 100644 --- a/ui/config/deprecation-workflow.js +++ b/ui/config/deprecation-workflow.js @@ -4,7 +4,7 @@ self.deprecationWorkflow.config = { workflow: [ { handler: 'throw', matchId: 'ember-inflector.globals' }, { handler: 'throw', matchId: 'ember-runtime.deprecate-copy-copyable' }, - { handler: 'silence', matchId: 'ember-console.deprecate-logger' }, + { handler: 'throw', matchId: 'ember-console.deprecate-logger' }, { handler: 'silence', matchId: 'ember-component.send-action' }, ], }; diff --git a/ui/package.json b/ui/package.json index bbd5b285c97..b395e6eacab 100644 --- a/ui/package.json +++ b/ui/package.json @@ -16,14 +16,8 @@ "test": "./node_modules/ember-cli/bin/ember test" }, "lint-staged": { - "'{app,tests,config,lib,mirage}/**/*.js'": [ - "prettier --write", - "git add" - ], - "'app/styles/**/*.*'": [ - "prettier --write", - "git add" - ] + "'{app,tests,config,lib,mirage}/**/*.js'": ["prettier --write", "git add"], + "'app/styles/**/*.*'": ["prettier --write", "git add"] }, "devDependencies": { "@babel/plugin-proposal-object-rest-spread": "^7.3.4", @@ -72,7 +66,7 @@ "ember-inline-svg": "^0.2.1", "ember-load-initializers": "^1.1.0", "ember-maybe-import-regenerator": "^0.1.6", - "ember-moment": "^7.5.0", + "ember-moment": "^7.8.1", "ember-native-dom-helpers": "^0.5.4", "ember-power-select": "^2.2.3", "ember-resolver": "^5.0.1", @@ -99,9 +93,7 @@ }, "private": true, "ember-addon": { - "paths": [ - "lib/bulma" - ] + "paths": ["lib/bulma"] }, "dependencies": { "lru_map": "^0.3.3" diff --git a/ui/yarn.lock b/ui/yarn.lock index 9fd5cfd74a1..a3d9e7f1fd3 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -4394,7 +4394,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.0" semver "^5.4.1" -ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.8.0: +ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.18.0, ember-cli-babel@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -5021,6 +5021,13 @@ ember-factory-for-polyfill@^1.1.0: dependencies: ember-cli-version-checker "^1.2.0" +ember-factory-for-polyfill@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/ember-factory-for-polyfill/-/ember-factory-for-polyfill-1.3.1.tgz#b446ed64916d293c847a4955240eb2c993b86eae" + integrity sha512-y3iG2iCzH96lZMTWQw6LWNLAfOmDC4pXKbZP6FxG8lt7GGaNFkZjwsf+Z5GAe7kxfD7UG4lVkF7x37K82rySGA== + dependencies: + ember-cli-version-checker "^2.1.0" + ember-fetch@^3.4.3: version "3.4.4" resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-3.4.4.tgz#926ffa1c4120324b298c44e9558b458e586eb504" @@ -5063,6 +5070,14 @@ ember-getowner-polyfill@^2.0.0, ember-getowner-polyfill@^2.0.1: ember-cli-version-checker "^1.2.0" ember-factory-for-polyfill "^1.1.0" +ember-getowner-polyfill@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz#38e7dccbcac69d5ec694000329ec0b2be651d2b2" + integrity sha512-rwGMJgbGzxIAiWYjdpAh04Abvt0s3HuS/VjHzUFhVyVg2pzAuz45B9AzOxYXzkp88vFC7FPaiA4kE8NxNk4A4Q== + dependencies: + ember-cli-version-checker "^2.1.0" + ember-factory-for-polyfill "^1.3.1" + ember-inflector@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.0.1.tgz#e9ac469ffa17992a43276bb1c9b8d87992b10d37" @@ -5112,12 +5127,12 @@ ember-lodash@^4.17.3: ember-cli-babel "^6.4.1" lodash-es "^4.17.4" -ember-macro-helpers@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/ember-macro-helpers/-/ember-macro-helpers-0.17.0.tgz#5e64a49f476e38c1916aff75f949455533cd1abe" - integrity sha1-XmSkn0duOMGRav91+UlFVTPNGr4= +ember-macro-helpers@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-macro-helpers/-/ember-macro-helpers-2.2.0.tgz#682bb887fda0679fd82cf981190f6dbba20b6e03" + integrity sha512-/ah3k6GFyrAxA2EE8XzNcrk1BlLw34TXgb+1tNdbWQj8pPoP0Notc00xiEXUDgwJ6kTT3KaEBujFyuIbwe3rsw== dependencies: - ember-cli-babel "^6.6.0" + ember-cli-babel "^6.18.0" ember-cli-string-utils "^1.1.0" ember-cli-test-info "^1.0.0" ember-weakmap "^3.0.0" @@ -5139,14 +5154,14 @@ ember-maybe-in-element@^0.2.0: dependencies: ember-cli-babel "^7.1.0" -ember-moment@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-7.5.0.tgz#9ed25b32ae941b2f1d9116c44f518a52bdb01722" - integrity sha1-ntJbMq6UGy8dkRbET1GKUr2wFyI= +ember-moment@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-7.8.1.tgz#6f77cf941d1a92e231b2f4b810e113b2fae50c5f" + integrity sha512-qEMWvJYOGGgyusUE9b+2wU7uWUG8aHkzdE6NBtGjaX5NU8SeByQkH8RkA+QKZonWQH3JncdbG6UBqRO1Ng3DYA== dependencies: ember-cli-babel "^6.7.2" - ember-getowner-polyfill "^2.0.1" - ember-macro-helpers "^0.17.0" + ember-getowner-polyfill "^2.2.0" + ember-macro-helpers "^2.1.0" ember-native-dom-helpers@^0.5.3, ember-native-dom-helpers@^0.5.4: version "0.5.10" From d5896208a18092ff216a4facb743869bab3a2279 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 26 Mar 2019 00:10:51 -0700 Subject: [PATCH 32/46] Kind of address the sendAction deprecation --- ui/config/deprecation-workflow.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/config/deprecation-workflow.js b/ui/config/deprecation-workflow.js index 68e17d57a10..7082caeb400 100644 --- a/ui/config/deprecation-workflow.js +++ b/ui/config/deprecation-workflow.js @@ -5,6 +5,8 @@ self.deprecationWorkflow.config = { { handler: 'throw', matchId: 'ember-inflector.globals' }, { handler: 'throw', matchId: 'ember-runtime.deprecate-copy-copyable' }, { handler: 'throw', matchId: 'ember-console.deprecate-logger' }, - { handler: 'silence', matchId: 'ember-component.send-action' }, + // Only used in ivy-codemirror. + // PR open: https://github.com/IvyApp/ivy-codemirror/pull/40/files + { handler: 'log', matchId: 'ember-component.send-action' }, ], }; From f6232f181729915a08b8e57325080792462dc266 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 26 Mar 2019 00:46:44 -0700 Subject: [PATCH 33/46] ES5 getters codemod --- ui/app/adapters/job.js | 2 +- ui/app/adapters/token.js | 2 +- ui/app/adapters/watchable.js | 20 ++-- ui/app/components/allocation-row.js | 18 ++-- ui/app/components/allocation-status-bar.js | 4 +- ui/app/components/children-status-bar.js | 4 +- ui/app/components/client-node-row.js | 14 +-- ui/app/components/distribution-bar.js | 12 +-- .../freestyle/sg-distribution-bar.js | 2 +- ui/app/components/freestyle/sg-line-chart.js | 4 +- .../components/freestyle/sg-progress-bar.js | 4 +- .../freestyle/sg-stats-time-series.js | 6 +- ui/app/components/freestyle/sg-table.js | 8 +- ui/app/components/gutter-menu.js | 2 +- ui/app/components/job-deployments-stream.js | 4 +- ui/app/components/job-editor.js | 16 ++-- .../job-page/parameterized-child.js | 2 +- .../job-page/parts/latest-deployment.js | 2 +- ui/app/components/job-page/parts/title.js | 8 +- ui/app/components/job-page/periodic-child.js | 2 +- ui/app/components/job-page/periodic.js | 2 +- ui/app/components/job-row.js | 2 +- ui/app/components/job-versions-stream.js | 2 +- ui/app/components/json-viewer.js | 2 +- ui/app/components/line-chart.js | 92 ++++++++----------- ui/app/components/list-accordion.js | 8 +- ui/app/components/list-pagination.js | 14 +-- ui/app/components/list-table.js | 2 +- ui/app/components/list-table/sort-by.js | 4 +- ui/app/components/multi-select-dropdown.js | 14 +-- ui/app/components/primary-metric.js | 30 +++--- ui/app/components/region-switcher.js | 2 +- ui/app/components/reschedule-event-row.js | 2 +- ui/app/components/search-box.js | 6 +- ui/app/components/server-agent-row.js | 6 +- ui/app/components/stats-time-series.js | 16 ++-- ui/app/components/task-group-row.js | 2 +- ui/app/components/task-log.js | 32 +++---- ui/app/components/task-row.js | 14 +-- ui/app/components/two-step-button.js | 2 +- ui/app/controllers/application.js | 16 ++-- ui/app/controllers/clients/index.js | 17 ++-- ui/app/controllers/jobs/index.js | 19 ++-- ui/app/controllers/jobs/job/definition.js | 2 +- ui/app/controllers/settings/tokens.js | 10 +- ui/app/mixins/searchable.js | 24 ++--- ui/app/mixins/sortable.js | 6 +- ui/app/mixins/window-resizable.js | 6 +- .../with-component-visibility-detection.js | 6 +- ui/app/mixins/with-forbidden-state.js | 2 +- .../mixins/with-route-visibility-detection.js | 6 +- ui/app/mixins/with-watchers.js | 2 +- ui/app/models/agent.js | 4 +- ui/app/models/allocation.js | 16 ++-- ui/app/models/deployment.js | 16 ++-- ui/app/models/job.js | 48 +++++----- ui/app/models/node-attributes.js | 4 +- ui/app/models/node-driver.js | 4 +- ui/app/models/node.js | 14 +-- ui/app/models/task-group.js | 8 +- ui/app/models/task-state.js | 4 +- ui/app/routes/allocations/allocation.js | 2 +- ui/app/routes/application.js | 4 +- ui/app/routes/clients.js | 4 +- ui/app/routes/clients/client.js | 4 +- ui/app/routes/clients/index.js | 2 +- ui/app/routes/freestyle.js | 2 +- ui/app/routes/jobs.js | 2 +- ui/app/routes/jobs/index.js | 2 +- ui/app/routes/jobs/job.js | 2 +- ui/app/routes/jobs/job/allocations.js | 2 +- ui/app/routes/jobs/job/definition.js | 2 +- ui/app/routes/jobs/job/deployments.js | 4 +- ui/app/routes/jobs/job/evaluations.js | 2 +- ui/app/routes/jobs/job/index.js | 12 +-- ui/app/routes/jobs/job/task-group.js | 6 +- ui/app/routes/jobs/job/versions.js | 2 +- ui/app/routes/jobs/run.js | 4 +- ui/app/routes/servers.js | 4 +- ui/app/services/breadcrumbs.js | 4 +- ui/app/services/stats-trackers-registry.js | 2 +- ui/app/services/system.js | 24 +++-- ui/app/services/token.js | 2 +- ui/app/utils/classes/abstract-logger.js | 6 +- .../utils/classes/abstract-stats-tracker.js | 8 +- .../utils/classes/allocation-stats-tracker.js | 22 ++--- ui/app/utils/classes/log.js | 20 ++-- ui/app/utils/classes/node-stats-tracker.js | 16 ++-- ui/app/utils/classes/poll-logger.js | 10 +- ui/app/utils/classes/stream-logger.js | 12 +-- ui/app/utils/properties/watch.js | 12 +-- 91 files changed, 396 insertions(+), 428 deletions(-) diff --git a/ui/app/adapters/job.js b/ui/app/adapters/job.js index efc18efea44..a75da89d301 100644 --- a/ui/app/adapters/job.js +++ b/ui/app/adapters/job.js @@ -78,7 +78,7 @@ export default Watchable.extend({ plan(job) { const jobId = job.get('id'); - const store = this.get('store'); + const store = this.store; const url = addToPath(this.urlForFindRecord(jobId, 'job'), '/plan'); return this.ajax(url, 'POST', { diff --git a/ui/app/adapters/token.js b/ui/app/adapters/token.js index 8b8a8b25072..7db3882484d 100644 --- a/ui/app/adapters/token.js +++ b/ui/app/adapters/token.js @@ -8,7 +8,7 @@ export default ApplicationAdapter.extend({ findSelf() { return this.ajax(`${this.buildURL()}/token/self`, 'GET').then(token => { - const store = this.get('store'); + const store = this.store; store.pushPayload('token', { tokens: [token], }); diff --git a/ui/app/adapters/watchable.js b/ui/app/adapters/watchable.js index 7974bef4004..c4fbc5ad822 100644 --- a/ui/app/adapters/watchable.js +++ b/ui/app/adapters/watchable.js @@ -42,9 +42,9 @@ export default ApplicationAdapter.extend({ if (previousBeforeSend) { previousBeforeSend(...arguments); } - this.get('xhrs').track(key, jqXHR); + this.xhrs.track(key, jqXHR); jqXHR.always(() => { - this.get('xhrs').remove(key, jqXHR); + this.xhrs.remove(key, jqXHR); }); }; @@ -60,7 +60,7 @@ export default ApplicationAdapter.extend({ const url = this.urlForFindAll(type.modelName); if (get(snapshotRecordArray || {}, 'adapterOptions.watch')) { - params.index = this.get('watchList').getIndexFor(url); + params.index = this.watchList.getIndexFor(url); } return this.ajax(url, 'GET', { @@ -73,7 +73,7 @@ export default ApplicationAdapter.extend({ params = assign(queryString.parse(params) || {}, this.buildQuery(), additionalParams); if (get(snapshot || {}, 'adapterOptions.watch')) { - params.index = this.get('watchList').getIndexFor(url); + params.index = this.watchList.getIndexFor(url); } return this.ajax(url, 'GET', { @@ -97,7 +97,7 @@ export default ApplicationAdapter.extend({ let params = {}; if (watch) { - params.index = this.get('watchList').getIndexFor(url); + params.index = this.watchList.getIndexFor(url); } // Avoid duplicating existing query params by passing them to ajax @@ -113,7 +113,7 @@ export default ApplicationAdapter.extend({ data: params, }).then( json => { - const store = this.get('store'); + const store = this.store; const normalizeMethod = relationship.kind === 'belongsTo' ? 'normalizeFindBelongsToResponse' @@ -138,7 +138,7 @@ export default ApplicationAdapter.extend({ // case sensitive. const newIndex = headers['x-nomad-index'] || headers['X-Nomad-Index']; if (newIndex) { - this.get('watchList').setIndexFor(requestData.url, newIndex); + this.watchList.setIndexFor(requestData.url, newIndex); } return this._super(...arguments); @@ -149,7 +149,7 @@ export default ApplicationAdapter.extend({ return; } const url = this.urlForFindRecord(id, modelName); - this.get('xhrs').cancel(`GET ${url}`); + this.xhrs.cancel(`GET ${url}`); }, cancelFindAll(modelName) { @@ -161,7 +161,7 @@ export default ApplicationAdapter.extend({ if (params) { url = `${url}?${params}`; } - this.get('xhrs').cancel(`GET ${url}`); + this.xhrs.cancel(`GET ${url}`); }, cancelReloadRelationship(model, relationshipName) { @@ -175,7 +175,7 @@ export default ApplicationAdapter.extend({ ); } else { const url = model[relationship.kind](relationship.key).link(); - this.get('xhrs').cancel(`GET ${url}`); + this.xhrs.cancel(`GET ${url}`); } }, }); diff --git a/ui/app/components/allocation-row.js b/ui/app/components/allocation-row.js index e720ac1b5ce..52fb12f6bd3 100644 --- a/ui/app/components/allocation-row.js +++ b/ui/app/components/allocation-row.js @@ -30,8 +30,8 @@ export default Component.extend({ if (!this.get('allocation.isRunning')) return; return AllocationStatsTracker.create({ - fetch: url => this.get('token').authorizedRequest(url), - allocation: this.get('allocation'), + fetch: url => this.token.authorizedRequest(url), + allocation: this.allocation, }); }), @@ -41,22 +41,22 @@ export default Component.extend({ onClick() {}, click(event) { - lazyClick([this.get('onClick'), event]); + lazyClick([this.onClick, event]); }, didReceiveAttrs() { - const allocation = this.get('allocation'); + const allocation = this.allocation; if (allocation) { run.scheduleOnce('afterRender', this, qualifyAllocation); } else { - this.get('fetchStats').cancelAll(); + this.fetchStats.cancelAll(); } }, fetchStats: task(function*() { do { - if (this.get('stats')) { + if (this.stats) { try { yield this.get('stats.poll').perform(); this.set('statsError', false); @@ -66,14 +66,14 @@ export default Component.extend({ } yield timeout(500); - } while (this.get('enablePolling')); + } while (this.enablePolling); }).drop(), }); function qualifyAllocation() { - const allocation = this.get('allocation'); + const allocation = this.allocation; return allocation.reload().then(() => { - this.get('fetchStats').perform(); + this.fetchStats.perform(); // Make sure that the job record in the store for this allocation // is complete and not a partial from the list endpoint diff --git a/ui/app/components/allocation-status-bar.js b/ui/app/components/allocation-status-bar.js index 5322ac97eab..6e3046570a8 100644 --- a/ui/app/components/allocation-status-bar.js +++ b/ui/app/components/allocation-status-bar.js @@ -11,11 +11,11 @@ export default DistributionBar.extend({ data: computed( 'allocationContainer.{queuedAllocs,completeAllocs,failedAllocs,runningAllocs,startingAllocs}', function() { - if (!this.get('allocationContainer')) { + if (!this.allocationContainer) { return []; } - const allocs = this.get('allocationContainer').getProperties( + const allocs = this.allocationContainer.getProperties( 'queuedAllocs', 'completeAllocs', 'failedAllocs', diff --git a/ui/app/components/children-status-bar.js b/ui/app/components/children-status-bar.js index b95b4f24050..63c62e48197 100644 --- a/ui/app/components/children-status-bar.js +++ b/ui/app/components/children-status-bar.js @@ -9,11 +9,11 @@ export default DistributionBar.extend({ 'data-test-children-status-bar': true, data: computed('job.{pendingChildren,runningChildren,deadChildren}', function() { - if (!this.get('job')) { + if (!this.job) { return []; } - const children = this.get('job').getProperties( + const children = this.job.getProperties( 'pendingChildren', 'runningChildren', 'deadChildren' diff --git a/ui/app/components/client-node-row.js b/ui/app/components/client-node-row.js index 2e465ce3fc6..947ae6e9a82 100644 --- a/ui/app/components/client-node-row.js +++ b/ui/app/components/client-node-row.js @@ -15,32 +15,32 @@ export default Component.extend(WithVisibilityDetection, { onClick() {}, click(event) { - lazyClick([this.get('onClick'), event]); + lazyClick([this.onClick, event]); }, didReceiveAttrs() { // Reload the node in order to get detail information - const node = this.get('node'); + const node = this.node; if (node) { node.reload().then(() => { - this.get('watch').perform(node, 100); + this.watch.perform(node, 100); }); } }, visibilityHandler() { if (document.hidden) { - this.get('watch').cancelAll(); + this.watch.cancelAll(); } else { - const node = this.get('node'); + const node = this.node; if (node) { - this.get('watch').perform(node, 100); + this.watch.perform(node, 100); } } }, willDestroy() { - this.get('watch').cancelAll(); + this.watch.cancelAll(); this._super(...arguments); }, diff --git a/ui/app/components/distribution-bar.js b/ui/app/components/distribution-bar.js index e9e5e152830..adc7d972c35 100644 --- a/ui/app/components/distribution-bar.js +++ b/ui/app/components/distribution-bar.js @@ -24,7 +24,7 @@ export default Component.extend(WindowResizable, { maskId: null, _data: computed('data', function() { - const data = copy(this.get('data'), true); + const data = copy(this.data, true); const sum = data.mapBy('value').reduce(sumAggregate, 0); return data.map(({ label, value, className, layers }, index) => ({ @@ -74,7 +74,7 @@ export default Component.extend(WindowResizable, { // prettier-ignore /* eslint-disable */ renderChart() { - const { chart, _data, isNarrow } = this.getProperties('chart', '_data', 'isNarrow'); + const { chart, _data, isNarrow } = this; const width = this.$('svg').width(); const filteredData = _data.filter(d => d.value > 0); filteredData.forEach((d, index) => { @@ -90,7 +90,7 @@ export default Component.extend(WindowResizable, { .append('g') .on('mouseenter', d => { run(() => { - const slices = this.get('slices'); + const slices = this.slices; const slice = slices.filter(datum => datum.label === d.label); slices.classed('active', false).classed('inactive', true); slice.classed('active', true).classed('inactive', false); @@ -110,7 +110,7 @@ export default Component.extend(WindowResizable, { slices = slices.merge(slicesEnter); slices.attr('class', d => { const className = d.className || `slice-${_data.indexOf(d)}` - const activeDatum = this.get('activeDatum'); + const activeDatum = this.activeDatum; const isActive = activeDatum && activeDatum.label === d.label; const isInactive = activeDatum && activeDatum.label !== d.label; return [ className, isActive && 'active', isInactive && 'inactive' ].compact().join(' '); @@ -149,7 +149,7 @@ export default Component.extend(WindowResizable, { .attr('width', setWidth) .attr('x', setOffset) .attr('y', () => isNarrow ? '50%' : 0) - .attr('clip-path', `url(#${this.get('maskId')})`) + .attr('clip-path', `url(#${this.maskId})`) .attr('height', () => isNarrow ? '6px' : '100%') .attr('transform', () => isNarrow ? 'translate(0, -3)' : '') .merge(layers) @@ -160,7 +160,7 @@ export default Component.extend(WindowResizable, { .attr('x', setOffset) if (isNarrow) { - d3.select(this.get('element')).select('.mask') + d3.select(this.element).select('.mask') .attr('height', '6px') .attr('y', '50%'); } diff --git a/ui/app/components/freestyle/sg-distribution-bar.js b/ui/app/components/freestyle/sg-distribution-bar.js index 7c1f5c57907..f4e2f80431e 100644 --- a/ui/app/components/freestyle/sg-distribution-bar.js +++ b/ui/app/components/freestyle/sg-distribution-bar.js @@ -14,7 +14,7 @@ export default Component.extend({ }.on('init'), willDestroy() { - clearInterval(this.get('timer')); + clearInterval(this.timer); }, distributionBarDatum: computed(() => { diff --git a/ui/app/components/freestyle/sg-line-chart.js b/ui/app/components/freestyle/sg-line-chart.js index 1da331dc4f3..a5c2466586c 100644 --- a/ui/app/components/freestyle/sg-line-chart.js +++ b/ui/app/components/freestyle/sg-line-chart.js @@ -11,7 +11,7 @@ export default Component.extend({ setInterval(() => { this.incrementProperty('timerTicks'); - const ref = this.get('lineChartLive'); + const ref = this.lineChartLive; ref.addObject({ ts: Date.now(), val: Math.random() * 30 + 20 }); if (ref.length > 60) { ref.splice(0, ref.length - 60); @@ -21,7 +21,7 @@ export default Component.extend({ }.on('init'), willDestroy() { - clearInterval(this.get('timer')); + clearInterval(this.timer); }, lineChartData: computed(() => { diff --git a/ui/app/components/freestyle/sg-progress-bar.js b/ui/app/components/freestyle/sg-progress-bar.js index 613bc08e9bd..9748dd60332 100644 --- a/ui/app/components/freestyle/sg-progress-bar.js +++ b/ui/app/components/freestyle/sg-progress-bar.js @@ -14,7 +14,7 @@ export default Component.extend({ }.on('init'), willDestroy() { - clearInterval(this.get('timer')); + clearInterval(this.timer); }, denominator: computed('timerTicks', function() { @@ -26,7 +26,7 @@ export default Component.extend({ }), numerator: computed('denominator', 'percentage', function() { - return Math.round(this.get('denominator') * this.get('percentage') * 100) / 100; + return Math.round(this.denominator * this.percentage * 100) / 100; }), liveDetails: computed('denominator', 'numerator', 'percentage', function() { diff --git a/ui/app/components/freestyle/sg-stats-time-series.js b/ui/app/components/freestyle/sg-stats-time-series.js index ac2a445979f..e84fa0fd92a 100644 --- a/ui/app/components/freestyle/sg-stats-time-series.js +++ b/ui/app/components/freestyle/sg-stats-time-series.js @@ -10,14 +10,14 @@ export default Component.extend({ this.set( 'timer', setInterval(() => { - const metricsHigh = this.get('metricsHigh'); + const metricsHigh = this.metricsHigh; const prev = metricsHigh.length ? metricsHigh[metricsHigh.length - 1].value : 0.9; this.appendTSValue( metricsHigh, Math.min(Math.max(prev + Math.random() * 0.05 - 0.025, 0.5), 1) ); - const metricsLow = this.get('metricsLow'); + const metricsLow = this.metricsLow; const prev2 = metricsLow.length ? metricsLow[metricsLow.length - 1].value : 0.1; this.appendTSValue( metricsLow, @@ -39,7 +39,7 @@ export default Component.extend({ }, willDestroy() { - clearInterval(this.get('timer')); + clearInterval(this.timer); }, metricsHigh: computed(() => { diff --git a/ui/app/components/freestyle/sg-table.js b/ui/app/components/freestyle/sg-table.js index da8112e19ac..759abc8724c 100644 --- a/ui/app/components/freestyle/sg-table.js +++ b/ui/app/components/freestyle/sg-table.js @@ -107,12 +107,12 @@ export default Component.extend({ ], filteredShortList: computed('searchTerm', 'shortList.[]', function() { - const term = this.get('searchTerm').toLowerCase(); - return this.get('shortList').filter(product => product.name.toLowerCase().includes(term)); + const term = this.searchTerm.toLowerCase(); + return this.shortList.filter(product => product.name.toLowerCase().includes(term)); }), sortedShortList: computed('shortList.[]', 'sortProperty', 'sortDescending', function() { - const sorted = this.get('shortList').sortBy(this.get('sortProperty')); - return this.get('sortDescending') ? sorted.reverse() : sorted; + const sorted = this.shortList.sortBy(this.sortProperty); + return this.sortDescending ? sorted.reverse() : sorted; }), }); diff --git a/ui/app/components/gutter-menu.js b/ui/app/components/gutter-menu.js index 66db45e8f93..6c7871ecc56 100644 --- a/ui/app/components/gutter-menu.js +++ b/ui/app/components/gutter-menu.js @@ -37,7 +37,7 @@ export default Component.extend({ gotoJobsForNamespace(namespace) { if (!namespace || !namespace.get('id')) return; - this.get('router').transitionTo('jobs', { + this.router.transitionTo('jobs', { queryParams: { namespace: namespace.get('id') }, }); }, diff --git a/ui/app/components/job-deployments-stream.js b/ui/app/components/job-deployments-stream.js index 0ddb5fedb23..4679117b9e5 100644 --- a/ui/app/components/job-deployments-stream.js +++ b/ui/app/components/job-deployments-stream.js @@ -9,13 +9,13 @@ export default Component.extend({ deployments: computed(() => []), sortedDeployments: computed('deployments.@each.versionSubmitTime', function() { - return this.get('deployments') + return this.deployments .sortBy('versionSubmitTime') .reverse(); }), annotatedDeployments: computed('sortedDeployments.@each.version', function() { - const deployments = this.get('sortedDeployments'); + const deployments = this.sortedDeployments; return deployments.map((deployment, index) => { const meta = {}; diff --git a/ui/app/components/job-editor.js b/ui/app/components/job-editor.js index 2620954dce6..fa4bf4e8fa8 100644 --- a/ui/app/components/job-editor.js +++ b/ui/app/components/job-editor.js @@ -16,7 +16,7 @@ export default Component.extend({ onSubmit() {}, context: computed({ get() { - return this.get('_context'); + return this._context; }, set(key, value) { const allowedValues = ['new', 'edit']; @@ -39,14 +39,14 @@ export default Component.extend({ showEditorMessage: localStorageProperty('nomadMessageJobEditor', true), stage: computed('planOutput', function() { - return this.get('planOutput') ? 'plan' : 'editor'; + return this.planOutput ? 'plan' : 'editor'; }), plan: task(function*() { this.reset(); try { - yield this.get('job').parse(); + yield this.job.parse(); } catch (err) { const error = messageFromAdapterError(err) || 'Could not parse input'; this.set('parseError', error); @@ -55,7 +55,7 @@ export default Component.extend({ } try { - const plan = yield this.get('job').plan(); + const plan = yield this.job.plan(); this.set('planOutput', plan); } catch (err) { const error = messageFromAdapterError(err) || 'Could not plan job'; @@ -66,10 +66,10 @@ export default Component.extend({ submit: task(function*() { try { - if (this.get('context') === 'new') { - yield this.get('job').run(); + if (this.context === 'new') { + yield this.job.run(); } else { - yield this.get('job').update(); + yield this.job.update(); } const id = this.get('job.plainId'); @@ -78,7 +78,7 @@ export default Component.extend({ this.reset(); // Treat the job as ephemeral and only provide ID parts. - this.get('onSubmit')(id, namespace); + this.onSubmit(id, namespace); } catch (err) { const error = messageFromAdapterError(err) || 'Could not submit job'; this.set('runError', error); diff --git a/ui/app/components/job-page/parameterized-child.js b/ui/app/components/job-page/parameterized-child.js index 841c6fa6004..c7b167befa5 100644 --- a/ui/app/components/job-page/parameterized-child.js +++ b/ui/app/components/job-page/parameterized-child.js @@ -7,7 +7,7 @@ export default PeriodicChildJobPage.extend({ payloadJSON: computed('payload', function() { let json; try { - json = JSON.parse(this.get('payload')); + json = JSON.parse(this.payload); } catch (e) { // Swallow error and fall back to plain text rendering } diff --git a/ui/app/components/job-page/parts/latest-deployment.js b/ui/app/components/job-page/parts/latest-deployment.js index b68978520d1..c9d2f3873cb 100644 --- a/ui/app/components/job-page/parts/latest-deployment.js +++ b/ui/app/components/job-page/parts/latest-deployment.js @@ -18,7 +18,7 @@ export default Component.extend({ if (!message || message === 'Forbidden') { message = 'Your ACL token does not grant permission to promote deployments.'; } - this.get('handleError')({ + this.handleError({ title: 'Could Not Promote Deployment', description: message, }); diff --git a/ui/app/components/job-page/parts/title.js b/ui/app/components/job-page/parts/title.js index ba328462726..2e65dfc25b4 100644 --- a/ui/app/components/job-page/parts/title.js +++ b/ui/app/components/job-page/parts/title.js @@ -12,12 +12,12 @@ export default Component.extend({ stopJob: task(function*() { try { - const job = this.get('job'); + const job = this.job; yield job.stop(); // Eagerly update the job status to avoid flickering this.job.set('status', 'dead'); } catch (err) { - this.get('handleError')({ + this.handleError({ title: 'Could Not Stop Job', description: 'Your ACL token does not grant permission to stop jobs.', }); @@ -25,7 +25,7 @@ export default Component.extend({ }), startJob: task(function*() { - const job = this.get('job'); + const job = this.job; const definition = yield job.fetchRawDefinition(); delete definition.Stop; @@ -42,7 +42,7 @@ export default Component.extend({ message = 'Your ACL token does not grant permission to stop jobs.'; } - this.get('handleError')({ + this.handleError({ title: 'Could Not Start Job', description: message, }); diff --git a/ui/app/components/job-page/periodic-child.js b/ui/app/components/job-page/periodic-child.js index 060627d9360..4eda0ed4dee 100644 --- a/ui/app/components/job-page/periodic-child.js +++ b/ui/app/components/job-page/periodic-child.js @@ -3,7 +3,7 @@ import { computed } from '@ember/object'; export default AbstractJobPage.extend({ breadcrumbs: computed('job.{name,id}', 'job.parent.{name,id}', function() { - const job = this.get('job'); + const job = this.job; const parent = this.get('job.parent'); return [ diff --git a/ui/app/components/job-page/periodic.js b/ui/app/components/job-page/periodic.js index a36338c7c64..c108fc2ab99 100644 --- a/ui/app/components/job-page/periodic.js +++ b/ui/app/components/job-page/periodic.js @@ -8,7 +8,7 @@ export default AbstractJobPage.extend({ actions: { forceLaunch() { - this.get('job') + this.job .forcePeriodic() .catch(() => { this.set('errorMessage', { diff --git a/ui/app/components/job-row.js b/ui/app/components/job-row.js index 2b17061eb6e..4d55fd71ad4 100644 --- a/ui/app/components/job-row.js +++ b/ui/app/components/job-row.js @@ -13,6 +13,6 @@ export default Component.extend({ onClick() {}, click(event) { - lazyClick([this.get('onClick'), event]); + lazyClick([this.onClick, event]); }, }); diff --git a/ui/app/components/job-versions-stream.js b/ui/app/components/job-versions-stream.js index 460d0b9a244..5d2f0d43e67 100644 --- a/ui/app/components/job-versions-stream.js +++ b/ui/app/components/job-versions-stream.js @@ -12,7 +12,7 @@ export default Component.extend({ verbose: true, annotatedVersions: computed('versions.[]', function() { - const versions = this.get('versions') + const versions = this.versions .sortBy('submitTime') .reverse(); return versions.map((version, index) => { diff --git a/ui/app/components/json-viewer.js b/ui/app/components/json-viewer.js index 95e27c6db84..63185cfc87c 100644 --- a/ui/app/components/json-viewer.js +++ b/ui/app/components/json-viewer.js @@ -6,6 +6,6 @@ export default Component.extend({ json: null, jsonStr: computed('json', function() { - return JSON.stringify(this.get('json'), null, 2); + return JSON.stringify(this.json, null, 2); }), }); diff --git a/ui/app/components/line-chart.js b/ui/app/components/line-chart.js index 2998993cd20..d09d2d1a517 100644 --- a/ui/app/components/line-chart.js +++ b/ui/app/components/line-chart.js @@ -58,20 +58,20 @@ export default Component.extend(WindowResizable, { activeDatum: null, activeDatumLabel: computed('activeDatum', function() { - const datum = this.get('activeDatum'); + const datum = this.activeDatum; if (!datum) return; - const x = datum[this.get('xProp')]; - return this.xFormat(this.get('timeseries'))(x); + const x = datum[this.xProp]; + return this.xFormat(this.timeseries)(x); }), activeDatumValue: computed('activeDatum', function() { - const datum = this.get('activeDatum'); + const datum = this.activeDatum; if (!datum) return; - const y = datum[this.get('yProp')]; + const y = datum[this.yProp]; return this.yFormat()(y); }), @@ -88,19 +88,19 @@ export default Component.extend(WindowResizable, { tooltipStyle: styleStringProperty('tooltipPosition'), xScale: computed('data.[]', 'xProp', 'timeseries', 'yAxisOffset', function() { - const xProp = this.get('xProp'); - const scale = this.get('timeseries') ? d3Scale.scaleTime() : d3Scale.scaleLinear(); - const data = this.get('data'); + const xProp = this.xProp; + const scale = this.timeseries ? d3Scale.scaleTime() : d3Scale.scaleLinear(); + const data = this.data; - const domain = data.length ? d3Array.extent(this.get('data'), d => d[xProp]) : [0, 1]; + const domain = data.length ? d3Array.extent(this.data, d => d[xProp]) : [0, 1]; - scale.rangeRound([10, this.get('yAxisOffset')]).domain(domain); + scale.rangeRound([10, this.yAxisOffset]).domain(domain); return scale; }), xRange: computed('data.[]', 'xFormat', 'xProp', 'timeseries', function() { - const { xProp, timeseries, data } = this.getProperties('xProp', 'timeseries', 'data'); + const { xProp, timeseries, data } = this; const range = d3Array.extent(data, d => d[xProp]); const formatter = this.xFormat(timeseries); @@ -108,40 +108,40 @@ export default Component.extend(WindowResizable, { }), yRange: computed('data.[]', 'yFormat', 'yProp', function() { - const yProp = this.get('yProp'); - const range = d3Array.extent(this.get('data'), d => d[yProp]); + const yProp = this.yProp; + const range = d3Array.extent(this.data, d => d[yProp]); const formatter = this.yFormat(); return range.map(formatter); }), yScale: computed('data.[]', 'yProp', 'xAxisOffset', function() { - const yProp = this.get('yProp'); - let max = d3Array.max(this.get('data'), d => d[yProp]) || 1; + const yProp = this.yProp; + let max = d3Array.max(this.data, d => d[yProp]) || 1; if (max > 1) { max = nice(max); } return d3Scale .scaleLinear() - .rangeRound([this.get('xAxisOffset'), 10]) + .rangeRound([this.xAxisOffset, 10]) .domain([0, max]); }), xAxis: computed('xScale', function() { - const formatter = this.xFormat(this.get('timeseries')); + const formatter = this.xFormat(this.timeseries); return d3Axis .axisBottom() - .scale(this.get('xScale')) + .scale(this.xScale) .ticks(5) .tickFormat(formatter); }), yTicks: computed('xAxisOffset', function() { - const height = this.get('xAxisOffset'); + const height = this.xAxisOffset; const tickCount = Math.ceil(height / 120) * 2 + 1; - const domain = this.get('yScale').domain(); + const domain = this.yScale.domain(); const ticks = lerp(domain, tickCount); return domain[1] - domain[0] > 1 ? nice(ticks) : ticks; }), @@ -151,20 +151,20 @@ export default Component.extend(WindowResizable, { return d3Axis .axisRight() - .scale(this.get('yScale')) - .tickValues(this.get('yTicks')) + .scale(this.yScale) + .tickValues(this.yTicks) .tickFormat(formatter); }), yGridlines: computed('yScale', function() { // The first gridline overlaps the x-axis, so remove it - const [, ...ticks] = this.get('yTicks'); + const [, ...ticks] = this.yTicks; return d3Axis .axisRight() - .scale(this.get('yScale')) + .scale(this.yScale) .tickValues(ticks) - .tickSize(-this.get('yAxisOffset')) + .tickSize(-this.yAxisOffset) .tickFormat(''); }), @@ -185,20 +185,15 @@ export default Component.extend(WindowResizable, { }), xAxisOffset: computed('height', 'xAxisHeight', function() { - return this.get('height') - this.get('xAxisHeight'); + return this.height - this.xAxisHeight; }), yAxisOffset: computed('width', 'yAxisWidth', function() { - return this.get('width') - this.get('yAxisWidth'); + return this.width - this.yAxisWidth; }), line: computed('data.[]', 'xScale', 'yScale', function() { - const { xScale, yScale, xProp, yProp } = this.getProperties( - 'xScale', - 'yScale', - 'xProp', - 'yProp' - ); + const { xScale, yScale, xProp, yProp } = this; const line = d3Shape .line() @@ -206,16 +201,11 @@ export default Component.extend(WindowResizable, { .x(d => xScale(d[xProp])) .y(d => yScale(d[yProp])); - return line(this.get('data')); + return line(this.data); }), area: computed('data.[]', 'xScale', 'yScale', function() { - const { xScale, yScale, xProp, yProp } = this.getProperties( - 'xScale', - 'yScale', - 'xProp', - 'yProp' - ); + const { xScale, yScale, xProp, yProp } = this; const area = d3Shape .area() @@ -224,7 +214,7 @@ export default Component.extend(WindowResizable, { .y0(yScale(0)) .y1(d => yScale(d[yProp])); - return area(this.get('data')); + return area(this.data); }), didInsertElement() { @@ -258,13 +248,7 @@ export default Component.extend(WindowResizable, { }, updateActiveDatum(mouseX) { - const { xScale, xProp, yScale, yProp, data } = this.getProperties( - 'xScale', - 'xProp', - 'yScale', - 'yProp', - 'data' - ); + const { xScale, xProp, yScale, yProp, data } = this; if (!data || !data.length) return; @@ -318,17 +302,17 @@ export default Component.extend(WindowResizable, { // axis, the axes themselves are recomputed and need to // be re-rendered. this.mountD3Elements(); - if (this.get('isActive')) { - this.updateActiveDatum(this.get('latestMouseX')); + if (this.isActive) { + this.updateActiveDatum(this.latestMouseX); } }); }, mountD3Elements() { - if (!this.get('isDestroyed') && !this.get('isDestroying')) { - d3.select(this.element.querySelector('.x-axis')).call(this.get('xAxis')); - d3.select(this.element.querySelector('.y-axis')).call(this.get('yAxis')); - d3.select(this.element.querySelector('.y-gridlines')).call(this.get('yGridlines')); + if (!this.isDestroyed && !this.isDestroying) { + d3.select(this.element.querySelector('.x-axis')).call(this.xAxis); + d3.select(this.element.querySelector('.y-axis')).call(this.yAxis); + d3.select(this.element.querySelector('.y-gridlines')).call(this.yGridlines); } }, diff --git a/ui/app/components/list-accordion.js b/ui/app/components/list-accordion.js index a7b0ccc41b1..852c112b9c5 100644 --- a/ui/app/components/list-accordion.js +++ b/ui/app/components/list-accordion.js @@ -11,12 +11,12 @@ export default Component.extend({ startExpanded: false, decoratedSource: computed('source.[]', function() { - const stateCache = this.get('stateCache'); - const key = this.get('key'); + const stateCache = this.stateCache; + const key = this.key; const deepKey = `item.${key}`; - const startExpanded = this.get('startExpanded'); + const startExpanded = this.startExpanded; - const decoratedSource = this.get('source').map(item => { + const decoratedSource = this.source.map(item => { const cacheItem = stateCache.findBy(deepKey, get(item, key)); return { item, diff --git a/ui/app/components/list-pagination.js b/ui/app/components/list-pagination.js index c04aaa9f4ff..36f372041cc 100644 --- a/ui/app/components/list-pagination.js +++ b/ui/app/components/list-pagination.js @@ -8,19 +8,19 @@ export default Component.extend({ spread: 2, startsAt: computed('size', 'page', function() { - return (this.get('page') - 1) * this.get('size') + 1; + return (this.page - 1) * this.size + 1; }), endsAt: computed('source.[]', 'size', 'page', function() { - return Math.min(this.get('page') * this.get('size'), this.get('source.length')); + return Math.min(this.page * this.size, this.get('source.length')); }), lastPage: computed('source.[]', 'size', function() { - return Math.ceil(this.get('source.length') / this.get('size')); + return Math.ceil(this.get('source.length') / this.size); }), pageLinks: computed('source.[]', 'page', 'spread', function() { - const { spread, page, lastPage } = this.getProperties('spread', 'page', 'lastPage'); + const { spread, page, lastPage } = this; // When there is only one page, don't bother with page links if (lastPage === 1) { @@ -38,8 +38,8 @@ export default Component.extend({ }), list: computed('source.[]', 'page', 'size', function() { - const size = this.get('size'); - const start = (this.get('page') - 1) * size; - return this.get('source').slice(start, start + size); + const size = this.size; + const start = (this.page - 1) * size; + return this.source.slice(start, start + size); }), }); diff --git a/ui/app/components/list-table.js b/ui/app/components/list-table.js index 0b6d63416e0..1bf0999b958 100644 --- a/ui/app/components/list-table.js +++ b/ui/app/components/list-table.js @@ -9,7 +9,7 @@ export default Component.extend({ // Plan for a future with metadata (e.g., isSelected) decoratedSource: computed('source.[]', function() { - return this.get('source').map(row => ({ + return this.source.map(row => ({ model: row, })); }), diff --git a/ui/app/components/list-table/sort-by.js b/ui/app/components/list-table/sort-by.js index cd6e3fc2ce3..2186eb2e772 100644 --- a/ui/app/components/list-table/sort-by.js +++ b/ui/app/components/list-table/sort-by.js @@ -16,10 +16,10 @@ export default Component.extend({ classNameBindings: ['isActive:is-active', 'sortDescending:desc:asc'], isActive: computed('currentProp', 'prop', function() { - return this.get('currentProp') === this.get('prop'); + return this.currentProp === this.prop; }), shouldSortDescending: computed('sortDescending', 'isActive', function() { - return !this.get('isActive') || !this.get('sortDescending'); + return !this.isActive || !this.sortDescending; }), }); diff --git a/ui/app/components/multi-select-dropdown.js b/ui/app/components/multi-select-dropdown.js index 8fd4a7988fa..d837b0ef8ef 100644 --- a/ui/app/components/multi-select-dropdown.js +++ b/ui/app/components/multi-select-dropdown.js @@ -27,8 +27,8 @@ export default Component.extend({ }, didReceiveAttrs() { - const dropdown = this.get('dropdown'); - if (this.get('isOpen') && dropdown) { + const dropdown = this.dropdown; + if (this.isOpen && dropdown) { run.scheduleOnce('afterRender', () => { dropdown.actions.reposition(); }); @@ -37,22 +37,22 @@ export default Component.extend({ actions: { toggle({ key }) { - const newSelection = this.get('selection').slice(); + const newSelection = this.selection.slice(); if (newSelection.includes(key)) { newSelection.removeObject(key); } else { newSelection.addObject(key); } - this.get('onSelect')(newSelection); + this.onSelect(newSelection); }, openOnArrowDown(dropdown, e) { this.capture(dropdown); - if (!this.get('isOpen') && e.keyCode === ARROW_DOWN) { + if (!this.isOpen && e.keyCode === ARROW_DOWN) { dropdown.actions.open(e); e.preventDefault(); - } else if (this.get('isOpen') && (e.keyCode === TAB || e.keyCode === ARROW_DOWN)) { + } else if (this.isOpen && (e.keyCode === TAB || e.keyCode === ARROW_DOWN)) { const optionsId = this.element.querySelector('.dropdown-trigger').getAttribute('aria-owns'); const firstElement = document.querySelector(`#${optionsId} .dropdown-option`); @@ -66,7 +66,7 @@ export default Component.extend({ traverseList(option, e) { if (e.keyCode === ESC) { // Close the dropdown - const dropdown = this.get('dropdown'); + const dropdown = this.dropdown; if (dropdown) { dropdown.actions.close(e); // Return focus to the trigger so tab works as expected diff --git a/ui/app/components/primary-metric.js b/ui/app/components/primary-metric.js index be5f3a61cdc..3e017d57b46 100644 --- a/ui/app/components/primary-metric.js +++ b/ui/app/components/primary-metric.js @@ -20,24 +20,24 @@ export default Component.extend({ // An instance of a StatsTracker. An alternative interface to resource tracker: computed('trackedResource', 'type', function() { - const resource = this.get('trackedResource'); - return this.get('statsTrackersRegistry').getTracker(resource); + const resource = this.trackedResource; + return this.statsTrackersRegistry.getTracker(resource); }), type: computed('resource', function() { - const resource = this.get('resource'); + const resource = this.resource; return resource && resource.constructor.modelName; }), trackedResource: computed('resource', 'type', function() { // TaskStates use the allocation stats tracker - return this.get('type') === 'task-state' + return this.type === 'task-state' ? this.get('resource.allocation') - : this.get('resource'); + : this.resource; }), metricLabel: computed('metric', function() { - const metric = this.get('metric'); + const metric = this.metric; const mappings = { cpu: 'CPU', memory: 'Memory', @@ -46,10 +46,10 @@ export default Component.extend({ }), data: computed('resource', 'metric', 'type', function() { - if (!this.get('tracker')) return []; + if (!this.tracker) return []; - const metric = this.get('metric'); - if (this.get('type') === 'task-state') { + const metric = this.metric; + if (this.type === 'task-state') { // handle getting the right task out of the tracker const task = this.get('tracker.tasks').findBy('task', this.get('resource.name')); return task && task[metric]; @@ -59,9 +59,9 @@ export default Component.extend({ }), reservedAmount: computed('resource', 'metric', 'type', function() { - const metricProperty = this.get('metric') === 'cpu' ? 'reservedCPU' : 'reservedMemory'; + const metricProperty = this.metric === 'cpu' ? 'reservedCPU' : 'reservedMemory'; - if (this.get('type') === 'task-state') { + if (this.type === 'task-state') { const task = this.get('tracker.tasks').findBy('task', this.get('resource.name')); return task[metricProperty]; } @@ -70,7 +70,7 @@ export default Component.extend({ }), chartClass: computed('metric', function() { - const metric = this.get('metric'); + const metric = this.metric; const mappings = { cpu: 'is-info', memory: 'is-danger', @@ -87,13 +87,13 @@ export default Component.extend({ }), didReceiveAttrs() { - if (this.get('tracker')) { - this.get('poller').perform(); + if (this.tracker) { + this.poller.perform(); } }, willDestroy() { - this.get('poller').cancelAll(); + this.poller.cancelAll(); this.get('tracker.signalPause').perform(); }, }); diff --git a/ui/app/components/region-switcher.js b/ui/app/components/region-switcher.js index 41574a908af..b9fe868b7e9 100644 --- a/ui/app/components/region-switcher.js +++ b/ui/app/components/region-switcher.js @@ -14,7 +14,7 @@ export default Component.extend({ }), gotoRegion(region) { - this.get('router').transitionTo('jobs', { + this.router.transitionTo('jobs', { queryParams: { region }, }); }, diff --git a/ui/app/components/reschedule-event-row.js b/ui/app/components/reschedule-event-row.js index 02fefc3b1da..8072ea29a4e 100644 --- a/ui/app/components/reschedule-event-row.js +++ b/ui/app/components/reschedule-event-row.js @@ -11,7 +11,7 @@ export default Component.extend({ // An allocation can also be provided directly allocation: computed('allocationId', function() { - return this.get('store').findRecord('allocation', this.get('allocationId')); + return this.store.findRecord('allocation', this.allocationId); }), time: null, diff --git a/ui/app/components/search-box.js b/ui/app/components/search-box.js index cb766cce096..25cf7715a1a 100644 --- a/ui/app/components/search-box.js +++ b/ui/app/components/search-box.js @@ -20,18 +20,18 @@ export default Component.extend({ actions: { setSearchTerm(e) { this.set('_searchTerm', e.target.value); - run.debounce(this, updateSearch, this.get('debounce')); + run.debounce(this, updateSearch, this.debounce); }, clear() { this.set('_searchTerm', ''); - run.debounce(this, updateSearch, this.get('debounce')); + run.debounce(this, updateSearch, this.debounce); }, }, }); function updateSearch() { - const newTerm = this.get('_searchTerm'); + const newTerm = this._searchTerm; this.onChange(newTerm); this.set('searchTerm', newTerm); } diff --git a/ui/app/components/server-agent-row.js b/ui/app/components/server-agent-row.js index fb4b72c4930..3bc39539526 100644 --- a/ui/app/components/server-agent-row.js +++ b/ui/app/components/server-agent-row.js @@ -22,8 +22,8 @@ export default Component.extend({ // const targetURL = this.get('router').urlFor('servers.server', this.get('agent')); // const currentURL = `${this.get('router.rootURL').slice(0, -1)}${this.get('router.currentURL')}`; - const router = this.get('router'); - const targetURL = router.generate('servers.server', this.get('agent')); + const router = this.router; + const targetURL = router.generate('servers.server', this.agent); const currentURL = `${router.get('rootURL').slice(0, -1)}${ router.get('currentURL').split('?')[0] }`; @@ -33,7 +33,7 @@ export default Component.extend({ }), click() { - const transition = () => this.get('router').transitionTo('servers.server', this.get('agent')); + const transition = () => this.router.transitionTo('servers.server', this.agent); lazyClick([transition, event]); }, }); diff --git a/ui/app/components/stats-time-series.js b/ui/app/components/stats-time-series.js index fc585487591..932d10f84bb 100644 --- a/ui/app/components/stats-time-series.js +++ b/ui/app/components/stats-time-series.js @@ -24,7 +24,7 @@ export default LineChart.extend({ title: 'Stats Time Series Chart', description: computed('data.[]', 'xProp', 'yProp', function() { - const { xProp, yProp, data } = this.getProperties('data', 'xProp', 'yProp'); + const { xProp, yProp, data } = this; const yRange = d3Array.extent(data, d => d[yProp]); const xRange = d3Array.extent(data, d => d[xProp]); const yFormatter = this.yFormat(); @@ -35,9 +35,9 @@ export default LineChart.extend({ }), xScale: computed('data.[]', 'xProp', 'timeseries', 'yAxisOffset', function() { - const xProp = this.get('xProp'); - const scale = this.get('timeseries') ? d3Scale.scaleTime() : d3Scale.scaleLinear(); - const data = this.get('data'); + const xProp = this.xProp; + const scale = this.timeseries ? d3Scale.scaleTime() : d3Scale.scaleLinear(); + const data = this.data; const [low, high] = d3Array.extent(data, d => d[xProp]); const minLow = moment(high) @@ -45,14 +45,14 @@ export default LineChart.extend({ .toDate(); const extent = data.length ? [Math.min(low, minLow), high] : [minLow, new Date()]; - scale.rangeRound([10, this.get('yAxisOffset')]).domain(extent); + scale.rangeRound([10, this.yAxisOffset]).domain(extent); return scale; }), yScale: computed('data.[]', 'yProp', 'xAxisOffset', function() { - const yProp = this.get('yProp'); - const yValues = (this.get('data') || []).mapBy(yProp); + const yProp = this.yProp; + const yValues = (this.data || []).mapBy(yProp); let [low, high] = [0, 1]; if (yValues.compact().length) { @@ -61,7 +61,7 @@ export default LineChart.extend({ return d3Scale .scaleLinear() - .rangeRound([this.get('xAxisOffset'), 10]) + .rangeRound([this.xAxisOffset, 10]) .domain([Math.min(0, low), Math.max(1, high)]); }), }); diff --git a/ui/app/components/task-group-row.js b/ui/app/components/task-group-row.js index 98753d6158c..9ee2cbe5fa6 100644 --- a/ui/app/components/task-group-row.js +++ b/ui/app/components/task-group-row.js @@ -11,6 +11,6 @@ export default Component.extend({ onClick() {}, click(event) { - lazyClick([this.get('onClick'), event]); + lazyClick([this.onClick, event]); }, }); diff --git a/ui/app/components/task-log.js b/ui/app/components/task-log.js index 2cc8617e436..c40e4a28409 100644 --- a/ui/app/components/task-log.js +++ b/ui/app/components/task-log.js @@ -26,7 +26,7 @@ export default Component.extend(WindowResizable, { serverTimeout: 5000, didReceiveAttrs() { - if (this.get('allocation') && this.get('task')) { + if (this.allocation && this.task) { this.send('toggleStream'); } }, @@ -53,29 +53,29 @@ export default Component.extend(WindowResizable, { const allocation = this.get('allocation.id'); const url = `/v1/client/fs/logs/${allocation}`; - return this.get('useServer') ? url : `//${address}${url}`; + return this.useServer ? url : `//${address}${url}`; }), logParams: computed('task', 'mode', function() { return { - task: this.get('task'), - type: this.get('mode'), + task: this.task, + type: this.mode, }; }), logger: logger('logUrl', 'logParams', function logFetch() { // If the log request can't settle in one second, the client // must be unavailable and the server should be used instead - const timing = this.get('useServer') ? this.get('serverTimeout') : this.get('clientTimeout'); + const timing = this.useServer ? this.serverTimeout : this.clientTimeout; return url => - RSVP.race([this.get('token').authorizedRequest(url), timeout(timing)]).then( + RSVP.race([this.token.authorizedRequest(url), timeout(timing)]).then( response => response, error => { - if (this.get('useServer')) { + if (this.useServer) { this.set('noConnection', true); } else { this.send('failoverToServer'); - this.get('stream').perform(); + this.stream.perform(); } throw error; } @@ -98,32 +98,32 @@ export default Component.extend(WindowResizable, { }), stream: task(function*() { - this.get('logger').on('tick', () => { + this.logger.on('tick', () => { run.scheduleOnce('afterRender', () => { const cliWindow = this.$('.cli-window'); cliWindow.scrollTop(cliWindow[0].scrollHeight); }); }); - yield this.get('logger').startStreaming(); - this.get('logger').off('tick'); + yield this.logger.startStreaming(); + this.logger.off('tick'); }), willDestroy() { - this.get('logger').stop(); + this.logger.stop(); }, actions: { setMode(mode) { - this.get('logger').stop(); + this.logger.stop(); this.set('mode', mode); - this.get('stream').perform(); + this.stream.perform(); }, toggleStream() { if (this.get('logger.isStreaming')) { - this.get('logger').stop(); + this.logger.stop(); } else { - this.get('stream').perform(); + this.stream.perform(); } }, failoverToServer() { diff --git a/ui/app/components/task-row.js b/ui/app/components/task-row.js index 2bb4ef7f55d..393a0fd93a8 100644 --- a/ui/app/components/task-row.js +++ b/ui/app/components/task-row.js @@ -25,11 +25,11 @@ export default Component.extend({ stats: computed('task', 'task.isRunning', function() { if (!this.get('task.isRunning')) return; - return this.get('statsTrackersRegistry').getTracker(this.get('task.allocation')); + return this.statsTrackersRegistry.getTracker(this.get('task.allocation')); }), taskStats: computed('task.name', 'stats.tasks.[]', function() { - if (!this.get('stats')) return; + if (!this.stats) return; return this.get('stats.tasks').findBy('task', this.get('task.name')); }), @@ -40,12 +40,12 @@ export default Component.extend({ onClick() {}, click(event) { - lazyClick([this.get('onClick'), event]); + lazyClick([this.onClick, event]); }, fetchStats: task(function*() { do { - if (this.get('stats')) { + if (this.stats) { try { yield this.get('stats.poll').perform(); this.set('statsError', false); @@ -55,16 +55,16 @@ export default Component.extend({ } yield timeout(500); - } while (this.get('enablePolling')); + } while (this.enablePolling); }).drop(), didReceiveAttrs() { const allocation = this.get('task.allocation'); if (allocation) { - this.get('fetchStats').perform(); + this.fetchStats.perform(); } else { - this.get('fetchStats').cancelAll(); + this.fetchStats.cancelAll(); } }, }); diff --git a/ui/app/components/two-step-button.js b/ui/app/components/two-step-button.js index fe40c16f244..8e7bc05d57b 100644 --- a/ui/app/components/two-step-button.js +++ b/ui/app/components/two-step-button.js @@ -25,7 +25,7 @@ export default Component.extend({ this.set('state', 'prompt'); }, confirm() { - RSVP.resolve(this.get('onConfirm')()).then(() => { + RSVP.resolve(this.onConfirm()).then(() => { this.send('setToIdle'); }); }, diff --git a/ui/app/controllers/application.js b/ui/app/controllers/application.js index da3cdcffff0..7a2934fab7e 100644 --- a/ui/app/controllers/application.js +++ b/ui/app/controllers/application.js @@ -19,39 +19,39 @@ export default Controller.extend({ error: null, errorStr: computed('error', function() { - return this.get('error').toString(); + return this.error.toString(); }), errorCodes: computed('error', function() { - return codesForError(this.get('error')); + return codesForError(this.error); }), is403: computed('errorCodes.[]', function() { - return this.get('errorCodes').includes('403'); + return this.errorCodes.includes('403'); }), is404: computed('errorCodes.[]', function() { - return this.get('errorCodes').includes('404'); + return this.errorCodes.includes('404'); }), is500: computed('errorCodes.[]', function() { - return this.get('errorCodes').includes('500'); + return this.errorCodes.includes('500'); }), isNoLeader: computed('error', function() { - const error = this.get('error'); + const error = this.error; return error instanceof NoLeaderError; }), throwError: observer('error', function() { if (this.get('config.isDev')) { run.next(() => { - throw this.get('error'); + throw this.error; }); } else if (!Ember.testing) { run.next(() => { // eslint-disable-next-line - console.warn('UNRECOVERABLE ERROR:', this.get('error')); + console.warn('UNRECOVERABLE ERROR:', this.error); }); } }), diff --git a/ui/app/controllers/clients/index.js b/ui/app/controllers/clients/index.js index e4e7f771bd8..bc27b69a769 100644 --- a/ui/app/controllers/clients/index.js +++ b/ui/app/controllers/clients/index.js @@ -43,11 +43,11 @@ export default Controller.extend(Sortable, Searchable, { selectionFlags: selection('qpFlags'), optionsClass: computed('nodes.[]', function() { - const classes = Array.from(new Set(this.get('nodes').mapBy('nodeClass'))).compact(); + const classes = Array.from(new Set(this.nodes.mapBy('nodeClass'))).compact(); // Remove any invalid node classes from the query param/selection scheduleOnce('actions', () => { - this.set('qpClass', serialize(intersection(classes, this.get('selectionClass')))); + this.set('qpClass', serialize(intersection(classes, this.selectionClass))); }); return classes.sort().map(dc => ({ key: dc, label: dc })); @@ -60,13 +60,13 @@ export default Controller.extend(Sortable, Searchable, { ]), optionsDatacenter: computed('nodes.[]', function() { - const datacenters = Array.from(new Set(this.get('nodes').mapBy('datacenter'))).compact(); + const datacenters = Array.from(new Set(this.nodes.mapBy('datacenter'))).compact(); // Remove any invalid datacenters from the query param/selection scheduleOnce('actions', () => { this.set( 'qpDatacenter', - serialize(intersection(datacenters, this.get('selectionDatacenter'))) + serialize(intersection(datacenters, this.selectionDatacenter)) ); }); @@ -90,17 +90,12 @@ export default Controller.extend(Sortable, Searchable, { selectionStatus: statuses, selectionDatacenter: datacenters, selectionFlags: flags, - } = this.getProperties( - 'selectionClass', - 'selectionStatus', - 'selectionDatacenter', - 'selectionFlags' - ); + } = this; const onlyIneligible = flags.includes('ineligible'); const onlyDraining = flags.includes('draining'); - return this.get('nodes').filter(node => { + return this.nodes.filter(node => { if (classes.length && !classes.includes(node.get('nodeClass'))) return false; if (statuses.length && !statuses.includes(node.get('status'))) return false; if (datacenters.length && !datacenters.includes(node.get('datacenter'))) return false; diff --git a/ui/app/controllers/jobs/index.js b/ui/app/controllers/jobs/index.js index 529469e8ffa..98ec6ef1a6e 100644 --- a/ui/app/controllers/jobs/index.js +++ b/ui/app/controllers/jobs/index.js @@ -62,7 +62,7 @@ export default Controller.extend(Sortable, Searchable, { optionsDatacenter: computed('visibleJobs.[]', function() { const flatten = (acc, val) => acc.concat(val); const allDatacenters = new Set( - this.get('visibleJobs') + this.visibleJobs .mapBy('datacenters') .reduce(flatten, []) ); @@ -72,7 +72,7 @@ export default Controller.extend(Sortable, Searchable, { scheduleOnce('actions', () => { this.set( 'qpDatacenter', - serialize(intersection(availableDatacenters, this.get('selectionDatacenter'))) + serialize(intersection(availableDatacenters, this.selectionDatacenter)) ); }); @@ -85,7 +85,7 @@ export default Controller.extend(Sortable, Searchable, { const hasPrefix = /.[-._]/; // Collect and count all the prefixes - const allNames = this.get('visibleJobs').mapBy('name'); + const allNames = this.visibleJobs.mapBy('name'); const nameHistogram = allNames.reduce((hist, name) => { if (hasPrefix.test(name)) { const prefix = name.match(/(.+?)[-.]/)[1]; @@ -106,7 +106,7 @@ export default Controller.extend(Sortable, Searchable, { // Remove any invalid prefixes from the query param/selection const availablePrefixes = prefixes.mapBy('prefix'); scheduleOnce('actions', () => { - this.set('qpPrefix', serialize(intersection(availablePrefixes, this.get('selectionPrefix')))); + this.set('qpPrefix', serialize(intersection(availablePrefixes, this.selectionPrefix))); }); // Sort, format, and include the count in the label @@ -126,7 +126,7 @@ export default Controller.extend(Sortable, Searchable, { const hasNamespaces = this.get('system.namespaces.length'); const activeNamespace = this.get('system.activeNamespace.id') || 'default'; - return this.get('model') + return this.model .compact() .filter(job => !hasNamespaces || job.get('namespace.id') === activeNamespace) .filter(job => !job.get('parent.content')); @@ -144,16 +144,11 @@ export default Controller.extend(Sortable, Searchable, { selectionStatus: statuses, selectionDatacenter: datacenters, selectionPrefix: prefixes, - } = this.getProperties( - 'selectionType', - 'selectionStatus', - 'selectionDatacenter', - 'selectionPrefix' - ); + } = this; // A job must match ALL filter facets, but it can match ANY selection within a facet // Always return early to prevent unnecessary facet predicates. - return this.get('visibleJobs').filter(job => { + return this.visibleJobs.filter(job => { if (types.length && !types.includes(job.get('displayType'))) { return false; } diff --git a/ui/app/controllers/jobs/job/definition.js b/ui/app/controllers/jobs/job/definition.js index ff03ba64365..910255c2d14 100644 --- a/ui/app/controllers/jobs/job/definition.js +++ b/ui/app/controllers/jobs/job/definition.js @@ -9,7 +9,7 @@ export default Controller.extend(WithNamespaceResetting, { isEditing: false, edit() { - this.get('job').set('_newDefinition', JSON.stringify(this.get('definition'), null, 2)); + this.job.set('_newDefinition', JSON.stringify(this.definition, null, 2)); this.set('isEditing', true); }, diff --git a/ui/app/controllers/settings/tokens.js b/ui/app/controllers/settings/tokens.js index b226b61dcc6..03a7a793247 100644 --- a/ui/app/controllers/settings/tokens.js +++ b/ui/app/controllers/settings/tokens.js @@ -15,12 +15,12 @@ export default Controller.extend({ tokenRecord: null, resetStore() { - this.get('store').unloadAll(); + this.store.unloadAll(); }, actions: { clearTokenProperties() { - this.get('token').setProperties({ + this.token.setProperties({ secret: undefined, }); this.setProperties({ @@ -32,7 +32,7 @@ export default Controller.extend({ }, verifyToken() { - const { secret } = this.getProperties('secret', 'accessor'); + const { secret } = this; const TokenAdapter = getOwner(this).lookup('adapter:token'); this.set('token.secret', secret); @@ -44,11 +44,11 @@ export default Controller.extend({ // Clear out all data to ensure only data the new token is privileged to // see is shown - this.get('system').reset(); + this.system.reset(); this.resetStore(); // Immediately refetch the token now that the store is empty - const newToken = this.get('store').findRecord('token', tokenId); + const newToken = this.store.findRecord('token', tokenId); this.setProperties({ tokenIsValid: true, diff --git a/ui/app/mixins/searchable.js b/ui/app/mixins/searchable.js index 0dfa9ba3e75..cf39e758b77 100644 --- a/ui/app/mixins/searchable.js +++ b/ui/app/mixins/searchable.js @@ -41,13 +41,13 @@ export default Mixin.create({ // preferable to generalize this rather than risking it being // forgotten on a single page. resetPagination() { - if (this.get('currentPage') != null) { + if (this.currentPage != null) { this.set('currentPage', 1); } }, fuse: computed('listToSearch.[]', 'fuzzySearchProps.[]', function() { - return new Fuse(this.get('listToSearch'), { + return new Fuse(this.listToSearch, { shouldSort: true, threshold: 0.4, location: 0, @@ -56,7 +56,7 @@ export default Mixin.create({ matchAllTokens: true, maxPatternLength: 32, minMatchCharLength: 1, - keys: this.get('fuzzySearchProps') || [], + keys: this.fuzzySearchProps || [], getFn(item, key) { return get(item, key); }, @@ -73,31 +73,31 @@ export default Mixin.create({ 'fuzzySearchProps.[]', 'regexSearchProps.[]', function() { - const searchTerm = this.get('searchTerm').trim(); + const searchTerm = this.searchTerm.trim(); if (!searchTerm || !searchTerm.length) { - return this.get('listToSearch'); + return this.listToSearch; } const results = []; - if (this.get('exactMatchEnabled')) { + if (this.exactMatchEnabled) { results.push( ...exactMatchSearch( searchTerm, - this.get('listToSearch'), - this.get('exactMatchSearchProps') + this.listToSearch, + this.exactMatchSearchProps ) ); } - if (this.get('fuzzySearchEnabled')) { - results.push(...this.get('fuse').search(searchTerm)); + if (this.fuzzySearchEnabled) { + results.push(...this.fuse.search(searchTerm)); } - if (this.get('regexEnabled')) { + if (this.regexEnabled) { results.push( - ...regexSearch(searchTerm, this.get('listToSearch'), this.get('regexSearchProps')) + ...regexSearch(searchTerm, this.listToSearch, this.regexSearchProps) ); } diff --git a/ui/app/mixins/sortable.js b/ui/app/mixins/sortable.js index e6a78aaf919..7a86d3c80d5 100644 --- a/ui/app/mixins/sortable.js +++ b/ui/app/mixins/sortable.js @@ -21,10 +21,10 @@ export default Mixin.create({ listToSort: computed(() => []), listSorted: computed('listToSort.[]', 'sortProperty', 'sortDescending', function() { - const sorted = this.get('listToSort') + const sorted = this.listToSort .compact() - .sortBy(this.get('sortProperty')); - if (this.get('sortDescending')) { + .sortBy(this.sortProperty); + if (this.sortDescending) { return sorted.reverse(); } return sorted; diff --git a/ui/app/mixins/window-resizable.js b/ui/app/mixins/window-resizable.js index 4799bddafaf..5a473f3c1ae 100644 --- a/ui/app/mixins/window-resizable.js +++ b/ui/app/mixins/window-resizable.js @@ -10,12 +10,12 @@ export default Mixin.create({ setupWindowResize: function() { run.scheduleOnce('afterRender', this, () => { - this.set('_windowResizeHandler', this.get('windowResizeHandler').bind(this)); - $(window).on('resize', this.get('_windowResizeHandler')); + this.set('_windowResizeHandler', this.windowResizeHandler.bind(this)); + $(window).on('resize', this._windowResizeHandler); }); }.on('didInsertElement'), removeWindowResize: function() { - $(window).off('resize', this.get('_windowResizeHandler')); + $(window).off('resize', this._windowResizeHandler); }.on('willDestroyElement'), }); diff --git a/ui/app/mixins/with-component-visibility-detection.js b/ui/app/mixins/with-component-visibility-detection.js index 6059378344e..3022d4d36c6 100644 --- a/ui/app/mixins/with-component-visibility-detection.js +++ b/ui/app/mixins/with-component-visibility-detection.js @@ -9,14 +9,14 @@ export default Mixin.create({ setupDocumentVisibility: function() { if (!Ember.testing) { - this.set('_visibilityHandler', this.get('visibilityHandler').bind(this)); - document.addEventListener('visibilitychange', this.get('_visibilityHandler')); + this.set('_visibilityHandler', this.visibilityHandler.bind(this)); + document.addEventListener('visibilitychange', this._visibilityHandler); } }.on('init'), removeDocumentVisibility: function() { if (!Ember.testing) { - document.removeEventListener('visibilitychange', this.get('_visibilityHandler')); + document.removeEventListener('visibilitychange', this._visibilityHandler); } }.on('willDestroy'), }); diff --git a/ui/app/mixins/with-forbidden-state.js b/ui/app/mixins/with-forbidden-state.js index 85f27676a0a..64b8db81e4d 100644 --- a/ui/app/mixins/with-forbidden-state.js +++ b/ui/app/mixins/with-forbidden-state.js @@ -2,7 +2,7 @@ import Mixin from '@ember/object/mixin'; export default Mixin.create({ setupController(controller) { - if (this.get('isForbidden')) { + if (this.isForbidden) { this.set('isForbidden', undefined); controller.set('isForbidden', true); } diff --git a/ui/app/mixins/with-route-visibility-detection.js b/ui/app/mixins/with-route-visibility-detection.js index 57e8300e3a4..4b7b05c244a 100644 --- a/ui/app/mixins/with-route-visibility-detection.js +++ b/ui/app/mixins/with-route-visibility-detection.js @@ -9,14 +9,14 @@ export default Mixin.create({ setupDocumentVisibility: function() { if (!Ember.testing) { - this.set('_visibilityHandler', this.get('visibilityHandler').bind(this)); - document.addEventListener('visibilitychange', this.get('_visibilityHandler')); + this.set('_visibilityHandler', this.visibilityHandler.bind(this)); + document.addEventListener('visibilitychange', this._visibilityHandler); } }.on('activate'), removeDocumentVisibility: function() { if (!Ember.testing) { - document.removeEventListener('visibilitychange', this.get('_visibilityHandler')); + document.removeEventListener('visibilitychange', this._visibilityHandler); } }.on('deactivate'), }); diff --git a/ui/app/mixins/with-watchers.js b/ui/app/mixins/with-watchers.js index ef3337866ec..d96992b74f3 100644 --- a/ui/app/mixins/with-watchers.js +++ b/ui/app/mixins/with-watchers.js @@ -7,7 +7,7 @@ export default Mixin.create(WithVisibilityDetection, { watchers: computed(() => []), cancelAllWatchers() { - this.get('watchers').forEach(watcher => { + this.watchers.forEach(watcher => { assert('Watchers must be Ember Concurrency Tasks.', !!watcher.cancelAll); watcher.cancelAll(); }); diff --git a/ui/app/models/agent.js b/ui/app/models/agent.js index 63bd7d2b017..0c210e69eb5 100644 --- a/ui/app/models/agent.js +++ b/ui/app/models/agent.js @@ -16,11 +16,11 @@ export default Model.extend({ region: attr('string'), rpcAddr: computed('address', 'port', function() { - const { address, rpcPort } = this.getProperties('address', 'rpcPort'); + const { address, rpcPort } = this; return address && rpcPort && `${address}:${rpcPort}`; }), isLeader: computed('system.leader.rpcAddr', function() { - return this.get('system.leader.rpcAddr') === this.get('rpcAddr'); + return this.get('system.leader.rpcAddr') === this.rpcAddr; }), }); diff --git a/ui/app/models/allocation.js b/ui/app/models/allocation.js index f00cf6006ae..b4563bf3969 100644 --- a/ui/app/models/allocation.js +++ b/ui/app/models/allocation.js @@ -36,7 +36,7 @@ export default Model.extend({ clientStatus: attr('string'), desiredStatus: attr('string'), statusIndex: computed('clientStatus', function() { - return STATUS_ORDER[this.get('clientStatus')] || 100; + return STATUS_ORDER[this.clientStatus] || 100; }), isRunning: equal('clientStatus', 'running'), @@ -57,12 +57,12 @@ export default Model.extend({ lost: 'is-light', }; - return classMap[this.get('clientStatus')] || 'is-dark'; + return classMap[this.clientStatus] || 'is-dark'; }), taskGroup: computed('taskGroupName', 'job.taskGroups.[]', function() { const taskGroups = this.get('job.taskGroups'); - return taskGroups && taskGroups.findBy('name', this.get('taskGroupName')); + return taskGroups && taskGroups.findBy('name', this.taskGroupName); }), unhealthyDrivers: computed('taskGroup.drivers.[]', 'node.unhealthyDriverNames.[]', function() { @@ -80,7 +80,7 @@ export default Model.extend({ rescheduleEvents: fragmentArray('reschedule-event'), hasRescheduleEvents: computed('rescheduleEvents.length', 'nextAllocation', function() { - return this.get('rescheduleEvents.length') > 0 || this.get('nextAllocation'); + return this.get('rescheduleEvents.length') > 0 || this.nextAllocation; }), hasStoppedRescheduling: computed( @@ -88,11 +88,9 @@ export default Model.extend({ 'clientStatus', 'followUpEvaluation.content', function() { - return ( - !this.get('nextAllocation.content') && - !this.get('followUpEvaluation.content') && - this.get('clientStatus') === 'failed' - ); + return !this.get('nextAllocation.content') && + !this.get('followUpEvaluation.content') && + this.clientStatus === 'failed'; } ), }); diff --git a/ui/app/models/deployment.js b/ui/app/models/deployment.js index e3fefb94fb9..df7f767bd73 100644 --- a/ui/app/models/deployment.js +++ b/ui/app/models/deployment.js @@ -18,12 +18,10 @@ export default Model.extend({ // If any task group is not promoted yet requires promotion and the deployment // is still running, the deployment needs promotion. requiresPromotion: computed('taskGroupSummaries.@each.promoted', function() { - return ( - this.get('status') === 'running' && - this.get('taskGroupSummaries') - .toArray() - .some(summary => summary.get('requiresPromotion') && !summary.get('promoted')) - ); + return this.status === 'running' && + this.taskGroupSummaries + .toArray() + .some(summary => summary.get('requiresPromotion') && !summary.get('promoted')); }), status: attr('string'), @@ -35,7 +33,7 @@ export default Model.extend({ allocations: hasMany('allocations'), version: computed('versionNumber', 'job.versions.content.@each.number', function() { - return (this.get('job.versions') || []).findBy('number', this.get('versionNumber')); + return (this.get('job.versions') || []).findBy('number', this.versionNumber); }), // Dependent keys can only go one level past an @each so an alias is needed @@ -57,11 +55,11 @@ export default Model.extend({ cancelled: 'is-cancelled', }; - return classMap[this.get('status')] || 'is-dark'; + return classMap[this.status] || 'is-dark'; }), promote() { - assert('A deployment needs to requirePromotion to be promoted', this.get('requiresPromotion')); + assert('A deployment needs to requirePromotion to be promoted', this.requiresPromotion); return this.store.adapterFor('deployment').promote(this); }, }); diff --git a/ui/app/models/job.js b/ui/app/models/job.js index 7ddfdb0d796..c410462767e 100644 --- a/ui/app/models/job.js +++ b/ui/app/models/job.js @@ -32,7 +32,7 @@ export default Model.extend({ parameterizedDetails: attr(), hasChildren: computed('periodic', 'parameterized', 'dispatched', function() { - return this.get('periodic') || (this.get('parameterized') && !this.get('dispatched')); + return this.periodic || (this.parameterized && !this.dispatched); }), parent: belongsTo('job', { inverse: 'children' }), @@ -40,19 +40,19 @@ export default Model.extend({ // The parent job name is prepended to child launch job names trimmedName: computed('name', 'parent', function() { - return this.get('parent.content') ? this.get('name').replace(/.+?\//, '') : this.get('name'); + return this.get('parent.content') ? this.name.replace(/.+?\//, '') : this.name; }), // A composite of type and other job attributes to determine // a better type descriptor for human interpretation rather // than for scheduling. displayType: computed('type', 'periodic', 'parameterized', function() { - if (this.get('periodic')) { + if (this.periodic) { return 'periodic'; - } else if (this.get('parameterized')) { + } else if (this.parameterized) { return 'parameterized'; } - return this.get('type'); + return this.type; }), // A composite of type and other job attributes to determine @@ -64,20 +64,20 @@ export default Model.extend({ 'parent.periodic', 'parent.parameterized', function() { - const type = this.get('type'); + const type = this.type; if (this.get('parent.periodic')) { return 'periodic-child'; } else if (this.get('parent.parameterized')) { return 'parameterized-child'; - } else if (this.get('periodic')) { + } else if (this.periodic) { return 'periodic'; - } else if (this.get('parameterized')) { + } else if (this.parameterized) { return 'parameterized'; } else if (JOB_TYPES.includes(type)) { // Guard against the API introducing a new type before the UI // is prepared to handle it. - return this.get('type'); + return this.type; } // A fail-safe in the event the API introduces a new type. @@ -122,7 +122,7 @@ export default Model.extend({ namespace: belongsTo('namespace'), drivers: computed('taskGroups.@each.drivers', function() { - return this.get('taskGroups') + return this.taskGroups .mapBy('drivers') .reduce((all, drivers) => { all.push(...drivers); @@ -134,7 +134,7 @@ export default Model.extend({ // Getting all unhealthy drivers for a job can be incredibly expensive if the job // has many allocations. This can lead to making an API request for many nodes. unhealthyDrivers: computed('allocations.@each.unhealthyDrivers.[]', function() { - return this.get('allocations') + return this.allocations .mapBy('unhealthyDrivers') .reduce((all, drivers) => { all.push(...drivers); @@ -144,7 +144,7 @@ export default Model.extend({ }), hasBlockedEvaluation: computed('evaluations.@each.isBlocked', function() { - return this.get('evaluations') + return this.evaluations .toArray() .some(evaluation => evaluation.get('isBlocked')); }), @@ -152,7 +152,7 @@ export default Model.extend({ hasPlacementFailures: and('latestFailureEvaluation', 'hasBlockedEvaluation'), latestEvaluation: computed('evaluations.@each.modifyIndex', 'evaluations.isPending', function() { - const evaluations = this.get('evaluations'); + const evaluations = this.evaluations; if (!evaluations || evaluations.get('isPending')) { return null; } @@ -163,7 +163,7 @@ export default Model.extend({ 'evaluations.@each.modifyIndex', 'evaluations.isPending', function() { - const evaluations = this.get('evaluations'); + const evaluations = this.evaluations; if (!evaluations || evaluations.get('isPending')) { return null; } @@ -180,7 +180,7 @@ export default Model.extend({ latestDeployment: belongsTo('deployment', { inverse: 'jobForLatest' }), runningDeployment: computed('latestDeployment', 'latestDeployment.isRunning', function() { - const latest = this.get('latestDeployment'); + const latest = this.latestDeployment; if (latest.get('isRunning')) return latest; }), @@ -197,22 +197,22 @@ export default Model.extend({ }, plan() { - assert('A job must be parsed before planned', this.get('_newDefinitionJSON')); + assert('A job must be parsed before planned', this._newDefinitionJSON); return this.store.adapterFor('job').plan(this); }, run() { - assert('A job must be parsed before ran', this.get('_newDefinitionJSON')); + assert('A job must be parsed before ran', this._newDefinitionJSON); return this.store.adapterFor('job').run(this); }, update() { - assert('A job must be parsed before updated', this.get('_newDefinitionJSON')); + assert('A job must be parsed before updated', this._newDefinitionJSON); return this.store.adapterFor('job').update(this); }, parse() { - const definition = this.get('_newDefinition'); + const definition = this._newDefinition; let promise; try { @@ -221,7 +221,7 @@ export default Model.extend({ this.set('_newDefinitionJSON', json); // You can't set the ID of a record that already exists - if (this.get('isNew')) { + if (this.isNew) { this.setIdByPayload(json); } @@ -231,7 +231,7 @@ export default Model.extend({ // in anyway, the parse endpoint will throw an error. promise = this.store .adapterFor('job') - .parse(this.get('_newDefinition')) + .parse(this._newDefinition) .then(response => { this.set('_newDefinitionJSON', response); this.setIdByPayload(response); @@ -255,7 +255,7 @@ export default Model.extend({ }, resetId() { - this.set('id', JSON.stringify([this.get('plainId'), this.get('namespace.name') || 'default'])); + this.set('id', JSON.stringify([this.plainId, this.get('namespace.name') || 'default'])); }, statusClass: computed('status', function() { @@ -265,13 +265,13 @@ export default Model.extend({ dead: 'is-light', }; - return classMap[this.get('status')] || 'is-dark'; + return classMap[this.status] || 'is-dark'; }), payload: attr('string'), decodedPayload: computed('payload', function() { // Lazily decode the base64 encoded payload - return window.atob(this.get('payload') || ''); + return window.atob(this.payload || ''); }), // An arbitrary HCL or JSON string that is used by the serializer to plan diff --git a/ui/app/models/node-attributes.js b/ui/app/models/node-attributes.js index fef464c5f14..6a699827263 100644 --- a/ui/app/models/node-attributes.js +++ b/ui/app/models/node-attributes.js @@ -9,7 +9,7 @@ export default Fragment.extend({ attributes: attr(), attributesStructured: computed('attributes', function() { - const original = this.get('attributes'); + const original = this.attributes; if (!original) { return; @@ -30,6 +30,6 @@ export default Fragment.extend({ // // ex: nodeAttrs.get('driver.docker') // [ "1", { version: "17.05.0-ce", volumes: { enabled: "1" } } ] - return get(this.get('attributesStructured'), key); + return get(this.attributesStructured, key); }, }); diff --git a/ui/app/models/node-driver.js b/ui/app/models/node-driver.js index 371c5cc4957..b235f864f0d 100644 --- a/ui/app/models/node-driver.js +++ b/ui/app/models/node-driver.js @@ -11,7 +11,7 @@ export default Fragment.extend({ attributesShort: computed('name', 'attributes.attributesStructured', function() { const attributes = this.get('attributes.attributesStructured'); - return get(attributes, `driver.${this.get('name')}`); + return get(attributes, `driver.${this.name}`); }), name: attr('string'), @@ -21,6 +21,6 @@ export default Fragment.extend({ updateTime: attr('date'), healthClass: computed('healthy', function() { - return this.get('healthy') ? 'running' : 'failed'; + return this.healthy ? 'running' : 'failed'; }), }); diff --git a/ui/app/models/node.js b/ui/app/models/node.js index eb86e19db36..412548d3624 100644 --- a/ui/app/models/node.js +++ b/ui/app/models/node.js @@ -31,15 +31,15 @@ export default Model.extend({ isEligible: equal('schedulingEligibility', 'eligible'), address: computed('httpAddr', function() { - return ipParts(this.get('httpAddr')).address; + return ipParts(this.httpAddr).address; }), port: computed('httpAddr', function() { - return ipParts(this.get('httpAddr')).port; + return ipParts(this.httpAddr).port; }), isPartial: computed('httpAddr', function() { - return this.get('httpAddr') == null; + return this.httpAddr == null; }), allocations: hasMany('allocations', { inverse: 'node' }), @@ -48,20 +48,20 @@ export default Model.extend({ events: fragmentArray('node-event'), detectedDrivers: computed('drivers.@each.detected', function() { - return this.get('drivers').filterBy('detected'); + return this.drivers.filterBy('detected'); }), unhealthyDrivers: computed('detectedDrivers.@each.healthy', function() { - return this.get('detectedDrivers').filterBy('healthy', false); + return this.detectedDrivers.filterBy('healthy', false); }), unhealthyDriverNames: computed('unhealthyDrivers.@each.name', function() { - return this.get('unhealthyDrivers').mapBy('name'); + return this.unhealthyDrivers.mapBy('name'); }), // A status attribute that includes states not included in node status. // Useful for coloring and sorting nodes compositeStatus: computed('status', 'isEligible', function() { - return this.get('isEligible') ? this.get('status') : 'ineligible'; + return this.isEligible ? this.status : 'ineligible'; }), }); diff --git a/ui/app/models/task-group.js b/ui/app/models/task-group.js index ab1a37bbe90..0d099117457 100644 --- a/ui/app/models/task-group.js +++ b/ui/app/models/task-group.js @@ -15,13 +15,13 @@ export default Fragment.extend({ tasks: fragmentArray('task'), drivers: computed('tasks.@each.driver', function() { - return this.get('tasks') + return this.tasks .mapBy('driver') .uniq(); }), allocations: computed('job.allocations.@each.taskGroup', function() { - return maybe(this.get('job.allocations')).filterBy('taskGroupName', this.get('name')); + return maybe(this.get('job.allocations')).filterBy('taskGroupName', this.name); }), reservedCPU: sumAggregation('tasks', 'reservedCPU'), @@ -32,7 +32,7 @@ export default Fragment.extend({ placementFailures: computed('job.latestFailureEvaluation.failedTGAllocs.[]', function() { const placementFailures = this.get('job.latestFailureEvaluation.failedTGAllocs'); - return placementFailures && placementFailures.findBy('name', this.get('name')); + return placementFailures && placementFailures.findBy('name', this.name); }), queuedOrStartingAllocs: computed('summary.{queuedAllocs,startingAllocs}', function() { @@ -40,6 +40,6 @@ export default Fragment.extend({ }), summary: computed('job.taskGroupSummaries.[]', function() { - return maybe(this.get('job.taskGroupSummaries')).findBy('name', this.get('name')); + return maybe(this.get('job.taskGroupSummaries')).findBy('name', this.name); }), }); diff --git a/ui/app/models/task-state.js b/ui/app/models/task-state.js index eb1dcd534c1..9ee5f229683 100644 --- a/ui/app/models/task-state.js +++ b/ui/app/models/task-state.js @@ -18,7 +18,7 @@ export default Fragment.extend({ task: computed('allocation.taskGroup.tasks.[]', function() { const tasks = this.get('allocation.taskGroup.tasks'); - return tasks && tasks.findBy('name', this.get('name')); + return tasks && tasks.findBy('name', this.name); }), driver: alias('task.driver'), @@ -41,6 +41,6 @@ export default Fragment.extend({ failed: 'is-error', }; - return classMap[this.get('state')] || 'is-dark'; + return classMap[this.state] || 'is-dark'; }), }); diff --git a/ui/app/routes/allocations/allocation.js b/ui/app/routes/allocations/allocation.js index ec07efe25b4..c884af59298 100644 --- a/ui/app/routes/allocations/allocation.js +++ b/ui/app/routes/allocations/allocation.js @@ -9,7 +9,7 @@ import { jobCrumbs } from 'nomad-ui/utils/breadcrumb-utils'; export default Route.extend(WithWatchers, { startWatchers(controller, model) { if (model) { - controller.set('watcher', this.get('watch').perform(model)); + controller.set('watcher', this.watch.perform(model)); } }, diff --git a/ui/app/routes/application.js b/ui/app/routes/application.js index 477d30c49d3..dbc9baa35e5 100644 --- a/ui/app/routes/application.js +++ b/ui/app/routes/application.js @@ -35,8 +35,8 @@ export default Route.extend({ (queryParam && queryParam !== currentRegion) || (!queryParam && currentRegion !== defaultRegion) ) { - this.get('system').reset(); - this.get('store').unloadAll(); + this.system.reset(); + this.store.unloadAll(); } this.set('system.activeRegion', queryParam || defaultRegion); diff --git a/ui/app/routes/clients.js b/ui/app/routes/clients.js index b31c96990a3..42791cfb54f 100644 --- a/ui/app/routes/clients.js +++ b/ui/app/routes/clients.js @@ -21,8 +21,8 @@ export default Route.extend(WithForbiddenState, { model() { return RSVP.hash({ - nodes: this.get('store').findAll('node'), - agents: this.get('store').findAll('agent'), + nodes: this.store.findAll('node'), + agents: this.store.findAll('agent'), }).catch(notifyForbidden(this)); }, }); diff --git a/ui/app/routes/clients/client.js b/ui/app/routes/clients/client.js index 8af73750342..499d585991d 100644 --- a/ui/app/routes/clients/client.js +++ b/ui/app/routes/clients/client.js @@ -31,8 +31,8 @@ export default Route.extend(WithWatchers, { startWatchers(controller, model) { if (model) { - controller.set('watchModel', this.get('watch').perform(model)); - controller.set('watchAllocations', this.get('watchAllocations').perform(model)); + controller.set('watchModel', this.watch.perform(model)); + controller.set('watchAllocations', this.watchAllocations.perform(model)); } }, diff --git a/ui/app/routes/clients/index.js b/ui/app/routes/clients/index.js index 0d9770e677e..374c8d00722 100644 --- a/ui/app/routes/clients/index.js +++ b/ui/app/routes/clients/index.js @@ -5,7 +5,7 @@ import WithWatchers from 'nomad-ui/mixins/with-watchers'; export default Route.extend(WithWatchers, { startWatchers(controller) { - controller.set('watcher', this.get('watch').perform()); + controller.set('watcher', this.watch.perform()); }, watch: watchAll('node'), diff --git a/ui/app/routes/freestyle.js b/ui/app/routes/freestyle.js index 21534ffe784..84865410869 100644 --- a/ui/app/routes/freestyle.js +++ b/ui/app/routes/freestyle.js @@ -6,7 +6,7 @@ export default Route.extend({ emberFreestyle: service(), beforeModel() { - let emberFreestyle = this.get('emberFreestyle'); + let emberFreestyle = this.emberFreestyle; return emberFreestyle.ensureHljs().then(() => { return RSVP.all([ diff --git a/ui/app/routes/jobs.js b/ui/app/routes/jobs.js index 49564910684..9748013b7b9 100644 --- a/ui/app/routes/jobs.js +++ b/ui/app/routes/jobs.js @@ -30,7 +30,7 @@ export default Route.extend(WithForbiddenState, { }, model() { - return this.get('store') + return this.store .findAll('job', { reload: true }) .catch(notifyForbidden(this)); }, diff --git a/ui/app/routes/jobs/index.js b/ui/app/routes/jobs/index.js index 7529d41045b..38b9ebe188c 100644 --- a/ui/app/routes/jobs/index.js +++ b/ui/app/routes/jobs/index.js @@ -5,7 +5,7 @@ import WithWatchers from 'nomad-ui/mixins/with-watchers'; export default Route.extend(WithWatchers, { startWatchers(controller) { - controller.set('modelWatch', this.get('watch').perform()); + controller.set('modelWatch', this.watch.perform()); }, watch: watchAll('job'), diff --git a/ui/app/routes/jobs/job.js b/ui/app/routes/jobs/job.js index b424fe99706..8685c9ac060 100644 --- a/ui/app/routes/jobs/job.js +++ b/ui/app/routes/jobs/job.js @@ -18,7 +18,7 @@ export default Route.extend({ const namespace = transition.queryParams.namespace || this.get('system.activeNamespace.id'); const name = params.job_name; const fullId = JSON.stringify([name, namespace || 'default']); - return this.get('store') + return this.store .findRecord('job', fullId, { reload: true }) .then(job => { return RSVP.all([job.get('allocations'), job.get('evaluations')]).then(() => job); diff --git a/ui/app/routes/jobs/job/allocations.js b/ui/app/routes/jobs/job/allocations.js index 9b222ed8799..f446ef86ae4 100644 --- a/ui/app/routes/jobs/job/allocations.js +++ b/ui/app/routes/jobs/job/allocations.js @@ -11,7 +11,7 @@ export default Route.extend(WithWatchers, { startWatchers(controller, model) { if (model) { - controller.set('watchAllocations', this.get('watchAllocations').perform(model)); + controller.set('watchAllocations', this.watchAllocations.perform(model)); } }, diff --git a/ui/app/routes/jobs/job/definition.js b/ui/app/routes/jobs/job/definition.js index 90d9e6b0b52..b551bd9b19c 100644 --- a/ui/app/routes/jobs/job/definition.js +++ b/ui/app/routes/jobs/job/definition.js @@ -13,7 +13,7 @@ export default Route.extend({ resetController(controller, isExiting) { if (isExiting) { - const job = controller.get('job'); + const job = controller.job; job.rollbackAttributes(); job.resetId(); controller.set('isEditing', false); diff --git a/ui/app/routes/jobs/job/deployments.js b/ui/app/routes/jobs/job/deployments.js index e5e92e46a1e..699cecf82e6 100644 --- a/ui/app/routes/jobs/job/deployments.js +++ b/ui/app/routes/jobs/job/deployments.js @@ -12,8 +12,8 @@ export default Route.extend(WithWatchers, { startWatchers(controller, model) { if (model) { - controller.set('watchDeployments', this.get('watchDeployments').perform(model)); - controller.set('watchVersions', this.get('watchVersions').perform(model)); + controller.set('watchDeployments', this.watchDeployments.perform(model)); + controller.set('watchVersions', this.watchVersions.perform(model)); } }, diff --git a/ui/app/routes/jobs/job/evaluations.js b/ui/app/routes/jobs/job/evaluations.js index e146abd3fcb..de811fcc31f 100644 --- a/ui/app/routes/jobs/job/evaluations.js +++ b/ui/app/routes/jobs/job/evaluations.js @@ -11,7 +11,7 @@ export default Route.extend(WithWatchers, { startWatchers(controller, model) { if (model) { - controller.set('watchEvaluations', this.get('watchEvaluations').perform(model)); + controller.set('watchEvaluations', this.watchEvaluations.perform(model)); } }, diff --git a/ui/app/routes/jobs/job/index.js b/ui/app/routes/jobs/job/index.js index 30423ce9db5..8e67de5ce66 100644 --- a/ui/app/routes/jobs/job/index.js +++ b/ui/app/routes/jobs/job/index.js @@ -9,13 +9,13 @@ export default Route.extend(WithWatchers, { return; } controller.set('watchers', { - model: this.get('watch').perform(model), - summary: this.get('watchSummary').perform(model.get('summary')), - allocations: this.get('watchAllocations').perform(model), - evaluations: this.get('watchEvaluations').perform(model), + model: this.watch.perform(model), + summary: this.watchSummary.perform(model.get('summary')), + allocations: this.watchAllocations.perform(model), + evaluations: this.watchEvaluations.perform(model), latestDeployment: - model.get('supportsDeployments') && this.get('watchLatestDeployment').perform(model), - list: model.get('hasChildren') && this.get('watchAll').perform(), + model.get('supportsDeployments') && this.watchLatestDeployment.perform(model), + list: model.get('hasChildren') && this.watchAll.perform(), }); }, diff --git a/ui/app/routes/jobs/job/task-group.js b/ui/app/routes/jobs/job/task-group.js index ae7bca40695..134d7e8296e 100644 --- a/ui/app/routes/jobs/job/task-group.js +++ b/ui/app/routes/jobs/job/task-group.js @@ -55,9 +55,9 @@ export default Route.extend(WithWatchers, { if (model) { const job = model.get('job'); controller.set('watchers', { - job: this.get('watchJob').perform(job), - summary: this.get('watchSummary').perform(job.get('summary')), - allocations: this.get('watchAllocations').perform(job), + job: this.watchJob.perform(job), + summary: this.watchSummary.perform(job.get('summary')), + allocations: this.watchAllocations.perform(job), }); } }, diff --git a/ui/app/routes/jobs/job/versions.js b/ui/app/routes/jobs/job/versions.js index 0e1c9de4589..38c850eaff5 100644 --- a/ui/app/routes/jobs/job/versions.js +++ b/ui/app/routes/jobs/job/versions.js @@ -11,7 +11,7 @@ export default Route.extend(WithWatchers, { startWatchers(controller, model) { if (model) { - controller.set('watcher', this.get('watchVersions').perform(model)); + controller.set('watcher', this.watchVersions.perform(model)); } }, diff --git a/ui/app/routes/jobs/run.js b/ui/app/routes/jobs/run.js index 121e9b4ce9e..1cdf52cdfe6 100644 --- a/ui/app/routes/jobs/run.js +++ b/ui/app/routes/jobs/run.js @@ -13,14 +13,14 @@ export default Route.extend({ ], model() { - return this.get('store').createRecord('job', { + return this.store.createRecord('job', { namespace: this.get('system.activeNamespace'), }); }, resetController(controller, isExiting) { if (isExiting) { - controller.get('model').deleteRecord(); + controller.model.deleteRecord(); } }, }); diff --git a/ui/app/routes/servers.js b/ui/app/routes/servers.js index 8f69d7b14f2..6f194933413 100644 --- a/ui/app/routes/servers.js +++ b/ui/app/routes/servers.js @@ -21,8 +21,8 @@ export default Route.extend(WithForbiddenState, { model() { return RSVP.hash({ - nodes: this.get('store').findAll('node'), - agents: this.get('store').findAll('agent'), + nodes: this.store.findAll('node'), + agents: this.store.findAll('agent'), }).catch(notifyForbidden(this)); }, }); diff --git a/ui/app/services/breadcrumbs.js b/ui/app/services/breadcrumbs.js index a86e9c3738f..c820aee5652 100644 --- a/ui/app/services/breadcrumbs.js +++ b/ui/app/services/breadcrumbs.js @@ -22,14 +22,14 @@ export default Service.extend({ // Routes can reset the breadcrumb trail to start anew even // if the route is deeply nested. - if (route.get('resetBreadcrumbs')) { + if (route.resetBreadcrumbs) { crumbs = []; } // Breadcrumbs are either an array of static crumbs // or a function that returns breadcrumbs given the current // model for the route's controller. - let breadcrumbs = route.get('breadcrumbs') || []; + let breadcrumbs = route.breadcrumbs || []; if (typeof breadcrumbs === 'function') { breadcrumbs = breadcrumbs(route.get('controller.model')) || []; } diff --git a/ui/app/services/stats-trackers-registry.js b/ui/app/services/stats-trackers-registry.js index 31f5c383b91..37cbb228ae0 100644 --- a/ui/app/services/stats-trackers-registry.js +++ b/ui/app/services/stats-trackers-registry.js @@ -45,7 +45,7 @@ export default Service.extend({ } const tracker = Constructor.create({ - fetch: url => this.get('token').authorizedRequest(url), + fetch: url => this.token.authorizedRequest(url), [resourceProp]: resource, }); diff --git a/ui/app/services/system.js b/ui/app/services/system.js index 2e49b2b37ba..f14e9012951 100644 --- a/ui/app/services/system.js +++ b/ui/app/services/system.js @@ -10,7 +10,7 @@ export default Service.extend({ store: service(), leader: computed('activeRegion', function() { - const token = this.get('token'); + const token = this.token; return PromiseObject.create({ promise: token @@ -26,7 +26,7 @@ export default Service.extend({ }), defaultRegion: computed(function() { - const token = this.get('token'); + const token = this.token; return PromiseObject.create({ promise: token .authorizedRawRequest(`/${namespace}/agent/members`) @@ -38,7 +38,7 @@ export default Service.extend({ }), regions: computed(function() { - const token = this.get('token'); + const token = this.token; return PromiseArray.create({ promise: token.authorizedRawRequest(`/${namespace}/regions`).then(jsonWithDefault([])), @@ -47,7 +47,7 @@ export default Service.extend({ activeRegion: computed('regions.[]', { get() { - const regions = this.get('regions'); + const regions = this.regions; const region = window.localStorage.nomadActiveRegion; if (regions.includes(region)) { @@ -78,30 +78,28 @@ export default Service.extend({ 'defaultRegion.region', 'shouldShowRegions', function() { - return ( - this.get('shouldShowRegions') && - this.get('activeRegion') !== this.get('defaultRegion.region') - ); + return this.shouldShowRegions && + this.activeRegion !== this.get('defaultRegion.region'); } ), namespaces: computed('activeRegion', function() { return PromiseArray.create({ - promise: this.get('store') + promise: this.store .findAll('namespace') .then(namespaces => namespaces.compact()), }); }), shouldShowNamespaces: computed('namespaces.[]', function() { - const namespaces = this.get('namespaces').toArray(); + const namespaces = this.namespaces.toArray(); return namespaces.length && namespaces.some(namespace => namespace.get('id') !== 'default'); }), activeNamespace: computed('namespaces.[]', { get() { const namespaceId = window.localStorage.nomadActiveNamespace || 'default'; - const namespace = this.get('namespaces').findBy('id', namespaceId); + const namespace = this.namespaces.findBy('id', namespaceId); if (namespace) { return namespace; @@ -110,14 +108,14 @@ export default Service.extend({ // If the namespace in localStorage is no longer in the cluster, it needs to // be cleared from localStorage window.localStorage.removeItem('nomadActiveNamespace'); - return this.get('namespaces').findBy('id', 'default'); + return this.namespaces.findBy('id', 'default'); }, set(key, value) { if (value == null) { window.localStorage.removeItem('nomadActiveNamespace'); } else if (typeof value === 'string') { window.localStorage.nomadActiveNamespace = value; - return this.get('namespaces').findBy('id', value); + return this.namespaces.findBy('id', value); } else { window.localStorage.nomadActiveNamespace = value.get('name'); return value; diff --git a/ui/app/services/token.js b/ui/app/services/token.js index 4fa249dd4b2..f4aece59691 100644 --- a/ui/app/services/token.js +++ b/ui/app/services/token.js @@ -29,7 +29,7 @@ export default Service.extend({ // param since the region cannot be known at this point. authorizedRawRequest(url, options = { credentials: 'include' }) { const headers = {}; - const token = this.get('secret'); + const token = this.secret; if (token) { headers['X-Nomad-Token'] = token; diff --git a/ui/app/utils/classes/abstract-logger.js b/ui/app/utils/classes/abstract-logger.js index 1cb62ec6735..574669ea111 100644 --- a/ui/app/utils/classes/abstract-logger.js +++ b/ui/app/utils/classes/abstract-logger.js @@ -16,7 +16,7 @@ export default Mixin.create({ endOffset: null, offsetParams: computed('endOffset', function() { - const endOffset = this.get('endOffset'); + const endOffset = this.endOffset; return endOffset ? { origin: 'start', offset: endOffset } : { origin: 'end', offset: MAX_OUTPUT_LENGTH }; @@ -26,8 +26,8 @@ export default Mixin.create({ fullUrl: computed('url', 'params', 'offsetParams', 'additionalParams', function() { const queryParams = queryString.stringify( - assign({}, this.get('params'), this.get('offsetParams'), this.get('additionalParams')) + assign({}, this.params, this.offsetParams, this.additionalParams) ); - return `${this.get('url')}?${queryParams}`; + return `${this.url}?${queryParams}`; }), }); diff --git a/ui/app/utils/classes/abstract-stats-tracker.js b/ui/app/utils/classes/abstract-stats-tracker.js index 68f2b5e56fd..ce39bfd795d 100644 --- a/ui/app/utils/classes/abstract-stats-tracker.js +++ b/ui/app/utils/classes/abstract-stats-tracker.js @@ -37,7 +37,7 @@ export default Mixin.create({ handleResponse(frame) { if (frame.error) { this.incrementProperty('frameMisses'); - if (this.get('frameMisses') >= this.get('maxFrameMisses')) { + if (this.frameMisses >= this.maxFrameMisses) { // Missing enough data consecutively is effectively a pause this.pause(); this.set('frameMisses', 0); @@ -57,13 +57,13 @@ export default Mixin.create({ // same tracker is used needs to coordinate. poll: task(function*() { // Interrupt any pause attempt - this.get('signalPause').cancelAll(); + this.signalPause.cancelAll(); try { - const url = this.get('url'); + const url = this.url; assert('Url must be defined', url); - yield this.get('fetch')(url) + yield this.fetch(url) .then(jsonWithDefault({ error: true })) .then(frame => this.handleResponse(frame)); } catch (error) { diff --git a/ui/app/utils/classes/allocation-stats-tracker.js b/ui/app/utils/classes/allocation-stats-tracker.js index 432fb4b24ec..87da6009432 100644 --- a/ui/app/utils/classes/allocation-stats-tracker.js +++ b/ui/app/utils/classes/allocation-stats-tracker.js @@ -24,22 +24,22 @@ const AllocationStatsTracker = EmberObject.extend(AbstractStatsTracker, { const timestamp = new Date(Math.floor(frame.Timestamp / 1000000)); const cpuUsed = Math.floor(frame.ResourceUsage.CpuStats.TotalTicks) || 0; - this.get('cpu').pushObject({ + this.cpu.pushObject({ timestamp, used: cpuUsed, - percent: percent(cpuUsed, this.get('reservedCPU')), + percent: percent(cpuUsed, this.reservedCPU), }); const memoryUsed = frame.ResourceUsage.MemoryStats.RSS; - this.get('memory').pushObject({ + this.memory.pushObject({ timestamp, used: memoryUsed, - percent: percent(memoryUsed / 1024 / 1024, this.get('reservedMemory')), + percent: percent(memoryUsed / 1024 / 1024, this.reservedMemory), }); for (var taskName in frame.Tasks) { const taskFrame = frame.Tasks[taskName]; - const stats = this.get('tasks').findBy('task', taskName); + const stats = this.tasks.findBy('task', taskName); // If for whatever reason there is a task in the frame data that isn't in the // allocation, don't attempt to append data for the task. @@ -65,9 +65,9 @@ const AllocationStatsTracker = EmberObject.extend(AbstractStatsTracker, { pause() { const ts = new Date(); - this.get('memory').pushObject(empty(ts)); - this.get('cpu').pushObject(empty(ts)); - this.get('tasks').forEach(task => { + this.memory.pushObject(empty(ts)); + this.cpu.pushObject(empty(ts)); + this.tasks.forEach(task => { task.memory.pushObject(empty(ts)); task.cpu.pushObject(empty(ts)); }); @@ -80,14 +80,14 @@ const AllocationStatsTracker = EmberObject.extend(AbstractStatsTracker, { // Dynamic figures, collected over time // []{ timestamp: Date, used: Number, percent: Number } cpu: computed('allocation', function() { - return RollingArray(this.get('bufferSize')); + return RollingArray(this.bufferSize); }), memory: computed('allocation', function() { - return RollingArray(this.get('bufferSize')); + return RollingArray(this.bufferSize); }), tasks: computed('allocation', function() { - const bufferSize = this.get('bufferSize'); + const bufferSize = this.bufferSize; const tasks = this.get('allocation.taskGroup.tasks') || []; return tasks.map(task => ({ task: get(task, 'name'), diff --git a/ui/app/utils/classes/log.js b/ui/app/utils/classes/log.js index e97c1a02a03..4f4d9dee379 100644 --- a/ui/app/utils/classes/log.js +++ b/ui/app/utils/classes/log.js @@ -37,7 +37,7 @@ const Log = EmberObject.extend(Evented, { // The top or bottom of the log, depending on whether // the logPointer is pointed at head or tail output: computed('logPointer', 'head', 'tail', function() { - return this.get('logPointer') === 'head' ? this.get('head') : this.get('tail'); + return this.logPointer === 'head' ? this.head : this.tail; }), init() { @@ -45,7 +45,7 @@ const Log = EmberObject.extend(Evented, { const args = this.getProperties('url', 'params', 'logFetch'); args.write = chunk => { - let newTail = this.get('tail') + chunk; + let newTail = this.tail + chunk; if (newTail.length > MAX_OUTPUT_LENGTH) { newTail = newTail.substr(newTail.length - MAX_OUTPUT_LENGTH); } @@ -66,15 +66,15 @@ const Log = EmberObject.extend(Evented, { }, gotoHead: task(function*() { - const logFetch = this.get('logFetch'); + const logFetch = this.logFetch; const queryParams = queryString.stringify( - assign(this.get('params'), { + assign(this.params, { plain: true, origin: 'start', offset: 0, }) ); - const url = `${this.get('url')}?${queryParams}`; + const url = `${this.url}?${queryParams}`; this.stop(); let text = yield logFetch(url).then(res => res.text(), fetchFailure(url)); @@ -88,15 +88,15 @@ const Log = EmberObject.extend(Evented, { }), gotoTail: task(function*() { - const logFetch = this.get('logFetch'); + const logFetch = this.logFetch; const queryParams = queryString.stringify( - assign(this.get('params'), { + assign(this.params, { plain: true, origin: 'end', offset: MAX_OUTPUT_LENGTH, }) ); - const url = `${this.get('url')}?${queryParams}`; + const url = `${this.url}?${queryParams}`; this.stop(); let text = yield logFetch(url).then(res => res.text(), fetchFailure(url)); @@ -107,11 +107,11 @@ const Log = EmberObject.extend(Evented, { startStreaming() { this.set('logPointer', 'tail'); - return this.get('logStreamer').start(); + return this.logStreamer.start(); }, stop() { - this.get('logStreamer').stop(); + this.logStreamer.stop(); }, }); diff --git a/ui/app/utils/classes/node-stats-tracker.js b/ui/app/utils/classes/node-stats-tracker.js index e61fbc27fcc..41312fc87e6 100644 --- a/ui/app/utils/classes/node-stats-tracker.js +++ b/ui/app/utils/classes/node-stats-tracker.js @@ -24,24 +24,24 @@ const NodeStatsTracker = EmberObject.extend(AbstractStatsTracker, { const timestamp = new Date(Math.floor(frame.Timestamp / 1000000)); const cpuUsed = Math.floor(frame.CPUTicksConsumed) || 0; - this.get('cpu').pushObject({ + this.cpu.pushObject({ timestamp, used: cpuUsed, - percent: percent(cpuUsed, this.get('reservedCPU')), + percent: percent(cpuUsed, this.reservedCPU), }); const memoryUsed = frame.Memory.Used; - this.get('memory').pushObject({ + this.memory.pushObject({ timestamp, used: memoryUsed, - percent: percent(memoryUsed / 1024 / 1024, this.get('reservedMemory')), + percent: percent(memoryUsed / 1024 / 1024, this.reservedMemory), }); }, pause() { const ts = new Date(); - this.get('memory').pushObject(empty(ts)); - this.get('cpu').pushObject(empty(ts)); + this.memory.pushObject(empty(ts)); + this.cpu.pushObject(empty(ts)); }, // Static figures, denominators for stats @@ -51,10 +51,10 @@ const NodeStatsTracker = EmberObject.extend(AbstractStatsTracker, { // Dynamic figures, collected over time // []{ timestamp: Date, used: Number, percent: Number } cpu: computed('node', function() { - return RollingArray(this.get('bufferSize')); + return RollingArray(this.bufferSize); }), memory: computed('node', function() { - return RollingArray(this.get('bufferSize')); + return RollingArray(this.bufferSize); }), }); diff --git a/ui/app/utils/classes/poll-logger.js b/ui/app/utils/classes/poll-logger.js index 1ab86a8324f..2c18e3d1463 100644 --- a/ui/app/utils/classes/poll-logger.js +++ b/ui/app/utils/classes/poll-logger.js @@ -7,19 +7,19 @@ export default EmberObject.extend(AbstractLogger, { interval: 1000, start() { - return this.get('poll') + return this.poll .linked() .perform(); }, stop() { - return this.get('poll').cancelAll(); + return this.poll.cancelAll(); }, poll: task(function*() { - const { interval, logFetch } = this.getProperties('interval', 'logFetch'); + const { interval, logFetch } = this; while (true) { - const url = this.get('fullUrl'); + const url = this.fullUrl; let response = yield logFetch(url).then(res => res, fetchFailure(url)); if (!response) { @@ -37,7 +37,7 @@ export default EmberObject.extend(AbstractLogger, { if (frames.length) { frames.forEach(frame => (frame.Data = window.atob(frame.Data))); this.set('endOffset', frames[frames.length - 1].Offset); - this.get('write')(frames.mapBy('Data').join('')); + this.write(frames.mapBy('Data').join('')); } } diff --git a/ui/app/utils/classes/stream-logger.js b/ui/app/utils/classes/stream-logger.js index 94cecb6f72c..aad60a4f904 100644 --- a/ui/app/utils/classes/stream-logger.js +++ b/ui/app/utils/classes/stream-logger.js @@ -12,20 +12,20 @@ export default EmberObject.extend(AbstractLogger, { })), start() { - return this.get('poll').perform(); + return this.poll.perform(); }, stop() { - const reader = this.get('reader'); + const reader = this.reader; if (reader) { reader.cancel(); } - return this.get('poll').cancelAll(); + return this.poll.cancelAll(); }, poll: task(function*() { - const url = this.get('fullUrl'); - const logFetch = this.get('logFetch'); + const url = this.fullUrl; + const logFetch = this.logFetch; let streamClosed = false; let buffer = ''; @@ -66,7 +66,7 @@ export default EmberObject.extend(AbstractLogger, { if (frames.length) { frames.forEach(frame => (frame.Data = window.atob(frame.Data))); this.set('endOffset', frames[frames.length - 1].Offset); - this.get('write')(frames.mapBy('Data').join('')); + this.write(frames.mapBy('Data').join('')); } } }); diff --git a/ui/app/utils/properties/watch.js b/ui/app/utils/properties/watch.js index aec2c6921bb..e5f9464fec2 100644 --- a/ui/app/utils/properties/watch.js +++ b/ui/app/utils/properties/watch.js @@ -15,7 +15,7 @@ export function watchRecord(modelName) { while (isEnabled && !Ember.testing) { try { yield RSVP.all([ - this.get('store').findRecord(modelName, id, { + this.store.findRecord(modelName, id, { reload: true, adapterOptions: { watch: true }, }), @@ -25,7 +25,7 @@ export function watchRecord(modelName) { yield e; break; } finally { - this.get('store') + this.store .adapterFor(modelName) .cancelFindRecord(modelName, id); } @@ -38,7 +38,7 @@ export function watchRelationship(relationshipName) { while (isEnabled && !Ember.testing) { try { yield RSVP.all([ - this.get('store') + this.store .adapterFor(model.constructor.modelName) .reloadRelationship(model, relationshipName, true), wait(throttle), @@ -47,7 +47,7 @@ export function watchRelationship(relationshipName) { yield e; break; } finally { - this.get('store') + this.store .adapterFor(model.constructor.modelName) .cancelReloadRelationship(model, relationshipName); } @@ -60,14 +60,14 @@ export function watchAll(modelName) { while (isEnabled && !Ember.testing) { try { yield RSVP.all([ - this.get('store').findAll(modelName, { reload: true, adapterOptions: { watch: true } }), + this.store.findAll(modelName, { reload: true, adapterOptions: { watch: true } }), wait(throttle), ]); } catch (e) { yield e; break; } finally { - this.get('store') + this.store .adapterFor(modelName) .cancelFindAll(modelName); } From 4c9a026e55b4a9b2cf78dede916a03814f45b7dc Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 26 Mar 2019 16:29:14 -0700 Subject: [PATCH 34/46] Rethink the adapter job unit tests to avoid notifyPropertyChange --- ui/tests/unit/adapters/job-test.js | 92 +++++++++++++++++++----------- 1 file changed, 58 insertions(+), 34 deletions(-) diff --git a/ui/tests/unit/adapters/job-test.js b/ui/tests/unit/adapters/job-test.js index a5028ce1209..34cf5fc9a8e 100644 --- a/ui/tests/unit/adapters/job-test.js +++ b/ui/tests/unit/adapters/job-test.js @@ -17,27 +17,30 @@ module('Unit | Adapter | Job', function(hooks) { window.localStorage.clear(); this.server = startMirage(); - this.server.create('namespace'); - this.server.create('namespace', { id: 'some-namespace' }); - this.server.create('node'); - this.server.create('job', { id: 'job-1', namespaceId: 'default' }); - this.server.create('job', { id: 'job-2', namespaceId: 'some-namespace' }); - - this.server.create('region', { id: 'region-1' }); - this.server.create('region', { id: 'region-2' }); - - this.system = this.owner.lookup('service:system'); - - // Namespace, default region, and all regions are requests that all - // job requests depend on. Fetching them ahead of time means testing - // job adapter behavior in isolation. - await this.system.get('namespaces'); - this.system.get('shouldIncludeRegion'); - await this.system.get('defaultRegion'); - - // Reset the handledRequests array to avoid accounting for this - // namespaces request everywhere. - this.server.pretender.handledRequests.length = 0; + + this.initializeUI = async () => { + this.server.create('namespace'); + this.server.create('namespace', { id: 'some-namespace' }); + this.server.create('node'); + this.server.create('job', { id: 'job-1', namespaceId: 'default' }); + this.server.create('job', { id: 'job-2', namespaceId: 'some-namespace' }); + + this.server.create('region', { id: 'region-1' }); + this.server.create('region', { id: 'region-2' }); + + this.system = this.owner.lookup('service:system'); + + // Namespace, default region, and all regions are requests that all + // job requests depend on. Fetching them ahead of time means testing + // job adapter behavior in isolation. + await this.system.get('namespaces'); + this.system.get('shouldIncludeRegion'); + await this.system.get('defaultRegion'); + + // Reset the handledRequests array to avoid accounting for this + // namespaces request everywhere. + this.server.pretender.handledRequests.length = 0; + }; }); hooks.afterEach(function() { @@ -45,12 +48,13 @@ module('Unit | Adapter | Job', function(hooks) { }); test('The job endpoint is the only required endpoint for fetching a job', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const jobName = 'job-1'; const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - await settled(); this.subject().findRecord(null, { modelName: 'job' }, jobId); assert.deepEqual( @@ -63,13 +67,13 @@ module('Unit | Adapter | Job', function(hooks) { test('When a namespace is set in localStorage but a job in the default namespace is requested, the namespace query param is not present', async function(assert) { window.localStorage.nomadActiveNamespace = 'some-namespace'; + await this.initializeUI(); + const { pretender } = this.server; const jobName = 'job-1'; const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - this.system.get('namespaces'); - await settled(); this.subject().findRecord(null, { modelName: 'job' }, jobId); assert.deepEqual( @@ -82,12 +86,13 @@ module('Unit | Adapter | Job', function(hooks) { test('When a namespace is in localStorage and the requested job is in the default namespace, the namespace query param is left out', async function(assert) { window.localStorage.nomadActiveNamespace = 'red-herring'; + await this.initializeUI(); + const { pretender } = this.server; const jobName = 'job-1'; const jobNamespace = 'default'; const jobId = JSON.stringify([jobName, jobNamespace]); - await settled(); this.subject().findRecord(null, { modelName: 'job' }, jobId); assert.deepEqual( @@ -98,12 +103,13 @@ module('Unit | Adapter | Job', function(hooks) { }); test('When the job has a namespace other than default, it is in the URL', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const jobName = 'job-2'; const jobNamespace = 'some-namespace'; const jobId = JSON.stringify([jobName, jobNamespace]); - await settled(); this.subject().findRecord(null, { modelName: 'job' }, jobId); assert.deepEqual( @@ -114,10 +120,11 @@ module('Unit | Adapter | Job', function(hooks) { }); test('When there is no token set in the token service, no x-nomad-token header is set', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); - await settled(); this.subject().findRecord(null, { modelName: 'job' }, jobId); assert.notOk( @@ -127,11 +134,12 @@ module('Unit | Adapter | Job', function(hooks) { }); test('When a token is set in the token service, then x-nomad-token header is set', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); const secret = 'here is the secret'; - await settled(); this.subject().set('token.secret', secret); this.subject().findRecord(null, { modelName: 'job' }, jobId); @@ -144,6 +152,8 @@ module('Unit | Adapter | Job', function(hooks) { }); test('findAll can be watched', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const request = () => @@ -171,6 +181,8 @@ module('Unit | Adapter | Job', function(hooks) { }); test('findRecord can be watched', async function(assert) { + await this.initializeUI(); + const jobId = JSON.stringify(['job-1', 'default']); const { pretender } = this.server; @@ -199,6 +211,8 @@ module('Unit | Adapter | Job', function(hooks) { }); test('relationships can be reloaded', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const plainId = 'job-1'; const mockModel = makeMockModel(plainId); @@ -213,6 +227,8 @@ module('Unit | Adapter | Job', function(hooks) { }); test('relationship reloads can be watched', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const plainId = 'job-1'; const mockModel = makeMockModel(plainId); @@ -234,6 +250,8 @@ module('Unit | Adapter | Job', function(hooks) { }); test('findAll can be canceled', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; pretender.get('/v1/jobs', () => [200, {}, '[]'], true); @@ -257,6 +275,8 @@ module('Unit | Adapter | Job', function(hooks) { }); test('findRecord can be canceled', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); @@ -280,6 +300,8 @@ module('Unit | Adapter | Job', function(hooks) { }); test('relationship reloads can be canceled', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const plainId = 'job-1'; const mockModel = makeMockModel(plainId); @@ -300,6 +322,8 @@ module('Unit | Adapter | Job', function(hooks) { }); test('requests can be canceled even if multiple requests for the same URL were made', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); @@ -334,6 +358,8 @@ module('Unit | Adapter | Job', function(hooks) { }); test('canceling a find record request will never cancel a request with the same url but different method', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const jobId = JSON.stringify(['job-1', 'default']); @@ -363,6 +389,8 @@ module('Unit | Adapter | Job', function(hooks) { }); test('when there is no region set, requests are made without the region query param', async function(assert) { + await this.initializeUI(); + const { pretender } = this.server; const jobName = 'job-1'; const jobNamespace = 'default'; @@ -383,9 +411,7 @@ module('Unit | Adapter | Job', function(hooks) { const region = 'region-2'; window.localStorage.nomadActiveRegion = region; - // Regions are fetched in the before hook, so manually dirty the activeRegion - // instead of repeating what is in the beforeEach here. - this.system.notifyPropertyChange('activeRegion'); + await this.initializeUI(); const { pretender } = this.server; const jobName = 'job-1'; @@ -406,9 +432,7 @@ module('Unit | Adapter | Job', function(hooks) { test('when the region is set to the default region, requests are made without the region query param', async function(assert) { window.localStorage.nomadActiveRegion = 'region-1'; - // Regions are fetched in the before hook, so manually dirty the activeRegion - // instead of repeating what is in the beforeEach here. - this.system.notifyPropertyChange('activeRegion'); + await this.initializeUI(); const { pretender } = this.server; const jobName = 'job-1'; From 542f124071c67be8a230600ea9f1f19cd994cd92 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Mon, 1 Apr 2019 18:30:11 -0700 Subject: [PATCH 35/46] Auto-upgrade packages --- ui/package.json | 14 +- ui/yarn.lock | 4069 ++++++++++++++++++----------------------------- 2 files changed, 1545 insertions(+), 2538 deletions(-) diff --git a/ui/package.json b/ui/package.json index b395e6eacab..bc86410c0ee 100644 --- a/ui/package.json +++ b/ui/package.json @@ -16,8 +16,14 @@ "test": "./node_modules/ember-cli/bin/ember test" }, "lint-staged": { - "'{app,tests,config,lib,mirage}/**/*.js'": ["prettier --write", "git add"], - "'app/styles/**/*.*'": ["prettier --write", "git add"] + "'{app,tests,config,lib,mirage}/**/*.js'": [ + "prettier --write", + "git add" + ], + "'app/styles/**/*.*'": [ + "prettier --write", + "git add" + ] }, "devDependencies": { "@babel/plugin-proposal-object-rest-spread": "^7.3.4", @@ -93,7 +99,9 @@ }, "private": true, "ember-addon": { - "paths": ["lib/bulma"] + "paths": [ + "lib/bulma" + ] }, "dependencies": { "lru_map": "^0.3.3" diff --git a/ui/yarn.lock b/ui/yarn.lock index a3d9e7f1fd3..0fb6f8a3bbc 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -9,18 +9,18 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.3.3": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b" - integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA== +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.3.3", "@babel/core@^7.3.4": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.0.tgz#248fd6874b7d755010bfe61f557461d4f446d9e9" + integrity sha512-Dzl7U0/T69DFOTwqz/FJdnOSWS57NpjNfCwMKHABr589Lg8uX1RrlBIJ7L5Dubt/xkLsx0xH5EBFzlBVes1ayA== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.3.4" - "@babel/helpers" "^7.2.0" - "@babel/parser" "^7.3.4" - "@babel/template" "^7.2.2" - "@babel/traverse" "^7.3.4" - "@babel/types" "^7.3.4" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.0" + "@babel/parser" "^7.4.0" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -29,12 +29,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" - integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg== +"@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== dependencies: - "@babel/types" "^7.3.4" + "@babel/types" "^7.4.0" jsesc "^2.5.1" lodash "^4.17.11" source-map "^0.5.0" @@ -55,23 +55,35 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-call-delegate@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" - integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== +"@babel/helper-call-delegate@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz#f308eabe0d44f451217853aedf4dea5f6fe3294f" + integrity sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ== dependencies: - "@babel/helper-hoist-variables" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-hoist-variables" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" -"@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" - integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== +"@babel/helper-create-class-features-plugin@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.0.tgz#30fd090e059d021995c1762a5b76798fa0b51d82" + integrity sha512-2K8NohdOT7P6Vyp23QH4w2IleP8yG3UJsbRKwA4YP6H8fErcLkFuuEEqbF2/BYBKSNci/FWJiqm6R3VhM/QHgw== dependencies: "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" + "@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.0" + "@babel/helper-split-export-declaration" "^7.4.0" + +"@babel/helper-define-map@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz#cbfd8c1b2f12708e262c26f600cd16ed6a3bc6c9" + integrity sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.0" + lodash "^4.17.11" "@babel/helper-explode-assignable-expression@^7.1.0": version "7.1.0" @@ -97,12 +109,12 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" - integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== +"@babel/helper-hoist-variables@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz#25b621399ae229869329730a62015bbeb0a6fbd6" + integrity sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.4.0" "@babel/helper-member-expression-to-functions@^7.0.0": version "7.0.0" @@ -160,15 +172,15 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.3.4.tgz#a795208e9b911a6eeb08e5891faacf06e7013e13" - integrity sha512-pvObL9WVf2ADs+ePg0jrqlhHoxRXlOa+SHRHzAXIz2xkYuOHfGl+fKxPMaS4Fq+uje8JQPobnertBBvyrWnQ1A== +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" + integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg== dependencies: "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.3.4" - "@babel/types" "^7.3.4" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" "@babel/helper-simple-access@^7.1.0": version "7.1.0" @@ -178,12 +190,12 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" - integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== +"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" + integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.4.0" "@babel/helper-wrap-function@^7.1.0": version "7.2.0" @@ -195,14 +207,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.2.0": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.3.1.tgz#949eec9ea4b45d3210feb7dc1c22db664c9e44b9" - integrity sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA== +"@babel/helpers@^7.4.0": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.2.tgz#3bdfa46a552ca77ef5a0f8551be5f0845ae989be" + integrity sha512-gQR1eQeroDzFBikhrCccm5Gs2xBjZ57DNjGbqTaHo911IpmSxflOQWMAHPw/TXk8L3isv7s9lYzUkexOeTQUYg== dependencies: - "@babel/template" "^7.1.2" - "@babel/traverse" "^7.1.5" - "@babel/types" "^7.3.0" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" "@babel/highlight@^7.0.0": version "7.0.0" @@ -213,10 +225,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.2.2", "@babel/parser@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" - integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== +"@babel/parser@^7.4.0": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.2.tgz#b4521a400cb5a871eab3890787b4bc1326d38d91" + integrity sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -227,6 +239,23 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" +"@babel/plugin-proposal-class-properties@^7.3.4": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" + integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-decorators@^7.3.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz#8e1bfd83efa54a5f662033afcc2b8e701f4bb3a9" + integrity sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.2.0" + "@babel/plugin-proposal-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" @@ -235,10 +264,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.4.tgz#47f73cf7f2a721aad5c0261205405c642e424654" - integrity sha512-j7VQmbbkA+qrzNqbKHrBsW3ddFnOeva6wzSe/zB7T+xaxGc+RCpwo44wCmRixAIGRoIpmVgvzFzNJqQcO3/9RA== +"@babel/plugin-proposal-object-rest-spread@^7.3.4", "@babel/plugin-proposal-object-rest-spread@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.0.tgz#e4960575205eadf2a1ab4e0c79f9504d5b82a97f" + integrity sha512-uTNi8pPYyUH2eWHyYWWSYJKwKg34hhgl4/dbejEjL+64OhbHjTX7wEVWMQl82tEmdDsGeu77+s8HHLS627h6OQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" @@ -251,14 +280,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" -"@babel/plugin-proposal-unicode-property-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" - integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== +"@babel/plugin-proposal-unicode-property-regex@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz#202d91ee977d760ef83f4f416b280d568be84623" + integrity sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.2.0" + regexpu-core "^4.5.4" "@babel/plugin-syntax-async-generators@^7.2.0": version "7.2.0" @@ -267,6 +296,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-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" @@ -295,10 +331,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.3.4.tgz#4e45408d3c3da231c0e7b823f407a53a7eb3048c" - integrity sha512-Y7nCzv2fw/jEZ9f678MuKdMo99MFDJMT/PvD9LisrR5JDFcJH6vYeH6RnjVt3p5tceyGRvTtEN0VOlU+rgHZjA== +"@babel/plugin-transform-async-to-generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" + integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -311,26 +347,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.3.4.tgz#5c22c339de234076eee96c8783b2fed61202c5c4" - integrity sha512-blRr2O8IOZLAOJklXLV4WhcEzpYafYQKSGT3+R26lWG41u/FODJuBggehtOwilVAcFu393v3OFj+HmaE6tVjhA== +"@babel/plugin-transform-block-scoping@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz#164df3bb41e3deb954c4ca32ffa9fcaa56d30bcb" + integrity sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.11" -"@babel/plugin-transform-classes@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.3.4.tgz#dc173cb999c6c5297e0b5f2277fdaaec3739d0cc" - integrity sha512-J9fAvCFBkXEvBimgYxCjvaVDzL6thk0j0dBvCeZmIUDBwyt+nv6HfbImsSrWsYXfDNDivyANgJlFXDUWRTZBuA== +"@babel/plugin-transform-classes@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.0.tgz#e3428d3c8a3d01f33b10c529b998ba1707043d4d" + integrity sha512-XGg1Mhbw4LDmrO9rSTNe+uI79tQPdGs0YASlxgweYRLZqo/EQktjaOV4tchL/UZbM0F+/94uOipmdNGoaGOEYg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.1.0" + "@babel/helper-define-map" "^7.4.0" "@babel/helper-function-name" "^7.1.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.3.4" - "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.2.0": @@ -340,10 +376,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.2.0": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz#f2f5520be055ba1c38c41c0e094d8a461dd78f2d" - integrity sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw== +"@babel/plugin-transform-destructuring@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.0.tgz#acbb9b2418d290107db333f4d6cd8aa6aea00343" + integrity sha512-HySkoatyYTY3ZwLI8GGvkRWCFrjAGXUHur5sMecmCIdIharnlcWWivOqDJI76vvmVZfzwb6G08NREsrY96RhGQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -371,10 +407,10 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-for-of@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" - integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== +"@babel/plugin-transform-for-of@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.0.tgz#56c8c36677f5d4a16b80b12f7b768de064aaeb5f" + integrity sha512-vWdfCEYLlYSxbsKj5lGtzA49K3KANtb8qCPQ1em07txJzsBwY+cKJzBHizj5fl3CCx7vt+WPdgDLTHmydkbQSQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -401,21 +437,21 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-commonjs@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" - integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== +"@babel/plugin-transform-modules-commonjs@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.0.tgz#3b8ec61714d3b75d20c5ccfa157f2c2e087fd4ca" + integrity sha512-iWKAooAkipG7g1IY0eah7SumzfnIT3WNhT4uYB2kIsvHnNSB6MDYVa5qyICSwaTBDBY2c4SnJ3JtEa6ltJd6Jw== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" -"@babel/plugin-transform-modules-systemjs@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.3.4.tgz#813b34cd9acb6ba70a84939f3680be0eb2e58861" - integrity sha512-VZ4+jlGOF36S7TjKs8g4ojp4MEI+ebCQZdswWb/T9I4X84j8OtFAyjXjt/M16iIm5RIZn0UMQgg/VgIwo/87vw== +"@babel/plugin-transform-modules-systemjs@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz#c2495e55528135797bc816f5d50f851698c586a1" + integrity sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ== dependencies: - "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-hoist-variables" "^7.4.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-modules-umd@^7.2.0": @@ -426,17 +462,17 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz#140b52985b2d6ef0cb092ef3b29502b990f9cd50" - integrity sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz#800391136d6cbcc80728dbdba3c1c6e46f86c12e" + integrity sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ== dependencies: regexp-tree "^0.1.0" -"@babel/plugin-transform-new-target@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" - integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== +"@babel/plugin-transform-new-target@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz#67658a1d944edb53c8d4fa3004473a0dd7838150" + integrity sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -448,26 +484,26 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.1.0" -"@babel/plugin-transform-parameters@^7.2.0": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.3.3.tgz#3a873e07114e1a5bee17d04815662c8317f10e30" - integrity sha512-IrIP25VvXWu/VlBWTpsjGptpomtIkYrN/3aDp4UKm7xK6UxZY88kcJ1UwETbzHAlwN21MnNfwlar0u8y3KpiXw== +"@babel/plugin-transform-parameters@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.0.tgz#a1309426fac4eecd2a9439a4c8c35124a11a48a9" + integrity sha512-Xqv6d1X+doyiuCGDoVJFtlZx0onAX0tnc3dY8w71pv/O0dODAbusVv2Ale3cGOwfiyi895ivOBhYa9DhAM8dUA== dependencies: - "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-call-delegate" "^7.4.0" "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-regenerator@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.3.4.tgz#1601655c362f5b38eead6a52631f5106b29fa46a" - integrity sha512-hvJg8EReQvXT6G9H2MvNPXkv9zK36Vxa1+csAVTpE1J3j0zlHplw76uudEbJxgvqZzAq9Yh45FLD4pk5mKRFQA== +"@babel/plugin-transform-regenerator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.0.tgz#0780e27ee458cc3fdbad18294d703e972ae1f6d1" + integrity sha512-SZ+CgL4F0wm4npojPU6swo/cK4FcbLgxLd4cWpHaNXY/NJ2dpahODCqBbAwb2rDmVszVb3SSjnk9/vik3AYdBw== dependencies: regenerator-transform "^0.13.4" "@babel/plugin-transform-runtime@^7.2.0": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.3.4.tgz#57805ac8c1798d102ecd75c03b024a5b3ea9b431" - integrity sha512-PaoARuztAdd5MgeVjAxnIDAIUet5KpogqaefQvPOmPYCxYoaPhautxDh3aO8a4xHsKgT/b9gSxR0BKK1MIewPA== + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.0.tgz#b4d8c925ed957471bc57e0b9da53408ebb1ed457" + integrity sha512-1uv2h9wnRj98XX3g0l4q+O3jFM6HfayKup7aIu4pnnlzGz0H+cYckGBC74FZIWJXJSXAmeJ9Yu5Gg2RQpS4hWg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -521,97 +557,99 @@ regexpu-core "^4.1.3" "@babel/polyfill@^7.0.0": - version "7.2.5" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.2.5.tgz#6c54b964f71ad27edddc567d065e57e87ed7fa7d" - integrity sha512-8Y/t3MWThtMLYr0YNC/Q76tqN1w30+b0uQMeFUYauG2UGTR19zyUtFrAzT23zNtBxPp+LbE5E/nwV/q/r3y6ug== + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.0.tgz#90f9d68ae34ac42ab4b4aa03151848f536960218" + integrity sha512-bVsjsrtsDflIHp5I6caaAa2V25Kzn50HKPL6g3X0P0ni1ks+58cPB8Mz6AOKVuRPgaVdq/OwEUc/1vKqX+Mo4A== dependencies: - core-js "^2.5.7" - regenerator-runtime "^0.12.0" + core-js "^2.6.5" + regenerator-runtime "^0.13.2" "@babel/preset-env@^7.0.0": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.4.tgz#887cf38b6d23c82f19b5135298bdb160062e33e1" - integrity sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA== + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.2.tgz#2f5ba1de2daefa9dcca653848f96c7ce2e406676" + integrity sha512-OEz6VOZaI9LW08CWVS3d9g/0jZA6YCn1gsKIy/fut7yZCJti5Lm1/Hi+uo/U+ODm7g4I6gULrCP+/+laT8xAsA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-async-generator-functions" "^7.2.0" "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.3.4" + "@babel/plugin-proposal-object-rest-spread" "^7.4.0" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.0" "@babel/plugin-syntax-async-generators" "^7.2.0" "@babel/plugin-syntax-json-strings" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.3.4" + "@babel/plugin-transform-async-to-generator" "^7.4.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.3.4" - "@babel/plugin-transform-classes" "^7.3.4" + "@babel/plugin-transform-block-scoping" "^7.4.0" + "@babel/plugin-transform-classes" "^7.4.0" "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.0" "@babel/plugin-transform-dotall-regex" "^7.2.0" "@babel/plugin-transform-duplicate-keys" "^7.2.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.0" "@babel/plugin-transform-function-name" "^7.2.0" "@babel/plugin-transform-literals" "^7.2.0" "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.2.0" - "@babel/plugin-transform-modules-systemjs" "^7.3.4" + "@babel/plugin-transform-modules-commonjs" "^7.4.0" + "@babel/plugin-transform-modules-systemjs" "^7.4.0" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" - "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.2" + "@babel/plugin-transform-new-target" "^7.4.0" "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.3.4" + "@babel/plugin-transform-parameters" "^7.4.0" + "@babel/plugin-transform-regenerator" "^7.4.0" "@babel/plugin-transform-shorthand-properties" "^7.2.0" "@babel/plugin-transform-spread" "^7.2.0" "@babel/plugin-transform-sticky-regex" "^7.2.0" "@babel/plugin-transform-template-literals" "^7.2.0" "@babel/plugin-transform-typeof-symbol" "^7.2.0" "@babel/plugin-transform-unicode-regex" "^7.2.0" - browserslist "^4.3.4" + "@babel/types" "^7.4.0" + browserslist "^4.4.2" + core-js-compat "^3.0.0" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.3.0" "@babel/runtime@^7.2.0": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" - integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" + integrity sha512-7Bl2rALb7HpvXFL7TETNzKSAeBVCPHELzc0C//9FCxN8nsiueWSJBqaF+2oIJScyILStASR/Cx5WMkXGYTiJFA== dependencies: - regenerator-runtime "^0.12.0" + regenerator-runtime "^0.13.2" -"@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" - integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== +"@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.2.2" - "@babel/types" "^7.2.2" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" - integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.0.tgz#14006967dd1d2b3494cdd650c686db9daf0ddada" + integrity sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.3.4" + "@babel/generator" "^7.4.0" "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.3.4" - "@babel/types" "^7.3.4" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" - integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== +"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" + integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== dependencies: esutils "^2.0.2" lodash "^4.17.11" @@ -670,9 +708,9 @@ "@glimmer/wire-format" "^0.38.1" "@glimmer/di@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.0.tgz#73bfd4a6ee4148a80bf092e8a5d29bcac9d4ce7e" - integrity sha1-c7/Upu5BSKgL8JLopdKbysnUzn4= + version "0.2.1" + resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.1.tgz#5286b6b32040232b751138f6d006130c728d4b3d" + integrity sha512-0D53YVuEgGdHfTl9LGWDZqVzGhn4cT0CXqyAuOYkKFLvqboJXz6SnkRhQNPhhA2hLVrPnvUz3+choQmPhHLGGQ== "@glimmer/interfaces@^0.38.1": version "0.38.1" @@ -683,9 +721,9 @@ "@simple-dom/interface" "1.4.0" "@glimmer/resolver@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.1.tgz#cd9644572c556e7e799de1cf8eff2b999cf5b878" - integrity sha512-Fdi//WYX+uwE3QCAd9cMXNwlgcOt+7tz3k8yQKLfLwt+fvuY/LKeztxMNEZREW8Xpysb8RFpVgVuY5Dw1sMuWA== + version "0.4.3" + resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.3.tgz#b1baae5c3291b4621002ccf8d7870466097e841d" + integrity sha512-UhX6vlZbWRMq6pCquSC3wfWLM9kO0PhQPD1dZ3XnyZkmsvEE94Cq+EncA9JalUuevKoJrfUFRvrZ0xaz+yar3g== dependencies: "@glimmer/di" "^0.2.0" @@ -729,6 +767,35 @@ resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA== +"@sinonjs/commons@^1", "@sinonjs/commons@^1.0.2": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.4.0.tgz#7b3ec2d96af481d7a0321252e7b1c94724ec5a78" + integrity sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw== + dependencies: + type-detect "4.0.8" + +"@sinonjs/formatio@^3.1.0": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" + integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^3.1.0" + +"@sinonjs/samsam@^3.1.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.1.tgz#e88c53fbd9d91ad9f0f2b0140c16c7c107fe0d07" + integrity sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw== + dependencies: + "@sinonjs/commons" "^1.0.2" + array-from "^2.1.1" + lodash "^4.17.11" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + "@types/acorn@^4.0.3": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.5.tgz#e29fdf884695e77be4e99e67d748f5147255752d" @@ -746,7 +813,14 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== -"@types/glob@^7.1.1": +"@types/fs-extra@^5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.5.tgz#080d90a792f3fa2c5559eb44bd8ef840aae9104b" + integrity sha512-w7iqhDH9mN8eLClQOYTkhdYUOSpp25eXxfc6VbFOGtzxW34JcvctH2bKjj4jD4++z4R5iO5D+pg48W2e03I65A== + dependencies: + "@types/node" "*" + +"@types/glob@*", "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== @@ -761,20 +835,28 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "11.11.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.3.tgz#7c6b0f8eaf16ae530795de2ad1b85d34bf2f5c58" - integrity sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg== + version "11.13.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.0.tgz#b0df8d6ef9b5001b2be3a94d909ce3c29a80f9e1" + integrity sha512-rx29MMkRdVmzunmiA4lzBYJNnXsW/PhG4kMBy2ATsYaDjGGR75dCFEVVROKpNwlVdcUX3xxlghKQOeDPBJobng== "@types/node@^9.6.0": - version "9.6.46" - resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.46.tgz#bb2eeb0eeb58e401ef9e4e29abc4f81003ee767c" - integrity sha512-W8W76mPzOkN1KuzB25yFIqv1ESj2gp8MILJByUnLcDhOZsuSaDhY8vXLEP9+6OWCqNe7W+3zh2L+rb8kg9rsFA== + version "9.6.47" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.47.tgz#655b4a1cc52c8ab08f48cc055061990d6846bc97" + integrity sha512-56wEJWXZs+3XXoTe/OCpdZ6czrONhy+6hT0GdPOb7HvudLTMJ1T5tuZPs37K5cPR5t+J9+vLPFDQgUQ8NWJE1w== "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/rimraf@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e" + integrity sha512-Hm/bnWq0TCy7jmjeN5bKYij9vw5GrDFWME4IuxV08278NtU/VdGbzsBohcCUJ7+QMqmUq5hpRKB39HeQWJjztQ== + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@webassemblyjs/ast@1.7.11": version "1.7.11" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -918,6 +1000,11 @@ "@webassemblyjs/wast-parser" "1.7.11" "@xtuc/long" "4.2.1" +"@xg-wang/whatwg-fetch@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@xg-wang/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#f7b222c012a238e7d6e89ed3d72a1e0edb58453d" + integrity sha512-ULtqA6L75RLzTNW68IiOja0XYv4Ebc3OGMzfia1xxSEMpD0mk/pMvkQX0vbCFyQmKc5xGp80Ms2WiSlXLh8hbA== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -929,17 +1016,9 @@ integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== abbrev@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" - integrity sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8= - -accepts@~1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" - integrity sha1-hiRnWMfdbSGmR0/whKR0DsBesh8= - dependencies: - mime-types "~2.1.16" - negotiator "0.6.1" + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== accepts@~1.3.4, accepts@~1.3.5: version "1.3.5" @@ -968,12 +1047,7 @@ acorn@^3.0.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^5.0.0, acorn@^5.6.2: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" - integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== - -acorn@^5.2.1, acorn@^5.5.3: +acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -988,59 +1062,35 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" - integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw= +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= - -ajv@^4.7.0, ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" + version "3.4.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" + integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== -ajv@^5.3.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.1.tgz#b38bb8876d9e86bee994956a04e721e88b248eb2" - integrity sha1-s4u4h22ehr7plJVqBOch6IskjrI= +ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.1.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" - integrity sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA== +ajv@^6.1.0, ajv@^6.5.5: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" - uri-js "^4.2.1" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amd-name-resolver@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz#814301adfe8a2f109f6e84d5e935196efb669615" - integrity sha1-gUMBrf6KLxCfboTV6TUZbvtmlhU= - dependencies: - ensure-posix-path "^1.0.1" + uri-js "^4.2.2" amd-name-resolver@1.2.0: version "1.2.0" @@ -1067,21 +1117,11 @@ ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= -ansi-escapes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" - integrity sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs= - ansi-escapes@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1092,24 +1132,12 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - integrity sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^3.2.1: +ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -1142,33 +1170,19 @@ aot-test-generators@^0.1.0: jsesc "^2.5.0" app-root-path@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" - integrity sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y= - -applause@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/applause/-/applause-1.2.2.tgz#a8468579e81f67397bb5634c29953bedcd0f56c0" - integrity sha1-qEaFeegfZzl7tWNMKZU77c0PVsA= - dependencies: - cson-parser "^1.1.0" - js-yaml "^3.3.0" - lodash "^3.10.0" - -aproba@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" - integrity sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a" + integrity sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA== -aproba@^1.1.1: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -1210,6 +1224,11 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + array-to-error@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/array-to-error/-/array-to-error-1.1.1.tgz#d68812926d14097a205579a667eeaf1856a44c07" @@ -1222,7 +1241,7 @@ array-to-sentence@^1.1.0: resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= @@ -1244,35 +1263,27 @@ arraybuffer.slice@~0.0.7: resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - asn1.js@^4.0.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a" - integrity sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg== + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= - assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" @@ -1303,10 +1314,10 @@ async-disk-cache@^1.2.1: rsvp "^3.0.18" username-sync "^1.0.2" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= +async-each@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" + integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== async-foreach@^0.1.3: version "0.1.3" @@ -1326,12 +1337,12 @@ async-promise-queue@^1.0.3, async-promise-queue@^1.0.4: async "^2.4.1" debug "^2.6.8" -async@^1.4.0, async@^1.5.2: +async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.4.1, async@^2.5.0: +async@^2.4.1, async@^2.5.0, async@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== @@ -1343,30 +1354,25 @@ async@~0.2.9: resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= -async@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" - integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.0.tgz#ab2b150e51d7b122b9efc8d7340c06b6c41076bc" - integrity sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw== +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" @@ -1377,32 +1383,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.14.0, babel-core@^6.24.1, babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.7" - slash "^1.0.0" - source-map "^0.5.6" - -babel-core@^6.26.3: +babel-core@^6.24.1, babel-core@^6.26.0, babel-core@^6.26.3: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== @@ -1428,9 +1409,9 @@ babel-core@^6.26.3: source-map "^0.5.7" babel-generator@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" - integrity sha1-rBriAHC3n248odMmlhMFN3TyDcU= + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -1438,7 +1419,7 @@ babel-generator@^6.26.0: detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.17.4" - source-map "^0.5.6" + source-map "^0.5.7" trim-right "^1.0.1" babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: @@ -1568,7 +1549,7 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: +babel-plugin-debug-macros@^0.1.10: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" integrity sha512-hZw5qNNGAR02Y+yBUrtsnJHh8OXavkayPRqKGAXnIm4t5rWVpj3ArwsC7TWdpZsBguQvHAeyTxZ7s23yY60HHg== @@ -1589,21 +1570,7 @@ babel-plugin-debug-macros@^0.3.0: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz#0c01f359658cfb9c797f705af6b09f6220205ae0" - integrity sha512-cv5ZimF5X52uW7Ul83UUxtsFZE6rZYkMv6qWnAeiDLT1/KtpVrTkJpwzDlvJ/FhKJZ43ih4GbFbhuhBKKT7vIw== - dependencies: - ember-rfc176-data "^0.3.0" - -babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.7.0.tgz#dcd6a9999da0d47d8c9185362bda6244ca525f4a" - integrity sha512-+QXPqmRngp13d7nKWrBcL6iIixpuyMNq107XV1dKvsvAO5BGFQ0mSk7Dl6/OgG+z2F1KquxkFfdXYBwbREQI6A== - dependencies: - ember-rfc176-data "^0.3.7" - -babel-plugin-ember-modules-api-polyfill@^2.8.0: +babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.8.0.tgz#70244800f750bf1c9f380910c1b2eed1db80ab4a" integrity sha512-3dlBH92qx8so2pRoks73+gwnuX97d0ajirOr96GwTZMnZxFzVR02c/PQbKWBcxpPqoL8CJSE2onuWM8PWezhOQ== @@ -1620,11 +1587,6 @@ babel-plugin-filter-imports@^0.3.1: resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.3.1.tgz#e7859b56886b175dd2616425d277b219e209ea8b" integrity sha1-54WbVohrF13SYWQl0neyGeIJ6os= -babel-plugin-htmlbars-inline-precompile@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.3.tgz#cd365e278af409bfa6be7704c4354beee742446b" - integrity sha1-zTZeJ4r0Cb+mvncExDVL7udCRGs= - babel-plugin-htmlbars-inline-precompile@^0.2.5: version "0.2.6" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" @@ -1766,9 +1728,9 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-template "^6.24.1" babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - integrity sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo= + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -1884,7 +1846,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: +babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= @@ -1893,42 +1855,6 @@ babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4" - integrity sha512-OVgtQRuOZKckrILgMA5rvctvFZPv72Gua9Rt006AiPoB0DJKGN07UmaQA+qRrYgK71MVct8fFhT0EyNWYorVew== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" @@ -2038,9 +1964,9 @@ babylon@^6.18.0: integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backbone@^1.1.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.3.3.tgz#4cc80ea7cb1631ac474889ce40f2f8bc683b2999" - integrity sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk= + version "1.4.0" + resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" + integrity sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ== dependencies: underscore ">=1.8.3" @@ -2060,9 +1986,9 @@ base64-arraybuffer@0.1.5: integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= base64-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" - integrity sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== base64id@1.0.0: version "1.0.0" @@ -2090,9 +2016,9 @@ basic-auth@~2.0.0: safe-buffer "5.1.2" bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - integrity sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40= + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" @@ -2103,15 +2029,15 @@ better-assert@~1.0.0: dependencies: callsite "1.0.0" -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" - integrity sha1-muuabF6IY4qtFx4Wf1kAq+JINdA= + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== "binaryextensions@1 || 2": version "2.1.2" @@ -2135,12 +2061,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.1.1, bluebird@^3.4.6: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" - integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw= - -bluebird@^3.5.3: +bluebird@^3.1.1, bluebird@^3.4.6, bluebird@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== @@ -2181,17 +2102,10 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= - dependencies: - hoek "2.x.x" - bower-config@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.0.tgz#16c38c1135f8071c19f25938d61b0d8cbf18d3f1" - integrity sha1-FsOMETX4BxwZ8lk41hsNjL8Y0/E= + version "1.4.1" + resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" + integrity sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw= dependencies: graceful-fs "^4.1.3" mout "^1.0.0" @@ -2212,7 +2126,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.0: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -2228,24 +2142,6 @@ braces@^2.3.0: split-string "^3.0.2" to-regex "^3.0.1" -braces@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" - integrity sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - define-property "^1.0.0" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - kind-of "^6.0.2" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - broccoli-amd-funnel@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-amd-funnel/-/broccoli-amd-funnel-1.3.0.tgz#c4426b4fce976e44295bd74f34725f53bdeb08e3" @@ -2273,22 +2169,6 @@ broccoli-asset-rewrite@^1.1.0: dependencies: broccoli-filter "^1.2.3" -broccoli-babel-transpiler@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.2.tgz#26019c045b5ea3e44cfef62821302f9bd483cabd" - integrity sha512-o1OUe5RZ5EP5+QICEmRNvWlhMvIciMisVACHu6qUPt6dE0Q0UnI5lUpWTmuXg/X+QuznqD/s1PApIpahv/QMZw== - dependencies: - babel-core "^6.14.0" - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.0.0" - broccoli-persistent-filter "^1.4.0" - clone "^2.0.0" - hash-for-dep "^1.0.2" - heimdalljs-logger "^0.1.7" - json-stable-stringify "^1.0.0" - rsvp "^3.5.0" - workerpool "^2.2.1" - broccoli-babel-transpiler@^6.5.0: version "6.5.1" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.1.tgz#a4afc8d3b59b441518eb9a07bd44149476e30738" @@ -2369,25 +2249,7 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.2.2.tgz#86ffdc52606eb590ba9f6b894c5ec7a016f5b7b9" - integrity sha1-hv/cUmButZC6n2uJTF7HoBb1t7k= - dependencies: - broccoli-kitchen-sink-helpers "^0.3.1" - broccoli-plugin "^1.3.0" - broccoli-stew "^1.3.3" - ensure-posix-path "^1.0.2" - fast-sourcemap-concat "^1.0.1" - find-index "^1.1.0" - fs-extra "^1.0.0" - fs-tree-diff "^0.5.6" - lodash.merge "^4.3.0" - lodash.omit "^4.1.0" - lodash.uniq "^4.2.0" - walk-sync "^0.3.1" - -broccoli-concat@^3.5.1, broccoli-concat@^3.7.1: +broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1: version "3.7.3" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.3.tgz#0dca01311567ffb13180e6b4eb111824628e4885" integrity sha512-2Ma9h81EJ0PRb9n4sW0i8KZlcnpTQfKxcj87zvi5DFe1fd8CTDEdseHDotK2beuA2l+LbgVPfd8EHaBJKm/Y8g== @@ -2422,19 +2284,7 @@ broccoli-config-replace@^1.1.2: debug "^2.2.0" fs-extra "^0.24.0" -broccoli-debug@^0.6.1, broccoli-debug@^0.6.2, broccoli-debug@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" - integrity sha512-CixMUndBqTljCc26i6ubhBrGbAWXpWBsGJFce6ZOr76Tul2Ev1xxM0tmf7OjSzdYhkr5BrPd/CNbR9VMPi+NBg== - dependencies: - broccoli-plugin "^1.2.1" - fs-tree-diff "^0.5.2" - heimdalljs "^0.2.1" - heimdalljs-logger "^0.1.7" - symlink-or-copy "^1.1.8" - tree-sync "^1.2.2" - -broccoli-debug@^0.6.5: +broccoli-debug@^0.6.1, broccoli-debug@^0.6.4, broccoli-debug@^0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.5.tgz#164a5cdafd8936e525e702bf8f91f39d758e2e78" integrity sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg== @@ -2447,16 +2297,12 @@ broccoli-debug@^0.6.5: tree-sync "^1.2.2" broccoli-file-creator@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" - integrity sha1-GzW2fSFavfrdjUnutpSTw55sNFA= + version "1.2.0" + resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.2.0.tgz#27f1b25b1b00e7bb7bf3d5d7abed5f4d5388df4d" + integrity sha512-l9zthHg6bAtnOfRr/ieZ1srRQEsufMZID7xGYRW3aBDv3u/3Eux+Iawl10tAGYE5pL9YB4n5X4vxkp6iNOoZ9g== dependencies: - broccoli-kitchen-sink-helpers "~0.2.0" broccoli-plugin "^1.1.0" - broccoli-writer "~0.1.1" mkdirp "^0.5.1" - rsvp "~3.0.6" - symlink-or-copy "^1.0.1" broccoli-file-creator@^2.1.1: version "2.1.1" @@ -2481,9 +2327,9 @@ broccoli-filter@^0.1.11: walk-sync "^0.1.3" broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.2.4.tgz#409afb94b9a3a6da9fac8134e91e205f40cc7330" - integrity sha1-QJr7lLmjptqfrIE06R4gX0DMczA= + version "1.3.0" + resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.3.0.tgz#71e3a8e32a17f309e12261919c5b1006d6766de6" + integrity sha512-VXJXw7eBfG82CFxaBDjYmyN7V72D4In2zwLVQJd/h3mBfF3CMdRTsv2L20lmRTtCv1sAHcB+LgMso90e/KYiLw== dependencies: broccoli-kitchen-sink-helpers "^0.3.1" broccoli-plugin "^1.0.0" @@ -2508,7 +2354,7 @@ broccoli-funnel-reducer@^1.0.0: resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= -broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli-funnel@^1.1.0, broccoli-funnel@^1.2.0: +broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0, broccoli-funnel@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= @@ -2528,7 +2374,7 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.2, broccoli symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.2: +broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75" integrity sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ== @@ -2547,29 +2393,10 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-funnel@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" - integrity sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg== - dependencies: - array-equal "^1.0.0" - blank-object "^1.0.1" - broccoli-plugin "^1.3.0" - debug "^2.2.0" - fast-ordered-set "^1.0.0" - fs-tree-diff "^0.5.3" - heimdalljs "^0.2.0" - minimatch "^3.0.0" - mkdirp "^0.5.0" - path-posix "^1.0.0" - rimraf "^2.4.3" - symlink-or-copy "^1.0.0" - walk-sync "^0.3.1" - -broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@^0.2.6, broccoli-kitchen-sink-helpers@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" - integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= +broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@^0.2.6: + version "0.2.9" + resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" + integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= dependencies: glob "^5.0.10" mkdirp "^0.5.1" @@ -2617,15 +2444,7 @@ broccoli-merge-trees@^2.0.0: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" -broccoli-merge-trees@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.0.tgz#90e4959f9e3c57cf1f04fab35152f3d849468d8b" - integrity sha512-yyk4J3KSeohlzsmVaRx7ZgAq57K2wzyVtGDaARLG/WuTNlRjKeYEW+atxblvrf0zAOsYMOi8YCpMLRBQUa9jjg== - dependencies: - broccoli-plugin "^1.3.0" - merge-trees "^2.0.0" - -broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2: +broccoli-merge-trees@^3.0.0, 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== @@ -2665,10 +2484,10 @@ broccoli-node-info@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= -broccoli-persistent-filter@^1.0.3, broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.2.0, broccoli-persistent-filter@^1.4.0, broccoli-persistent-filter@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" - integrity sha512-JwNLDvvXJlhUmr+CHcbVhCyp33NbCIAITjQZmJY9e8QzANXh3jpFWlhSFvkWghwKA8rTAKcXkW12agtiZjxr4g== +broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.3: + version "1.4.6" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" + integrity sha512-0RejLwoC95kv4kta8KAa+FmECJCK78Qgm8SRDEK7YyU0N9Cx6KpY3UCDy9WELl3mCXLN8TokNxc7/hp3lL4lfw== dependencies: async-disk-cache "^1.2.1" async-promise-queue "^1.0.3" @@ -2713,7 +2532,7 @@ broccoli-plugin@1.1.0: rimraf "^2.3.4" symlink-or-copy "^1.0.1" -broccoli-plugin@^1.0.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: +broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== @@ -2723,25 +2542,6 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#bee704a8e42da08cb58e513aaa436efb7f0ef1ee" - integrity sha1-vucEqOQtoIy1jlE6qkNu+38O8e4= - dependencies: - promise-map-series "^0.2.1" - quick-temp "^0.1.3" - rimraf "^2.3.4" - symlink-or-copy "^1.1.8" - -broccoli-replace@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/broccoli-replace/-/broccoli-replace-0.12.0.tgz#36460a984c45c61731638c53068b0ab12ea8fdb7" - integrity sha1-NkYKmExFxhcxY4xTBosKsS6o/bc= - dependencies: - applause "1.2.2" - broccoli-persistent-filter "^1.2.0" - minimatch "^3.0.0" - broccoli-rollup@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" @@ -2760,14 +2560,14 @@ broccoli-rollup@^2.1.1: walk-sync "^0.3.1" broccoli-sass-source-maps@^2.0.0, broccoli-sass-source-maps@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-2.1.1.tgz#5d71d3734234acb102000e5d7776d4c722aad756" - integrity sha512-o2ZUKWiAEvHOM1lNOJ2kcD+ov0ivvTuciCYwIb4+IVEPeGO4vcygqOcEtuviH8mlDn3dB6gGJ/8zTVslU1sI8A== + version "2.2.0" + resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-2.2.0.tgz#1f1a0794136152b096188638b59b42b17a4bdc68" + integrity sha512-X1yTOGQcjQxYebP+hjeAI286x63VZ0WfgFxqHsr4eimgNNL2TPxkJKKgOaDKJ3nE8pszbJWgHrWpEVXuwgsUzw== dependencies: broccoli-caching-writer "^3.0.3" include-path-searcher "^0.1.0" mkdirp "^0.3.5" - node-sass "^4.1.0" + node-sass "^4.7.2" object-assign "^2.0.0" rsvp "^3.0.6" @@ -2794,27 +2594,27 @@ broccoli-sri-hash@^2.1.0: sri-toolbox "^0.2.0" symlink-or-copy "^1.0.1" -broccoli-stew@^1.2.0, broccoli-stew@^1.3.3, broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.5.0.tgz#d7af8c18511dce510e49d308a62e5977f461883c" - integrity sha1-16+MGFEdzlEOSdMIpi5Zd/RhiDw= +broccoli-stew@^1.2.0, broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.6.0.tgz#01f6d92806ed6679ddbe48d405066a0e164dfbef" + integrity sha512-sUwCJNnYH4Na690By5xcEMAZqKgquUQnMAEuIiL3Z2k63mSw9Xg+7Ew4wCrFrMmXMcLpWjZDOm6Yqnq268N+ZQ== dependencies: broccoli-debug "^0.6.1" - broccoli-funnel "^1.0.1" - broccoli-merge-trees "^1.0.0" + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^2.0.0" broccoli-persistent-filter "^1.1.6" broccoli-plugin "^1.3.0" - chalk "^1.1.3" - debug "^2.4.0" + chalk "^2.4.1" + debug "^3.1.0" ensure-posix-path "^1.0.1" - fs-extra "^2.0.0" - minimatch "^3.0.2" - resolve "^1.1.6" - rsvp "^3.0.16" - symlink-or-copy "^1.1.8" + fs-extra "^5.0.0" + minimatch "^3.0.4" + resolve "^1.8.1" + rsvp "^4.8.3" + symlink-or-copy "^1.2.0" walk-sync "^0.3.0" -broccoli-stew@^2.0.0: +broccoli-stew@^2.0.0, broccoli-stew@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== @@ -2834,7 +2634,7 @@ broccoli-stew@^2.0.0: symlink-or-copy "^1.2.0" walk-sync "^0.3.3" -broccoli-string-replace@^0.1.1, broccoli-string-replace@^0.1.2: +broccoli-string-replace@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/broccoli-string-replace/-/broccoli-string-replace-0.1.2.tgz#1ed92f85680af8d503023925e754e4e33676b91f" integrity sha1-HtkvhWgK+NUDAjkl51Tk4zZ2uR8= @@ -2868,14 +2668,7 @@ broccoli-uglify-sourcemap@^2.1.1: walk-sync "^0.3.2" workerpool "^2.3.0" -broccoli-unwatched-tree@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/broccoli-unwatched-tree/-/broccoli-unwatched-tree-0.1.3.tgz#ab0fb820f613845bf67a803baad820f68b1e3aae" - integrity sha1-qw+4IPYThFv2eoA7qtgg9oseOq4= - dependencies: - broccoli-source "^1.1.0" - -broccoli-writer@^0.1.1, broccoli-writer@~0.1.1: +broccoli-writer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" integrity sha1-1NcaqPKvvGejhmuRotp5CEuWqy0= @@ -2889,9 +2682,9 @@ brorand@^1.0.1: integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" - integrity sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -2901,22 +2694,23 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: safe-buffer "^5.0.1" browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" - integrity sha1-mYgkSHS/XtTijalWZtzWasj8Njo= + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" evp_bytestokey "^1.0.0" browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" - integrity sha1-2qJ3cXRwki7S/hhZQRihdUOXId0= + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" des.js "^1.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" browserify-rsa@^4.0.0: version "4.0.1" @@ -2946,15 +2740,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^2.1.2, browserslist@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.4.0.tgz#693ee93d01e66468a6348da5498e011f578f87f8" - integrity sha512-aM2Gt4x9bVlCUteADBS6JP0F+2tMWKM1jQzUulVROtdFWFIcIVvY76AJbr7GDqy0eDhn+PcnpzzivGxY4qiaKQ== - dependencies: - caniuse-lite "^1.0.30000718" - electron-to-chromium "^1.3.18" - -browserslist@^3.2.6: +browserslist@^3.1.1, browserslist@^3.2.6: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== @@ -2962,14 +2748,14 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.3.4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.2.tgz#6ea8a74d6464bb0bd549105f659b41197d8f0ba2" - integrity sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg== +browserslist@^4.4.2, browserslist@^4.5.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.3.tgz#969495c410314bc89f14e748505e58be968080f1" + integrity sha512-Tx/Jtrmh6vFg24AelzLwCaCq1IUJiMDM1x/LPzqbmbktF8Zo7F9ONUpOWsFK6TtdON95mSMaQUWqi0ilc8xM6g== dependencies: - caniuse-lite "^1.0.30000939" - electron-to-chromium "^1.3.113" - node-releases "^1.1.8" + caniuse-lite "^1.0.30000955" + electron-to-chromium "^1.3.122" + node-releases "^1.1.12" bser@^2.0.0: version "2.0.0" @@ -2997,9 +2783,9 @@ buffer-fill@^1.0.0: integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= buffer-from@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" - integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer-xor@^1.0.3: version "1.0.3" @@ -3031,11 +2817,6 @@ build@^0.1.4: winston "*" wrench "1.3.x" -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -3097,9 +2878,9 @@ cache-base@^1.0.1: unset-value "^1.0.0" calculate-cache-key-for-tree@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.1.0.tgz#0c3e42c9c134f3c9de5358c0f16793627ea976d6" - integrity sha1-DD5CycE088neU1jA8WeTYn6pdtY= + version "1.2.3" + resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.2.3.tgz#5a5e4fcfa2d374a63e47fe967593f179e8282825" + integrity sha512-PPQorvdNw8K8k7UftCeradwOmKDSDJs8wcqYTtJPEt3fHbZyK8QsorybJA+lOmk0dgE61vX6R+5Kd3W9h4EMGg== dependencies: json-stable-stringify "^1.0.1" @@ -3133,11 +2914,6 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= - camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -3160,20 +2936,10 @@ can-symlink@^1.0.0: dependencies: tmp "0.0.28" -caniuse-lite@^1.0.30000718: - version "1.0.30000718" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000718.tgz#0dd24290beb11310b2d80f6b70a823c2a65a6fad" - integrity sha1-DdJCkL6xExCy2A9rcKgjwqZab60= - -caniuse-lite@^1.0.30000844: - version "1.0.30000945" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000945.tgz#d51e3750416dd05126d5ac94a9c57d1c26c6fd21" - integrity sha512-PSGwYChNIXJ4FZr9Z9mrVzBCB1TF3yyiRmIDRIdKDHZ6u+1jYH6xeR28XaquxnMwcZVX3f48S9zi7eswO/G1nQ== - -caniuse-lite@^1.0.30000939: - version "1.0.30000946" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000946.tgz#ac50a3331bb805b483478bbc26a0ab71bb6d0509" - integrity sha512-ZVXtMoZ3Mfq69Ikv587Av+5lwGVJsG98QKUucVmtFBf0tl1kOCfLQ5o6Z2zBNis4Mx3iuH77WxEUpdP6t7f2CQ== +caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000955: + version "1.0.30000955" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000955.tgz#360fdb9a1e41d6dd996130411334e44a39e4446d" + integrity sha512-6AwmIKgqCYfDWWadRkAuZSHMQP4Mmy96xAXEdRBlN/luQhlRYOKgwOlZ9plpCOsVbBuqbTmGqDK3JUM/nlr8CA== capture-exit@^1.2.0: version "1.2.0" @@ -3200,25 +2966,6 @@ ceibo@~2.0.0: resolved "https://registry.yarnpkg.com/ceibo/-/ceibo-2.0.0.tgz#9a61eb054a91c09934588d4e45d9dd2c3bf04eee" integrity sha1-mmHrBUqRwJk0WI1ORdndLDvwTu4= -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -3230,16 +2977,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - -chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3248,6 +2986,11 @@ chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" @@ -3256,29 +2999,23 @@ charm@^1.0.0: inherits "^2.0.1" chokidar@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== + version "2.1.5" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" + integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== dependencies: anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" + async-each "^1.0.1" + braces "^2.3.2" glob-parent "^3.1.0" - inherits "^2.0.1" + inherits "^2.0.3" is-binary-path "^1.0.0" is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.2.2" - -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= + fsevents "^1.2.7" chownr@^1.1.1: version "1.1.1" @@ -3292,12 +3029,7 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" -ci-info@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" - integrity sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ= - -ci-info@^1.1.3: +ci-info@^1.1.3, ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== @@ -3396,15 +3128,6 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -3457,11 +3180,6 @@ codemirror@~5.15.0: resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.15.2.tgz#58b3dc732c6d10d7aae806f4c7cdd56a9b87fe8f" integrity sha1-WLPccyxtENeq6Ab0x83VapuH/o8= -coffee-script@^1.10.0: - version "1.12.7" - resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" - integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw== - collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -3470,32 +3188,71 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" - integrity sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o= +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - color-name "^1.1.1" + color-name "1.1.3" -color-name@^1.1.1: +color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -colors@1.0.3, colors@1.0.x: +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" + integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colornames@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96" + integrity sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y= + +colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= +colors@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - integrity sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk= +colorspace@1.1.x: + version "1.1.1" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.1.tgz#9ac2491e1bc6f8fb690e2176814f8d091636d972" + integrity sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw== + dependencies: + color "3.0.x" + text-hex "1.0.x" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== dependencies: delayed-stream "~1.0.0" @@ -3511,22 +3268,15 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.11.0, commander@^2.6.0, commander@^2.9.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== - -commander@^2.19.0, commander@~2.19.0: +commander@^2.11.0, commander@^2.19.0, commander@^2.6.0, commander@^2.9.0, commander@~2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== common-tags@^1.4.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.6.0.tgz#788e4bcc582f16993e5b2c92f76b1ccb80731537" - integrity sha512-sgmgEodNLbxnSSoR5a2xH23CoDJ9J5MKsJS/tqplfmJLpikG0oWMpAb+tM8ERQCMpp9I+ERf6SYl158G6GwX0w== - dependencies: - babel-runtime "^6.26.0" + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== commondir@^1.0.1: version "1.0.1" @@ -3548,7 +3298,7 @@ component-inherit@0.0.3: resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= -compressible@~2.0.14: +compressible@~2.0.16: version "2.0.16" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.16.tgz#a49bf9858f3821b64ce1be0296afc7380466a77f" integrity sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA== @@ -3556,15 +3306,15 @@ compressible@~2.0.14: mime-db ">= 1.38.0 < 2" compression@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" - integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== dependencies: accepts "~1.3.5" bytes "3.0.0" - compressible "~2.0.14" + compressible "~2.0.16" debug "2.6.9" - on-headers "~1.0.1" + on-headers "~1.0.2" safe-buffer "5.1.2" vary "~1.1.2" @@ -3573,16 +3323,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.4.7, concat-stream@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -concat-stream@^1.5.0: +concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3645,11 +3386,6 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= -content-type@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" - integrity sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0= - content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -3660,23 +3396,13 @@ continuable-cache@^0.3.1: resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= -convert-source-map@^1.1.0: +convert-source-map@^1.1.0, convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== dependencies: safe-buffer "~5.1.1" -convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" - integrity sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU= - -convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= - cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -3709,12 +3435,27 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" - integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4= +core-js-compat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.0.tgz#cd9810b8000742535a4a43773866185e310bd4f7" + integrity sha512-W/Ppz34uUme3LmXWjMgFlYyGnbo1hd9JvA0LNQ4EmieqVjg2GPYbj3H6tcdP2QGPGWdRKUqZVbVKLNIFVs/HiA== + dependencies: + browserslist "^4.5.1" + core-js "3.0.0" + core-js-pure "3.0.0" + semver "^5.6.0" -core-js@^2.5.7: +core-js-pure@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.0.tgz#a5679adb4875427c8c0488afc93e6f5b7125859b" + integrity sha512-yPiS3fQd842RZDgo/TAKGgS0f3p2nxssF1H65DIZvZv0Od5CygP8puHXn3IQiM/39VAvgCbdaMQpresrbGgt9g== + +core-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.0.tgz#a8dbfa978d29bfc263bfb66c556d0ca924c28957" + integrity sha512-WBmxlgH2122EzEJ6GH8o9L/FeoUKxxxZ6q6VUxoTlsE4EvbTWKJb447eyVxTEuq0LpXjlq/kCB2qgBvsYRkLvQ== + +core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.6.5: version "2.6.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== @@ -3731,38 +3472,39 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-3.1.0.tgz#640a94bf9847f321800403cd273af60665c73397" - integrity sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q== +cosmiconfig@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" + integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== dependencies: is-directory "^0.3.1" js-yaml "^3.9.0" - parse-json "^3.0.0" + parse-json "^4.0.0" require-from-string "^2.0.1" create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" - integrity sha1-iIxyNZbN92EvZJgjPuvXo1MBc30= + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: bn.js "^4.1.0" elliptic "^6.0.0" create-hash@^1.1.0, create-hash@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" - integrity sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0= + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" inherits "^2.0.1" - ripemd160 "^2.0.0" + md5.js "^1.3.4" + ripemd160 "^2.0.1" sha.js "^2.4.0" create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" - integrity sha1-rLniIaThe9sHbpBlfEK5PjcmzwY= + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -3799,13 +3541,6 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= - dependencies: - boom "2.x.x" - crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -3828,13 +3563,6 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= -cson-parser@^1.1.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/cson-parser/-/cson-parser-1.3.5.tgz#7ec675e039145533bf2a6a856073f1599d9c2d24" - integrity sha1-fsZ14DkUVTO/KmqFYHPxWZ2cLSQ= - dependencies: - coffee-script "^1.10.0" - css-select-base-adapter@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -3895,11 +3623,6 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -cycle@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" - integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= - cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -3921,19 +3644,19 @@ d3-collection@1: integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== d3-color@1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b" - integrity sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs= + version "1.2.3" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.2.3.tgz#6c67bb2af6df3cc8d79efcc4d3a3e83e28c8048f" + integrity sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw== d3-dispatch@1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.3.tgz#46e1491eaa9b58c358fce5be4e8bed626e7871f8" - integrity sha1-RuFJHqqbWMNY/OW+TovtYm54cfg= + version "1.0.5" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.5.tgz#e25c10a186517cd6c82dd19ea018f07e01e39015" + integrity sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g== d3-ease@1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e" - integrity sha1-aL+8NJM4o4DETYrMT7wzBKotjA4= + version "1.0.5" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.5.tgz#8ce59276d81241b1b72042d6af2d40e76d936ffb" + integrity sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ== d3-format@1, d3-format@^1.3.0: version "1.3.2" @@ -3941,9 +3664,9 @@ d3-format@1, d3-format@^1.3.0: integrity sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ== d3-interpolate@1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.5.tgz#69e099ff39214716e563c9aec3ea9d1ea4b8a79f" - integrity sha1-aeCZ/zkhRxblY8muw+qdHqS4p58= + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.3.2.tgz#417d3ebdeb4bc4efcc8fd4361c55e4040211fd68" + integrity sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w== dependencies: d3-color "1" @@ -3966,14 +3689,14 @@ d3-scale@^1.0.0: d3-time-format "2" d3-selection@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.2.0.tgz#1b8ec1c7cedadfb691f2ba20a4a3cfbeb71bbc88" - integrity sha512-xW2Pfcdzh1gOaoI+LGpPsLR2VpBQxuFoxvrvguK8ZmrJbPIVvfNG6pU6GNfK41D6Qz15sj61sbW/AFYuukwaLQ== + version "1.4.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.0.tgz#ab9ac1e664cf967ebf1b479cc07e28ce9908c474" + integrity sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg== d3-shape@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.2.tgz#f9dba3777a5825f9a8ce8bc928da08c17679e9a7" - integrity sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ== + version "1.3.5" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.5.tgz#e81aea5940f59f0a79cfccac012232a8987c6033" + integrity sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg== dependencies: d3-path "1" @@ -3985,19 +3708,19 @@ d3-time-format@2, d3-time-format@^2.1.0: d3-time "1" d3-time@1: - version "1.0.10" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.10.tgz#8259dd71288d72eeacfd8de281c4bf5c7393053c" - integrity sha512-hF+NTLCaJHF/JqHN5hE8HVGAXPStEq6/omumPE/SxyHVrR7/qQxusFDo0t0c/44+sCGHthC7yNGFZIEgju0P8g== + version "1.0.11" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.11.tgz#1d831a3e25cd189eb256c17770a666368762bbce" + integrity sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw== d3-timer@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.6.tgz#4044bf15d7025c06ce7d1149f73cd07b54dbd784" - integrity sha1-QES/FdcCXAbOfRFJ9zzQe1Tb14Q= + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.9.tgz#f7bb8c0d597d792ff7131e1c24a36dd471a471ba" + integrity sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg== d3-transition@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.1.1.tgz#d8ef89c3b848735b060e54a39b32aaebaa421039" - integrity sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ== + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.2.0.tgz#f538c0e21b2aa1f05f3e965f8567e81284b3b2b8" + integrity sha512-VJ7cmX/FPIPJYuaL2r1o1EMHLttvoIuZhhuAlRoOxDzogV8iQS6jYulDm3xEU3TqL80IZIhI551/ebmCMrkvhw== dependencies: d3-color "1" d3-dispatch "1" @@ -4019,9 +3742,9 @@ dashdash@^1.12.0: assert-plus "^1.0.0" date-fns@^1.27.2: - version "1.28.5" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.5.tgz#257cfc45d322df45ef5658665967ee841cd73faf" - integrity sha1-JXz8RdMi30XvVlhmWWfuhBzXP68= + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== date-now@^0.1.4: version "0.1.4" @@ -4035,34 +3758,20 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debug@2.6.8, debug@^2.1.0, debug@^2.3.3, debug@^2.4.0: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= - dependencies: - ms "2.0.0" - -debug@2.6.9, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.0.1, debug@^3.2.6: +debug@^3.0.1, debug@^3.1.0, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" -debug@^3.1.0, debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@^4.1.0, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -4070,7 +3779,14 @@ debug@^4.1.0, debug@~4.1.0: dependencies: ms "^2.1.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -4131,19 +3847,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -4154,11 +3857,6 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@1.1.1, depd@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -4199,36 +3897,40 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -diff@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.0.tgz#056695150d7aa93237ca7e378ac3b1682b7963b9" - integrity sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg== +diagnostics@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a" + integrity sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ== + dependencies: + colorspace "1.1.x" + enabled "1.0.x" + kuler "1.0.x" -diff@^3.5.0: +diff@^3.1.0, diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" - integrity sha1-tYNXOScM/ias9jIJn97SoH8gnl4= + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@^2.2.1: +dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== dependencies: path-type "^3.0.0" -doctrine@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.2.tgz#68f96ce8efc56cc42651f1faadb4f175273b0075" - integrity sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A== +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" @@ -4266,9 +3968,9 @@ dot-prop@^4.1.0: is-obj "^1.0.0" duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" - integrity sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ== + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -4276,11 +3978,12 @@ duplexify@^3.4.2, duplexify@^3.6.0: stream-shift "^1.0.0" ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - integrity sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU= + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" editions@^1.1.1: version "1.3.4" @@ -4292,15 +3995,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.113, electron-to-chromium@^1.3.47: - version "1.3.115" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.115.tgz#fdaa56c19b9f7386dbf29abc1cc632ff5468ff3b" - integrity sha512-mN2qeapQWdi2B9uddxTZ4nl80y46hbyKY5Wt9Yjih+QZFQLdaujEDK4qJky35WhyxMzHF3ZY41Lgjd2BPDuBhg== - -electron-to-chromium@^1.3.18: - version "1.3.18" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.18.tgz#3dcc99da3e6b665f6abbc71c28ad51a2cd731a9c" - integrity sha1-PcyZ2j5rZl9qu8ccKK1Ros1zGpw= +electron-to-chromium@^1.3.122, electron-to-chromium@^1.3.47: + version "1.3.122" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.122.tgz#b32a0805f48557bd3c3b8104eadc7fa511b14a9a" + integrity sha512-3RKoIyCN4DhP2dsmleuFvpJAIDOseWH88wFYBzb22CSwoFDSWRc4UAMfrtc9h8nBdJjTNIN3rogChgOy6eFInw== elegant-spinner@^1.0.1: version "1.0.1" @@ -4308,9 +4006,9 @@ elegant-spinner@^1.0.1: integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - integrity sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8= + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -4336,7 +4034,7 @@ ember-assign-polyfill@~2.4.0: ember-cli-babel "^6.6.0" ember-cli-version-checker "^2.0.0" -ember-auto-import@^1.2.21: +ember-auto-import@^1.2.19, ember-auto-import@^1.2.21: version "1.2.21" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.2.21.tgz#e02ded183844faba66c3f2af97028ef35175b837" integrity sha512-coHnqO3mRnlj/JAQSQBEqzX2wL8rH5YrfEJMzk1102X9MdSX1CWeaUYBcyjvI/pG8fHUhv+4VsD6rQuhTUyZUQ== @@ -4375,26 +4073,12 @@ ember-basic-dropdown@^1.1.0: ember-cli-htmlbars "^3.0.1" ember-maybe-in-element "^0.2.0" -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.3.0, ember-cli-babel@^6.4.1, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: - version "6.11.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.11.0.tgz#79cb184bac3c05bfe181ddc306bac100ab1f9493" - integrity sha512-lHQyl30lbAsMmMq2it1GO85HKrqr2gMpK5CFxmOgTJ3moBqOGMKsdV3Z0qXWpgh8Asy7pB9AACMShdgfQvSGPg== - dependencies: - amd-name-resolver "0.0.7" - babel-plugin-debug-macros "^0.1.11" - babel-plugin-ember-modules-api-polyfill "^2.3.0" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.16.0" - babel-preset-env "^1.5.1" - broccoli-babel-transpiler "^6.1.2" - broccoli-debug "^0.6.2" - broccoli-funnel "^1.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.1.0" - semver "^5.4.1" +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.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.18.0, ember-cli-babel@^6.8.0: +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.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.18.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -4413,36 +4097,14 @@ ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.2.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.5.0.tgz#af654dcef23630391d2efe85aaa3bdf8b6ca17b7" - integrity sha512-wWXqPPQNRxCtEHvYaLBNiIVgCVCy8YqZ0tM8Dpql1D5nGnPDbaK073sS1vlOYBP7xe5Ab2nXhvQkFwUxFacJ2g== - dependencies: - "@babel/core" "^7.0.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.7.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-version-checker "^2.1.2" - ensure-posix-path "^1.0.2" - semver "^5.5.0" - -ember-cli-babel@^7.1.2: - version "7.6.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.6.0.tgz#2e7f1df888fb62eb54d170defce4b6c536e8dfd3" - integrity sha512-2m400ZW9c4EE343g/j1U7beJgjJezTdDCgXM2koHdhpLlZB1Kz7iQw8S+t8gzXGwSGXlf7C7v0RHxP1/bo8frA== +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.2.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" @@ -4457,6 +4119,7 @@ ember-cli-babel@^7.1.2: 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" @@ -4515,18 +4178,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: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.2.tgz#5b544f664d5d9911f08cd979c5f70d8cb0ca2add" - integrity sha1-W1RPZk1dmRHwjNl5xfcNjLDKKt0= - dependencies: - babel-plugin-htmlbars-inline-precompile "^0.2.3" - ember-cli-version-checker "^2.0.0" - hash-for-dep "^1.0.2" - heimdalljs-logger "^0.1.7" - silent-error "^1.1.0" - -ember-cli-htmlbars-inline-precompile@^1.0.3: +ember-cli-htmlbars-inline-precompile@^1.0.0, ember-cli-htmlbars-inline-precompile@^1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.5.tgz#312e050c9e3dd301c55fb399fd706296cd0b1d6a" integrity sha512-/CNEqPxroIcbY6qejrt704ZaghHLCntZKYLizFfJ2esirXoJx6fuYKBY1YyJ8GOgjfbHHKjBZuK4vFFJpkGqkQ== @@ -4538,12 +4190,12 @@ ember-cli-htmlbars-inline-precompile@^1.0.3: silent-error "^1.1.0" ember-cli-htmlbars@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.3.tgz#e116e1500dba12f29c94b05b9ec90f52cb8bb042" - integrity sha512-oyWtJebOwxAqWZwMc0NKFJ8FJdxVixM7zl0FaXq1vTAG6bOgnU7yAhXEASlaO5f+PptZueZfOpdpvRwZW/Gk1A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.5.tgz#b5a105429a6bce4f7c9c97b667e3b8926e31397f" + integrity sha512-3f3PAxdnQ/fhQa8XP/3z4RLRgLHxV8j4Ln75aHbRdemOCjBa048KxL9l+acRLhCulbGQCMnLiIUIC89PAzLrcA== dependencies: - broccoli-persistent-filter "^1.0.3" - hash-for-dep "^1.0.2" + broccoli-persistent-filter "^1.4.3" + hash-for-dep "^1.2.3" json-stable-stringify "^1.0.0" strip-bom "^3.0.0" @@ -4581,55 +4233,44 @@ ember-cli-lodash-subset@^2.0.1: integrity sha1-IMtop5D+D94kiN39jvu332/nZvI= ember-cli-mirage@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/ember-cli-mirage/-/ember-cli-mirage-0.4.3.tgz#81470c2b9cdb2b88661c56be6aacb928945a9b3b" - integrity sha512-zdlP1fD/42PvKq/NwQJJHqUhC/JHW/8v/7+M5y6Ubqe7saDvG4/IBjlrRuVnT0GFzlNWSAQN8CkKQozCR3BWGw== + version "0.4.15" + resolved "https://registry.yarnpkg.com/ember-cli-mirage/-/ember-cli-mirage-0.4.15.tgz#dcf878e785853232d8ac725bb425aa545da63e79" + integrity sha512-5wCycS40pkohNPaLcyCn5BUjJ/4PGK9lz6j1tftJms5tBQhSjkZ37+pfhVKh3iYSId/+z0RTxVknykQH4P0sQA== dependencies: - broccoli-funnel "^1.0.2" - broccoli-merge-trees "^1.1.0" - broccoli-replace "^0.12.0" - broccoli-stew "^1.5.0" + "@xg-wang/whatwg-fetch" "^3.0.0" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.2" + broccoli-stew "^2.0.1" + broccoli-string-replace "^0.1.2" chalk "^1.1.1" - ember-cli-babel "^6.8.2" - ember-cli-node-assets "^0.1.4" + ember-auto-import "^1.2.19" + ember-cli-babel "^6.16.0" + ember-cli-node-assets "^0.2.2" ember-get-config "^0.2.2" - ember-inflector "^2.0.0" - ember-lodash "^4.17.3" - exists-sync "0.0.3" - fake-xml-http-request "^1.4.0" + ember-inflector "^2.0.0 || ^3.0.0" + fake-xml-http-request "^2.0.0" faker "^3.0.0" - pretender "^1.6.1" - route-recognizer "^0.2.3" + lodash "^4.17.11" + pretender "2.1.1" + route-recognizer "^0.3.4" ember-cli-moment-shim@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/ember-cli-moment-shim/-/ember-cli-moment-shim-3.5.0.tgz#7ea8d42b0a04c767258287b30447681e52fba0c4" - integrity sha1-fqjUKwoEx2clgoezBEdoHlL7oMQ= + version "3.7.1" + resolved "https://registry.yarnpkg.com/ember-cli-moment-shim/-/ember-cli-moment-shim-3.7.1.tgz#3ad691c5027c1f38a4890fe47d74b5224cc98e32" + integrity sha512-U3HHuEU7sXQ78v25ifmIa9w4nQPQ7vK/LZ2bt18pN3aKNvIDYiLe/MDeXGmqfFIq3OfruKG+CF+7dOLqxuzSlQ== dependencies: broccoli-funnel "^2.0.0" broccoli-merge-trees "^2.0.0" broccoli-source "^1.1.0" broccoli-stew "^1.5.0" chalk "^1.1.3" - ember-cli-babel "^6.8.2" + ember-cli-babel "^6.6.0" ember-cli-import-polyfill "^0.2.0" - exists-sync "^0.0.4" lodash.defaults "^4.2.0" - moment "^2.18.1" + moment "^2.19.3" moment-timezone "^0.5.13" -ember-cli-node-assets@^0.1.4: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.1.6.tgz#6488a2949048c801ad6d9e33753c7bce32fc1146" - integrity sha1-ZIiilJBIyAGtbZ4zdTx7zjL8EUY= - dependencies: - broccoli-funnel "^1.0.1" - broccoli-merge-trees "^1.1.1" - broccoli-unwatched-tree "^0.1.1" - debug "^2.2.0" - lodash "^4.5.1" - resolve "^1.1.7" - ember-cli-node-assets@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/ember-cli-node-assets/-/ember-cli-node-assets-0.2.2.tgz#d2d55626e7cc6619f882d7fe55751f9266022708" @@ -4650,9 +4291,9 @@ ember-cli-normalize-entity-name@^1.0.0: silent-error "^1.0.0" ember-cli-page-object@^1.15.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/ember-cli-page-object/-/ember-cli-page-object-1.15.1.tgz#da1f870638584b17e183d0014b4efb15465fadd5" - integrity sha512-/oUkiha+CLUNQGkQLHJ+mw9rm/V6Gi3VGgzKo7laEGZe6Mk8jl13otxEKWKI2NTJmL69fZxPPfFsqQqpzN+0UA== + version "1.15.2" + resolved "https://registry.yarnpkg.com/ember-cli-page-object/-/ember-cli-page-object-1.15.2.tgz#24d0ee60f64d9ae34fb8fa5bec9df46b62654c72" + integrity sha512-uUlUWeIkBCmqO2/PWInQgNu9I7YXj/Vfd566ddTRE5VHErM4B9XaNE2dRBM9J0ub1JKeWZaBByqP/hDNADRxxQ== dependencies: broccoli-file-creator "^2.1.1" broccoli-merge-trees "^2.0.0" @@ -4669,9 +4310,9 @@ ember-cli-path-utils@^1.0.0: integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= ember-cli-preprocess-registry@^3.1.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.2.2.tgz#5d076ebeee9e28ccfc13c87c715b4330bb8d324c" - integrity sha512-Yp6gjErRyKigwYblhTHL/QduXbg9RbeEe9bGEv98eGcJKkNFHCl/l8o3yhPlGACmq5yK0QFgekNYki80aArsrg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.3.0.tgz#685837a314fbe57224bd54b189f4b9c23907a2de" + integrity sha512-60GYpw7VPeB7TvzTLZTuLTlHdOXvayxjAQ+IxM2T04Xkfyu75O2ItbWlftQW7NZVGkaCsXSRAmn22PG03VpLMA== dependencies: broccoli-clean-css "^1.1.0" broccoli-funnel "^2.0.1" @@ -4698,14 +4339,14 @@ ember-cli-sass@^6.1.3: merge "^1.2.0" ember-cli-sass@^7.1.2: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-7.1.3.tgz#d4a418d68bb513c40270b88576bd2cf07301fdf2" - integrity sha512-2TbhlJxxdH7KxlHU9CykHR+me16x7HvT9DBgejIFTZtpnETXaqG762sx+8zfe3WBdkBw7S/z37w1+6mfz7+Ajg== + version "7.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-7.2.0.tgz#293d1a94c43c1fdbb3835378e43d255e8ad5c961" + integrity sha512-X4BNBYuCyfRMGJ/Bjjk/gQw4eT6ixIXNltDQ8kapymilCqKEBZ6Rlx6noEfVzeh2nK7VP0e4rQ4DBj+TK6EDzA== dependencies: broccoli-funnel "^1.0.0" broccoli-merge-trees "^1.1.0" broccoli-sass-source-maps "^2.1.0" - ember-cli-version-checker "^1.0.2" + ember-cli-version-checker "^2.1.0" ember-cli-showdown@^4.1.0: version "4.4.4" @@ -4732,12 +4373,12 @@ ember-cli-sri@^2.1.1: broccoli-sri-hash "^2.1.0" ember-cli-string-helpers@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-1.5.0.tgz#b7c1b27ffd4bb4bf4846b3167f730f0125a96f44" - integrity sha1-t8Gyf/1LtL9IRrMWf3MPASWpb0Q= + version "1.10.0" + resolved "https://registry.yarnpkg.com/ember-cli-string-helpers/-/ember-cli-string-helpers-1.10.0.tgz#6ee6c18d15759acb0905aa0153fe9e031a382fa4" + integrity sha512-z2eNT7BsTNSxp3qNrv7KAxjPwdLC1kIYCck9CERg0RM5vBGy2vK6ozZE3U6nWrtth1xO4PrYkgISwhSgN8NMeg== dependencies: broccoli-funnel "^1.0.1" - ember-cli-babel "^6.3.0" + ember-cli-babel "^6.6.0" ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" @@ -4790,22 +4431,14 @@ ember-cli-valid-component-name@^1.0.0: dependencies: silent-error "^1.0.0" -ember-cli-version-checker@^1.0.2, ember-cli-version-checker@^1.1.6, ember-cli-version-checker@^1.2.0: +ember-cli-version-checker@^1.0.2: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" integrity sha1-C8LRNMgwFC2mS/lieg7e0QthrnI= dependencies: semver "^5.3.0" -ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz#fc79a56032f3717cf844ada7cbdec1a06fedb604" - integrity sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ== - dependencies: - resolve "^1.3.3" - semver "^5.3.0" - -ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: +ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz#47771b731fe0962705e27c8199a9e3825709f3b3" integrity sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg== @@ -4814,11 +4447,11 @@ ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: semver "^5.3.0" ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.2.tgz#baee5cc621d5259d9011b5ef60fe6fbe61bd57c7" - integrity sha512-SNY7757cqj5GmES9dlWb43aWoGUcc+keniu+Rvsl/C/TnSK99edgL6eG4+Zr0ESeJ1hEcI3UrHN/8GIcK5eJUQ== + 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.1.1" + resolve-package-path "^1.2.6" semver "^5.6.0" ember-cli@~3.4.4: @@ -4914,7 +4547,7 @@ ember-cli@~3.4.4: watch-detector "^0.1.0" yam "^0.0.24" -ember-compatibility-helpers@^1.1.1: +ember-compatibility-helpers@^1.1.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== @@ -4924,30 +4557,30 @@ ember-compatibility-helpers@^1.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" - integrity sha512-H6KCyB/BzjR18MxQFcQQR5MDRmawCmCCZKHQTEpAwhs5wCDhnMMLUGINan+sY4NRPrStfpUlMoGg9fsksN2wJA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.2.0.tgz#a03984eaddf65ee08cb9ff554a24b0d671651af3" + integrity sha512-VWFYfxPLkgmEoL5aplh8dEwzAhmERfPzIGZeb+O7PhT0of5SYtJeOJFbIIXV2NkVHcDothwUu3IEALsWBsES8A== dependencies: broccoli-funnel "^1.0.1" - ember-cli-babel "^6.6.0" + ember-cli-babel "^7.1.0" ember-concurrency@^0.8.12: - version "0.8.12" - resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.12.tgz#fb91180e5efeb1024cfa2cfb99d2fe6721930c91" - integrity sha1-+5EYDl7+sQJM+iz7mdL+ZyGTDJE= + version "0.8.27" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.27.tgz#6dd1b9928cf5d13d5ae9c8cd3d5869f6ff81a9a9" + integrity sha512-2IujJ0Y79a+sHvEOPhUtZ7Ga8HDrwjbQqO7aZ88b0KCsXPro7birQFB508njQSQ0mxrsR9qzDv/KS5V67Cy5dA== dependencies: babel-core "^6.24.1" ember-cli-babel "^6.8.2" - ember-getowner-polyfill "^2.0.0" ember-maybe-import-regenerator "^0.1.5" -ember-concurrency@^0.8.26: - version "0.8.27" - resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.27.tgz#6dd1b9928cf5d13d5ae9c8cd3d5869f6ff81a9a9" - integrity sha512-2IujJ0Y79a+sHvEOPhUtZ7Ga8HDrwjbQqO7aZ88b0KCsXPro7birQFB508njQSQ0mxrsR9qzDv/KS5V67Cy5dA== +ember-concurrency@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.9.0.tgz#0016652ff780fb665842e7f47815ee0601122ea1" + integrity sha512-JDjvwSlZBUQwv1+qUj6YUqXXe0Y0/to4ppUTNXQ1EEiEAopkHJXQUn0ZcFOiQpEinrYp34Vg6+lUNskoJFL2Vg== 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-copy@1.0.0, ember-copy@^1.0.0: @@ -5014,13 +4647,6 @@ ember-export-application-global@^2.0.0: dependencies: ember-cli-babel "^6.0.0-beta.7" -ember-factory-for-polyfill@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ember-factory-for-polyfill/-/ember-factory-for-polyfill-1.2.0.tgz#e27752a7d9dbd5336e8b470341bc1c55bbe3e4d2" - integrity sha512-6Kr/FqL0h4F0f4AcG6EX9+9ml0BpSLuN82S3fYvwTFuh1HdrPUmGUcOCTuzZZLpS+n5BZjQukokJLSHzXewmyA== - dependencies: - ember-cli-version-checker "^1.2.0" - ember-factory-for-polyfill@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-factory-for-polyfill/-/ember-factory-for-polyfill-1.3.1.tgz#b446ed64916d293c847a4955240eb2c993b86eae" @@ -5029,9 +4655,9 @@ ember-factory-for-polyfill@^1.3.1: ember-cli-version-checker "^2.1.0" ember-fetch@^3.4.3: - version "3.4.4" - resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-3.4.4.tgz#926ffa1c4120324b298c44e9558b458e586eb504" - integrity sha512-N81LZl/NEaQiK4KnLHuibrIZ7goxuIarrQ+A6ZBE/aQCI2x23IISL/YgX0U4bL2F+9I6Kg9ZO2gI+4tszGQSEQ== + version "3.4.5" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-3.4.5.tgz#2967df9cbdbe0993402588216332580be3950b92" + integrity sha512-6rrZ0VMcp9jd1eyS6tuZdquH3nb7juT7l2bZ5zYPZUAVlUAOnyWJH+KIZ16osj7kqV60yqaCRUn99HWX1dXoyw== dependencies: broccoli-funnel "^1.2.0" broccoli-stew "^1.4.2" @@ -5062,15 +4688,7 @@ ember-get-config@^0.2.2: broccoli-file-creator "^1.1.1" ember-cli-babel "^6.3.0" -ember-getowner-polyfill@^2.0.0, ember-getowner-polyfill@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-2.0.1.tgz#9bfe2b4d527ed174e76fef2c8f30937d77cb66fb" - integrity sha1-m/4rTVJ+0XTnb+8sjzCTfXfLZvs= - dependencies: - ember-cli-version-checker "^1.2.0" - ember-factory-for-polyfill "^1.1.0" - -ember-getowner-polyfill@^2.2.0: +ember-getowner-polyfill@^2.0.1, ember-getowner-polyfill@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz#38e7dccbcac69d5ec694000329ec0b2be651d2b2" integrity sha512-rwGMJgbGzxIAiWYjdpAh04Abvt0s3HuS/VjHzUFhVyVg2pzAuz45B9AzOxYXzkp88vFC7FPaiA4kE8NxNk4A4Q== @@ -5078,14 +4696,7 @@ ember-getowner-polyfill@^2.2.0: ember-cli-version-checker "^2.1.0" ember-factory-for-polyfill "^1.3.1" -ember-inflector@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-2.0.1.tgz#e9ac469ffa17992a43276bb1c9b8d87992b10d37" - integrity sha512-CFiWADOwuyRJwlOm2/8qvCRPLPylowvew+2vgFUFjd6UDvunwQfOJ/LS06PqnNcTfKN5Wu3Rcvj81NzIVkJmSg== - dependencies: - ember-cli-babel "^6.0.0" - -ember-inflector@^3.0.0: +"ember-inflector@^2.0.0 || ^3.0.0", ember-inflector@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.0.tgz#7e1ee8aaa0fa773ba0905d8b7c0786354d890ee1" integrity sha512-tLWfYolZAkLnkTvvBkjizy4Wmj8yI8wqHZFK+leh0iScHiC3r1Yh5C4qO+OMGiBTMLwfTy+YqVoE/Nu3hGNkcA== @@ -5115,18 +4726,6 @@ ember-load-initializers@^1.1.0: dependencies: ember-cli-babel "^6.6.0" -ember-lodash@^4.17.3: - version "4.17.5" - resolved "https://registry.yarnpkg.com/ember-lodash/-/ember-lodash-4.17.5.tgz#bda557402facae144567d1ef530b3de7c38bcde1" - integrity sha512-KNXi6nosrNOyYmop4J+z3lBskZQe8077nJufY7ZqjCdKNrFH9cZ0FpwANZKcYqJe+srwp4RPOW9RaMdjTdFSvw== - dependencies: - broccoli-debug "^0.6.1" - broccoli-funnel "^1.1.0" - broccoli-merge-trees "^2.0.0" - broccoli-string-replace "^0.1.1" - ember-cli-babel "^6.4.1" - lodash-es "^4.17.4" - ember-macro-helpers@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-macro-helpers/-/ember-macro-helpers-2.2.0.tgz#682bb887fda0679fd82cf981190f6dbba20b6e03" @@ -5172,14 +4771,14 @@ ember-native-dom-helpers@^0.5.3, ember-native-dom-helpers@^0.5.4: ember-cli-babel "^6.6.0" ember-power-select@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/ember-power-select/-/ember-power-select-2.2.3.tgz#ab23ba0c1bcf743b60703afb0655788ccb0912e4" - integrity sha512-Y1sgUD7e78szL5bSdmqIFI175NNF1iw92JsDFY56AxYXQk/0se58P07fiyHgWQ5YgC5ilS3bHmkWJ6hAw6Q1lA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/ember-power-select/-/ember-power-select-2.3.0.tgz#f9f2d242381f715f860c76f168d63c6ff2688ae7" + integrity sha512-LSLAt3WiljlbXelWLgna6cnnvhapltzK/yYoRbQ2iyawIQA1yU/HD4Sc2s3flrGI5IpAIbG+MFYKq0CpfJWQMQ== dependencies: ember-basic-dropdown "^1.1.0" ember-cli-babel "^7.2.0" ember-cli-htmlbars "^3.0.1" - ember-concurrency "^0.8.26" + ember-concurrency "^0.9.0" ember-text-measurer "^0.5.0" ember-truth-helpers "^2.1.0" @@ -5216,16 +4815,6 @@ ember-responsive@^3.0.0: dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" - integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== - -ember-rfc176-data@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.7.tgz#ecff7d74987d09296d3703343fed934515a4be33" - integrity sha512-AbTlD+q7sfyrD4diZqE7r9Y9/Je+HntVn7TlpHAe+nP5BNXxUXJIfDs5w5e3MxPcMs6Dz/yY90YfW8h1oKEvGg== - ember-rfc176-data@^0.3.8: version "0.3.8" resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.8.tgz#d46bbef9a0d57c803217b258cfd2e90d8e191848" @@ -5239,12 +4828,12 @@ ember-router-generator@^1.2.3: recast "^0.11.3" ember-runtime-enumerable-includes-polyfill@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.0.0.tgz#6e9ba118bc909d1d7762de1b03a550d8955308a9" - integrity sha1-bpuhGLyQnR13Yt4bA6VQ2JVTCKk= + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-runtime-enumerable-includes-polyfill/-/ember-runtime-enumerable-includes-polyfill-2.1.0.tgz#dc6d4a028471e4acc350dfd2a149874fb20913f5" + integrity sha512-au18iI8VbEDYn3jLFZzETnKN5ciPgCUxMRucEP3jkq7qZ6sE0FVKpWMPY/h9tTND3VOBJt6fgPpEBJoJVCUudg== dependencies: - ember-cli-babel "^6.0.0" - ember-cli-version-checker "^1.1.6" + ember-cli-babel "^6.9.0" + ember-cli-version-checker "^2.1.0" ember-sinon@^1.0.1: version "1.0.1" @@ -5303,14 +4892,7 @@ ember-text-measurer@^0.5.0: dependencies: ember-cli-babel "^7.1.0" -ember-truth-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-2.0.0.tgz#f3e2eef667859197f1328bb4f83b0b35b661c1ac" - integrity sha512-B28rHIXi4nIoMOxiCLTNfz5m0b0kfpIM49Sna5/9q44drLuDInVH1H6dRBkG5ROa6zR/md36C/uMyTofjvnI5Q== - dependencies: - ember-cli-babel "^6.8.2" - -ember-truth-helpers@^2.1.0: +ember-truth-helpers@^2.0.0, ember-truth-helpers@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-2.1.0.tgz#d4dab4eee7945aa2388126485977baeb33ca0798" integrity sha512-BQlU8aTNl1XHKTYZ243r66yqtR9JU7XKWQcmMA+vkqfkE/c9WWQ9hQZM8YABihCmbyxzzZsngvldokmeX5GhAw== @@ -5318,13 +4900,13 @@ ember-truth-helpers@^2.1.0: ember-cli-babel "^6.6.0" ember-weakmap@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ember-weakmap/-/ember-weakmap-3.1.1.tgz#2ae6e0080b5b80cf0d108f7752dc69ea9603dbd7" - integrity sha512-rfW3A1m3NFsHd/NuHyBkssU0Qf0zGcJmASGfhjZc7fIQeBZvSLIFYZTej+W+YBLPtED9h/SVW63DHTRY5PUR4Q== + version "3.3.2" + resolved "https://registry.yarnpkg.com/ember-weakmap/-/ember-weakmap-3.3.2.tgz#82c0d3168df786f789600cd8386c2eabff96958d" + integrity sha512-AFECvDuKaxMvi/kMl18sRDUwoB+WKxDdLXfEAOJ8JbjcYhGE/6cWXELSNIshIIwmuLRyDC9xwfhd7PpMnRohYA== dependencies: - browserslist "^2.2.2" + browserslist "^3.1.1" debug "^3.1.0" - ember-cli-babel "^6.3.0" + ember-cli-babel "^6.6.0" ember-welcome-page@^3.2.0: version "3.2.0" @@ -5340,10 +4922,12 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" - integrity sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA= +enabled@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" + integrity sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M= + dependencies: + env-variable "0.0.x" encodeurl@~1.0.2: version "1.0.2" @@ -5406,25 +4990,20 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" -ensure-posix-path@^1.0.0, ensure-posix-path@^1.1.0: +ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2, ensure-posix-path@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce" integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== -ensure-posix-path@^1.0.1, ensure-posix-path@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz#a65b3e42d0b71cfc585eb774f9943c8d9b91b0c2" - integrity sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI= - -entities@^1.1.1: +entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== -entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" - integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= +env-variable@0.0.x: + version "0.0.5" + resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88" + integrity sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA== errno@^0.1.3, errno@~0.1.7: version "0.1.7" @@ -5434,9 +5013,9 @@ errno@^0.1.3, errno@~0.1.7: prr "~1.0.1" error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - integrity sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" @@ -5474,15 +5053,15 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -5501,9 +5080,9 @@ eslint-visitor-keys@^1.0.0: integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== eslint@^4.0.0, eslint@^4.13.1: - version "4.15.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.15.0.tgz#89ab38c12713eec3d13afac14e4a89e75ef08145" - integrity sha512-zEO/Z1ZUxIQ+MhDVKkVTUYpIPDTEJLXGMrkID+5v1NeQHtCz6FZikWuFRgxE1Q/RV2V4zVl1u3xmpPADHhMZ6A== + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -5511,10 +5090,10 @@ eslint@^4.0.0, eslint@^4.13.1: concat-stream "^1.6.0" cross-spawn "^5.1.0" debug "^3.1.0" - doctrine "^2.0.2" + doctrine "^2.1.0" eslint-scope "^3.7.1" eslint-visitor-keys "^1.0.0" - espree "^3.5.2" + espree "^3.5.4" esquery "^1.0.0" esutils "^2.0.2" file-entry-cache "^2.0.0" @@ -5536,25 +5115,26 @@ eslint@^4.0.0, eslint@^4.13.1: path-is-inside "^1.0.2" pluralize "^7.0.0" progress "^2.0.0" + regexpp "^1.0.1" require-uncached "^1.0.3" semver "^5.3.0" strip-ansi "^4.0.0" strip-json-comments "~2.0.1" - table "^4.0.1" + table "4.0.2" text-table "~0.2.0" -espree@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" - integrity sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ== +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== dependencies: - acorn "^5.2.1" + acorn "^5.5.0" acorn-jsx "^3.0.0" esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - integrity sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esprima@~3.0.0: version "3.0.0" @@ -5567,19 +5147,18 @@ esprima@~3.1.0: integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" - integrity sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo= + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" - integrity sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM= + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" - object-assign "^4.0.1" estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" @@ -5596,21 +5175,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -etag@~1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" - integrity sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE= - etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= - eventemitter3@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" @@ -5621,10 +5190,10 @@ events-to-array@^1.0.1: resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -5644,11 +5213,11 @@ exec-file-sync@^2.0.0: spawn-sync "^1.0.11" exec-sh@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" - integrity sha1-FPdd4/INKG75MwmbLOUKkDWc7xA= + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" + integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== dependencies: - merge "^1.1.3" + merge "^1.2.0" execa@^0.10.0: version "0.10.0" @@ -5707,12 +5276,7 @@ exists-stat@1.0.0: resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" integrity sha1-BmDjUlouidnkRhKUQMJy7foktSk= -exists-sync@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.3.tgz#b910000bedbb113b378b82f5f5a7638107622dcf" - integrity sha1-uRAAC+27ETs3i4L19adjgQdiLc8= - -exists-sync@0.0.4, exists-sync@^0.0.4: +exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" integrity sha1-l0TCxCjMA7AQYNtFTUsS8O88iHk= @@ -5747,41 +5311,7 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -express@^4.10.7: - version "4.15.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.15.4.tgz#032e2253489cf8fce02666beca3d11ed7a2daed1" - integrity sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE= - dependencies: - accepts "~1.3.3" - array-flatten "1.1.1" - content-disposition "0.5.2" - content-type "~1.0.2" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.8" - depd "~1.1.1" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.0" - finalhandler "~1.0.4" - fresh "0.5.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.1" - path-to-regexp "0.1.7" - proxy-addr "~1.1.5" - qs "6.5.0" - range-parser "~1.2.0" - send "0.15.4" - serve-static "1.12.4" - setprototypeof "1.0.3" - statuses "~1.3.1" - type-is "~1.6.15" - utils-merge "1.0.0" - vary "~1.1.1" - -express@^4.16.3: +express@^4.10.7, express@^4.16.3: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== @@ -5832,10 +5362,10 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^1.1.0: version "1.1.1" @@ -5847,13 +5377,13 @@ external-editor@^1.1.0: tmp "^0.0.29" external-editor@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" - integrity sha1-HtkZnanL/i7y96MbL96LDRI2iXI= + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== dependencies: + chardet "^0.4.0" iconv-lite "^0.4.17" - jschardet "^1.4.2" - tmp "^0.0.31" + tmp "^0.0.33" extglob@^2.0.4: version "2.0.4" @@ -5869,20 +5399,20 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= -eyes@0.1.x: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fake-xml-http-request@^1.4.0, fake-xml-http-request@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz#bd0ac79ae3e2660098282048a12c730a6f64d550" - integrity sha512-99XPwwSg89BfzPuv4XCpZxn3EbauMCgAQCxq9MzrvS6DFD73OON6AnUTicL4A0HZtYMBwCZBWVnRqGjZDgQkTg== +fake-xml-http-request@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.0.0.tgz#41a92f0ca539477700cb1dafd2df251d55dac8ff" + integrity sha512-UjNnynb6eLAB0lyh2PlTEkjRJORnNsVF1hbzU+PQv89/cyBV9GDRCy7JAcLQgeCLYT+3kaumWWZKEJvbaK74eQ== faker@^3.0.0: version "3.1.0" @@ -5890,9 +5420,9 @@ faker@^3.0.0: integrity sha1-D5CPr05uwCUk5UpX5DLFwBPgjJ8= fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" - integrity sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8= + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= fast-deep-equal@^2.0.1: version "2.0.1" @@ -5928,20 +5458,10 @@ fast-ordered-set@^1.0.0, fast-ordered-set@^1.0.2: dependencies: blank-object "^1.0.1" -fast-sourcemap-concat@^1.0.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.2.3.tgz#22f14e92d739e37920334376ec8433bf675eaa04" - integrity sha1-IvFOktc543kgM0N27IQzv2deqgQ= - dependencies: - chalk "^0.5.1" - fs-extra "^0.30.0" - heimdalljs-logger "^0.1.7" - memory-streams "^0.1.0" - mkdirp "^0.5.0" - rsvp "^3.0.14" - source-map "^0.4.2" - source-map-url "^0.3.0" - sourcemap-validator "^1.0.5" +fast-safe-stringify@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2" + integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg== fast-sourcemap-concat@^1.4.0: version "1.4.0" @@ -5971,6 +5491,11 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +fecha@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" + integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -6027,19 +5552,6 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" -finalhandler@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.4.tgz#18574f2e7c4b98b8ae3b230c21f201f31bdb3fb7" - integrity sha512-16l/r8RgzlXKmFOhZpHBztvye+lAhC5SU7hXavnerC9UfZqZxxXl3BzL8MhffPT3kF61lj9Oav2LKEzh0ei7tg== - dependencies: - debug "2.6.8" - encodeurl "~1.0.1" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.1" - statuses "~1.3.1" - unpipe "~1.0.0" - find-babel-config@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" @@ -6058,9 +5570,9 @@ find-cache-dir@^2.0.0: pkg-dir "^3.0.0" find-index@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.0.tgz#53007c79cd30040d6816d79458e8837d5c5705ef" - integrity sha1-UwB8ec0wBA1oFteUWOiDfVxXBe8= + version "1.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-1.1.1.tgz#4b221f8d46b7f8bea33d8faed953f3ca7a081cbc" + integrity sha512-XYKutXMrIK99YMUPf91KX5QVJoG31/OsgftD6YoTPAObfQIxM4ziA9f0J1AsqKhJmo+IeaIPP0CFopTD4bdUBw== find-parent-dir@^0.3.0: version "0.3.0" @@ -6119,45 +5631,48 @@ fireworm@^0.7.0: minimatch "^3.0.2" fixturify-project@^1.5.3: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.8.0.tgz#c2b2d510afbb4c9ab6c94cf85659565b3794e1d1" - integrity sha512-D+UqEd/2vdK12CJTwKCoUyMOM3/iqevck8xvDQcHFkD7xPYzl4NIYi4uLp4O1Yi7HLNCHl/KfMg7ex8XwqbEfg== + version "1.8.1" + resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.8.1.tgz#c0a95a801538bcdd502cbe6a1950f663c1e077a4" + integrity sha512-kq1rX8SlHzfR5Okhj4gatm/XJDv2ELzHiW9S5zFoZygHMrCRhoWcW/Ktl8zzpmJn/dsz8Rrm7addq62G3wmCNw== dependencies: - fixturify "^0.3.4" + fixturify "^1.2.0" tmp "^0.0.33" -fixturify@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-0.3.4.tgz#c676de404a7f8ee8e64d0b76118e62ec95ab7b25" - integrity sha512-Gx+KSB25b6gMc4bf7UFRTA85uE0iZR+RYur0JHh6dg4AGBh0EksOv4FCHyM7XpGmiJO7Bc7oV7vxENQBT+2WEQ== +fixturify@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-1.2.0.tgz#abe8c52dd27dbbfdb874a02893781c93425663ea" + integrity sha512-b5CMQmBZKsGR6HGqdSrLOGYGHIqrR0CUrcGU/lDL0mYy+DtGm5cnb61Z0UiIUqMVZIoV0CbN+u9/Gwjj+ICg0A== dependencies: - fs-extra "^0.30.0" - matcher-collection "^1.0.4" + "@types/fs-extra" "^5.0.5" + "@types/minimatch" "^3.0.3" + "@types/rimraf" "^2.0.2" + fs-extra "^7.0.1" + matcher-collection "^2.0.0" flat-cache@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" - integrity sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y= + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== dependencies: circular-json "^0.3.1" - del "^2.0.2" graceful-fs "^4.1.2" + rimraf "~2.6.2" write "^0.2.1" flat@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.0.0.tgz#3abc7f3b588e64ce77dc42fd59aa35806622fea8" - integrity sha512-ji/WMv2jdsE+LaznpkIF9Haax0sdpTBozrz/Dtg4qSRMfbs8oVg4ypJunIRYPiMLvH/ed6OflXbnbTIKJhtgeg== + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== dependencies: - is-buffer "~1.1.5" + is-buffer "~2.0.3" flush-write-stream@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" - integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" + inherits "^2.0.3" + readable-stream "^2.3.6" follow-redirects@^1.0.0: version "1.7.0" @@ -6176,27 +5691,22 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.5" + combined-stream "^1.0.6" mime-types "^2.1.12" -formatio@1.2.0, formatio@^1.2.0: +formatio@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" integrity sha1-87IWfZBoxGmKjVH092CjmlTYGOs= dependencies: samsam "1.x" -forwarded@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" - integrity sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M= - forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -6209,11 +5719,6 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fresh@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" - integrity sha1-9HTKXmqSRtb9jglTz6m5yAWvp44= - fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -6237,34 +5742,6 @@ fs-extra@^0.24.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - -fs-extra@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.0.0.tgz#337352bded4a0b714f3eb84de8cea765e9d37600" - integrity sha1-M3NSve1KC3FPPrhN6M6nZenTdgA= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -6292,7 +5769,7 @@ fs-extra@^6.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^7.0.0: +fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -6308,7 +5785,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4: +fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw== @@ -6318,16 +5795,6 @@ fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4: path-posix "^1.0.0" symlink-or-copy "^1.1.8" -fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.7.tgz#315e2b098d5fe7f622880ac965b1b051868ac871" - integrity sha512-dJwDX6NBH7IfdfFjZAdHCZ6fIKc8LwR7kzqUhYRFJuX4g9ctG/7cuqJuwegGQsyLEykp6Z4krq+yIFMQlt7d9Q== - dependencies: - heimdalljs-logger "^0.1.7" - object-assign "^4.1.0" - path-posix "^1.0.0" - symlink-or-copy "^1.1.8" - fs-tree-diff@^1.0.0, fs-tree-diff@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-1.0.2.tgz#0e2931733a85b55feb3472c0b89a20b0c03ac0de" @@ -6364,15 +5831,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - -fsevents@^1.2.3: +fsevents@^1.2.3, fsevents@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== @@ -6401,9 +5860,9 @@ functional-red-black-tree@^1.0.1: integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= fuse.js@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.2.0.tgz#f0448e8069855bf2a3e683cdc1d320e7e2a07ef4" - integrity sha1-8ESOgGmFW/Kj5oPNwdMg5+KgfvQ= + version "3.2.1" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.2.1.tgz#6320cb94ce56ec9755c89ade775bcdbb0358d425" + integrity sha1-YyDLlM5W7JdVyJred1vNuwNY1CU= gauge@~2.7.3: version "2.7.4" @@ -6420,21 +5879,21 @@ gauge@~2.7.3: wide-align "^1.1.0" gaze@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" - integrity sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU= + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== dependencies: globule "^1.0.0" get-caller-file@^1.0.0, get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-own-enumerable-property-symbols@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b" - integrity sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug== +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" + integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg== get-stdin@^4.0.1: version "4.0.1" @@ -6494,19 +5953,7 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.2, glob@~7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.5, glob@^7.1.3: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -6538,12 +5985,7 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -globals@^11.0.1: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.1.0.tgz#632644457f5f0e3ae711807183700ebf2e4633e4" - integrity sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ== - -globals@^11.1.0: +globals@^11.0.1, globals@^11.1.0: version "11.11.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== @@ -6553,26 +5995,14 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - globby@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.1.0.tgz#e90f4d5134109e6d855abdd31bdb1b085428592e" - integrity sha512-VtYjhHr7ncls724Of5W6Kaahz0ag7dB4G62/2HsN+xEKG6SrPzM1AJMerGxQTwJGnN9reeyxdvXbuZYpfssCvg== + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== dependencies: "@types/glob" "^7.1.1" array-union "^1.0.2" - dir-glob "^2.2.1" + dir-glob "^2.2.2" fast-glob "^2.2.6" glob "^7.1.3" ignore "^4.0.3" @@ -6580,20 +6010,15 @@ globby@^9.0.0: slash "^2.0.0" globule@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" - integrity sha1-HcScaCLdnoovoAuiopUAboZkvQk= + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== dependencies: glob "~7.1.1" - lodash "~4.17.4" + lodash "~4.17.10" minimatch "~3.0.2" -graceful-fs@^4.1.11, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= - -graceful-fs@^4.1.15, graceful-fs@^4.1.2: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== @@ -6608,23 +6033,12 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.4: - version "4.0.10" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" - integrity sha1-PTDHGLCaPZbyPqTMH0A8TTup/08= - dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" - -handlebars@^4.0.6: - version "4.1.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" - integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== +handlebars@^4.0.4, handlebars@^4.0.6: + version "4.1.1" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.1.tgz#6e4e41c18ebe7719ae4d38e5aca3d32fa3dd23d3" + integrity sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA== dependencies: - async "^2.5.0" + neo-async "^2.6.0" optimist "^0.6.1" source-map "^0.6.1" optionalDependencies: @@ -6641,25 +6055,18 @@ handlebars@~4.0.13: optionalDependencies: uglify-js "^3.1.4" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== dependencies: - ansi-regex "^0.2.0" + ajv "^6.5.5" + har-schema "^2.0.0" has-ansi@^2.0.0: version "2.0.0" @@ -6680,11 +6087,6 @@ has-cors@1.1.0: resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -6738,13 +6140,6 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" - integrity sha1-ZuodhW206KVHDK32/OI65SRO8uE= - dependencies: - inherits "^2.0.1" - hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" @@ -6754,9 +6149,9 @@ hash-base@^3.0.0: safe-buffer "^5.0.1" hash-for-dep@^1.0.2, hash-for-dep@^1.2.3, hash-for-dep@^1.4.7, hash-for-dep@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.0.tgz#02dacb5a3ee14e45d06f5aa039d142c970940476" - integrity sha512-Jtp264IRh25UmNHBNjB9jgYQGOpUVFMzt8E2MS6dJyR5uAO14bq4B9q5znOStkKpOpcxNUrYtg3hgpOSjQSONw== + version "1.5.1" + resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.1.tgz#497754b39bee2f1c4ade4521bfd2af0a7c1196e3" + integrity sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw== dependencies: broccoli-kitchen-sink-helpers "^0.3.1" heimdalljs "^0.2.3" @@ -6766,22 +6161,12 @@ hash-for-dep@^1.0.2, hash-for-dep@^1.2.3, hash-for-dep@^1.4.7, hash-for-dep@^1.5 resolve-package-path "^1.0.11" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" + minimalistic-assert "^1.0.1" heimdalljs-fs-monitor@^0.2.2: version "0.2.2" @@ -6796,7 +6181,7 @@ heimdalljs-graph@^0.3.4: resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.5.tgz#420fbbc8fc3aec5963ddbbf1a5fb47921c4a5927" integrity sha512-szOy9WZUc7eUInEBQEsoa1G2d+oYHrn6ndZPf76eh8A9ID1zWUCEEsxP3F+CvQx9+EDrg1srdyLUmfVAr8EB4g== -heimdalljs-logger@^0.1.7: +heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: version "0.1.10" resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7" integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g== @@ -6804,28 +6189,13 @@ heimdalljs-logger@^0.1.7: debug "^2.2.0" heimdalljs "^0.2.6" -heimdalljs-logger@^0.1.9: - version "0.1.9" - resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz#d76ada4e45b7bb6f786fc9c010a68eb2e2faf176" - integrity sha1-12raTkW3u294b8nAEKaOsuL68XY= - dependencies: - debug "^2.2.0" - heimdalljs "^0.2.0" - -heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.6: +heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heimdalljs@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe" integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA== dependencies: rsvp "~3.2.1" -heimdalljs@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" - integrity sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw= - dependencies: - rsvp "~3.2.1" - heimdalljs@^0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" @@ -6842,11 +6212,6 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= - home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -6862,17 +6227,12 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" - integrity sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw== - -hosted-git-info@^2.6.0: +hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== -http-errors@1.6.3, http-errors@~1.6.3: +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= @@ -6882,25 +6242,12 @@ http-errors@1.6.3, http-errors@~1.6.3: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-proxy@^1.13.1: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" - integrity sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I= - dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" +http-parser-js@>=0.4.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" + integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== -http-proxy@^1.17.0: +http-proxy@^1.13.1, http-proxy@^1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== @@ -6909,12 +6256,12 @@ http-proxy@^1.17.0: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: - assert-plus "^0.2.0" + assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" @@ -6932,22 +6279,24 @@ husky@^0.14.3: normalize-path "^1.0.0" strip-indent "^2.0.0" -iconv-lite@0.4.23, iconv-lite@^0.4.4: +iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.17: - version "0.4.18" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" - integrity sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA== +iconv-lite@^0.4.17, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" - integrity sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q= + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== iferr@^0.1.5: version "0.1.5" @@ -6962,9 +6311,9 @@ ignore-walk@^3.0.1: minimatch "^3.0.4" ignore@^3.3.3: - version "3.3.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.4.tgz#85ab6d0a9ca8b27b31604c09efe1c14dc21ab872" - integrity sha512-KjHyHxUgicfgFiTJaIA9DoeY3TIQz5thaKqm35re7RTVVB7zjF1fTMIDMXM4GUUBipR4FW8BvGnA115pZ/AxQQ== + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== ignore@^4.0.3: version "4.0.6" @@ -7027,9 +6376,9 @@ inherits@2.0.1: integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - integrity sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4= + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inline-source-map-comment@^1.0.5: version "1.0.5" @@ -7062,27 +6411,7 @@ inquirer@^2: strip-ansi "^3.0.0" through "^2.3.6" -inquirer@^3.0.6: - version "3.2.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.2.tgz#c2aaede1507cc54d826818737742d621bef2e823" - integrity sha512-bTKLzEHJVATimZO/YFdLrom0lRx1BHfRYskFHfIMVkGdp8+dIZaxuU+4yrsS1lcu6YWywVQVVsfvdwESzbeqHw== - dependencies: - ansi-escapes "^2.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -inquirer@^3.3.0: +inquirer@^3.0.6, inquirer@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== @@ -7103,9 +6432,9 @@ inquirer@^3.3.0: through "^2.3.6" invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - integrity sha1-nh9WrArNtr8wMwbzOL47IErmA2A= + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" @@ -7114,11 +6443,6 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -ipaddr.js@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" - integrity sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA= - ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" @@ -7143,6 +6467,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -7150,17 +6479,15 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.5, is-buffer@~1.1.5: +is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= - dependencies: - builtin-modules "^1.0.0" +is-buffer@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== is-callable@^1.1.4: version "1.1.4" @@ -7168,11 +6495,11 @@ is-callable@^1.1.4: integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-ci@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" - integrity sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4= + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== dependencies: - ci-info "^1.0.0" + ci-info "^1.5.0" is-data-descriptor@^0.1.4: version "0.1.4" @@ -7265,9 +6592,9 @@ is-glob@^3.1.0: is-extglob "^2.1.0" is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" @@ -7278,11 +6605,6 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-obj@^1.0.0, is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -7295,32 +6617,6 @@ is-observable@^0.2.0: dependencies: symbol-observable "^0.2.2" -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - integrity sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ== - dependencies: - is-number "^4.0.0" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - integrity sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw= - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - integrity sha1-/AbloWg/vaE95mev9xe7wQpI838= - dependencies: - path-is-inside "^1.0.1" - is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -7334,9 +6630,9 @@ is-promise@^2.1.0: integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-reference@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.1.tgz#bf2cda150a877f04d48caaf8fd70c03d8bed5e2d" - integrity sha512-URlByVARcyP2E2GC7d3Ur702g3vqW391VKCHuF5Goo/M8IT97k4RU/+56OYImwDdX1J/V/VRxECE/wJqB0I2tg== + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.2.tgz#01cf91517d21db66a34642287ed6e70d53dcbe5c" + integrity sha512-Kn5g8c7XHKejFOpTf2QN9YjiHHKl5xRj+2uAZf9iM2//nkBNi/NNeB5JMoun28nEaUVHyPUzqzhfRlfAirEjXg== dependencies: "@types/estree" "0.0.39" @@ -7353,11 +6649,9 @@ is-regexp@^1.0.0: integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - integrity sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI= - dependencies: - tryit "^1.0.1" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-stream@^1.1.0: version "1.1.0" @@ -7393,6 +6687,11 @@ is-windows@^1.0.1, is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -7432,7 +6731,7 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isstream@0.1.x, isstream@~0.1.2: +isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= @@ -7475,20 +6774,15 @@ jquery-deferred@^0.3.0: resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= -jquery@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" - integrity sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c= - -jquery@^3.3.1: +jquery@^3.2.1, jquery@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== js-base64@^2.1.8: - version "2.1.9" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" - integrity sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4= + version "2.5.1" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" + integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== js-levenshtein@^1.1.3: version "1.1.6" @@ -7505,33 +6799,25 @@ js-string-escape@^1.0.1: resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + js-yaml@0.3.x: version "0.3.7" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-0.3.7.tgz#d739d8ee86461e54b354d6a7d7d1f2ad9a167f62" integrity sha1-1znY7oZGHlSzVNan19HyrZoWf2I= -js-yaml@^3.12.0: - version "3.12.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" - integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.9.0, js-yaml@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" - integrity sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww== +js-yaml@^3.12.0, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.9.0, js-yaml@^3.9.1: + version "3.13.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" + integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -7549,22 +6835,12 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jschardet@^1.4.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" - integrity sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A== - jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= -jsesc@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" - integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= - -jsesc@^2.5.1: +jsesc@^2.5.0, jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== @@ -7584,7 +6860,7 @@ jsmin@1.x: resolved "https://registry.yarnpkg.com/jsmin/-/jsmin-1.0.1.tgz#e7bd0dcd6496c3bf4863235bf461a3d98aa3b98c" integrity sha1-570NzWSWw79IYyNb9GGj2YqjuYw= -json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -7621,11 +6897,18 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^0.5.0, json5@^0.5.1: +json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + json5@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" @@ -7662,10 +6945,10 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -just-extend@^1.1.26: - version "1.1.27" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" - integrity sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g== +just-extend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" + integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== jxLoader@*: version "0.1.1" @@ -7701,17 +6984,12 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= +kuler@1.0.x: + version "1.0.1" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6" + integrity sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ== + dependencies: + colornames "^1.1.1" lcid@^1.0.0: version "1.0.0" @@ -7743,21 +7021,21 @@ levn@^0.3.0, levn@~0.3.0: type-check "~0.3.2" linkify-it@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" - integrity sha1-2UpGSPmxwXnWT6lykSaL22zpQ08= + version "2.1.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz#c4caf38a6cd7ac2212ef3c7d2bde30a91561f9db" + integrity sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg== dependencies: uc.micro "^1.0.1" lint-staged@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-6.0.0.tgz#7ab7d345f2fe302ff196f1de6a005594ace03210" - integrity sha512-ZUftK94S4vedpQG1LlA2tc2AuQXXBwc+1lB+j8SEfG5+p2dqu3Ug8iYQ8jdap+uLkhDw4OaJXqE+CZ/L+vfv+Q== + version "6.1.1" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-6.1.1.tgz#cd08c4d9b8ccc2d37198d1c47ce77d22be6cf324" + integrity sha512-M/7bwLdXbeG7ZNLcasGeLMBDg60/w6obj3KOtINwJyxAxb53XGY0yH5FSZlWklEzuVbTtqtIfAajh6jYIN90AA== dependencies: app-root-path "^2.0.0" chalk "^2.1.0" commander "^2.11.0" - cosmiconfig "^3.1.0" + cosmiconfig "^4.0.0" debug "^3.1.0" dedent "^0.7.0" execa "^0.8.0" @@ -7772,7 +7050,7 @@ lint-staged@^6.0.0: p-map "^1.1.1" path-is-inside "^1.0.2" pify "^3.0.0" - staged-git-files "0.0.4" + staged-git-files "1.0.0" stringify-object "^3.2.0" listr-silent-renderer@^1.1.1: @@ -7795,9 +7073,9 @@ listr-update-renderer@^0.4.0: strip-ansi "^3.0.1" listr-verbose-renderer@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.0.tgz#44dc01bb0c34a03c572154d4d08cde9b1dc5620f" - integrity sha1-RNwBuww0oDxXIVTU0Izemx3FYg8= + version "0.4.1" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" + integrity sha1-ggb0z21S3cWCfl/RSYng6WWTOjU= dependencies: chalk "^1.1.3" cli-cursor "^1.0.2" @@ -7844,18 +7122,18 @@ load-json-file@^1.0.0: strip-bom "^2.0.0" loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - integrity sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI= + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== dependencies: - big.js "^3.1.3" + big.js "^5.2.2" emojis-list "^2.0.0" - json5 "^0.5.0" + json5 "^1.0.1" loader.js@^4.7.0: version "4.7.0" @@ -7883,11 +7161,6 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash-es@^4.17.4: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" - integrity sha1-3MHXVS4VCgZABzupyzHXDwMpUOc= - lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" @@ -8105,11 +7378,6 @@ lodash.debounce@^3.1.1: dependencies: lodash._getnative "^3.0.0" -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -8229,20 +7497,15 @@ lodash.keys@~2.3.0: lodash._shimkeys "~2.3.0" lodash.isobject "~2.3.0" -lodash.merge@^4.3.0, lodash.merge@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" - integrity sha1-aYhLoUSsM/5plzemCG3v+t0PicU= - -lodash.merge@^4.3.1: +lodash.merge@^4.3.1, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== lodash.mergewith@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" - integrity sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU= + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== lodash.noop@~2.3.0: version "2.3.0" @@ -8342,22 +7605,7 @@ lodash.values@~2.3.0: dependencies: lodash.keys "~2.3.0" -lodash@^3.10.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= - -lodash@^4.0.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@~4.17.4: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= - -lodash@^4.17.10: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== - -lodash@^4.17.11: +lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -8369,14 +7617,7 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" -log-symbols@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.1.0.tgz#f35fa60e278832b538dc4dddcbb478a45d3e3be6" - integrity sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ== - dependencies: - chalk "^2.0.1" - -log-symbols@^2.2.0: +log-symbols@^2.0.0, log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== @@ -8391,27 +7632,28 @@ log-update@^1.0.2: ansi-escapes "^1.0.0" cli-cursor "^1.0.2" -lolex@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" - integrity sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY= - -lolex@^2.1.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.1.tgz#3d2319894471ea0950ef64692ead2a5318cff362" - integrity sha512-mQuW55GhduF3ppo+ZRUTz1PRjEh1hS5BbqU7d8D0ez2OKxHDod7StPPeAVKisZR5aLkHZjdGWSL42LSONUJsZw== +logform@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.1.2.tgz#957155ebeb67a13164069825ce67ddb5bb2dd360" + integrity sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ== + dependencies: + colors "^1.2.1" + fast-safe-stringify "^2.0.4" + fecha "^2.3.3" + ms "^2.1.1" + triple-beam "^1.3.0" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= +lolex@^2.1.2, lolex@^2.3.2: + version "2.7.5" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" + integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - integrity sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg= + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - js-tokens "^3.0.0" + js-tokens "^3.0.0 || ^4.0.0" loud-rejection@^1.0.0: version "1.6.0" @@ -8422,9 +7664,9 @@ loud-rejection@^1.0.0: signal-exit "^3.0.0" lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" - integrity sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew== + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -8449,11 +7691,11 @@ magic-string@^0.24.0: sourcemap-codec "^1.4.1" make-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" - integrity sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg= + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: - pify "^2.3.0" + pify "^3.0.0" make-dir@^2.0.0: version "2.1.0" @@ -8498,18 +7740,7 @@ markdown-it-terminal@0.1.0: lodash.merge "^4.6.0" markdown-it "^8.3.1" -markdown-it@^8.3.1: - version "8.4.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" - integrity sha512-tNuOCCfunY5v5uhcO2AUMArvKAyKMygX8tfup/JrgnsDqcCATQsAExBq7o5Ml9iMmO82bk6jYNLj6khcrl0JGA== - dependencies: - argparse "^1.0.7" - entities "~1.1.1" - linkify-it "^2.0.0" - mdurl "^1.0.1" - uc.micro "^1.0.3" - -markdown-it@^8.4.2: +markdown-it@^8.3.1, markdown-it@^8.4.2: version "8.4.2" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== @@ -8520,18 +7751,19 @@ markdown-it@^8.4.2: mdurl "^1.0.1" uc.micro "^1.0.5" -matcher-collection@^1.0.0, matcher-collection@^1.0.4, matcher-collection@^1.1.1: +matcher-collection@^1.0.0, matcher-collection@^1.0.5, matcher-collection@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838" integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g== dependencies: minimatch "^3.0.2" -matcher-collection@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" - integrity sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA== +matcher-collection@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.0.tgz#470ae263c793e897b3f1e72c695016b7aea355c4" + integrity sha512-wSi4BgQGTFfBN5J+pIaS78rEKk4qIkjrw+NfJYdHsd2cRVIQsbDi3BZtNAXTFA2WHvlbS9kLGtTjv3cPJKuRSw== dependencies: + "@types/minimatch" "^3.0.3" minimatch "^3.0.2" md5-hex@^2.0.0: @@ -8547,12 +7779,13 @@ md5-o-matic@^0.1.1: integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - integrity sha1-6b296UogpawYsENA/Fdk1bCdkB0= + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" mdn-data@^1.0.0: version "1.2.0" @@ -8589,13 +7822,6 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -memory-streams@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.2.tgz#273ff777ab60fec599b116355255282cca2c50c2" - integrity sha1-Jz/3d6tg/sWZsRY1UlUoLMosUMI= - dependencies: - readable-stream "~1.0.2" - memory-streams@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.3.tgz#d9b0017b4b87f1d92f55f2745c9caacb1dc93ceb" @@ -8649,11 +7875,6 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== -merge@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= - merge@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" @@ -8696,44 +7917,27 @@ miller-rabin@^4.0.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== -mime-db@~1.29.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" - integrity sha1-SNJtI1WJZRcErFkWygYAGRQmaHg= - -mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.7: - version "2.1.16" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" - integrity sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM= - dependencies: - mime-db "~1.29.0" - -mime-types@^2.1.18, mime-types@~2.1.18: +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.18, mime-types@~2.1.19: version "2.1.22" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== dependencies: mime-db "~1.38.0" -mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - integrity sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM= - mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - integrity sha1-5md4PZLonb00KBi1IwudYqZyrRg= + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" - integrity sha1-cCvi3aazf0g2vLP121ZkG2Sh09M= +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" @@ -8747,7 +7951,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8, minimist@~0.0.1: +minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= @@ -8757,7 +7961,12 @@ minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minipass@^2.2.0: +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass@^2.2.0, minipass@^2.2.1, minipass@^2.3.4: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== @@ -8765,18 +7974,10 @@ minipass@^2.2.0: safe-buffer "^5.1.2" yallist "^3.0.0" -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" - integrity sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - integrity sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA== +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== dependencies: minipass "^2.2.1" @@ -8822,16 +8023,16 @@ mktemp@~0.4.0: integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= moment-timezone@^0.5.13: - version "0.5.14" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.14.tgz#4eb38ff9538b80108ba467a458f3ed4268ccfcb1" - integrity sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE= + version "0.5.23" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" + integrity sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w== dependencies: moment ">= 2.9.0" -"moment@>= 2.9.0", moment@^2.18.1: - version "2.18.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" - integrity sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8= +"moment@>= 2.9.0", moment@^2.19.3: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== moo-server@*, moo-server@1.3.x: version "1.3.0" @@ -8850,9 +8051,9 @@ morgan@^1.9.0: on-headers "~1.0.1" mout@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mout/-/mout-1.0.0.tgz#9bdf1d4af57d66d47cb353a6335a3281098e1501" - integrity sha1-m98dSvV9ZtR8s1OmM1oygQmOFQE= + version "1.1.0" + resolved "https://registry.yarnpkg.com/mout/-/mout-1.1.0.tgz#0b29d41e6a80fa9e2d4a5be9d602e1d9d02177f6" + integrity sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw== move-concurrently@^1.0.1: version "1.0.1" @@ -8900,27 +8101,21 @@ najax@^1.0.3: lodash.defaultsdeep "^4.6.0" qs "^6.2.0" -nan@^2.3.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" - integrity sha1-5P805slf37WuzAjeZZb0NgWn20U= - -nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== +nan@^2.10.0, nan@^2.9.2: + version "2.13.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" - integrity sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA== + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" - is-odd "^2.0.0" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" @@ -8938,10 +8133,10 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" - integrity sha512-t/ZswCM9JTWjAdXS9VpvqhI2Ct2sL2MdY4fUXqGJaGBk13ge99ObqRksRTbBE56K+wxUXwwfZYOuZHifFW9q+Q== +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -8952,10 +8147,10 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= -neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" - integrity sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA== +neo-async@^2.5.0, neo-async@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== nice-try@^1.0.4: version "1.0.5" @@ -8963,35 +8158,34 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== nise@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.2.0.tgz#079d6cadbbcb12ba30e38f1c999f36ad4d6baa53" - integrity sha512-q9jXh3UNsMV28KeqI43ILz5+c3l+RiNW8mhurEwCKckuHQbL+hTJIKKTiUlCPKlgQ/OukFvSnKB/Jk3+sFbkGA== - dependencies: - formatio "^1.2.0" - just-extend "^1.1.26" - lolex "^1.6.0" + version "1.4.10" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.10.tgz#ae46a09a26436fae91a38a60919356ae6db143b6" + integrity sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA== + dependencies: + "@sinonjs/formatio" "^3.1.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + lolex "^2.3.2" path-to-regexp "^1.7.0" - text-encoding "^0.6.4" node-fetch@^2.0.0-alpha.9: - version "2.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.0.0-alpha.9.tgz#990c0634f510f76449a0d6f6eaec96b22f273628" - integrity sha512-I7wP1QkmBNX1mt4BS5zyLRTegl5Ii+MSalpfFefn+EZFrGVsdfCvLTKt9eHkNlU4phKgp3tqLWW8VXDcCm9m9w== + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== -node-gyp@^3.3.1: - version "3.6.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" - integrity sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA= +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== dependencies: fstream "^1.0.0" glob "^7.0.3" graceful-fs "^4.1.2" - minimatch "^3.0.2" mkdirp "^0.5.0" nopt "2 || 3" npmlog "0 || 1 || 2 || 3 || 4" osenv "0" - request "2" + request "^2.87.0" rimraf "2" semver "~5.3.0" tar "^2.0.0" @@ -9003,9 +8197,9 @@ node-int64@^0.4.0: integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" + integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -9014,7 +8208,7 @@ node-libs-browser@^2.0.0: constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^1.0.0" + events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" path-browserify "0.0.0" @@ -9028,32 +8222,33 @@ node-libs-browser@^2.0.0: timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.10.3" + util "^0.11.0" vm-browserify "0.0.4" node-modules-path@^1.0.0, node-modules-path@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" - integrity sha1-QAlrCM560OoUaAhjr0ScfHWl0cg= + version "1.0.2" + resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.2.tgz#e3acede9b7baf4bc336e3496b58e5b40d517056e" + integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== node-notifier@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" - integrity sha1-L6nhJgX6EACdRFSdb82KY93g5P8= + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== dependencies: growly "^1.3.0" - semver "^5.3.0" - shellwords "^0.1.0" - which "^1.2.12" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" node-pre-gyp@^0.10.0: - version "0.10.2" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.2.tgz#e8945c20ef6795a20aac2b44f036eb13cf5146e3" - integrity sha512-16lql9QTqs6KsB9fl3neWyZm02KxIKdI9FlJjrB0y7eMTP5Nyz+xalwPbOlw3iw7EejllJPmlJSnY711PLD1ug== + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" - needle "^2.2.0" + needle "^2.2.1" nopt "^4.0.1" npm-packlist "^1.1.6" npmlog "^4.0.2" @@ -9062,17 +8257,17 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.8: - version "1.1.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.10.tgz#5dbeb6bc7f4e9c85b899e2e7adcc0635c9b2adf7" - integrity sha512-KbUPCpfoBvb3oBkej9+nrU0/7xPlVhmhhUJ1PZqwIP5/1dJkRWKWD3OONjo6M2J7tSCBtDCumLwwqeI+DWWaLQ== +node-releases@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.12.tgz#1d6baf544316b5422fcd35efe18708370a4e7637" + integrity sha512-Y+AQ1xdjcgaEzpL65PBEF3fnl1FNKnDh9Zm+AUQLIlyyqtSc4u93jyMN4zrjMzdwKQ10RTr3tgY1x7qpsfF/xg== dependencies: semver "^5.3.0" -node-sass@^4.1.0: - version "4.5.3" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.5.3.tgz#d09c9d1179641239d1b97ffc6231fdcec53e1568" - integrity sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg= +node-sass@^4.7.2: + version "4.11.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a" + integrity sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -9086,12 +8281,13 @@ node-sass@^4.1.0: lodash.mergewith "^4.6.0" meow "^3.7.0" mkdirp "^0.5.1" - nan "^2.3.2" - node-gyp "^3.3.1" + nan "^2.10.0" + node-gyp "^3.8.0" npmlog "^4.0.0" - request "^2.79.0" - sass-graph "^2.1.1" + request "^2.88.0" + sass-graph "^2.2.4" stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" "nopt@2 || 3", nopt@^3.0.6: version "3.0.6" @@ -9109,12 +8305,12 @@ nopt@^4.0.1: osenv "^0.1.4" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" + resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" @@ -9130,10 +8326,15 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" - integrity sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow== + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-git-info@^1.0.3: version "1.0.3" @@ -9151,17 +8352,17 @@ npm-package-arg@^6.1.0: validate-npm-package-name "^3.0.0" npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" - integrity sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" npm-path@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.3.tgz#15cff4e1c89a38da77f56f6055b24f975dfb2bbe" - integrity sha1-Fc/04ciaONp39W9gVbJPl137K74= + version "2.0.4" + resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" + integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== dependencies: which "^1.2.10" @@ -9203,10 +8404,10 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" @@ -9281,10 +8482,10 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= +on-headers@~1.0.1, on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -9293,6 +8494,11 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +one-time@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e" + integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= + onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" @@ -9383,15 +8589,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.3, osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - integrity sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -osenv@^0.1.5: +osenv@0, osenv@^0.1.3, osenv@^0.1.4, osenv@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -9405,9 +8603,11 @@ p-finally@^1.0.0: integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" - integrity sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw= + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" p-limit@^2.0.0: version "2.2.0" @@ -9431,19 +8631,24 @@ p-locate@^3.0.0: p-limit "^2.0.0" p-map@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" - integrity sha1-BfXkrpegaDcbwqXMhr+9vBnErno= + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== parallel-transform@^1.1.0: version "1.1.0" @@ -9455,15 +8660,16 @@ parallel-transform@^1.1.0: readable-stream "^2.1.5" parse-asn1@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" - integrity sha1-N8T5t+06tlx0gXtfJICTf7+XxxI= + version "5.1.4" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" parse-json@^2.2.0: version "2.2.0" @@ -9472,12 +8678,13 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse-json@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-3.0.0.tgz#fa6f47b18e23826ead32f263e744d0e1e847fb13" - integrity sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM= +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" parse-ms@^1.0.0: version "1.0.1" @@ -9503,11 +8710,6 @@ parseuri@0.0.5: dependencies: better-assert "~1.0.0" -parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" - integrity sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY= - parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -9552,7 +8754,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= @@ -9613,9 +8815,9 @@ path-type@^3.0.0: pify "^3.0.0" pbkdf2@^3.0.3: - version "3.0.14" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" - integrity sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA== + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -9623,12 +8825,12 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pify@^2.0.0, pify@^2.3.0: +pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -9693,18 +8895,19 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -pretender@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.6.1.tgz#77d1e42ac8c6b298f5cd43534a87645df035db8c" - integrity sha1-d9HkKsjGspj1zUNTSodkXfA124w= +pretender@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretender/-/pretender-2.1.1.tgz#5085f0a1272c31d5b57c488386f69e6ca207cb35" + integrity sha512-IkidsJzaroAanw3I43tKCFm2xCpurkQr9aPXv5/jpN+LfCwDaeI8rngVWtQZTx4qqbhc5zJspnLHJ4N/25KvDQ== dependencies: - fake-xml-http-request "^1.6.0" + "@xg-wang/whatwg-fetch" "^3.0.0" + fake-xml-http-request "^2.0.0" route-recognizer "^0.3.3" prettier@^1.4.4: - version "1.10.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.10.2.tgz#1af8356d1842276a99a5b5529c82dd9e9ad3cc93" - integrity sha512-TcdNoQIWFoHblurqqU6d1ysopjq7UX0oRcT/hJ8qvBAELiYWn+Ugf0AXdnzISEJ7vuhNnQ98N8jR8Sh53x4IZg== + version "1.16.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" + integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g== pretty-format@^21.2.1: version "21.2.1" @@ -9731,16 +8934,6 @@ private@^0.1.6, private@^0.1.8, private@~0.1.5: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -private@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" - integrity sha1-aM5eih7woju1cMwoU3tTMqumPvE= - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= - process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -9759,9 +8952,9 @@ process@^0.11.10: integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== promise-inflight@^1.0.1: version "1.0.1" @@ -9780,14 +8973,6 @@ promised-io@*: resolved "https://registry.yarnpkg.com/promised-io/-/promised-io-0.3.5.tgz#4ad217bb3658bcaae9946b17a8668ecd851e1356" integrity sha1-StIXuzZYvKrplGsXqGaOzYUeE1Y= -proxy-addr@~1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" - integrity sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg= - dependencies: - forwarded "~0.1.0" - ipaddr.js "1.4.0" - proxy-addr@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" @@ -9806,16 +8991,22 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= +psl@^1.1.24: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" - integrity sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY= + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" + safe-buffer "^5.1.2" pump@^2.0.0: version "2.0.1" @@ -9862,30 +9053,20 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.5.0, qs@^6.4.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" - integrity sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg== - -qs@6.5.2: +qs@6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -qs@^6.2.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" - integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA== - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= +qs@^6.2.0, qs@^6.4.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== query-string@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.0.1.tgz#6e2b86fe0e08aef682ecbe86e85834765402bd88" - integrity sha512-aM+MkQClojlNiKkO09tiN2Fv8jM/L7GWIjG2liWeKljlOdOPNWr+bW3KQ+w5V/uKprpezC7fAsAMsJtJ+2rLKA== + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== dependencies: decode-uri-component "^0.2.0" object-assign "^4.1.0" @@ -9932,16 +9113,16 @@ qunit@~2.6.0: walk-sync "0.3.2" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" - integrity sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62" - integrity sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" @@ -9996,7 +9177,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.4, readable-stream@^2.3.3, readable-stream@^2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -10009,18 +9190,14 @@ read-pkg@^1.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - integrity sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ== +readable-stream@^3.1.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" + integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" readable-stream@~1.0.2: version "1.0.34" @@ -10032,15 +9209,14 @@ readable-stream@~1.0.2: isarray "0.0.1" string_decoder "~0.10.x" -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" recast@^0.11.3: version "0.11.23" @@ -10085,14 +9261,14 @@ regenerator-runtime@^0.10.5: integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" - integrity sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A== + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" - integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== regenerator-runtime@^0.9.5: version "0.9.6" @@ -10128,6 +9304,11 @@ regexp-tree@^0.1.0: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.5.tgz#7cd71fca17198d04b4176efd79713f2998009397" integrity sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ== +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -10137,7 +9318,7 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.1.3, regexpu-core@^4.2.0: +regexpu-core@^4.1.3, regexpu-core@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== @@ -10179,11 +9360,11 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -10195,33 +9376,31 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2, request@^2.79.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= +request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" + aws-sign2 "~0.7.0" + aws4 "^1.8.0" caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" tunnel-agent "^0.6.0" - uuid "^3.0.0" + uuid "^3.3.2" require-directory@^2.1.1: version "2.1.1" @@ -10229,9 +9408,9 @@ require-directory@^2.1.1: integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-from-string@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff" - integrity sha1-xUUjPp19pmFunVmt+zn8n1iGdv8= + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^1.0.1: version "1.0.1" @@ -10251,7 +9430,7 @@ require-uncached@^1.0.3: caller-path "^0.1.0" resolve-from "^1.0.0" -requires-port@1.x.x, requires-port@^1.0.0: +requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= @@ -10274,10 +9453,10 @@ resolve-from@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= -resolve-package-path@^1.0.11, resolve-package-path@^1.1.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.4.tgz#814c5fcfb5f6e4151d95ec6e5653707c43706670" - integrity sha512-AOIfR/AauBM1w1Oq9swqGxUjL4PW7bMztN7UCQ4KWg9AR2t03bGb9faegZbE0meAOHlntAni/4kXkcsQ7dWLPQ== +resolve-package-path@^1.0.11, resolve-package-path@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.6.tgz#48f5d69a5b3a0ea68f7b9c7398459dd4125807c7" + integrity sha512-He6cGWU74tJ6wLYSKrbvWOfIXf2tUu5RcBWqX/2K9Ju00CncF5WRdCOJQisqCtaULcqIqpLvMtz8ZjfpwlBwqg== dependencies: path-root "^0.1.1" resolve "^1.10.0" @@ -10287,27 +9466,20 @@ 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, resolve@^1.1.7, resolve@^1.3.3, resolve@^1.5.0: +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== dependencies: path-parse "^1.0.5" -resolve@^1.1.3, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.6.0, resolve@^1.8.1: +resolve@^1.1.3, resolve@^1.1.7, resolve@^1.10.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.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: path-parse "^1.0.6" -resolve@^1.7.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== - dependencies: - path-parse "^1.0.5" - restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -10329,51 +9501,30 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= - dependencies: - align-text "^0.1.1" - -rimraf@2, rimraf@^2.4.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" - integrity sha1-wjOOxkPfeht/5cVPqG9XQopV8z0= - dependencies: - glob "^7.0.5" - -rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" -rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - dependencies: - glob "^7.0.5" - rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" - integrity sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc= + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: - hash-base "^2.0.0" + hash-base "^3.0.0" inherits "^2.0.1" rollup-pluginutils@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.4.1.tgz#de43ab54965bbf47843599a7f3adceb723de38db" - integrity sha512-wesMQ9/172IJDIW/lYWm0vW0LiKe5Ekjws481R7z9WTRtmO59cqyM/2uUlxvf6yzm/fElFmHUobeQOYz46dZJw== + version "2.5.0" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.5.0.tgz#23be0f05ac3972ea7b08fc7870cb91fde5b23a09" + integrity sha512-9Muh1H+XB5f5ONmKMayUoTYR1EZwHbwJJ9oZLrKT5yuTf/RLIQ5mYIGsrERquVucJmjmaAW0Y7+6Qo1Ep+5w3Q== dependencies: estree-walker "^0.6.0" micromatch "^3.1.10" @@ -10395,36 +9546,21 @@ rollup@^0.57.1: signal-exit "^3.0.2" sourcemap-codec "^1.4.1" -route-recognizer@^0.2.3: - version "0.2.10" - resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.2.10.tgz#024b2283c2e68d13a7c7f5173a5924645e8902df" - integrity sha1-Aksig8LmjROnx/UXOlkkZF6JAt8= - -route-recognizer@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.3.tgz#1d365e27fa6995e091675f7dc940a8c00353bd29" - integrity sha1-HTZeJ/ppleCRZ199yUCowANTvSk= +route-recognizer@^0.3.3, route-recognizer@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" + integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== -rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3, rsvp@^3.5.0: +rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -rsvp@^4.6.1, rsvp@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.7.0.tgz#dc1b0b1a536f7dec9d2be45e0a12ad4197c9fd96" - integrity sha1-3BsLGlNvfeydK+ReChKtQZfJ/ZY= - -rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4: +rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4: version "4.8.4" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== -rsvp@~3.0.6: - version "3.0.21" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" - integrity sha1-ScWI/hjvKTvNCrn05nVuasQzNZ8= - rsvp@~3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" @@ -10462,22 +9598,17 @@ rx@^4.1.0: integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= rxjs@^5.4.2: - version "5.5.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" - integrity sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg== + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== dependencies: symbol-observable "1.0.1" -safe-buffer@5.1.2, safe-buffer@^5.1.2: +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== - safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" @@ -10490,15 +9621,15 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== samsam@1.x, samsam@^1.1.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" - integrity sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc= + version "1.3.0" + 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: version "2.5.2" @@ -10533,7 +9664,7 @@ sane@^3.0.0: optionalDependencies: fsevents "^1.2.3" -sass-graph@^2.1.1: +sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= @@ -10549,9 +9680,9 @@ sax@^1.2.4, sax@~1.2.4: integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== schema-utils@^0.4.4: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" - integrity sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA== + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== dependencies: ajv "^6.1.0" ajv-keywords "^3.1.0" @@ -10573,40 +9704,16 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" -"semver@2 || 3 || 4 || 5", semver@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== - -semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= -send@0.15.4: - version "0.15.4" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9" - integrity sha1-mF+qPihLAnPHkzZKNcZze9k5Bbk= - dependencies: - debug "2.6.8" - depd "~1.1.1" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.0" - fresh "0.5.0" - http-errors "~1.6.2" - mime "1.3.4" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.1" - send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -10627,19 +9734,9 @@ send@0.16.2: statuses "~1.4.0" serialize-javascript@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" - integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ== - -serve-static@1.12.4: - version "1.12.4" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.4.tgz#9b6aa98eeb7253c4eedc4c1f6fdbca609901a961" - integrity sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE= - dependencies: - encodeurl "~1.0.1" - escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.15.4" + version "1.6.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" + integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== serve-static@1.13.2: version "1.13.2" @@ -10656,11 +9753,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" @@ -10686,20 +9778,15 @@ setimmediate@^1.0.4: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.9" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" - integrity sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A== + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -10716,7 +9803,7 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shellwords@^0.1.0: +shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== @@ -10734,9 +9821,9 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9" - integrity sha1-IglwbxyFCp8dENDYQJGLRvJuG8k= + version "1.1.1" + resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662" + integrity sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw== dependencies: debug "^2.2.0" @@ -10745,6 +9832,13 @@ simple-html-tokenizer@^0.5.6: resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.7.tgz#8eca336ecfbe2b3c6166cbb31b2682088de79f40" integrity sha512-APW9iYbkJ5cijjX4Ljhf3VG8SwYPUJT5gZrwci/wieMabQxWFiV5VwsrP5c6GMRvXKEQMGkAB1d9dvW66dTqpg== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + sinon@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/sinon/-/sinon-3.3.0.tgz#9132111b4bbe13c749c2848210864250165069b1" @@ -10777,6 +9871,13 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -10807,13 +9908,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= - dependencies: - hoek "2.x.x" - socket.io-adapter@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" @@ -10866,33 +9960,33 @@ sort-object-keys@^1.1.2: integrity sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI= sort-package-json@^1.15.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.21.0.tgz#9501273da130693b4dd1ebe68882d1d289119546" - integrity sha512-G920kGKROov3kS32jnmf03YolcGTkdONKbOv+Hi1Db7D9lBXhNU5aNMZCE0j/hfDqd/zmPVmpSiuhSOt3Lv+4A== + version "1.22.1" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.22.1.tgz#384ce7a098cd13be4109800d5ce2f0cf7826052e" + integrity sha512-uVINQraFQvnlzNHFnQOT4MYy0qonIEzKwhrI2yrTiQjNo5QF4h3ffrnCk7a95QAwoK/RdkO/w8W9tJIcaOWC7g== dependencies: detect-indent "^5.0.0" sort-object-keys "^1.1.2" source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" - integrity sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A== + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" - integrity sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A== + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== dependencies: - atob "^2.0.0" + atob "^2.1.1" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" source-map-support@^0.4.15: - version "0.4.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.16.tgz#16fecf98212467d017d586a2af68d628b9421cd8" - integrity sha512-A6vlydY7H/ljr4L2UOhDSajQdZQ6dMD7cLH0pzwcmwLyc9u8PNI4WGtnfDDzX7uzGL6c/T+ORL97Zlh+S4iOrg== + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" @@ -10914,14 +10008,14 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4: +source-map@0.4.x, source-map@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -10932,9 +10026,9 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.1.x: - version "0.1.32" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" - integrity sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY= + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= dependencies: amdefine ">=0.0.4" @@ -10943,16 +10037,6 @@ sourcemap-codec@^1.4.1: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== -sourcemap-validator@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.0.5.tgz#f9b960f48c6469e288a19af305f005da3dc1df3a" - integrity sha1-+blg9IxkaeKIoZrzBfAF2j3B3zo= - dependencies: - jsesc "~0.3.x" - lodash.foreach "~2.3.x" - lodash.template "~2.3.x" - source-map "~0.1.x" - sourcemap-validator@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/sourcemap-validator/-/sourcemap-validator-1.1.0.tgz#00454547d1682186e1498a7208e022e8dfa8738f" @@ -10976,22 +10060,31 @@ spawn-sync@^1.0.11, spawn-sync@^1.0.15: concat-stream "^1.4.7" os-shim "^0.1.2" -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - integrity sha1-SzBz2TP/UfORLwOsVRlJikFQ20A= +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: - spdx-license-ids "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - integrity sha1-m98vIOH0DtRH++JzJmGR/O1RYmw= +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - integrity sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc= +spdx-license-ids@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" + integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -11016,18 +10109,18 @@ sri-toolbox@^0.2.0: integrity sha1-p/6lw/3lXmdc8cjAbz67XCk1g14= sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - integrity sha1-US322mKHFEMW3EwY/hzx2UBzm+M= + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" ssri@^6.0.1: @@ -11047,10 +10140,10 @@ stack-trace@0.0.x: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= -staged-git-files@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35" - integrity sha1-15fhtVHKemOd7AI33G60u5vhfTU= +staged-git-files@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.0.0.tgz#cdb847837c1fcc52c08a872d4883cc0877668a80" + integrity sha1-zbhHg3wfzFLAioctSIPMCHdmioA= static-extend@^0.1.1: version "0.1.2" @@ -11060,11 +10153,6 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2", statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= - "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -11076,24 +10164,24 @@ statuses@~1.4.0: integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== stdout-stream@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" - integrity sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s= + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== dependencies: readable-stream "^2.0.1" stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" readable-stream "^2.0.2" stream-each@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" - integrity sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== dependencies: end-of-stream "^1.1.0" stream-shift "^1.0.0" @@ -11140,7 +10228,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -11153,41 +10241,29 @@ string_decoder@0.10, string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= -string_decoder@^1.0.0, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== dependencies: safe-buffer "~5.1.0" -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" stringify-object@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.1.tgz#2720c2eff940854c819f6ee252aaeb581f30624d" - integrity sha512-jPcQYw/52HUPP8uOE4kkjxl5bB9LfHkKCTptIk3qw7ozP5XMIMlHMLjt00GGSwW6DJAf/njY5EU6Vpwl4LlBKQ== + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: - get-own-enumerable-property-symbols "^2.0.1" + get-own-enumerable-property-symbols "^3.0.0" is-obj "^1.0.1" is-regexp "^1.0.0" -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= - -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= - dependencies: - ansi-regex "^0.2.1" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -11248,23 +10324,11 @@ sum-up@^1.0.1: dependencies: chalk "^1.0.0" -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" - integrity sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA== - dependencies: - has-flag "^2.0.0" - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -11307,17 +10371,17 @@ symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink- resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== -table@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" - integrity sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU= +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" tap-parser@^7.0.0: version "7.0.0" @@ -11328,12 +10392,7 @@ tap-parser@^7.0.0: js-yaml "^3.2.7" minipass "^2.2.0" -tapable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" - integrity sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg== - -tapable@^1.1.0: +tapable@^1.0.0, tapable@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== @@ -11348,14 +10407,14 @@ tar@^2.0.0: inherits "2" tar@^4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" - integrity sha512-mq9ixIYfNF9SK0IS/h2HKMu8Q2iaCuhDDsZhdEag/FHv8fOaYld4vN7ouMgcSSt5WKZzPs8atclTcJm36OTh4w== + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== dependencies: - chownr "^1.0.1" + chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" + minipass "^2.3.4" + minizlib "^1.1.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" yallist "^3.0.2" @@ -11425,11 +10484,16 @@ testem@^2.9.2: tmp "0.0.33" xmldom "^0.1.19" -text-encoding@0.6.4, text-encoding@^0.6.4: +text-encoding@0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -11441,11 +10505,11 @@ text-table@~0.2.0: integrity sha512-qftQXnX1DzpSV8EddtHIT0eDDEiBF8ywhFYR2lI9xrGtxqKN+CvLXhACeCIGbCpQfxxERbrkZEFb8cZcDKbVZA== through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: - readable-stream "^2.1.5" + readable-stream "~2.3.6" xtend "~4.0.1" through@^2.3.6, through@^2.3.8: @@ -11503,13 +10567,6 @@ tmp@^0.0.29: dependencies: os-tmpdir "~1.0.1" -tmp@^0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - integrity sha1-jzirlDjhcxXl29izZX6L+yd65Kc= - dependencies: - os-tmpdir "~1.0.1" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -11560,23 +10617,24 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" - integrity sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo= +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: + psl "^1.1.24" punycode "^1.4.1" tree-sync@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.2.2.tgz#2cf76b8589f59ffedb58db5a3ac7cb013d0158b7" - integrity sha1-LPdrhYn1n/7bWNtaOsfLAT0BWLc= + version "1.4.0" + resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.4.0.tgz#314598d13abaf752547d9335b8f95d9a137100d6" + integrity sha512-YvYllqh3qrR5TAYZZTXdspnIhlKAYezPYw11ntmweoceu4VK+keN356phHRIIo1d+RDmLpHZrUlmxga2gc9kSQ== dependencies: debug "^2.2.0" fs-tree-diff "^0.5.6" mkdirp "^0.5.1" quick-temp "^0.1.5" - walk-sync "^0.2.7" + walk-sync "^0.3.3" trim-newlines@^1.0.0: version "1.0.0" @@ -11588,10 +10646,17 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -tryit@^1.0.1: +triple-beam@^1.2.0, triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + +"true-case-path@^1.0.2": version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - integrity sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics= + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" tslib@^1.9.0: version "1.9.3" @@ -11622,18 +10687,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" - integrity sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo= - -type-is@~1.6.15: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" - integrity sha1-yrEPtJCeRByChC6v4a1kbIGARBA= - dependencies: - media-typer "0.3.0" - mime-types "~2.1.15" +type-detect@4.0.8, type-detect@^4.0.0: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-is@~1.6.16: version "1.6.16" @@ -11648,12 +10705,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -uc.micro@^1.0.1, uc.micro@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" - integrity sha1-ftUNXg+an7ClczeSWfKndFjVAZI= - -uc.micro@^1.0.5: +uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== @@ -11663,29 +10715,14 @@ uglify-js@1.x: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-1.3.5.tgz#4b5bfff9186effbaa888e4c9e94bd9fc4c94929d" integrity sha1-S1v/+Rhu/7qoiOTJ6UvZ/EyUkp0= -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - uglify-js@^3.1.4: - version "3.4.10" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" - integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + version "3.5.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.3.tgz#d490bb5347f23025f0c1bc0dee901d98e4d6b063" + integrity sha512-rIQPT2UMDnk4jRX+w4WO84/pebU2jiLsjgIyrCktYgSvx28enOE3iYQMr+BD1rHiitWnDmpu0cY/LfIEpKcjcw== dependencies: commander "~2.19.0" source-map "~0.6.1" -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= - underscore.string@~3.3.4: version "3.3.5" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" @@ -11695,9 +10732,9 @@ underscore.string@~3.3.4: util-deprecate "^1.0.2" underscore@>=1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -11740,9 +10777,9 @@ unique-filename@^1.1.1: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" - integrity sha1-22Z258fMBimHj/GWCXx4hVrp9Ks= + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== dependencies: imurmurhash "^0.1.4" @@ -11754,9 +10791,9 @@ unique-string@^1.0.0: crypto-random-string "^1.0.0" universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" - integrity sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc= + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -11783,12 +10820,12 @@ untildify@^2.1.0: dependencies: os-homedir "^1.0.0" -upath@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== -uri-js@^4.2.1: +uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== @@ -11809,11 +10846,9 @@ url@^0.11.0: querystring "0.2.0" use@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" - integrity sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw== - dependencies: - kind-of "^6.0.2" + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== user-info@^1.0.0: version "1.0.0" @@ -11836,7 +10871,7 @@ username@^1.0.1: dependencies: meow "^3.4.0" -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -11856,40 +10891,30 @@ util@0.10.3: dependencies: inherits "2.0.1" -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== dependencies: inherits "2.0.3" -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" - integrity sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg= - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - integrity sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g== - uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - integrity sha1-KAS6vnEq0zeUWaz74kdGqywwP7w= + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" validate-npm-package-name@^3.0.0: version "3.0.0" @@ -11898,11 +10923,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -vary@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" - integrity sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc= - vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -11924,7 +10944,7 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" -walk-sync@0.3.2, walk-sync@^0.3.2: +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== @@ -11937,7 +10957,7 @@ walk-sync@^0.1.3: resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.1.3.tgz#8a07261a00bda6cfb1be25e9f100fad57546f583" integrity sha1-igcmGgC9ps+xviXp8QD61XVG9YM= -walk-sync@^0.2.5, walk-sync@^0.2.7: +walk-sync@^0.2.5: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" integrity sha1-tJvk7mhnZXrrc2l4tWop0Q+jmWk= @@ -11945,7 +10965,7 @@ walk-sync@^0.2.5, walk-sync@^0.2.7: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.3: +walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2, walk-sync@^0.3.3: version "0.3.4" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.4.tgz#cf78486cc567d3a96b5b2237c6108017a5ffb9a4" integrity sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig== @@ -12004,15 +11024,7 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" - integrity sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-sources@^1.3.0: +webpack-sources@^1.1.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== @@ -12051,21 +11063,22 @@ webpack@~4.28: webpack-sources "^1.3.0" websocket-driver@>=0.5.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= dependencies: + http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" - integrity sha1-domUmcGEtu91Q3fC27DNbLVdKec= + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== whatwg-fetch@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" - integrity sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ= + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== which-module@^1.0.0: version "1.0.0" @@ -12077,14 +11090,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.2.10, which@^1.2.12, which@^1.2.9: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== - dependencies: - isexe "^2.0.0" - -which@^1.2.14: +which@1, which@^1.2.10, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -12092,33 +11098,34 @@ which@^1.2.14: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^1.0.2" + string-width "^1.0.2 || 2" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= +winston-transport@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66" + integrity sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A== + dependencies: + readable-stream "^2.3.6" + triple-beam "^1.2.0" winston@*: - version "2.4.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.0.tgz#808050b93d52661ed9fb6c26b3f0c826708b0aee" - integrity sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4= - dependencies: - async "~1.0.0" - colors "1.0.x" - cycle "1.0.x" - eyes "0.1.x" - isstream "0.1.x" + version "3.2.1" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.2.1.tgz#63061377976c73584028be2490a1846055f77f07" + integrity sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw== + dependencies: + async "^2.6.1" + diagnostics "^1.1.1" + is-stream "^1.1.0" + logform "^2.1.1" + one-time "0.0.4" + readable-stream "^3.1.1" stack-trace "0.0.x" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= + triple-beam "^1.3.0" + winston-transport "^4.3.0" wordwrap@~0.0.2: version "0.0.3" @@ -12137,7 +11144,7 @@ worker-farm@^1.5.2: dependencies: errno "~0.1.7" -workerpool@^2.2.1, workerpool@^2.3.0: +workerpool@^2.3.0: version "2.3.3" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.3.tgz#49a70089bd55e890d68cc836a19419451d7c81d7" integrity sha512-L1ovlYHp6UObYqElXXpbd214GgbEKDED0d3sj7pRdFXjNkb2+un/AUcCkceHizO0IVI6SOGGncrcjozruCkRgA== @@ -12145,11 +11152,13 @@ workerpool@^2.2.1, workerpool@^2.3.0: object-assign "4.1.1" workerpool@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-3.1.1.tgz#9decea76b73c2f91de1b5bec1019f8a474b3a620" - integrity sha512-VzYD/kM3Gk9L7GR0LtrcyiZA8+h8Fse503aq4WkYwRBXreHTixVEcqKLjiFS6gM0fyaEt0pjSLf1ANGQXM27cg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-3.1.2.tgz#b34e79243647decb174b7481ab5b351dc565c426" + integrity sha512-WJFA0dGqIK7qj7xPTqciWBH5DlJQzoPjsANvc3Y4hNB0SScT+Emjvt0jPPkDBUjBNngX1q9hHgt1Gfwytu6pug== dependencies: + "@babel/core" "^7.3.4" object-assign "4.1.1" + rsvp "^4.8.4" wrap-ansi@^2.0.0: version "2.1.0" @@ -12170,9 +11179,9 @@ wrench@1.3.x: integrity sha1-bxPsNRRTF+spLKX2UxORskQRFBE= write-file-atomic@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== + version "2.4.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" + integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -12228,9 +11237,9 @@ yallist@^2.1.2: integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== yam@^0.0.24: version "0.0.24" @@ -12291,16 +11300,6 @@ yargs@^7.0.0: y18n "^3.2.1" yargs-parser "^5.0.0" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" From b0a65bdb629b43be4c3c3e0071a318e68dae5e27 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Mon, 1 Apr 2019 18:30:44 -0700 Subject: [PATCH 36/46] Update everything to work with the mirage backwards incompat --- ui/mirage/config.js | 9 ++++----- ui/mirage/factories/allocation.js | 16 ++++++++-------- ...cation-stats.js => client-allocation-stat.js} | 0 .../{client-stats.js => client-stat.js} | 0 ui/mirage/factories/node.js | 6 +++--- .../{task-resources.js => task-resource.js} | 0 ui/mirage/models/allocation.js | 2 +- ...cation-stats.js => client-allocation-stat.js} | 0 .../models/{client-stats.js => client-stat.js} | 0 ui/tests/acceptance/allocation-detail-test.js | 2 +- ui/tests/acceptance/task-detail-test.js | 4 ++-- 11 files changed, 19 insertions(+), 20 deletions(-) rename ui/mirage/factories/{client-allocation-stats.js => client-allocation-stat.js} (100%) rename ui/mirage/factories/{client-stats.js => client-stat.js} (100%) rename ui/mirage/factories/{task-resources.js => task-resource.js} (100%) rename ui/mirage/models/{client-allocation-stats.js => client-allocation-stat.js} (100%) rename ui/mirage/models/{client-stats.js => client-stat.js} (100%) diff --git a/ui/mirage/config.js b/ui/mirage/config.js index ef6e97ff956..5dbd947f201 100644 --- a/ui/mirage/config.js +++ b/ui/mirage/config.js @@ -46,11 +46,10 @@ export default function() { const json = this.serialize(jobs.all()); const namespace = queryParams.namespace || 'default'; return json - .filter( - job => - namespace === 'default' - ? !job.NamespaceID || job.NamespaceID === namespace - : job.NamespaceID === namespace + .filter(job => + namespace === 'default' + ? !job.NamespaceID || job.NamespaceID === namespace + : job.NamespaceID === namespace ) .map(job => filterKeys(job, 'TaskGroups', 'NamespaceID')); }) diff --git a/ui/mirage/factories/allocation.js b/ui/mirage/factories/allocation.js index 6c31749c738..2fad2b398df 100644 --- a/ui/mirage/factories/allocation.js +++ b/ui/mirage/factories/allocation.js @@ -31,7 +31,7 @@ export default Factory.extend({ const taskGroup = server.db.taskGroups.findBy({ name: allocation.taskGroup }); const resources = taskGroup.taskIds.map(id => server.create( - 'task-resources', + 'task-resource', { allocation, name: server.db.tasks.find(id).name, @@ -40,7 +40,7 @@ export default Factory.extend({ ) ); - allocation.update({ taskResourcesIds: resources.mapBy('id') }); + allocation.update({ taskResourceIds: resources.mapBy('id') }); }, }), @@ -49,7 +49,7 @@ export default Factory.extend({ const taskGroup = server.db.taskGroups.findBy({ name: allocation.taskGroup }); const resources = taskGroup.taskIds.map(id => server.create( - 'task-resources', + 'task-resource', { allocation, name: server.db.tasks.find(id).name, @@ -58,7 +58,7 @@ export default Factory.extend({ ) ); - allocation.update({ taskResourcesIds: resources.mapBy('id') }); + allocation.update({ taskResourceIds: resources.mapBy('id') }); }, }), @@ -146,7 +146,7 @@ export default Factory.extend({ ); const resources = taskGroup.taskIds.map(id => - server.create('task-resources', { + server.create('task-resource', { allocation, name: server.db.tasks.find(id).name, }) @@ -157,16 +157,16 @@ export default Factory.extend({ jobId: job.id, nodeId: node.id, taskStateIds: allocation.clientStatus === 'pending' ? [] : states.mapBy('id'), - taskResourcesIds: allocation.clientStatus === 'pending' ? [] : resources.mapBy('id'), + taskResourceIds: allocation.clientStatus === 'pending' ? [] : resources.mapBy('id'), taskGroup: taskGroup.name, name: allocation.name || `${taskGroup.name}.[${faker.random.number(10)}]`, }); // Each allocation has a corresponding allocation stats running on some client. // Create that record, even though it's not a relationship. - server.create('client-allocation-stats', { + server.create('client-allocation-stat', { id: allocation.id, - _tasks: states.mapBy('name'), + _taskNames: states.mapBy('name'), }); }, }); diff --git a/ui/mirage/factories/client-allocation-stats.js b/ui/mirage/factories/client-allocation-stat.js similarity index 100% rename from ui/mirage/factories/client-allocation-stats.js rename to ui/mirage/factories/client-allocation-stat.js diff --git a/ui/mirage/factories/client-stats.js b/ui/mirage/factories/client-stat.js similarity index 100% rename from ui/mirage/factories/client-stats.js rename to ui/mirage/factories/client-stat.js diff --git a/ui/mirage/factories/node.js b/ui/mirage/factories/node.js index 5649786be25..8dc72a7e2c8 100644 --- a/ui/mirage/factories/node.js +++ b/ui/mirage/factories/node.js @@ -108,9 +108,9 @@ export default Factory.extend({ }), afterCreate(node, server) { - // Each node has a corresponding client stats resource that's queried via node IP. + // Each node has a corresponding client stat resource that's queried via node IP. // Create that record, even though it's not a relationship. - server.create('client-stats', { + server.create('client-stat', { id: node.httpAddr, }); @@ -122,7 +122,7 @@ export default Factory.extend({ eventIds: events.mapBy('id'), }); - server.create('client-stats', { + server.create('client-stat', { id: node.id, }); }, diff --git a/ui/mirage/factories/task-resources.js b/ui/mirage/factories/task-resource.js similarity index 100% rename from ui/mirage/factories/task-resources.js rename to ui/mirage/factories/task-resource.js diff --git a/ui/mirage/models/allocation.js b/ui/mirage/models/allocation.js index 22ef8847d7a..fde6d52acba 100644 --- a/ui/mirage/models/allocation.js +++ b/ui/mirage/models/allocation.js @@ -2,5 +2,5 @@ import { Model, hasMany } from 'ember-cli-mirage'; export default Model.extend({ task_states: hasMany('task-state'), - task_resources: hasMany('task-resources'), + task_resources: hasMany('task-resource'), }); diff --git a/ui/mirage/models/client-allocation-stats.js b/ui/mirage/models/client-allocation-stat.js similarity index 100% rename from ui/mirage/models/client-allocation-stats.js rename to ui/mirage/models/client-allocation-stat.js diff --git a/ui/mirage/models/client-stats.js b/ui/mirage/models/client-stat.js similarity index 100% rename from ui/mirage/models/client-stats.js rename to ui/mirage/models/client-stat.js diff --git a/ui/tests/acceptance/allocation-detail-test.js b/ui/tests/acceptance/allocation-detail-test.js index 009b1a17198..21b613e2827 100644 --- a/ui/tests/acceptance/allocation-detail-test.js +++ b/ui/tests/acceptance/allocation-detail-test.js @@ -74,7 +74,7 @@ module('Acceptance | allocation detail', function(hooks) { test('each task row should list high-level information for the task', async function(assert) { const task = server.db.taskStates.where({ allocationId: allocation.id }).sortBy('name')[0]; - const taskResources = allocation.taskResourcesIds + const taskResources = allocation.taskResourceIds .map(id => server.db.taskResources.find(id)) .sortBy('name')[0]; const reservedPorts = taskResources.resources.Networks[0].ReservedPorts; diff --git a/ui/tests/acceptance/task-detail-test.js b/ui/tests/acceptance/task-detail-test.js index 806ce094860..211f2cea853 100644 --- a/ui/tests/acceptance/task-detail-test.js +++ b/ui/tests/acceptance/task-detail-test.js @@ -91,7 +91,7 @@ module('Acceptance | task detail', function(hooks) { }); test('the addresses table lists all reserved and dynamic ports', async function(assert) { - const taskResources = allocation.taskResourcesIds + const taskResources = allocation.taskResourceIds .map(id => server.db.taskResources.find(id)) .find(resources => resources.name === task.name); const reservedPorts = taskResources.resources.Networks[0].ReservedPorts; @@ -102,7 +102,7 @@ module('Acceptance | task detail', function(hooks) { }); test('each address row shows the label and value of the address', async function(assert) { - const taskResources = allocation.taskResourcesIds + const taskResources = allocation.taskResourceIds .map(id => server.db.taskResources.find(id)) .findBy('name', task.name); const networkAddress = taskResources.resources.Networks[0].IP; From baf5077a3204a9e65c2f115fa5950661373383fe Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 2 Apr 2019 15:01:20 -0700 Subject: [PATCH 37/46] Manually upgrade fringe dependencies --- ui/package.json | 23 +++++++--------------- ui/yarn.lock | 52 +++++++++++++++++++++++++++++-------------------- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/ui/package.json b/ui/package.json index bc86410c0ee..d830f52cfbd 100644 --- a/ui/package.json +++ b/ui/package.json @@ -16,20 +16,14 @@ "test": "./node_modules/ember-cli/bin/ember test" }, "lint-staged": { - "'{app,tests,config,lib,mirage}/**/*.js'": [ - "prettier --write", - "git add" - ], - "'app/styles/**/*.*'": [ - "prettier --write", - "git add" - ] + "'{app,tests,config,lib,mirage}/**/*.js'": ["prettier --write", "git add"], + "'app/styles/**/*.*'": ["prettier --write", "git add"] }, "devDependencies": { - "@babel/plugin-proposal-object-rest-spread": "^7.3.4", - "@ember/jquery": "^0.5.2", - "@ember/optional-features": "^0.6.3", - "broccoli-asset-rev": "^2.7.0", + "@babel/plugin-proposal-object-rest-spread": "^7.4.3", + "@ember/jquery": "^0.6.0", + "@ember/optional-features": "^0.7.0", + "broccoli-asset-rev": "^3.0.0", "bulma": "0.6.1", "core-js": "^2.4.1", "d3-array": "^1.2.0", @@ -81,7 +75,6 @@ "ember-source": "~3.4.0", "ember-test-selectors": "^2.1.0", "ember-truth-helpers": "^2.0.0", - "ember-welcome-page": "^3.2.0", "eslint": "^4.13.1", "flat": "^4.0.0", "fuse.js": "~3.2.0", @@ -99,9 +92,7 @@ }, "private": true, "ember-addon": { - "paths": [ - "lib/bulma" - ] + "paths": ["lib/bulma"] }, "dependencies": { "lru_map": "^0.3.3" diff --git a/ui/yarn.lock b/ui/yarn.lock index 0fb6f8a3bbc..00035685fc0 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -264,7 +264,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.3.4", "@babel/plugin-proposal-object-rest-spread@^7.4.0": +"@babel/plugin-proposal-object-rest-spread@^7.4.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.0.tgz#e4960575205eadf2a1ab4e0c79f9504d5b82a97f" integrity sha512-uTNi8pPYyUH2eWHyYWWSYJKwKg34hhgl4/dbejEjL+64OhbHjTX7wEVWMQl82tEmdDsGeu77+s8HHLS627h6OQ== @@ -272,6 +272,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" +"@babel/plugin-proposal-object-rest-spread@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz#be27cd416eceeba84141305b93c282f5de23bbb4" + integrity sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-proposal-optional-catch-binding@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" @@ -655,20 +663,22 @@ 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" - integrity sha1-/jEsA62gAi+gktI/fNfi6wN0tTo= +"@ember/jquery@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.6.0.tgz#5fe9d39b15c9d47fe495302b2a6176059a6267cd" + integrity sha512-O81+JslKE7bsV+5wrhXEmBU1Bpte2u9bm6MLIoRYePvWDo50l7llDW1RM38l1KkeSj/s7iXTsviZ4uunhIcKow== dependencies: broccoli-funnel "^2.0.1" - ember-cli-babel "^6.6.0" + broccoli-merge-trees "^3.0.2" + ember-cli-babel "^7.4.0" + ember-cli-version-checker "^3.0.0" jquery "^3.3.1" - resolve "^1.7.1" + resolve "^1.10.0" -"@ember/optional-features@^0.6.3": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-0.6.4.tgz#8199f853c1781234fcb1f05090cddd0b822bff69" - integrity sha512-nKmKxMk+Q/BGE8cmfq8KTHnYHVgrU3GHhy/eZ/OTj/fUvzXZhxaEVFOfAXssiOzV3FOQDJjznpbua2TEtHaQRw== +"@ember/optional-features@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@ember/optional-features/-/optional-features-0.7.0.tgz#f65a858007020ddfb8342f586112750c32abd2d9" + integrity sha512-qLXvL/Kq/COb43oQmCrKx7Fy8k1XJDI2RlgbCnZHH26AGVgJT/sZugx1A2AIxKdamtl/Mi+rQSjGIuscSjqjDw== dependencies: chalk "^2.3.0" co "^4.6.0" @@ -2150,22 +2160,22 @@ broccoli-amd-funnel@^1.3.0: broccoli-plugin "^1.3.0" symlink-or-copy "^1.2.0" -broccoli-asset-rev@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-2.7.0.tgz#c73da1d97c4180366fa442a87624ca1b7fb99161" - integrity sha512-GZ7gU3Qo6HMAUqDeh1q+4UVCQPJPjCyGcpIY5s9Qp58a244FT4nZSiy8qYkVC4LLIWTZt59G7jFFsUcj/13IPQ== +broccoli-asset-rev@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rev/-/broccoli-asset-rev-3.0.0.tgz#65a28c8a062d6ee2cffd91ed2a8309e0f8253ac6" + integrity sha512-gAHQZnwvtl74tGevUqGuWoyOdJUdMMv0TjGSMzbdyGImr9fZcnM6xmggDA8bUawrMto9NFi00ZtNUgA4dQiUBw== dependencies: - broccoli-asset-rewrite "^1.1.0" + broccoli-asset-rewrite "^2.0.0" broccoli-filter "^1.2.2" broccoli-persistent-filter "^1.4.3" json-stable-stringify "^1.0.0" minimatch "^3.0.4" rsvp "^3.0.6" -broccoli-asset-rewrite@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/broccoli-asset-rewrite/-/broccoli-asset-rewrite-1.1.0.tgz#77a5da56157aa318c59113245e8bafb4617f8830" - integrity sha1-d6XaVhV6oxjFkRMkXouvtGF/iDA= +broccoli-asset-rewrite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/broccoli-asset-rewrite/-/broccoli-asset-rewrite-2.0.0.tgz#603c4a52d4c8987a2f681254436923ac0a9c94ab" + integrity sha512-dqhxdQpooNi7LHe8J9Jdxp6o3YPFWl4vQmint6zrsn2sVbOo+wpyiX3erUSt0IBtjNkAxqJjuvS375o2cLBHTA== dependencies: broccoli-filter "^1.2.3" @@ -4097,7 +4107,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.2.0: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.2.0, ember-cli-babel@^7.4.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== From a4c5410323eef9dfade1fe0633a0bdb12d1d7d7e Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 2 Apr 2019 15:55:20 -0700 Subject: [PATCH 38/46] Upgrade ember addons --- ui/package.json | 13 +- ui/yarn.lock | 791 ++++++++++++++++++++++-------------------------- 2 files changed, 363 insertions(+), 441 deletions(-) diff --git a/ui/package.json b/ui/package.json index d830f52cfbd..f65210897ad 100644 --- a/ui/package.json +++ b/ui/package.json @@ -34,17 +34,17 @@ "d3-shape": "^1.2.0", "d3-time-format": "^2.1.0", "d3-transition": "^1.1.0", - "ember-ajax": "^4.0.1", + "ember-ajax": "^5.0.0", "ember-auto-import": "^1.2.21", "ember-cli": "~3.4.4", "ember-cli-babel": "^7.1.2", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-deprecation-workflow": "^1.0.1", - "ember-cli-eslint": "^4.2.3", + "ember-cli-eslint": "^5.1.0", "ember-cli-funnel": "^0.6.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-inject-live-reload": "^2.0.1", "ember-cli-mirage": "^0.4.3", "ember-cli-moment-shim": "^3.5.0", "ember-cli-page-object": "^1.15.1", @@ -60,7 +60,7 @@ "ember-data": "~3.4.0", "ember-data-model-fragments": "3.3.0", "ember-export-application-global": "^2.0.0", - "ember-fetch": "^3.4.3", + "ember-fetch": "^6.5.0", "ember-freestyle": "~0.10.0", "ember-inflector": "^3.0.0", "ember-inline-svg": "^0.2.1", @@ -71,7 +71,7 @@ "ember-power-select": "^2.2.3", "ember-resolver": "^5.0.1", "ember-responsive": "^3.0.0", - "ember-sinon": "^1.0.1", + "ember-sinon": "^2.2.0", "ember-source": "~3.4.0", "ember-test-selectors": "^2.1.0", "ember-truth-helpers": "^2.0.0", @@ -84,8 +84,7 @@ "loader.js": "^4.7.0", "lodash.intersection": "^4.4.0", "prettier": "^1.4.4", - "query-string": "^5.0.0", - "qunit-dom": "^0.7.1" + "query-string": "^5.0.0" }, "engines": { "node": "6.* || 8.* || >= 10.*" diff --git a/ui/yarn.lock b/ui/yarn.lock index 00035685fc0..57054dadee1 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -784,7 +784,7 @@ dependencies: type-detect "4.0.8" -"@sinonjs/formatio@^3.1.0": +"@sinonjs/formatio@^3.0.0", "@sinonjs/formatio@^3.1.0": version "3.2.1" resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ== @@ -792,6 +792,11 @@ "@sinonjs/commons" "^1" "@sinonjs/samsam" "^3.1.0" +"@sinonjs/samsam@^2.1.2": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-2.1.3.tgz#62cf2a9b624edc795134135fe37fc2ae8ea36be3" + integrity sha512-8zNeBkSKhU9a5cRNbpCKau2WWPfan+Q2zDlcXvXyhn9EsMqgYs4qzo0XHNVlXC6ABQL8fT6nV+zzo5RTHJzyXw== + "@sinonjs/samsam@^3.1.0": version "3.3.1" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.1.tgz#e88c53fbd9d91ad9f0f2b0140c16c7c107fe0d07" @@ -1030,6 +1035,11 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abortcontroller-polyfill@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.3.0.tgz#de69af32ae926c210b7efbcc29bf644ee4838b00" + integrity sha512-lbWQgf+eRvku3va8poBlDBO12FigTQr9Zb7NIjXrePrhxWVKdCP2wbDl1tLDaYa18PWTom3UEWwdH13S46I+yA== + accepts@~1.3.4, accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" @@ -1052,6 +1062,11 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -1062,6 +1077,11 @@ acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3, acorn@^5.6.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== +acorn@^6.0.7: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" @@ -1092,7 +1112,7 @@ ajv@^5.2.3, ajv@^5.3.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.1.0, ajv@^6.5.5: +ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -1127,7 +1147,7 @@ ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= -ansi-escapes@^3.0.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -1142,6 +1162,11 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -1311,6 +1336,11 @@ ast-types@0.9.6: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + async-disk-cache@^1.2.1: version "1.3.4" resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.4.tgz#a5c9f72f199a9933583659f57a0e11377884f816" @@ -1352,7 +1382,7 @@ async@^1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.4.1, async@^2.5.0, async@^2.6.1: +async@^2.4.1, async@^2.5.0: version "2.6.2" resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== @@ -2322,20 +2352,6 @@ broccoli-file-creator@^2.1.1: broccoli-plugin "^1.1.0" mkdirp "^0.5.1" -broccoli-filter@^0.1.11: - version "0.1.14" - resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-0.1.14.tgz#23cae3891ff9ebb7b4d7db00c6dcf03535daf7ad" - integrity sha1-I8rjiR/567e019sAxtzwNTXa960= - dependencies: - broccoli-kitchen-sink-helpers "^0.2.6" - broccoli-writer "^0.1.1" - mkdirp "^0.3.5" - promise-map-series "^0.2.1" - quick-temp "^0.1.2" - rsvp "^3.0.16" - symlink-or-copy "^1.0.1" - walk-sync "^0.1.3" - broccoli-filter@^1.2.2, broccoli-filter@^1.2.3: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.3.0.tgz#71e3a8e32a17f309e12261919c5b1006d6766de6" @@ -2364,7 +2380,7 @@ broccoli-funnel-reducer@^1.0.0: resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= -broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0, broccoli-funnel@^1.2.0: +broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" integrity sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY= @@ -2403,7 +2419,7 @@ broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1, broccoli-funnel@^2.0.2: symlink-or-copy "^1.0.0" walk-sync "^0.3.1" -broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@^0.2.6: +broccoli-kitchen-sink-helpers@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" integrity sha1-peCYbtjXb7WYS2jD8EUNOpbjbsw= @@ -2419,15 +2435,15 @@ broccoli-kitchen-sink-helpers@^0.3.1: glob "^5.0.10" mkdirp "^0.5.1" -broccoli-lint-eslint@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-4.2.1.tgz#f780dc083a7357a9746a9cfa8f76feb092777477" - integrity sha512-Jvm06UvuMPa5gEH+9/Sb+QpoIodDAYzbyIUEqxniPCdA6JJooa91hQDCTJc32RUV46JNMcLhb3Dl55BdA8v5mw== +broccoli-lint-eslint@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/broccoli-lint-eslint/-/broccoli-lint-eslint-5.0.0.tgz#05365879d597dd78496a1c718db0e5ea5d4a2bde" + integrity sha512-V7M6U4th21bf1X4u3KoZa0xkcPq9JCSyKxB/nCWCBFMI3rkrB8nlyDLd8DKIUTqL+ojlFOGV5lohPZwndw0sZw== dependencies: aot-test-generators "^0.1.0" broccoli-concat "^3.2.2" - broccoli-persistent-filter "^1.4.3" - eslint "^4.0.0" + broccoli-persistent-filter "^2.1.0" + eslint "^5.6.0" json-stable-stringify "^1.0.1" lodash.defaultsdeep "^4.6.0" md5-hex "^2.0.0" @@ -2513,7 +2529,7 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1: +broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.2.2.tgz#e0180e75ede5dd05d4c702f24f6c049e93fba915" integrity sha512-PW12RD1yY+x5SASUADuUMJce+dVSmjBO3pV1rLNHmT1C31rp1P++TvX7AgUObFmGhL7qlwviSdhMbBkY1v3G2w== @@ -2604,7 +2620,7 @@ broccoli-sri-hash@^2.1.0: sri-toolbox "^0.2.0" symlink-or-copy "^1.0.1" -broccoli-stew@^1.2.0, broccoli-stew@^1.4.2, broccoli-stew@^1.5.0: +broccoli-stew@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-1.6.0.tgz#01f6d92806ed6679ddbe48d405066a0e164dfbef" integrity sha512-sUwCJNnYH4Na690By5xcEMAZqKgquUQnMAEuIiL3Z2k63mSw9Xg+7Ew4wCrFrMmXMcLpWjZDOm6Yqnq268N+ZQ== @@ -2652,14 +2668,16 @@ broccoli-string-replace@^0.1.2: broccoli-persistent-filter "^1.1.5" minimatch "^3.0.3" -broccoli-templater@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/broccoli-templater/-/broccoli-templater-1.0.0.tgz#7c054aacf596d1868d1a44291f9ec7b907d30ecf" - integrity sha1-fAVKrPWW0YaNGkQpH57HuQfTDs8= +broccoli-templater@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/broccoli-templater/-/broccoli-templater-2.0.2.tgz#285a892071c0b3ad5ebc275d9e8b3465e2d120d6" + integrity sha512-71KpNkc7WmbEokTQpGcbGzZjUIY1NSVa3GB++KFKAfx5SZPUozCOsBlSTwxcv8TLoCAqbBnsX5AQPgg6vJ2l9g== dependencies: - broccoli-filter "^0.1.11" - broccoli-stew "^1.2.0" - lodash.template "^3.3.2" + broccoli-plugin "^1.3.1" + fs-tree-diff "^0.5.9" + lodash.template "^4.4.0" + rimraf "^2.6.2" + walk-sync "^0.3.3" broccoli-uglify-sourcemap@^2.1.1: version "2.2.0" @@ -2678,14 +2696,6 @@ broccoli-uglify-sourcemap@^2.1.1: walk-sync "^0.3.2" workerpool "^2.3.0" -broccoli-writer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/broccoli-writer/-/broccoli-writer-0.1.1.tgz#d4d71aa8f2afbc67a3866b91a2da79084b96ab2d" - integrity sha1-1NcaqPKvvGejhmuRotp5CEuWqy0= - dependencies: - quick-temp "^0.1.0" - rsvp "^3.0.6" - brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -2758,7 +2768,7 @@ browserslist@^3.1.1, browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.4.2, browserslist@^4.5.1: +browserslist@^4.0.0, browserslist@^4.4.2, browserslist@^4.5.1: version "4.5.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.3.tgz#969495c410314bc89f14e748505e58be968080f1" integrity sha512-Tx/Jtrmh6vFg24AelzLwCaCq1IUJiMDM1x/LPzqbmbktF8Zo7F9ONUpOWsFK6TtdON95mSMaQUWqi0ilc8xM6g== @@ -2811,22 +2821,6 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -build@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/build/-/build-0.1.4.tgz#707fe026ffceddcacbfdcdf356eafda64f151046" - integrity sha1-cH/gJv/O3crL/c3zVur9pk8VEEY= - dependencies: - cssmin "0.3.x" - jsmin "1.x" - jxLoader "*" - moo-server "*" - promised-io "*" - timespan "2.x" - uglify-js "1.x" - walker "1.x" - winston "*" - wrench "1.3.x" - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -2916,6 +2910,11 @@ callsites@^0.2.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= +callsites@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" + integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -2946,7 +2945,17 @@ can-symlink@^1.0.0: dependencies: tmp "0.0.28" -caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000955: +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000955: version "1.0.30000955" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000955.tgz#360fdb9a1e41d6dd996130411334e44a39e4446d" integrity sha512-6AwmIKgqCYfDWWadRkAuZSHMQP4Mmy96xAXEdRBlN/luQhlRYOKgwOlZ9plpCOsVbBuqbTmGqDK3JUM/nlr8CA== @@ -2987,7 +2996,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3001,6 +3010,11 @@ chardet@^0.4.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + charm@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/charm/-/charm-1.0.2.tgz#8add367153a6d9a581331052c4090991da995e35" @@ -3198,7 +3212,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -3210,55 +3224,16 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@3.0.x: - version "3.0.0" - resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" - integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" - -colornames@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96" - integrity sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y= - colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== - colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= -colorspace@1.1.x: - version "1.1.1" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.1.tgz#9ac2491e1bc6f8fb690e2176814f8d091636d972" - integrity sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw== - dependencies: - color "3.0.x" - text-hex "1.0.x" - combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" @@ -3540,7 +3515,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.0: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -3614,11 +3589,6 @@ css-what@2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== -cssmin@0.3.x: - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssmin/-/cssmin-0.3.2.tgz#ddce4c547b510ae0d594a8f1fbf8aaf8e2c5c00d" - integrity sha1-3c5MVHtRCuDVlKjx+/iq+OLFwA0= - csso@^3.5.0: version "3.5.1" resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" @@ -3782,7 +3752,7 @@ debug@^3.0.1, debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@~4.1.0: +debug@^4.0.1, debug@^4.1.0, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -3907,16 +3877,7 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -diagnostics@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a" - integrity sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ== - dependencies: - colorspace "1.1.x" - enabled "1.0.x" - kuler "1.0.x" - -diff@^3.1.0, diff@^3.5.0: +diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== @@ -3944,6 +3905,13 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-serializer@0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" @@ -4028,12 +3996,12 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -ember-ajax@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-4.0.2.tgz#ce86d52c24289657e0a230140b06a52fe453d655" - integrity sha512-YeeeAQizQc5ioCeraxFo30y3W6mmUxmndF0ShI/Wvwfe8IhVw40jL42itaUHbo2CxKsNRZzQ8x3re65dGM0CrA== +ember-ajax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-5.0.0.tgz#404b17c93194ab37aff86b7b8607d8edab93c9ec" + integrity sha512-Pet0S5VuiO7PDOwyTIF28VHdR7BpugL+jp+6PxNHRQvAq3SkKmVnXN0W06rnOgicH3xX29S46fx7czkKOGB3gA== dependencies: - ember-cli-babel "^6.16.0" + ember-cli-babel "^7.5.0" najax "^1.0.3" ember-assign-polyfill@~2.4.0: @@ -4107,7 +4075,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.2.0, ember-cli-babel@^7.4.0: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.2.0, ember-cli-babel@^7.4.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== @@ -4166,15 +4134,15 @@ ember-cli-deprecation-workflow@^1.0.1: broccoli-plugin "^1.3.1" ember-debug-handlers-polyfill "^1.1.1" -ember-cli-eslint@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598" - integrity sha512-1fqRz9QVLTT790Zr07aDFmAprZ1vVsaBGJOGQgDEFmBpogq8BeaQopaxogWFp748hol8nGC4QP5tbzhVD6KQHw== +ember-cli-eslint@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-5.1.0.tgz#acdb9b072911e04b07c313b610f514db4086d21a" + integrity sha512-o6787b0tgkRNp+KJo5BiQxtkLuz/yyYqVWF31LPrh+ZCC8jETrfyjsuk8VPDxKLGq7qEiQNJUgOEW87HTad7Vg== dependencies: - broccoli-lint-eslint "^4.2.1" - ember-cli-version-checker "^2.1.0" + broccoli-lint-eslint "^5.0.0" + ember-cli-version-checker "^3.0.0" rsvp "^4.6.1" - walk-sync "^0.3.0" + walk-sync "^1.0.0" ember-cli-funnel@^0.6.1: version "0.6.1" @@ -4224,10 +4192,10 @@ ember-cli-import-polyfill@^0.2.0: resolved "https://registry.yarnpkg.com/ember-cli-import-polyfill/-/ember-cli-import-polyfill-0.2.0.tgz#c1a08a8affb45c97b675926272fe78cf4ca166f2" integrity sha1-waCKiv+0XJe2dZJicv54z0yhZvI= -ember-cli-inject-live-reload@^1.8.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.10.2.tgz#43c59f7f1d1e717772da32e5e81d948fb9fe7c94" - integrity sha512-yFvZE4WFyWjzMJ6MTYIyjCXpcJNFMTaZP61JXITMkXhSkhuDkzMD/XfwR5+fr004TYcwrbNWpg1oGX5DbOgcaQ== +ember-cli-inject-live-reload@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.0.1.tgz#1bf3a6ea1747bceddc9f62f7ca8575de6b53ddaf" + integrity sha512-vrW/3KSrku+Prqmp7ZkpCxYkabnLrTHDEvV9B1yphTP++dhiV7n7Dv9NrmyubkoF3Inm0xrbbhB5mScvvuTQSg== dependencies: clean-base-url "^1.0.0" ember-cli-version-checker "^2.1.2" @@ -4664,17 +4632,23 @@ ember-factory-for-polyfill@^1.3.1: dependencies: ember-cli-version-checker "^2.1.0" -ember-fetch@^3.4.3: - version "3.4.5" - resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-3.4.5.tgz#2967df9cbdbe0993402588216332580be3950b92" - integrity sha512-6rrZ0VMcp9jd1eyS6tuZdquH3nb7juT7l2bZ5zYPZUAVlUAOnyWJH+KIZ16osj7kqV60yqaCRUn99HWX1dXoyw== +ember-fetch@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-6.5.0.tgz#efed80b3dd2259b52efce7498659e9125235bfb7" + integrity sha512-B9KSeeO3xDNMQ22JqNwbmgnOprBzc8kNVfQMtzkAmugMb2aCmBZohAlQlwUUX5ODz8fHq2xfuZXDHD81Dzb0vg== dependencies: - broccoli-funnel "^1.2.0" - broccoli-stew "^1.4.2" - broccoli-templater "^1.0.0" + abortcontroller-polyfill "^1.2.5" + broccoli-concat "^3.2.2" + broccoli-debug "^0.6.5" + broccoli-merge-trees "^3.0.0" + broccoli-rollup "^2.1.1" + broccoli-stew "^2.0.0" + broccoli-templater "^2.0.1" + calculate-cache-key-for-tree "^1.1.0" + caniuse-api "^3.0.0" ember-cli-babel "^6.8.2" - node-fetch "^2.0.0-alpha.9" - whatwg-fetch "^2.0.3" + node-fetch "^2.3.0" + whatwg-fetch "^3.0.0" ember-freestyle@~0.10.0: version "0.10.0" @@ -4845,15 +4819,15 @@ ember-runtime-enumerable-includes-polyfill@^2.0.0: ember-cli-babel "^6.9.0" ember-cli-version-checker "^2.1.0" -ember-sinon@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ember-sinon/-/ember-sinon-1.0.1.tgz#056390eacc9367b4c3955ce1cb5a04246f8197f5" - integrity sha1-BWOQ6syTZ7TDlVzhy1oEJG+Bl/U= +ember-sinon@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ember-sinon/-/ember-sinon-2.2.0.tgz#acb628dec695d6817bd17fd6c25a4d70821851e9" + integrity sha512-BgjHsgy8rli8FaJ1MWkscIKRpoFmzYhNkDtwBWQrUCzQx1bp3+irVpseAPqBnuEB4FPFGGQV5ahDpFcckmIsAw== dependencies: broccoli-funnel "^2.0.0" - broccoli-merge-trees "^2.0.0" - ember-cli-babel "^6.3.0" - sinon "^3.2.1" + broccoli-merge-trees "^3.0.0" + ember-cli-babel "^6.6.0" + sinon "^6.0.1" ember-source@~3.4.0: version "3.4.8" @@ -4918,27 +4892,16 @@ ember-weakmap@^3.0.0: debug "^3.1.0" ember-cli-babel "^6.6.0" -ember-welcome-page@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ember-welcome-page/-/ember-welcome-page-3.2.0.tgz#fe9903dbbaccfb4a2a05f42c716b7d07470f2d78" - integrity sha512-aDUIGwPsAvv77K6jplnIvQamNBOuqRKlSXsaWaIkjpIi4ZTbDLnyDkuxMBgxCKiajr7wGhrghAelRQHbKUK5aw== - dependencies: - broccoli-funnel "^1.0.1" - ember-cli-babel "^6.6.0" - ember-cli-htmlbars "^2.0.3" +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -enabled@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" - integrity sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M= - dependencies: - env-variable "0.0.x" - encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -5010,11 +4973,6 @@ entities@^1.1.1, entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== -env-variable@0.0.x: - version "0.0.5" - resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88" - integrity sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA== - errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -5076,7 +5034,7 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^4.0.0: +eslint-scope@^4.0.0, eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -5084,12 +5042,17 @@ eslint-scope@^4.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@^4.0.0, eslint@^4.13.1: +eslint@^4.13.1: version "4.19.1" resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== @@ -5133,6 +5096,48 @@ eslint@^4.0.0, eslint@^4.13.1: table "4.0.2" text-table "~0.2.0" +eslint@^5.6.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + espree@^3.5.4: version "3.5.4" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" @@ -5141,6 +5146,15 @@ espree@^3.5.4: acorn "^5.5.0" acorn-jsx "^3.0.0" +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -5156,7 +5170,7 @@ esprima@~3.1.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= -esquery@^1.0.0: +esquery@^1.0.0, esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== @@ -5395,6 +5409,15 @@ external-editor@^2.0.4: iconv-lite "^0.4.17" tmp "^0.0.33" +external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -5468,11 +5491,6 @@ fast-ordered-set@^1.0.0, fast-ordered-set@^1.0.2: dependencies: blank-object "^1.0.1" -fast-safe-stringify@^2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2" - integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg== - fast-sourcemap-concat@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/fast-sourcemap-concat/-/fast-sourcemap-concat-1.4.0.tgz#122c330d4a2afaff16ad143bc9674b87cd76c8ad" @@ -5501,11 +5519,6 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fecha@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" - integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== - figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -5534,6 +5547,13 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + filesize@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" @@ -5669,6 +5689,15 @@ flat-cache@^1.2.1: rimraf "~2.6.2" write "^0.2.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + flat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" @@ -5676,6 +5705,11 @@ flat@^4.0.0: dependencies: is-buffer "~2.0.3" +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -5710,13 +5744,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -formatio@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" - integrity sha1-87IWfZBoxGmKjVH092CjmlTYGOs= - dependencies: - samsam "1.x" - forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -5795,7 +5822,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7: +fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7, fs-tree-diff@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw== @@ -5995,7 +6022,7 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -globals@^11.0.1, globals@^11.1.0: +globals@^11.0.1, globals@^11.1.0, globals@^11.7.0: version "11.11.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== @@ -6296,7 +6323,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.17, iconv-lite@^0.4.4: +iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -6325,11 +6352,19 @@ ignore@^3.3.3: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^4.0.3: +ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -6441,6 +6476,25 @@ inquirer@^3.0.6, inquirer@^3.3.0: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.0.0" + through "^2.3.6" + invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -6477,11 +6531,6 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -6819,12 +6868,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@0.3.x: - version "0.3.7" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-0.3.7.tgz#d739d8ee86461e54b354d6a7d7d1f2ad9a167f62" - integrity sha1-1znY7oZGHlSzVNan19HyrZoWf2I= - -js-yaml@^3.12.0, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.9.0, js-yaml@^3.9.1: +js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.9.0, js-yaml@^3.9.1: version "3.13.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== @@ -6865,11 +6909,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -jsmin@1.x: - version "1.0.1" - resolved "https://registry.yarnpkg.com/jsmin/-/jsmin-1.0.1.tgz#e7bd0dcd6496c3bf4863235bf461a3d98aa3b98c" - integrity sha1-570NzWSWw79IYyNb9GGj2YqjuYw= - json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -6960,16 +6999,6 @@ just-extend@^4.0.2: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== -jxLoader@*: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jxLoader/-/jxLoader-0.1.1.tgz#0134ea5144e533b594fc1ff25ff194e235c53ecd" - integrity sha1-ATTqUUTlM7WU/B/yX/GU4jXFPs0= - dependencies: - js-yaml "0.3.x" - moo-server "1.3.x" - promised-io "*" - walker "1.x" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -6994,13 +7023,6 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -kuler@1.0.x: - version "1.0.1" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6" - integrity sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ== - dependencies: - colornames "^1.1.1" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -7230,16 +7252,6 @@ lodash._baseflatten@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U= - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc= - lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" @@ -7295,16 +7307,16 @@ lodash._objecttypes@~2.3.0: resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz#6a3ea3987dd6eeb8021b2d5c9c303549cc2bae1e" integrity sha1-aj6jmH3W7rgCGy1cnDA1Scwrrh4= -lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - lodash._reinterpolate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz#03ee9d85c0e55cbd590d71608a295bdda51128ec" integrity sha1-A+6dhcDlXL1ZDXFgiilb3aURKOw= +lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + lodash._renative@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._renative/-/lodash._renative-2.3.0.tgz#77d8edd4ced26dd5971f9e15a5f772e4e317fbd3" @@ -7318,11 +7330,6 @@ lodash._reunescapedhtml@~2.3.0: lodash._htmlescapes "~2.3.0" lodash.keys "~2.3.0" -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= - lodash._setbinddata@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.3.0.tgz#e5610490acd13277d59858d95b5f2727f1508f04" @@ -7406,13 +7413,6 @@ lodash.defaultsdeep@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81" integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E= -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg= - dependencies: - lodash._root "^3.0.0" - lodash.escape@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.3.0.tgz#844c38c58f844e1362ebe96726159b62cf5f2a58" @@ -7507,6 +7507,11 @@ lodash.keys@~2.3.0: lodash._shimkeys "~2.3.0" lodash.isobject "~2.3.0" +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + lodash.merge@^4.3.1, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" @@ -7539,21 +7544,6 @@ lodash.support@~2.3.0: dependencies: lodash._renative "~2.3.0" -lodash.template@^3.3.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8= - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" @@ -7575,14 +7565,6 @@ lodash.template@~2.3.x: lodash.templatesettings "~2.3.0" lodash.values "~2.3.0" -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU= - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" @@ -7598,7 +7580,7 @@ lodash.templatesettings@~2.3.0: lodash._reinterpolate "~2.3.0" lodash.escape "~2.3.0" -lodash.uniq@^4.2.0: +lodash.uniq@^4.2.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= @@ -7642,18 +7624,7 @@ log-update@^1.0.2: ansi-escapes "^1.0.0" cli-cursor "^1.0.2" -logform@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.1.2.tgz#957155ebeb67a13164069825ce67ddb5bb2dd360" - integrity sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ== - dependencies: - colors "^1.2.1" - fast-safe-stringify "^2.0.4" - fecha "^2.3.3" - ms "^2.1.1" - triple-beam "^1.3.0" - -lolex@^2.1.2, lolex@^2.3.2: +lolex@^2.3.2, lolex@^2.7.5: version "2.7.5" resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== @@ -8044,11 +8015,6 @@ moment-timezone@^0.5.13: resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== -moo-server@*, moo-server@1.3.x: - version "1.3.0" - resolved "https://registry.yarnpkg.com/moo-server/-/moo-server-1.3.0.tgz#5dc79569565a10d6efed5439491e69d2392e58f1" - integrity sha1-XceVaVZaENbv7VQ5SR5p0jkuWPE= - morgan@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" @@ -8133,11 +8099,6 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -native-promise-only@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" - integrity sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE= - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -8167,7 +8128,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.0.1: +nise@^1.4.5: version "1.4.10" resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.10.tgz#ae46a09a26436fae91a38a60919356ae6db143b6" integrity sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA== @@ -8178,7 +8139,7 @@ nise@^1.0.1: lolex "^2.3.2" path-to-regexp "^1.7.0" -node-fetch@^2.0.0-alpha.9: +node-fetch@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== @@ -8504,11 +8465,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -one-time@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e" - integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= - onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" @@ -8669,6 +8625,13 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: version "5.1.4" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" @@ -8978,11 +8941,6 @@ promise-map-series@^0.2.1, promise-map-series@^0.2.3: dependencies: rsvp "^3.0.14" -promised-io@*: - version "0.3.5" - resolved "https://registry.yarnpkg.com/promised-io/-/promised-io-0.3.5.tgz#4ad217bb3658bcaae9946b17a8668ecd851e1356" - integrity sha1-StIXuzZYvKrplGsXqGaOzYUeE1Y= - proxy-addr@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" @@ -9092,7 +9050,7 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: +quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408" integrity sha1-urAqJCq4+w3XWKPJd2sy+aXZRAg= @@ -9101,14 +9059,6 @@ quick-temp@^0.1.0, quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quic rimraf "^2.5.4" underscore.string "~3.3.4" -qunit-dom@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.7.1.tgz#2e6ad4a6453c034f88ef415250b37e82572460b9" - integrity sha512-8mwF7taWSqDrVRYHgp98nJmoTeE2z37K7RmHjV18pX0YoGxaJSYg+y1bRE0h3tsjSMs85W9gL/WR62yfoQN3VA== - dependencies: - broccoli-funnel "^2.0.0" - broccoli-merge-trees "^2.0.0" - qunit@~2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.6.2.tgz#551210c5cf857258a4fe39a7fe15d9e14dfef22c" @@ -9200,15 +9150,6 @@ read-pkg@^1.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.1.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" - integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@~1.0.2: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -9319,6 +9260,11 @@ regexpp@^1.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -9463,6 +9409,11 @@ resolve-from@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-package-path@^1.0.11, resolve-package-path@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.6.tgz#48f5d69a5b3a0ea68f7b9c7398459dd4125807c7" @@ -9511,7 +9462,7 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: +rimraf@2, rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -9561,7 +9512,7 @@ route-recognizer@^0.3.3, route-recognizer@^0.3.4: resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== -rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3: +rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== @@ -9614,6 +9565,13 @@ rxjs@^5.4.2: dependencies: symbol-observable "1.0.1" +rxjs@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -9636,11 +9594,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -samsam@1.x, samsam@^1.1.3: - version "1.3.0" - 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: version "2.5.2" resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" @@ -9842,29 +9795,20 @@ simple-html-tokenizer@^0.5.6: resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.7.tgz#8eca336ecfbe2b3c6166cbb31b2682088de79f40" integrity sha512-APW9iYbkJ5cijjX4Ljhf3VG8SwYPUJT5gZrwci/wieMabQxWFiV5VwsrP5c6GMRvXKEQMGkAB1d9dvW66dTqpg== -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= +sinon@^6.0.1: + version "6.3.5" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-6.3.5.tgz#0f6d6a5b4ebaad1f6e8e019395542d1d02c144a0" + integrity sha512-xgoZ2gKjyVRcF08RrIQc+srnSyY1JDJtxu3Nsz07j1ffjgXoY6uPLf/qja6nDBZgzYYEovVkFryw2+KiZz11xQ== dependencies: - is-arrayish "^0.3.1" - -sinon@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-3.3.0.tgz#9132111b4bbe13c749c2848210864250165069b1" - integrity sha512-/flfGfIxIRXSvZBHJzIf3iAyGYkmMQq6SQjA0cx9SOuVuq+4ZPPO4LJtH1Ce0Lznax1KSG1U6Dad85wIcSW19w== - dependencies: - build "^0.1.4" - diff "^3.1.0" - formatio "1.2.0" + "@sinonjs/commons" "^1.0.2" + "@sinonjs/formatio" "^3.0.0" + "@sinonjs/samsam" "^2.1.2" + diff "^3.5.0" lodash.get "^4.4.2" - lolex "^2.1.2" - native-promise-only "^0.8.1" - nise "^1.0.1" - path-to-regexp "^1.7.0" - samsam "^1.1.3" - text-encoding "0.6.4" - type-detect "^4.0.0" + lolex "^2.7.5" + nise "^1.4.5" + supports-color "^5.5.0" + type-detect "^4.0.8" slash@^1.0.0: version "1.0.0" @@ -9888,6 +9832,15 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -10145,11 +10098,6 @@ stable@~0.1.6: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - staged-git-files@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.0.0.tgz#cdb847837c1fcc52c08a872d4883cc0877668a80" @@ -10246,12 +10194,21 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== @@ -10288,6 +10245,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0, strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -10317,7 +10281,7 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -10339,7 +10303,7 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^5.3.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -10393,6 +10357,16 @@ table@4.0.2: slice-ansi "1.0.0" string-width "^2.1.1" +table@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" + integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ== + dependencies: + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" + tap-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-7.0.0.tgz#54db35302fda2c2ccc21954ad3be22b2cba42721" @@ -10494,17 +10468,7 @@ testem@^2.9.2: tmp "0.0.33" xmldom "^0.1.19" -text-encoding@0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" - integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -text-table@~0.2.0: +text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -10539,11 +10503,6 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -timespan@2.x: - version "2.3.0" - resolved "https://registry.yarnpkg.com/timespan/-/timespan-2.3.0.tgz#4902ce040bd13d845c8f59b27e9d59bad6f39929" - integrity sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk= - tiny-lr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" @@ -10656,11 +10615,6 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -triple-beam@^1.2.0, triple-beam@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" - integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== - "true-case-path@^1.0.2": version "1.0.3" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" @@ -10697,7 +10651,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0: +type-detect@4.0.8, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -10720,11 +10674,6 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== -uglify-js@1.x: - version "1.3.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-1.3.5.tgz#4b5bfff9186effbaa888e4c9e94bd9fc4c94929d" - integrity sha1-S1v/+Rhu/7qoiOTJ6UvZ/EyUkp0= - uglify-js@^3.1.4: version "3.5.3" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.3.tgz#d490bb5347f23025f0c1bc0dee901d98e4d6b063" @@ -10881,7 +10830,7 @@ username@^1.0.1: dependencies: meow "^3.4.0" -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -10962,11 +10911,6 @@ walk-sync@0.3.2: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.1.3.tgz#8a07261a00bda6cfb1be25e9f100fad57546f583" - integrity sha1-igcmGgC9ps+xviXp8QD61XVG9YM= - walk-sync@^0.2.5: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" @@ -10992,7 +10936,7 @@ walk-sync@^1.0.0: ensure-posix-path "^1.1.0" matcher-collection "^1.1.1" -walker@1.x, walker@~1.0.5: +walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= @@ -11085,10 +11029,10 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -whatwg-fetch@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== +whatwg-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== which-module@^1.0.0: version "1.0.0" @@ -11114,29 +11058,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -winston-transport@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66" - integrity sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A== - dependencies: - readable-stream "^2.3.6" - triple-beam "^1.2.0" - -winston@*: - version "3.2.1" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.2.1.tgz#63061377976c73584028be2490a1846055f77f07" - integrity sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw== - dependencies: - async "^2.6.1" - diagnostics "^1.1.1" - is-stream "^1.1.0" - logform "^2.1.1" - one-time "0.0.4" - readable-stream "^3.1.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.3.0" - wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -11183,11 +11104,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -wrench@1.3.x: - version "1.3.9" - resolved "https://registry.yarnpkg.com/wrench/-/wrench-1.3.9.tgz#6f13ec35145317eb292ca5f6531391b244111411" - integrity sha1-bxPsNRRTF+spLKX2UxORskQRFBE= - write-file-atomic@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" @@ -11197,6 +11113,13 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" From 56500bd04b3117bcc74c32bbb0243feabdfd22ab Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 2 Apr 2019 15:59:16 -0700 Subject: [PATCH 39/46] Upgrade eslint to v5 --- ui/.eslintrc.js | 5 +- ui/package.json | 2 +- ui/yarn.lock | 220 +++--------------------------------------------- 3 files changed, 13 insertions(+), 214 deletions(-) diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js index f75da3c33ea..a18e7dc06e3 100644 --- a/ui/.eslintrc.js +++ b/ui/.eslintrc.js @@ -8,11 +8,8 @@ module.exports = { }, extends: 'eslint:recommended', parserOptions: { - ecmaVersion: 2017, + ecmaVersion: 2018, sourceType: 'module', - ecmaFeatures: { - experimentalObjectRestSpread: true, - }, }, rules: { indent: ['error', 2, { SwitchCase: 1 }], diff --git a/ui/package.json b/ui/package.json index f65210897ad..b2066e1fcbe 100644 --- a/ui/package.json +++ b/ui/package.json @@ -75,7 +75,7 @@ "ember-source": "~3.4.0", "ember-test-selectors": "^2.1.0", "ember-truth-helpers": "^2.0.0", - "eslint": "^4.13.1", + "eslint": "^5.16.0", "flat": "^4.0.0", "fuse.js": "~3.2.0", "husky": "^0.14.3", diff --git a/ui/yarn.lock b/ui/yarn.lock index 57054dadee1..2ac7968b749 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1055,24 +1055,12 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= - dependencies: - acorn "^3.0.4" - acorn-jsx@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= - -acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3, acorn@^5.6.2: +acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -1092,26 +1080,11 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= - ajv-keywords@^3.1.0: version "3.4.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== -ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" @@ -1414,7 +1387,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -2893,23 +2866,11 @@ call-me-maybe@^1.0.1: resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= - dependencies: - callsites "^0.2.0" - callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= - callsites@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" @@ -3066,11 +3027,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -3308,7 +3264,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0: +concat-stream@^1.4.7, concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3506,7 +3462,7 @@ cross-spawn@^3.0.0: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^5.0.1, cross-spawn@^5.1.0: +cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= @@ -3898,13 +3854,6 @@ dir-glob@^2.2.2: dependencies: path-type "^3.0.0" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -5026,14 +4975,6 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-scope@^3.7.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" - integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-scope@^4.0.0, eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -5052,51 +4993,7 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@^4.13.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" - integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" - -eslint@^5.6.0: +eslint@^5.16.0, eslint@^5.6.0: version "5.16.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== @@ -5138,14 +5035,6 @@ eslint@^5.6.0: table "^5.2.3" text-table "^0.2.0" -espree@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - espree@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" @@ -5170,7 +5059,7 @@ esprima@~3.1.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= -esquery@^1.0.0, esquery@^1.0.1: +esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== @@ -5452,11 +5341,6 @@ faker@^3.0.0: resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" integrity sha1-D5CPr05uwCUk5UpX5DLFwBPgjJ8= -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -5539,14 +5423,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -5679,16 +5555,6 @@ fixturify@^1.2.0: fs-extra "^7.0.1" matcher-collection "^2.0.0" -flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== - dependencies: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -6022,7 +5888,7 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -globals@^11.0.1, globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0, globals@^11.7.0: version "11.11.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== @@ -6347,11 +6213,6 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.3: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -6456,7 +6317,7 @@ inquirer@^2: strip-ansi "^3.0.0" through "^2.3.6" -inquirer@^3.0.6, inquirer@^3.3.0: +inquirer@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== @@ -6707,11 +6568,6 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -6868,7 +6724,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.9.0, js-yaml@^3.9.1: +js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.9.0: version "3.13.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== @@ -6914,11 +6770,6 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -8844,11 +8695,6 @@ pkg-up@^2.0.0: dependencies: find-up "^2.1.0" -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - portfinder@^1.0.15: version "1.0.20" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" @@ -9255,11 +9101,6 @@ regexp-tree@^0.1.0: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.5.tgz#7cd71fca17198d04b4176efd79713f2998009397" integrity sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ== -regexpp@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== - regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -9378,14 +9219,6 @@ require-relative@^0.8.7: resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -9404,11 +9237,6 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -9462,7 +9290,7 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@2, rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: +rimraf@2, rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -9825,13 +9653,6 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== - dependencies: - is-fullwidth-code-point "^2.0.0" - slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -10345,18 +10166,6 @@ symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink- resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - table@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" @@ -10468,7 +10277,7 @@ testem@^2.9.2: tmp "0.0.33" xmldom "^0.1.19" -text-table@^0.2.0, text-table@~0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -11120,13 +10929,6 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= - dependencies: - mkdirp "^0.5.1" - ws@~6.1.0: version "6.1.4" resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" From 513f882f1a20cb5e54b5469a02aa9c1ee702de95 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 2 Apr 2019 16:11:22 -0700 Subject: [PATCH 40/46] Upgrade third party packages --- ui/package.json | 11 +- ui/yarn.lock | 513 +++++++++++++++++++++++++++++------------------- 2 files changed, 323 insertions(+), 201 deletions(-) diff --git a/ui/package.json b/ui/package.json index b2066e1fcbe..708132a8a33 100644 --- a/ui/package.json +++ b/ui/package.json @@ -15,6 +15,11 @@ "start": "./node_modules/ember-cli/bin/ember server", "test": "./node_modules/ember-cli/bin/ember test" }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, "lint-staged": { "'{app,tests,config,lib,mirage}/**/*.js'": ["prettier --write", "git add"], "'app/styles/**/*.*'": ["prettier --write", "git add"] @@ -77,10 +82,10 @@ "ember-truth-helpers": "^2.0.0", "eslint": "^5.16.0", "flat": "^4.0.0", - "fuse.js": "~3.2.0", - "husky": "^0.14.3", + "fuse.js": "^3.4.4", + "husky": "^1.3.1", "ivy-codemirror": "^2.1.0", - "lint-staged": "^6.0.0", + "lint-staged": "^8.1.5", "loader.js": "^4.7.0", "lodash.intersection": "^4.4.0", "prettier": "^1.4.4", diff --git a/ui/yarn.lock b/ui/yarn.lock index 2ac7968b749..be9aa391c32 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -623,6 +623,13 @@ js-levenshtein "^1.1.3" semver "^5.3.0" +"@babel/runtime@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" + integrity sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA== + dependencies: + regenerator-runtime "^0.12.0" + "@babel/runtime@^7.2.0": version "7.4.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" @@ -772,6 +779,13 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== + dependencies: + any-observable "^0.3.0" + "@simple-dom/interface@1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" @@ -1115,7 +1129,7 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= -ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: +ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= @@ -1157,10 +1171,10 @@ ansicolors@~0.2.1: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= -any-observable@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242" - integrity sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI= +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== anymatch@^2.0.0: version "2.0.0" @@ -1177,11 +1191,6 @@ aot-test-generators@^0.1.0: dependencies: jsesc "^2.5.0" -app-root-path@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a" - integrity sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA== - aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -1249,7 +1258,7 @@ array-to-sentence@^1.1.0: resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= -array-union@^1.0.2: +array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= @@ -1271,6 +1280,11 @@ arraybuffer.slice@~0.0.7: resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" @@ -2866,11 +2880,30 @@ call-me-maybe@^1.0.1: resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + callsites@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" @@ -3014,11 +3047,16 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" -ci-info@^1.1.3, ci-info@^1.5.0: +ci-info@^1.1.3: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +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== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -3064,25 +3102,20 @@ clean-up-path@^1.0.0: resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw== -cli-cursor@^1.0.1, cli-cursor@^1.0.2: +cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= dependencies: restore-cursor "^1.0.1" -cli-cursor@^2.1.0: +cli-cursor@^2.0.0, cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" -cli-spinners@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" - integrity sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw= - cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" @@ -3209,7 +3242,7 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.11.0, commander@^2.19.0, commander@^2.6.0, commander@^2.9.0, commander@~2.19.0: +commander@^2.14.1, commander@^2.19.0, commander@^2.6.0, commander@^2.9.0, commander@~2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== @@ -3413,15 +3446,15 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" - integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== +cosmiconfig@^5.0.2, cosmiconfig@^5.0.7: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.0.tgz#45038e4d28a7fe787203aede9c25bca4a08b12c8" + integrity sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g== dependencies: + import-fresh "^2.0.0" is-directory "^0.3.1" - js-yaml "^3.9.0" + js-yaml "^3.13.0" parse-json "^4.0.0" - require-from-string "^2.0.1" create-ecdh@^4.0.0: version "4.0.3" @@ -3783,6 +3816,18 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -4970,7 +5015,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -5158,19 +5203,6 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -5584,6 +5616,11 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +fn-name@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" + integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= + follow-redirects@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" @@ -5762,10 +5799,19 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -fuse.js@~3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.2.1.tgz#6320cb94ce56ec9755c89ade775bcdbb0358d425" - integrity sha1-YyDLlM5W7JdVyJred1vNuwNY1CU= +fuse.js@^3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.4.4.tgz#f98f55fcb3b595cf6a3e629c5ffaf10982103e95" + integrity sha512-pyLQo/1oR5Ywf+a/tY8z4JygnIglmRxVUOiyFAbd11o9keUDpUJSMGRWJngcnkURj30kDHPmhoKY8ChJiz3EpQ== + +g-status@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/g-status/-/g-status-2.0.2.tgz#270fd32119e8fc9496f066fe5fe88e0a6bc78b97" + integrity sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA== + dependencies: + arrify "^1.0.1" + matcher "^1.0.0" + simple-git "^1.85.0" gauge@~2.7.3: version "2.7.4" @@ -5803,6 +5849,11 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -5898,6 +5949,17 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globby@^9.0.0: version "9.2.0" resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" @@ -6173,14 +6235,21 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -husky@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3" - integrity sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA== +husky@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-1.3.1.tgz#26823e399300388ca2afff11cfa8a86b0033fae0" + integrity sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg== dependencies: - is-ci "^1.0.10" - normalize-path "^1.0.0" - strip-indent "^2.0.0" + cosmiconfig "^5.0.7" + execa "^1.0.0" + find-up "^3.0.0" + get-stdin "^6.0.0" + is-ci "^2.0.0" + pkg-dir "^3.0.0" + please-upgrade-node "^3.1.1" + read-pkg "^4.0.1" + run-node "^1.0.0" + slash "^2.0.0" iconv-lite@0.4.23: version "0.4.23" @@ -6218,6 +6287,14 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + import-fresh@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" @@ -6414,12 +6491,12 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== +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 "^1.5.0" + ci-info "^2.0.0" is-data-descriptor@^0.1.4: version "0.1.4" @@ -6530,12 +6607,31 @@ is-obj@^1.0.0, is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-observable@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2" - integrity sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI= +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: - symbol-observable "^0.2.2" + path-is-inside "^1.0.1" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -6669,21 +6765,6 @@ ivy-codemirror@^2.1.0: ember-cli-babel "^6.0.0" ember-cli-node-assets "^0.2.2" -jest-get-type@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23" - integrity sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q== - -jest-validate@^21.1.0: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" - integrity sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg== - dependencies: - chalk "^2.0.1" - jest-get-type "^21.2.0" - leven "^2.1.0" - pretty-format "^21.2.1" - jquery-deferred@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" @@ -6724,7 +6805,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.9.0: +js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7: version "3.13.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== @@ -6890,11 +6971,6 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -6910,41 +6986,46 @@ linkify-it@^2.0.0: dependencies: uc.micro "^1.0.1" -lint-staged@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-6.1.1.tgz#cd08c4d9b8ccc2d37198d1c47ce77d22be6cf324" - integrity sha512-M/7bwLdXbeG7ZNLcasGeLMBDg60/w6obj3KOtINwJyxAxb53XGY0yH5FSZlWklEzuVbTtqtIfAajh6jYIN90AA== +lint-staged@^8.1.5: + version "8.1.5" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.5.tgz#372476fe1a58b8834eb562ed4c99126bd60bdd79" + integrity sha512-e5ZavfnSLcBJE1BTzRTqw6ly8OkqVyO3GL2M6teSmTBYQ/2BuueD5GIt2RPsP31u/vjKdexUyDCxSyK75q4BDA== dependencies: - app-root-path "^2.0.0" - chalk "^2.1.0" - commander "^2.11.0" - cosmiconfig "^4.0.0" + chalk "^2.3.1" + commander "^2.14.1" + cosmiconfig "^5.0.2" debug "^3.1.0" dedent "^0.7.0" - execa "^0.8.0" + del "^3.0.0" + execa "^1.0.0" find-parent-dir "^0.3.0" + g-status "^2.0.2" is-glob "^4.0.0" - jest-validate "^21.1.0" - listr "^0.13.0" - lodash "^4.17.4" - log-symbols "^2.0.0" - minimatch "^3.0.0" + is-windows "^1.0.2" + listr "^0.14.2" + listr-update-renderer "^0.5.0" + lodash "^4.17.11" + log-symbols "^2.2.0" + micromatch "^3.1.8" npm-which "^3.0.1" p-map "^1.1.1" path-is-inside "^1.0.2" pify "^3.0.0" - staged-git-files "1.0.0" - stringify-object "^3.2.0" + please-upgrade-node "^3.0.2" + staged-git-files "1.1.2" + string-argv "^0.0.2" + stringify-object "^3.2.2" + yup "^0.26.10" listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= -listr-update-renderer@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7" - integrity sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc= +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== dependencies: chalk "^1.1.3" cli-truncate "^0.2.1" @@ -6952,41 +7033,33 @@ listr-update-renderer@^0.4.0: figures "^1.7.0" indent-string "^3.0.0" log-symbols "^1.0.2" - log-update "^1.0.2" + log-update "^2.3.0" strip-ansi "^3.0.1" -listr-verbose-renderer@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" - integrity sha1-ggb0z21S3cWCfl/RSYng6WWTOjU= +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== dependencies: - chalk "^1.1.3" - cli-cursor "^1.0.2" + chalk "^2.4.1" + cli-cursor "^2.1.0" date-fns "^1.27.2" - figures "^1.7.0" + figures "^2.0.0" -listr@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.13.0.tgz#20bb0ba30bae660ee84cc0503df4be3d5623887d" - integrity sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0= +listr@^0.14.2: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - figures "^1.7.0" - indent-string "^2.1.0" - is-observable "^0.2.0" + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" is-promise "^2.1.0" is-stream "^1.1.0" listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.4.0" - listr-verbose-renderer "^0.4.0" - log-symbols "^1.0.2" - log-update "^1.0.2" - ora "^0.2.3" - p-map "^1.1.1" - rxjs "^5.4.2" - stream-to-observable "^0.2.0" - strip-ansi "^3.0.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" livereload-js@^2.3.0: version "2.4.0" @@ -7460,20 +7533,21 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" -log-symbols@^2.0.0, log-symbols@^2.2.0: +log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" -log-update@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" - integrity sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE= +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= dependencies: - ansi-escapes "^1.0.0" - cli-cursor "^1.0.2" + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" lolex@^2.3.2, lolex@^2.7.5: version "2.7.5" @@ -7598,6 +7672,13 @@ matcher-collection@^2.0.0: "@types/minimatch" "^3.0.3" minimatch "^3.0.2" +matcher@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" + integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== + dependencies: + escape-string-regexp "^1.0.4" + md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" @@ -8136,11 +8217,6 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" - integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= - normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -8348,16 +8424,6 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -ora@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" - integrity sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q= - dependencies: - chalk "^1.1.1" - cli-cursor "^1.0.2" - cli-spinners "^0.1.2" - object-assign "^4.0.1" - ora@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" @@ -8452,6 +8518,11 @@ p-map@^1.1.1: resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== +p-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz#be18c5a5adeb8e156460651421aceca56c213a50" + integrity sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w== + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -8578,7 +8649,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: +path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= @@ -8695,6 +8766,13 @@ pkg-up@^2.0.0: dependencies: find-up "^2.1.0" +please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac" + integrity sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ== + dependencies: + semver-compare "^1.0.0" + portfinder@^1.0.15: version "1.0.20" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" @@ -8728,14 +8806,6 @@ prettier@^1.4.4: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g== -pretty-format@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" - integrity sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A== - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - pretty-ms@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" @@ -8787,6 +8857,11 @@ promise-map-series@^0.2.1, promise-map-series@^0.2.3: dependencies: rsvp "^3.0.14" +property-expr@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" + integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== + proxy-addr@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" @@ -8983,6 +9058,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" + integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= + dependencies: + normalize-package-data "^2.3.2" + parse-json "^4.0.0" + pify "^3.0.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -9062,6 +9146,11 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + regenerator-runtime@^0.13.2: version "0.13.2" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" @@ -9204,11 +9293,6 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -9237,6 +9321,11 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -9362,6 +9451,11 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" + integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -9386,14 +9480,7 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= -rxjs@^5.4.2: - version "5.5.12" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" - integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== - dependencies: - symbol-observable "1.0.1" - -rxjs@^6.4.0: +rxjs@^6.3.3, rxjs@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== @@ -9495,6 +9582,11 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" @@ -9618,6 +9710,13 @@ silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: dependencies: debug "^2.2.0" +simple-git@^1.85.0: + version "1.110.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.110.0.tgz#54eb179089d055a7783d32399246cebc9d9933e9" + integrity sha512-UYY0rQkknk0P5eb+KW+03F4TevZ9ou0H+LoGaj7iiVgpnZH4wdj/HTViy/1tNNkmIPcmtxuBqXWiYt2YwlRKOQ== + dependencies: + debug "^4.0.1" + simple-html-tokenizer@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.7.tgz#8eca336ecfbe2b3c6166cbb31b2682088de79f40" @@ -9919,10 +10018,10 @@ stable@~0.1.6: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -staged-git-files@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.0.0.tgz#cdb847837c1fcc52c08a872d4883cc0877668a80" - integrity sha1-zbhHg3wfzFLAioctSIPMCHdmioA= +staged-git-files@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz#4326d33886dc9ecfa29a6193bf511ba90a46454b" + integrity sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA== static-extend@^0.1.1: version "0.1.2" @@ -9981,18 +10080,16 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= -stream-to-observable@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10" - integrity sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA= - dependencies: - any-observable "^0.2.0" - strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +string-argv@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" + integrity sha1-2sMECGkMIfPDYwo/86BYd73L1zY= + string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -10043,7 +10140,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-object@^3.2.0: +stringify-object@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== @@ -10097,11 +10194,6 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -10151,21 +10243,21 @@ svgo@~1.0.5: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= - -symbol-observable@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" - integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A= +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#5d49108e2ab824a34069b68974486c290020b393" integrity sha512-W31+GLiBmU/ZR02Ii0mVZICuNEN9daZ63xZMPDsYgPgNjMtg+atqLEGI7PPI936jYSQZxoLb/63xos8Adrx4Eg== +synchronous-promise@^2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.7.tgz#3574b3d2fae86b145356a4b89103e1577f646fe3" + integrity sha512-16GbgwTmFMYFyQMLvtQjvNWh30dsFe1cAW5Fg1wm5+dg84L9Pe36mftsIRU95/W2YsISxsz/xq4VB23sqpgb/A== + table@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" @@ -10395,6 +10487,11 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= + tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -10908,6 +11005,14 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -11039,3 +11144,15 @@ yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + +yup@^0.26.10: + version "0.26.10" + resolved "https://registry.yarnpkg.com/yup/-/yup-0.26.10.tgz#3545839663289038faf25facfc07e11fd67c0cb1" + integrity sha512-keuNEbNSnsOTOuGCt3UJW69jDE3O4P+UHAakO7vSeFMnjaitcmlbij/a3oNb9g1Y1KvSKH/7O1R2PQ4m4TRylw== + dependencies: + "@babel/runtime" "7.0.0" + fn-name "~2.0.1" + lodash "^4.17.10" + property-expr "^1.5.0" + synchronous-promise "^2.0.5" + toposort "^2.0.2" From 514e8aae91c5fa7f0f7f09e73e3c2a6c824fa8b9 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 2 Apr 2019 16:39:20 -0700 Subject: [PATCH 41/46] Major upgrade, ember-cli-sass; swiches to sass-dart --- ui/package.json | 5 +++-- ui/yarn.lock | 42 ++++++++++++++++++++++++++++++------------ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/ui/package.json b/ui/package.json index 708132a8a33..443098e19b5 100644 --- a/ui/package.json +++ b/ui/package.json @@ -54,7 +54,7 @@ "ember-cli-moment-shim": "^3.5.0", "ember-cli-page-object": "^1.15.1", "ember-cli-qunit": "^4.3.2", - "ember-cli-sass": "^7.1.2", + "ember-cli-sass": "^10.0.0", "ember-cli-sri": "^2.1.1", "ember-cli-string-helpers": "^1.5.0", "ember-cli-template-lint": "^1.0.0-beta.1", @@ -89,7 +89,8 @@ "loader.js": "^4.7.0", "lodash.intersection": "^4.4.0", "prettier": "^1.4.4", - "query-string": "^5.0.0" + "query-string": "^5.0.0", + "sass": "^1.17.3" }, "engines": { "node": "6.* || 8.* || >= 10.*" diff --git a/ui/yarn.lock b/ui/yarn.lock index be9aa391c32..6b744da6dfd 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2572,7 +2572,7 @@ broccoli-rollup@^2.1.1: symlink-or-copy "^1.1.8" walk-sync "^0.3.1" -broccoli-sass-source-maps@^2.0.0, broccoli-sass-source-maps@^2.1.0: +broccoli-sass-source-maps@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-2.2.0.tgz#1f1a0794136152b096188638b59b42b17a4bdc68" integrity sha512-X1yTOGQcjQxYebP+hjeAI286x63VZ0WfgFxqHsr4eimgNNL2TPxkJKKgOaDKJ3nE8pszbJWgHrWpEVXuwgsUzw== @@ -2584,6 +2584,17 @@ broccoli-sass-source-maps@^2.0.0, broccoli-sass-source-maps@^2.1.0: object-assign "^2.0.0" rsvp "^3.0.6" +broccoli-sass-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-4.0.0.tgz#1ee4c10a810b10955b0502e28f85ab672f5961a2" + integrity sha512-Bjgg0Q626pPwiPU+Sk7jJNjblPEwhceuTzMPw2F5XY+FzdTBMYQKuJYlJ4x2DdsubE95e3rVQeSZ68jA13Nhzg== + dependencies: + broccoli-caching-writer "^3.0.3" + include-path-searcher "^0.1.0" + mkdirp "^0.3.5" + object-assign "^2.0.0" + rsvp "^3.0.6" + broccoli-slow-trees@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.0.1.tgz#9bf2a9e2f8eb3ed3a3f2abdde988da437ccdc9b4" @@ -3016,7 +3027,7 @@ charm@^1.0.0: dependencies: inherits "^2.0.1" -chokidar@^2.0.2: +chokidar@^2.0.0, chokidar@^2.0.2: version "2.1.5" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== @@ -4299,6 +4310,16 @@ ember-cli-qunit@^4.3.2: ember-cli-babel "^6.11.0" ember-qunit "^3.5.0" +ember-cli-sass@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-10.0.0.tgz#700094ebaf348896111756c2644f1e444b05323c" + integrity sha512-gAMh3sHRExk/gOpbJ+OKKLPd8vCT8Bs8UU0cdNwBUOVwQ0UJ3iKyQY6GS1bMMXYtiyK2ieUPsrDGf14LUcC7bw== + dependencies: + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^3.0.1" + broccoli-sass-source-maps "^4.0.0" + ember-cli-version-checker "^2.1.0" + ember-cli-sass@^6.1.3: version "6.2.0" resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-6.2.0.tgz#e1f81289678e1e22d9cf9dbf7fa2de76a0de9a2f" @@ -4310,16 +4331,6 @@ ember-cli-sass@^6.1.3: ember-cli-version-checker "^1.0.2" merge "^1.2.0" -ember-cli-sass@^7.1.2: - version "7.2.0" - resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-7.2.0.tgz#293d1a94c43c1fdbb3835378e43d255e8ad5c961" - integrity sha512-X4BNBYuCyfRMGJ/Bjjk/gQw4eT6ixIXNltDQ8kapymilCqKEBZ6Rlx6noEfVzeh2nK7VP0e4rQ4DBj+TK6EDzA== - dependencies: - broccoli-funnel "^1.0.0" - broccoli-merge-trees "^1.1.0" - broccoli-sass-source-maps "^2.1.0" - ember-cli-version-checker "^2.1.0" - ember-cli-showdown@^4.1.0: version "4.4.4" resolved "https://registry.yarnpkg.com/ember-cli-showdown/-/ember-cli-showdown-4.4.4.tgz#daf666369b1f35843dc5dc55a94da058e63f59c4" @@ -9552,6 +9563,13 @@ sass-graph@^2.2.4: scss-tokenizer "^0.2.3" yargs "^7.0.0" +sass@^1.17.3: + version "1.17.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.17.3.tgz#19f9164cf8653b9fca670a64e53285272c96d192" + integrity sha512-S4vJawbrNUxJUBiHLXPYUKZCoO6cvq3/3ZFBV66a+PafTxcDEFJB+FHLDFl0P+rUfha/703ajEXMuGTYhJESkQ== + dependencies: + chokidar "^2.0.0" + sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" From 3b5f7f637d514ecb3308164a34b840bdb4081df1 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 2 Apr 2019 16:53:03 -0700 Subject: [PATCH 42/46] Upgrade ember-concurrency --- ui/package.json | 2 +- ui/yarn.lock | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/ui/package.json b/ui/package.json index 443098e19b5..020f0dbcb20 100644 --- a/ui/package.json +++ b/ui/package.json @@ -60,7 +60,7 @@ "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^2.1.0", "ember-composable-helpers": "^2.0.3", - "ember-concurrency": "^0.8.12", + "ember-concurrency": "^0.9.0", "ember-copy": "^1.0.0", "ember-data": "~3.4.0", "ember-data-model-fragments": "3.3.0", diff --git a/ui/yarn.lock b/ui/yarn.lock index 6b744da6dfd..d3a137b2b91 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -4547,15 +4547,6 @@ ember-composable-helpers@^2.0.3: broccoli-funnel "^1.0.1" ember-cli-babel "^7.1.0" -ember-concurrency@^0.8.12: - version "0.8.27" - resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.27.tgz#6dd1b9928cf5d13d5ae9c8cd3d5869f6ff81a9a9" - integrity sha512-2IujJ0Y79a+sHvEOPhUtZ7Ga8HDrwjbQqO7aZ88b0KCsXPro7birQFB508njQSQ0mxrsR9qzDv/KS5V67Cy5dA== - dependencies: - babel-core "^6.24.1" - ember-cli-babel "^6.8.2" - ember-maybe-import-regenerator "^0.1.5" - ember-concurrency@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.9.0.tgz#0016652ff780fb665842e7f47815ee0601122ea1" From 6cba965ff35ce8d955cec1eaba4e7a6cf6a3563c Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 2 Apr 2019 17:37:09 -0700 Subject: [PATCH 43/46] Don't remove viewBox from svgs as part of svgo --- ui/ember-cli-build.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui/ember-cli-build.js b/ui/ember-cli-build.js index 15e814594dd..6e2fb01c596 100644 --- a/ui/ember-cli-build.js +++ b/ui/ember-cli-build.js @@ -12,6 +12,9 @@ module.exports = function(defaults) { }, svg: { paths: ['public/images/icons'], + optimize: { + plugins: [{ removeViewBox: false }], + }, }, codemirror: { modes: ['javascript'], From 54e89a50044557e12794024d92159d7ebd8fcb49 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Mon, 8 Apr 2019 16:50:37 -0700 Subject: [PATCH 44/46] Upgrade to Node 10, latest LTS --- scripts/vagrant-linux-unpriv-ui.sh | 4 ++-- ui/.nvmrc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/vagrant-linux-unpriv-ui.sh b/scripts/vagrant-linux-unpriv-ui.sh index b6af330b936..be5994b7fb3 100755 --- a/scripts/vagrant-linux-unpriv-ui.sh +++ b/scripts/vagrant-linux-unpriv-ui.sh @@ -9,8 +9,8 @@ export NVM_DIR="/home/vagrant/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm # Install Node, Ember CLI, and Phantom for UI development -nvm install 8.11.2 -nvm alias default 8.11.2 +nvm install 10 +nvm alias default 10 npm install -g ember-cli # Install Yarn for front-end dependency management diff --git a/ui/.nvmrc b/ui/.nvmrc index 45a4fb75db8..f599e28b8ab 100644 --- a/ui/.nvmrc +++ b/ui/.nvmrc @@ -1 +1 @@ -8 +10 From bd2b2d705951f43c94773ac81925a940733eb142 Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Mon, 8 Apr 2019 16:54:45 -0700 Subject: [PATCH 45/46] Upgrade Yarn --- .travis.yml | 2 +- scripts/vagrant-linux-unpriv-ui.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 333a290db19..53716f01f8f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -71,7 +71,7 @@ before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]] && [[ -z "$SKIP_NOMAD_TESTS" ]]; then sudo -E bash ./scripts/travis-mac-priv.sh ; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ -z "$SKIP_NOMAD_TESTS" ]]; then sudo -E bash ./scripts/travis-linux.sh ; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$RUN_STATIC_CHECKS" ]]; then sudo -E bash ./scripts/vagrant-linux-priv-protoc.sh; fi - - if [[ "$RUN_UI_TESTS" ]]; then curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.0.1 ; fi + - if [[ "$RUN_UI_TESTS" ]]; then curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.15.2 ; fi - if [[ "$RUN_UI_TESTS" ]]; then export PATH="$HOME/.yarn/bin:$PATH" ; fi install: diff --git a/scripts/vagrant-linux-unpriv-ui.sh b/scripts/vagrant-linux-unpriv-ui.sh index be5994b7fb3..03a9f19f5ac 100755 --- a/scripts/vagrant-linux-unpriv-ui.sh +++ b/scripts/vagrant-linux-unpriv-ui.sh @@ -14,7 +14,7 @@ nvm alias default 10 npm install -g ember-cli # Install Yarn for front-end dependency management -curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.7.0 +curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.15.2 # Install Chrome for running tests (in headless mode) wget -qO- - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - From 27ee73ae9c1df3b5defd229bc4be3328fb0d74eb Mon Sep 17 00:00:00 2001 From: Michael Lange Date: Tue, 9 Apr 2019 14:35:59 -0700 Subject: [PATCH 46/46] Force Travis to use node 10 --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 53716f01f8f..3d06007d8ea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -73,11 +73,12 @@ before_install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$RUN_STATIC_CHECKS" ]]; then sudo -E bash ./scripts/vagrant-linux-priv-protoc.sh; fi - if [[ "$RUN_UI_TESTS" ]]; then curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.15.2 ; fi - if [[ "$RUN_UI_TESTS" ]]; then export PATH="$HOME/.yarn/bin:$PATH" ; fi + - echo "Travis Node Version" && node -v install: - if [[ -z "$SKIP_NOMAD_TESTS" ]] || [[ "$RUN_STATIC_CHECKS" ]]; then make deps; fi - if [[ "$RUN_STATIC_CHECKS" ]]; then make lint-deps ; fi - - if [[ "$RUN_UI_TESTS" ]]; then . $HOME/.nvm/nvm.sh && cd ui && nvm use && cd .. ; fi + - if [[ "$RUN_UI_TESTS" ]]; then . $HOME/.nvm/nvm.sh && cd ui && nvm install && nvm use && cd .. ; fi script: - sudo -E "PATH=$PATH" GOTESTSUM_JUNITFILE=/tmp/results.xml make travis