diff --git a/.eslintrc.js b/.eslintrc.js index 194ffd12..ec0142c1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -25,6 +25,7 @@ module.exports = { 'ember-cli-build.js', 'index.js', 'testem.js', + 'blueprints/*/index.js', 'config/**/*.js', 'tests/dummy/config/**/*.js' ], diff --git a/.gitignore b/.gitignore index 3846f0af..f18e5fa7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,24 @@ # See https://help.github.com/ignore-files/ for more about ignoring files. # compiled output -/dist -/tmp +/dist/ +/tmp/ # dependencies -/node_modules -/bower_components +/bower_components/ +/node_modules/ # misc +/.env* /.sass-cache /connect.lock -/coverage/* +/coverage/ /libpeerconnection.log -npm-debug.log* -yarn-error.log -testem.log -package-lock.json +/npm-debug.log* +/testem.log +/yarn-error.log # ember-try -.node_modules.ember-try/ -bower.json.ember-try -package.json.ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/package.json.ember-try diff --git a/.npmignore b/.npmignore index 135c7b1f..fba91545 100644 --- a/.npmignore +++ b/.npmignore @@ -1,21 +1,31 @@ -/bower_components +# compiled output +/dist/ +/tmp/ + +# dependencies +/bower_components/ + +# misc +/.bowerrc +/.editorconfig +/.ember-cli +/.env* +/.eslintignore +/.eslintrc.js +/.gitignore +/.template-lintrc.js +/.travis.yml +/.watchmanconfig +/bower.json /config/ember-try.js -/dist -/tests -/tmp -**/.gitkeep -.bowerrc -.editorconfig -.ember-cli -.eslintrc.js -.gitignore -.watchmanconfig -.travis.yml -bower.json -ember-cli-build.js -testem.js +/CONTRIBUTING.md +/ember-cli-build.js +/testem.js +/tests/ +/yarn.lock +.gitkeep # ember-try -.node_modules.ember-try/ -bower.json.ember-try -package.json.ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/package.json.ember-try diff --git a/.template-lintrc.js b/.template-lintrc.js new file mode 100644 index 00000000..b45e96ff --- /dev/null +++ b/.template-lintrc.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + extends: 'recommended' +}; diff --git a/.travis.yml b/.travis.yml index c09a839c..c8cec197 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,24 +35,26 @@ jobs: - stage: "Tests" name: "Tests" + install: + - yarn install --non-interactive script: - - npm run lint:js - - npm test + - yarn lint:hbs + - yarn lint:js + - yarn test + + - name: "Floating Dependencies" + script: + - yarn test # we recommend new addons test the current and previous LTS # as well as latest stable release (bonus points to beta/canary) - - EMBER_TRY_SCENARIO=ember-lts-2.12 - - EMBER_TRY_SCENARIO=ember-lts-2.16 - - EMBER_TRY_SCENARIO=ember-lts-2.18 - - EMBER_TRY_SCENARIO=ember-release - - EMBER_TRY_SCENARIO=ember-beta - - EMBER_TRY_SCENARIO=ember-canary - - EMBER_TRY_SCENARIO=ember-default - -matrix: - fast_finish: true - allow_failures: + - stage: "Additional Tests" + env: EMBER_TRY_SCENARIO=ember-lts-2.18 + - env: EMBER_TRY_SCENARIO=ember-lts-3.4 + - env: EMBER_TRY_SCENARIO=ember-release + - env: EMBER_TRY_SCENARIO=ember-beta - env: EMBER_TRY_SCENARIO=ember-canary + - env: EMBER_TRY_SCENARIO=ember-default-with-jquery before_install: - curl -o- -L https://yarnpkg.com/install.sh | bash @@ -62,7 +64,4 @@ install: - yarn install --no-lockfile --non-interactive script: - - yarn lint:js - # Usually, it's ok to finish the test scenario without reverting - # to the addon's original dependency state, skipping "cleanup". - - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO --skip-cleanup + - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7ed89197..6b87e57c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,14 +3,14 @@ ## Installation * `git clone ` -* `cd my-addon` -* `npm install` +* `cd ember-router-scroll` +* `yarn install` ## Linting -* `npm run lint:hbs` -* `npm run lint:js` -* `npm run lint:js -- --fix` +* `yarn lint:hbs` +* `yarn lint:js` +* `yarn lint:js --fix` ## Running tests diff --git a/LICENSE.md b/LICENSE.md index 02000b56..f8d1edb3 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016 +Copyright (c) 2019 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/README.md b/README.md index 6a6cc2cc..dfab227f 100644 --- a/README.md +++ b/README.md @@ -1,235 +1,250 @@ -# ember-router-scroll - -[![Build Status](https://travis-ci.org/dollarshaveclub/ember-router-scroll.svg?branch=master)](https://travis-ci.org/dollarshaveclub/ember-router-scroll) -[![Greenkeeper badge](https://badges.greenkeeper.io/dollarshaveclub/ember-router-scroll.svg)](https://greenkeeper.io/) - -> Scroll to page top on transition, like a non-SPA website. An alternative scroll behavior for Ember applications. - -## Why Use it? - -Ember expects an application to be rendered with nested views. The default behavior is for the scroll position to be -preserved on every transition. However, not all Ember applications use nested views. For these applications, a user -would expect to see the top of the page on most transitions. - -In addition to scrolling to the top of the page on most transitions, a user would expect the scroll position to be -preserved when using the back or forward browser buttons. - -**ember-router-scroll** makes your single page application feel more like a regular website. - - -## Installation & Usage - -**1.** Install addon - -```bash -ember install ember-router-scroll -``` - -**2.** Import ember-router-scroll - -You need to import the mixin in your `app/router.js` file, so it will be injected in all your routes. -Also, you have to add RouterScroll as an extension to your Router object: - -```javascript -// app/router.js - -import RouterScroll from 'ember-router-scroll'; - -const Router = EmberRouter.extend(PageTrackerMixin, RouterScroll, { - ... -}); -``` - -**3.** Update your app's `locationType` - -Edit `config/environment.js` and change `locationType`. -Also add `historySupportMiddleware: true,` to get live-reload working in nested routes. -(See [Issue #21](https://github.com/dollarshaveclub/ember-router-scroll/issues/21)) - -```javascript -locationType: 'router-scroll', -historySupportMiddleware: true, -``` - -This location type inherits from Ember's `HistoryLocation`. - -**4.** If using old style QUnit tests. If tests based on [RFC](https://github.com/emberjs/rfcs/pull/232), you can -ignore this. -In your router and controller tests, add `'service:router-scroll'` and `'service:scheduler'` as dependencies in the -`needs: []` block: - -```javascript -//{your-app}}/tests/unit/routes/{{your-route}}.js -needs:[ 'service:router-scroll', 'service:scheduler' ], -``` - - -### Options - -If you need to scroll to the top of an area that generates a vertical scroll bar, you can specify the id of an element -of the scrollable area. Default is `window` for using the scroll position of the whole viewport. You can pass an options -object in your application's `config/environment.js` file. - -```javascript -ENV['routerScroll'] = { - scrollElement: '#mainScrollElement' -}; -``` - -If you want to scroll to a target element on the page, you can specify the id or class of the element on the page. This -is particularly useful if instead of scrolling to the top of the window, you want to scroll to the top of the main -content area (that does not generate a vertical scrollbar). - -```javascript -ENV['routerScroll'] = { - targetElement: '#main-target-element' // or .main-target-element -}; -``` - -Moreover, if your route breaks up render into multiple phases, you may need to delay scrollTop functionality until after -the First Meaningful Paint using `delayScrollTop: true` in your config. `delayScrollTop` defaults to `false`. - -```javascript -ENV['routerScroll'] = { - delayScrollTop: true -}; -``` - - -## A working example - -See [demo](https://dollarshaveclub.github.io/router-scroll-demo/) made by [Jon Chua](https://github.com/Chuabacca/). - - -## A visual demo - -### Before - -![before-scroll](https://cloud.githubusercontent.com/assets/4430436/17122972/0a1fe454-5295-11e6-937f-f1f5beab9d6b.gif) - -Notice that the in the full purple page, the user is sent to the **middle** of the page. - - -### After - -![after-scroll](https://cloud.githubusercontent.com/assets/4430436/17122970/07c1a3a0-5295-11e6-977f-37eb955d95b1.gif) - -Notice that the in the full purple page, the user is sent to the **top** of the page. - - -## Issues with nested routes - -### Before: - -![before-preserve](https://cloud.githubusercontent.com/assets/4430436/17122971/0a1e34ce-5295-11e6-8d30-9f687dd69dbb.gif) - -Notice the unwanted scroll to top in this case. - - -### After: - -![after-preserve](https://cloud.githubusercontent.com/assets/4430436/17122969/07acbb48-5295-11e6-9900-f9ba519affa4.gif) - -Adding a query parameter or controller property fixes this issue. - - -### preserveScrollPosition with queryParams - -In certain cases, you might want to have certain routes preserve scroll position when coming from a specific location. -For example, inside your application, there is a way to get to a route where the user expects scroll position to be -preserved (such as a tab section). - -**1.** Add query param in controller - -Add `preserveScrollPosition` as a queryParam in the controller for the route that needs to preserve the scroll position. - -Example: - -```javascript -import Controller from '@ember/controller'; - -export default Controller.extend({ - queryParams: [ - 'preserveScrollPosition', - ], -}); -``` - -**2.** Pass in query param - -Next, in the place where a transition is triggered, pass in `preserveScrollPosition=true`. For example - -```handlebars -{{link-to "About Tab" 'tab.about' (query-params preserveScrollPosition=true) }} -``` - - -### preserveScrollPosition with a controller property - -In other cases, you may have certain routes that always preserve scroll position, or routes where the controller can -decide when to preserve scroll position. For instance, you may have some nested routes that have true nested UI where -preserving scroll position is expected. Or you want a particular route to start off with the default scroll-to-top -behavior but then preserve scroll position when query params change in response to user interaction. Using a controller -property also allows the use of preserveScrollPosition without adding this to the query params. - - -**1.** Add query param to controller - -Add `preserveScrollPosition` as a controller property for the route that needs to preserve the scroll position. -In this example we have `preserveScrollPosition` initially set to false so that we get our normal scroll-to-top behavior -when the route loads. Later on, when an action triggers a change to the `filter` query param, we also set -`preserveScrollPosition` to true so that this user interaction does not trigger the scroll-to-top behavior. - -Example: - -```javascript -import Controller from '@ember/controller'; - -export default Controller.extend({ - queryParams: ['filter'], - - preserveScrollPosition: false, - - actions: { - changeFilter(filter) { - this.set('preserveScrollPosition', true); - this.set('filter', filter); - } - } -}); -``` - -**2.** Reset preserveScrollPosition if necessary - -If your controller is changing the preserveScrollPosition property, you'll probably need to reset -`preserveScrollPosition` back to the default behavior whenever the controller is reset. This is not necessary on routes -where `preserveScrollPosition` is always set to true. - -```javascript -import Router from '@ember/routing/route'; - -export default Route.extend({ - resetController(controller) { - controller.set('preserveScrollPosition', false); - } -}); -``` - - -## Running Tests - -* `npm test` (Runs `ember try:testall` to test your addon against multiple Ember versions) -* `ember test` -* `ember test --server` - -## Automatic Updates - -This repository uses [Greenkeeper](https://greenkeeper.io/) to manage dependencies. -Before doing manual updates to dependencies, please check if a Greenkeeper pull request for the update already exists. - -Greenkeeper updates are updated and merged following the steps listed below. - -* `git checkout ` -* `nvm i` -* `yarn` -* `yarn update` +ember-router-scroll +============================================================================== + +[![Build Status](https://travis-ci.org/dollarshaveclub/ember-router-scroll.svg?branch=master)](https://travis-ci.org/dollarshaveclub/ember-router-scroll) +[![Greenkeeper badge](https://badges.greenkeeper.io/dollarshaveclub/ember-router-scroll.svg)](https://greenkeeper.io/) + +> Scroll to page top on transition, like a non-SPA website. An alternative scroll behavior for Ember applications. + +## Why Use it? + +Ember expects an application to be rendered with nested views. The default behavior is for the scroll position to be +preserved on every transition. However, not all Ember applications use nested views. For these applications, a user +would expect to see the top of the page on most transitions. + +In addition to scrolling to the top of the page on most transitions, a user would expect the scroll position to be +preserved when using the back or forward browser buttons. + +**ember-router-scroll** makes your single page application feel more like a regular website. + +Compatibility +------------------------------------------------------------------------------ + +* Ember.js v2.18 or above +* Ember CLI v2.13 or above + + +Installation +------------------------------------------------------------------------------ + +``` +ember install ember-router-scroll +``` + + +Usage +------------------------------------------------------------------------------ + +**1.** Import ember-router-scroll + +You need to import the mixin in your `app/router.js` file, so it will be injected in all your routes. +Also, you have to add RouterScroll as an extension to your Router object: + +```javascript +// app/router.js + +import RouterScroll from 'ember-router-scroll'; + +const Router = EmberRouter.extend(PageTrackerMixin, RouterScroll, { + ... +}); +``` + +**2.** Update your app's `locationType` + +Edit `config/environment.js` and change `locationType`. +Also add `historySupportMiddleware: true,` to get live-reload working in nested routes. +(See [Issue #21](https://github.com/dollarshaveclub/ember-router-scroll/issues/21)) + +```javascript +locationType: 'router-scroll', +historySupportMiddleware: true, +``` + +This location type inherits from Ember's `HistoryLocation`. + +**3.** If using old style QUnit tests. If tests based on [RFC](https://github.com/emberjs/rfcs/pull/232), you can +ignore this. +In your router and controller tests, add `'service:router-scroll'` and `'service:scheduler'` as dependencies in the +`needs: []` block: + +```javascript +//{your-app}}/tests/unit/routes/{{your-route}}.js +needs:[ 'service:router-scroll', 'service:scheduler' ], +``` + + +### Options + +If you need to scroll to the top of an area that generates a vertical scroll bar, you can specify the id of an element +of the scrollable area. Default is `window` for using the scroll position of the whole viewport. You can pass an options +object in your application's `config/environment.js` file. + +```javascript +ENV['routerScroll'] = { + scrollElement: '#mainScrollElement' +}; +``` + +If you want to scroll to a target element on the page, you can specify the id or class of the element on the page. This +is particularly useful if instead of scrolling to the top of the window, you want to scroll to the top of the main +content area (that does not generate a vertical scrollbar). + +```javascript +ENV['routerScroll'] = { + targetElement: '#main-target-element' // or .main-target-element +}; +``` + +Moreover, if your route breaks up render into multiple phases, you may need to delay scrollTop functionality until after +the First Meaningful Paint using `delayScrollTop: true` in your config. `delayScrollTop` defaults to `false`. + +```javascript +ENV['routerScroll'] = { + delayScrollTop: true +}; +``` + + +## A working example + +See [demo](https://dollarshaveclub.github.io/router-scroll-demo/) made by [Jon Chua](https://github.com/Chuabacca/). + + +## A visual demo + +### Before + +![before-scroll](https://cloud.githubusercontent.com/assets/4430436/17122972/0a1fe454-5295-11e6-937f-f1f5beab9d6b.gif) + +Notice that the in the full purple page, the user is sent to the **middle** of the page. + + +### After + +![after-scroll](https://cloud.githubusercontent.com/assets/4430436/17122970/07c1a3a0-5295-11e6-977f-37eb955d95b1.gif) + +Notice that the in the full purple page, the user is sent to the **top** of the page. + + +## Issues with nested routes + +### Before: + +![before-preserve](https://cloud.githubusercontent.com/assets/4430436/17122971/0a1e34ce-5295-11e6-8d30-9f687dd69dbb.gif) + +Notice the unwanted scroll to top in this case. + + +### After: + +![after-preserve](https://cloud.githubusercontent.com/assets/4430436/17122969/07acbb48-5295-11e6-9900-f9ba519affa4.gif) + +Adding a query parameter or controller property fixes this issue. + + +### preserveScrollPosition with queryParams + +In certain cases, you might want to have certain routes preserve scroll position when coming from a specific location. +For example, inside your application, there is a way to get to a route where the user expects scroll position to be +preserved (such as a tab section). + +**1.** Add query param in controller + +Add `preserveScrollPosition` as a queryParam in the controller for the route that needs to preserve the scroll position. + +Example: + +```javascript +import Controller from '@ember/controller'; + +export default Controller.extend({ + queryParams: [ + 'preserveScrollPosition', + ], +}); +``` + +**2.** Pass in query param + +Next, in the place where a transition is triggered, pass in `preserveScrollPosition=true`. For example + +```handlebars +{{link-to "About Tab" 'tab.about' (query-params preserveScrollPosition=true) }} +``` + + +### preserveScrollPosition with a controller property + +In other cases, you may have certain routes that always preserve scroll position, or routes where the controller can +decide when to preserve scroll position. For instance, you may have some nested routes that have true nested UI where +preserving scroll position is expected. Or you want a particular route to start off with the default scroll-to-top +behavior but then preserve scroll position when query params change in response to user interaction. Using a controller +property also allows the use of preserveScrollPosition without adding this to the query params. + + +**1.** Add query param to controller + +Add `preserveScrollPosition` as a controller property for the route that needs to preserve the scroll position. +In this example we have `preserveScrollPosition` initially set to false so that we get our normal scroll-to-top behavior +when the route loads. Later on, when an action triggers a change to the `filter` query param, we also set +`preserveScrollPosition` to true so that this user interaction does not trigger the scroll-to-top behavior. + +Example: + +```javascript +import Controller from '@ember/controller'; + +export default Controller.extend({ + queryParams: ['filter'], + + preserveScrollPosition: false, + + actions: { + changeFilter(filter) { + this.set('preserveScrollPosition', true); + this.set('filter', filter); + } + } +}); +``` + +**2.** Reset preserveScrollPosition if necessary + +If your controller is changing the preserveScrollPosition property, you'll probably need to reset +`preserveScrollPosition` back to the default behavior whenever the controller is reset. This is not necessary on routes +where `preserveScrollPosition` is always set to true. + +```javascript +import Router from '@ember/routing/route'; + +export default Route.extend({ + resetController(controller) { + controller.set('preserveScrollPosition', false); + } +}); +``` + + +## Running Tests + +* `npm test` (Runs `ember try:testall` to test your addon against multiple Ember versions) +* `ember test` +* `ember test --server` + +## Automatic Updates + +This repository uses [Greenkeeper](https://greenkeeper.io/) to manage dependencies. +Before doing manual updates to dependencies, please check if a Greenkeeper pull request for the update already exists. + +Greenkeeper updates are updated and merged following the steps listed below. + +* `git checkout ` +* `nvm i` +* `yarn` +* `yarn update` + +License +------------------------------------------------------------------------------ + +This project is licensed under the [MIT License](LICENSE.md). diff --git a/addon/index.js b/addon/index.js index ba65845d..5479cd2a 100644 --- a/addon/index.js +++ b/addon/index.js @@ -4,8 +4,9 @@ import { inject } from '@ember/service'; import { getOwner } from '@ember/application'; import { scheduleOnce } from '@ember/runloop'; import { setupRouter, reset, whenRouteIdle } from 'ember-app-scheduler'; +import { gte } from 'ember-compatibility-helpers'; -export default Mixin.create({ +let RouterScrollMixin = Mixin.create({ service: inject('router-scroll'), isFastBoot: computed(function() { @@ -17,6 +18,16 @@ export default Mixin.create({ this._super(...arguments); setupRouter(this); + + if (gte('3.6.0-beta.1')) { + this.on('routeWillChange', () => { + this._routeWillChange(); + }); + + this.on('routeDidChange', (transition) => { + this._routeDidChange(transition); + }); + } }, destroy() { @@ -25,35 +36,14 @@ export default Mixin.create({ this._super(...arguments); }, - willTransition(...args) { - this._super(...args); - - if (get(this, 'isFastBoot')) { return; } - - get(this, 'service').update(); - }, - - didTransition(transitions, ...args) { - this._super(transitions, ...args); - - if (get(this, 'isFastBoot')) { return; } - - const delayScrollTop = get(this, 'service.delayScrollTop'); - - if (!delayScrollTop) { - scheduleOnce('render', this, () => this.updateScrollPosition(transitions)); - } else { - // as described in ember-app-scheduler, this addon can be used to delay rendering until after First Meaningful Paint. - // If you loading your routes progressively, this may be a good option to delay scrollTop until the remaining DOM elements are painted. - whenRouteIdle().then(() => { - this.updateScrollPosition(transitions); - }); - } - }, - - updateScrollPosition(transitions) { + /** + * Updates the scroll position + * @param {transition|transition[]} transition If before Ember 3.6, this will be an array of transitions, otherwise + * it will be a single transition + */ + updateScrollPosition(transition) { const url = get(this, 'currentURL'); - const hashElement = url ? document.getElementById(url.split('#').pop()) : null + const hashElement = url ? document.getElementById(url.split('#').pop()) : null; if (get(this, 'service.isFirstLoad')) { get(this, 'service').unsetFirstLoad(); @@ -62,13 +52,18 @@ export default Mixin.create({ let scrollPosition; - if(url && url.indexOf('#') > -1 && hashElement) { + if (url && url.indexOf('#') > -1 && hashElement) { scrollPosition = { x: hashElement.offsetLeft, y: hashElement.offsetTop }; } else { scrollPosition = get(this, 'service.position'); } - const preserveScrollPosition = transitions.some((transition) => get(transition, 'handler.controller.preserveScrollPosition')); + let preserveScrollPosition; + if (gte('3.6.0-beta.1')) { + preserveScrollPosition = get(transition, 'handler.controller.preserveScrollPosition'); + } else { + preserveScrollPosition = transition.some((t) => get(t, 'handler.controller.preserveScrollPosition')); + } if (!preserveScrollPosition) { const scrollElement = get(this, 'service.scrollElement'); @@ -87,5 +82,49 @@ export default Mixin.create({ } } } + }, + + _routeWillChange() { + if (get(this, 'isFastBoot')) { + return; + } + + get(this, 'service').update(); + }, + + _routeDidChange(transition) { + if (get(this, 'isFastBoot')) { + return; + } + + const delayScrollTop = get(this, 'service.delayScrollTop'); + + if (!delayScrollTop) { + scheduleOnce('render', this, () => this.updateScrollPosition(transition)); + } else { + // as described in ember-app-scheduler, this addon can be used to delay rendering until after First Meaningful Paint. + // If you loading your routes progressively, this may be a good option to delay scrollTop until the remaining DOM elements are painted. + whenRouteIdle().then(() => { + this.updateScrollPosition(transition); + }); + } } }); + +if (!gte('3.6.0-beta.1')) { + RouterScrollMixin = Mixin.create(RouterScrollMixin, { + willTransition(...args) { + this._super(...args); + + this._routeWillChange(); + }, + + didTransition(transitions, ...args) { + this._super(transitions, ...args); + + this._routeDidChange(transitions); + } + }); +} + +export default RouterScrollMixin; diff --git a/config/ember-try.js b/config/ember-try.js index e48886dc..534df49f 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -12,32 +12,22 @@ module.exports = function() { useYarn: true, scenarios: [ { - name: 'ember-lts-2.12', - npm: { - devDependencies: { - 'ember-source': '~2.12.0' - } - } - }, - { - name: 'ember-lts-2.16', + name: 'ember-lts-2.18', env: { EMBER_OPTIONAL_FEATURES: JSON.stringify({ 'jquery-integration': true }) }, npm: { devDependencies: { - 'ember-source': '~2.16.0' + '@ember/jquery': '^0.5.1', + 'ember-source': '~2.18.0' } } }, { - name: 'ember-lts-2.18', - env: { - EMBER_OPTIONAL_FEATURES: JSON.stringify({ 'jquery-integration': true }) - }, + name: 'ember-lts-3.4', npm: { devDependencies: { - 'ember-source': '~2.18.0' + 'ember-source': '~3.4.0' } } }, @@ -65,6 +55,16 @@ module.exports = function() { } } }, + // The default `.travis.yml` runs this scenario via `yarn test`, + // not via `ember try`. It's still included here so that running + // `ember try:each` manually or from a customized CI config will run it + // along with all the other scenarios. + { + name: 'ember-default', + npm: { + devDependencies: {} + } + }, { name: 'ember-default-with-jquery', env: { diff --git a/index.js b/index.js index a9c9d61d..2e1d1d8d 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,5 @@ 'use strict'; module.exports = { - name: 'ember-router-scroll' + name: require('./package').name }; diff --git a/package.json b/package.json index 0c466b2b..ca9e1ea2 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "scripts": { "build": "ember build", "lint:hbs": "ember-template-lint .", - "lint:js": "eslint ./*.js addon app config tests", + "lint:js": "eslint .", "start": "ember serve", "test": "ember test", "deploy": "ember github-pages:commit --message \"Deploy gh-pages from commit $(git rev-parse HEAD)\"; git push; git checkout -", @@ -66,36 +66,40 @@ "dependencies": { "ember-app-scheduler": "^1.0.5", "ember-cli-babel": "^7.1.2", + "ember-compatibility-helpers": "^1.1.2", "ember-getowner-polyfill": "^2.2.0" }, "devDependencies": { + "@ember/optional-features": "^0.6.3", "broccoli-asset-rev": "^3.0.0", - "ember-cli": "~3.6.0", + "ember-cli": "~3.7.1", "ember-cli-dependency-checker": "^3.0.0", "ember-cli-eslint": "^5.0.0", "ember-cli-github-pages": "^0.2.0", "ember-cli-htmlbars": "^3.0.0", "ember-cli-htmlbars-inline-precompile": "^2.1.0", "ember-cli-inject-live-reload": "^2.0.1", - "ember-cli-qunit": "^4.4.0", "ember-cli-shims": "^1.2.0", "ember-cli-sri": "^2.1.0", + "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^2.1.0", "ember-cli-update": "^0.27.3", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.0", "ember-load-initializers": "^2.0.0", "ember-maybe-import-regenerator": "^0.1.6", + "ember-qunit": "^3.4.1", "ember-resolver": "^5.0.1", - "ember-source": "~3.6.1", + "ember-source": "~3.7.0", "ember-source-channel-url": "^1.1.0", - "ember-try": "^1.0.0-beta.2", + "ember-try": "^1.0.0", "eslint-plugin-ember": "^6.1.0", "eslint-plugin-node": "^8.0.0", - "loader.js": "^4.7.0" + "loader.js": "^4.7.0", + "qunit-dom": "^0.8.0" }, "engines": { - "node": "^4.5 || 6.* || >= 7.*" + "node": "6.* || 8.* || >= 10.*" }, "ember-addon": { "configPath": "tests/dummy/config", diff --git a/testem.js b/testem.js index d1755a4e..726d1879 100644 --- a/testem.js +++ b/testem.js @@ -9,13 +9,14 @@ module.exports = { ], browser_args: { Chrome: { - mode: 'ci', - args: [ + ci: [ // --no-sandbox is needed when running Chrome inside a container - process.env.TRAVIS ? '--no-sandbox' : null, - - '--disable-gpu', + process.env.CI ? '--no-sandbox' : null, '--headless', + '--disable-gpu', + '--disable-dev-shm-usage', + '--disable-software-rasterizer', + '--mute-audio', '--remote-debugging-port=0', '--window-size=1440,900' ].filter(Boolean) diff --git a/tests/dummy/app/templates/application.hbs b/tests/dummy/app/templates/application.hbs index 49a00a7d..f4d932bc 100644 --- a/tests/dummy/app/templates/application.hbs +++ b/tests/dummy/app/templates/application.hbs @@ -2,7 +2,7 @@
Click on the submarine to launch!
- {{#link-to 'next-page'}}Submarine{{/link-to}} + {{#link-to "next-page"}}Submarine{{/link-to}}
— 500 fathoms
diff --git a/tests/dummy/app/templates/next-page.hbs b/tests/dummy/app/templates/next-page.hbs index fadde389..17a632ad 100644 --- a/tests/dummy/app/templates/next-page.hbs +++ b/tests/dummy/app/templates/next-page.hbs @@ -9,8 +9,8 @@ Using the back button will take you to your previous scroll position. - {{#link-to 'application'}}Submarine{{/link-to}} - + {{#link-to "application"}}Submarine{{/link-to}} + Death Star
— Orbit -500 km
diff --git a/tests/dummy/config/optional-features.json b/tests/dummy/config/optional-features.json new file mode 100644 index 00000000..b1902623 --- /dev/null +++ b/tests/dummy/config/optional-features.json @@ -0,0 +1,3 @@ +{ + "jquery-integration": false +} diff --git a/tests/unit/mixins/router-scroll-test.js b/tests/unit/mixins/router-scroll-test.js index dec0a206..48a54da9 100644 --- a/tests/unit/mixins/router-scroll-test.js +++ b/tests/unit/mixins/router-scroll-test.js @@ -3,6 +3,7 @@ import EmberObject from '@ember/object'; import Evented from '@ember/object/evented'; import RouterScroll from 'ember-router-scroll'; import { module, test } from 'qunit'; +import { gte } from 'ember-compatibility-helpers'; let scrollTo, subject; @@ -15,18 +16,18 @@ module('mixin:router-scroll', function(hooks) { window.scrollTo = scrollTo; }); - function getTransitionsMock (URL, isPreserveScroll) { + function getTransitionsMock(URL, isPreserveScroll) { subject.set('currentURL', URL || 'Hello/World'); - return [ - { - handler: { - controller: { - preserveScrollPosition: isPreserveScroll || false, - } - }, - }, - ]; + const transition = { + handler: { + controller: { + preserveScrollPosition: isPreserveScroll || false + } + } + }; + + return gte('3.6.0-beta.1') ? transition : [transition]; } test('when the application is FastBooted', (assert) => { @@ -39,11 +40,15 @@ module('mixin:router-scroll', function(hooks) { updateScrollPosition() { assert.notOk(true, 'it should not call updateScrollPosition.'); done(); - }, + } }); run(() => { - subject.didTransition(); + if(gte('3.6.0-beta.1')) { + subject.trigger('routeDidChange'); + } else { + subject.didTransition(); + } next(() => { assert.ok(true, 'it should not call updateScrollPosition.'); done(); @@ -59,16 +64,20 @@ module('mixin:router-scroll', function(hooks) { subject = RouterScrollObject.create({ isFastBoot: false, service: { - delayScrollTop: false, + delayScrollTop: false }, - updateScrollPosition () { + updateScrollPosition() { assert.ok(true, 'it should call updateScrollPosition.'); done(); - }, + } }); run(() => { - subject.didTransition(); + if(gte('3.6.0-beta.1')) { + subject.trigger('routeDidChange'); + } else { + subject.didTransition(); + } }); }); @@ -80,16 +89,20 @@ module('mixin:router-scroll', function(hooks) { subject = RouterScrollObject.create({ isFastBoot: false, service: { - targetElement: '#myElement', + targetElement: '#myElement' }, - updateScrollPosition () { + updateScrollPosition() { assert.ok(true, 'it should call updateScrollPosition.'); done(); - }, + } }); run(() => { - subject.didTransition(); + if(gte('3.6.0-beta.1')) { + subject.trigger('routeDidChange'); + } else { + subject.didTransition(); + } }); }); @@ -101,16 +114,20 @@ module('mixin:router-scroll', function(hooks) { subject = RouterScrollObject.create({ isFastBoot: false, service: { - delayScrollTop: true, + delayScrollTop: true }, - updateScrollPosition () { + updateScrollPosition() { assert.ok(true, 'it should call updateScrollPosition.'); done(); - }, + } }); run(() => { - subject.didTransition(); + if(gte('3.6.0-beta.1')) { + subject.trigger('routeDidChange'); + } else { + subject.didTransition(); + } }); }); @@ -125,12 +142,16 @@ module('mixin:router-scroll', function(hooks) { isFastBoot: false, service: { position: null, - scrollElement: 'window', - }, + scrollElement: 'window' + } }); run(() => { - subject.didTransition(getTransitionsMock('Hello/World', true)); + if(gte('3.6.0-beta.1')) { + subject.trigger('routeDidChange', getTransitionsMock('Hello/World', true)); + } else { + subject.didTransition(getTransitionsMock('Hello/World', true)); + } done(); }); }); @@ -150,12 +171,16 @@ module('mixin:router-scroll', function(hooks) { isFastBoot: false, service: { position: null, - scrollElement: 'window', - }, + scrollElement: 'window' + } }); run(() => { - subject.didTransition(getTransitionsMock('Hello/#World', false)); + if(gte('3.6.0-beta.1')) { + subject.trigger('routeDidChange', getTransitionsMock('Hello/#World', false)); + } else { + subject.didTransition(getTransitionsMock('Hello/#World', false)); + } done(); }); }); @@ -175,12 +200,16 @@ module('mixin:router-scroll', function(hooks) { isFastBoot: false, service: { position: null, - scrollElement: 'window', - }, + scrollElement: 'window' + } }); run(() => { - subject.didTransition(getTransitionsMock('Hello/#World', false)); + if(gte('3.6.0-beta.1')) { + subject.trigger('routeDidChange', getTransitionsMock('Hello/#World', false)); + } else { + subject.didTransition(getTransitionsMock('Hello/#World', false)); + } done(); }); }); @@ -197,12 +226,16 @@ module('mixin:router-scroll', function(hooks) { isFastBoot: false, service: { position: { x: 1, y: 2 }, - scrollElement: 'window', - }, + scrollElement: 'window' + } }); run(() => { - subject.didTransition(getTransitionsMock('Hello/#')); + if(gte('3.6.0-beta.1')) { + subject.trigger('routeDidChange', getTransitionsMock('Hello/#')); + } else { + subject.didTransition(getTransitionsMock('Hello/#')); + } done(); }); }); @@ -222,12 +255,16 @@ module('mixin:router-scroll', function(hooks) { isFastBoot: false, service: { position: { x: 1, y: 2 }, - scrollElement: 'window', - }, + scrollElement: 'window' + } }); run(() => { - subject.didTransition(getTransitionsMock('Hello/#Bar')); + if(gte('3.6.0-beta.1')) { + subject.trigger('routeDidChange', getTransitionsMock('Hello/#Bar')); + } else { + subject.didTransition(getTransitionsMock('Hello/#Bar')); + } done(); }); }); @@ -244,12 +281,16 @@ module('mixin:router-scroll', function(hooks) { isFastBoot: false, service: { position: { x: 1, y: 2 }, - scrollElement: 'window', - }, + scrollElement: 'window' + } }); run(() => { - subject.didTransition(getTransitionsMock('Hello/World')); + if(gte('3.6.0-beta.1')) { + subject.trigger('routeDidChange', getTransitionsMock('Hello/World')); + } else { + subject.didTransition(getTransitionsMock('Hello/World')); + } next(() => { done(); }); diff --git a/yarn.lock b/yarn.lock index 48a044d1..757b1632 100644 --- a/yarn.lock +++ b/yarn.lock @@ -525,6 +525,20 @@ lodash "^4.17.10" to-fast-properties "^2.0.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== + 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/test-helpers@^0.7.26": version "0.7.27" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.27.tgz#c622cabd0cbb95b34efc1e1b6274ab5a14edc138" @@ -534,16 +548,74 @@ ember-cli-babel "^6.12.0" ember-cli-htmlbars-inline-precompile "^1.0.0" +"@glimmer/compiler@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@glimmer/compiler/-/compiler-0.38.0.tgz#fde12464feef3f3c82ef6a0cab1813074f34a5a4" + integrity sha512-qxQzeuRrD0qR3cJorz8GzhP6A1jgio/THLHj6nhdZu4Rv+Nch6ooQkqIK+6AzvaBknoOT7h+QCSTGJWMHG/jzQ== + dependencies: + "@glimmer/interfaces" "^0.38.0" + "@glimmer/syntax" "^0.38.0" + "@glimmer/util" "^0.38.0" + "@glimmer/wire-format" "^0.38.0" + "@glimmer/di@^0.2.0": version "0.2.1" resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.1.tgz#5286b6b32040232b751138f6d006130c728d4b3d" +"@glimmer/interfaces@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.38.0.tgz#dea320d1c0b5bd210e4d1119da081993ce766171" + integrity sha512-5/STOfFFg7+4Plr2AhJfhMqOmtGv9k6YvQFEavM1+7UwlHyz+WCOQL+11t3ov4Ngn8X4apkq21gPblhsMdp/Nw== + dependencies: + "@glimmer/wire-format" "^0.38.0" + "@simple-dom/interface" "1.4.0" + "@glimmer/resolver@^0.4.1": version "0.4.3" resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.3.tgz#b1baae5c3291b4621002ccf8d7870466097e841d" dependencies: "@glimmer/di" "^0.2.0" +"@glimmer/syntax@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.38.0.tgz#5270839ecc3f6fff80c1cbfdad0d0c9413c84445" + integrity sha512-fAlQS0NioN/MW63AC/g6+AlIj4c3NjHDnUVeCQDy3WczV47YU42U/j4jNyDeTh5rAYp2vz/JRXeJ9RVc1NfUNw== + dependencies: + "@glimmer/interfaces" "^0.38.0" + "@glimmer/util" "^0.38.0" + handlebars "^4.0.6" + simple-html-tokenizer "^0.5.6" + +"@glimmer/util@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.38.0.tgz#c4b6817df8900ab29c4e26768b81315255d76b60" + integrity sha512-QIyh79A9soXVnamYJlGX6Be5NtBUQEIb8NrIk1JCrI7WTjJ/Z6tfXkhb4kRXjbxh2KMvEfOlBjjHZm1FLeOB/g== + +"@glimmer/wire-format@^0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.38.0.tgz#db77a9b4867c84fd0fec7490ed0e481df769c47a" + integrity sha512-sxNpQ2V0q2rKuJA+ScJTyc0din/7yF+V6CD9F/BBmeP8Cah+SdHpziMIhvT8gwJCMj/ySUTWSy7l/yGSLObiVA== + dependencies: + "@glimmer/util" "^0.38.0" + +"@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: + 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== + +"@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== + "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" @@ -725,13 +797,21 @@ amd-name-resolver@1.2.0: dependencies: ensure-posix-path "^1.0.1" -amd-name-resolver@^1.2.0, amd-name-resolver@^1.2.1: +amd-name-resolver@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.1.tgz#cea40abff394268307df647ce340c83eda6e9cfc" dependencies: ensure-posix-path "^1.0.1" object-hash "^1.3.1" +amd-name-resolver@^1.3.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" @@ -856,6 +936,18 @@ array-to-sentence@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -864,6 +956,11 @@ arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -1662,7 +1759,7 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.1.0: +broccoli-babel-transpiler@^7.1.0, broccoli-babel-transpiler@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.1.1.tgz#4202cd0653845083ee744fb4eaa4a2b50292f03f" dependencies: @@ -1720,7 +1817,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, broccoli-concat@^3.7.3: +broccoli-concat@^3.2.2, broccoli-concat@^3.7.1, broccoli-concat@^3.7.3: version "3.7.3" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.3.tgz#0dca01311567ffb13180e6b4eb111824628e4885" dependencies: @@ -1871,7 +1968,7 @@ broccoli-merge-trees@^2.0.0: broccoli-plugin "^1.3.0" merge-trees "^1.0.1" -broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1: +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" dependencies: @@ -2184,6 +2281,11 @@ call-limit@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz#6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea" +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" @@ -2266,6 +2368,11 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4 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= + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -2284,10 +2391,15 @@ chownr@~1.0.1: version "1.0.1" resolved "http://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" -ci-info@^1.1.3, ci-info@^1.5.0: +ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" +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== + circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" @@ -2814,6 +2926,14 @@ diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + 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" @@ -2886,7 +3006,7 @@ ember-assign-polyfill@~2.4.0: ember-cli-babel "^6.6.0" ember-cli-version-checker "^2.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.6.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: +ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.12.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" dependencies: @@ -2925,15 +3045,16 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.1.3: 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" +ember-cli-broccoli-sane-watcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-3.0.0.tgz#dc1812c047e1ceec4413d3c41b51a9ffc61b4cfe" + integrity sha512-sLn+wy6FJpGMHtSwAGUjQK3nJFvw2b6H8bR2EgMIXxkUI3DYFLi6Xnyxm02XlMTcfTxF10yHFhHJe0O+PcJM7A== dependencies: broccoli-slow-trees "^3.0.1" heimdalljs "^0.2.1" heimdalljs-logger "^0.1.7" rsvp "^3.0.18" - sane "^2.4.1" + sane "^4.0.0" ember-cli-dependency-checker@^3.0.0: version "3.0.0" @@ -3035,13 +3156,6 @@ ember-cli-preprocess-registry@^3.1.2: process-relative-require "^1.0.0" silent-error "^1.0.0" -ember-cli-qunit@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.4.0.tgz#0edd7d651001d0d7ea200b9236a4733a5b7420f1" - dependencies: - ember-cli-babel "^6.11.0" - ember-qunit "^3.5.0" - 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" @@ -3062,6 +3176,23 @@ ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" +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-loader@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.2.0.tgz#3fb8d5d1357e4460d3f0a092f5375e71b6f7c243" @@ -3102,17 +3233,19 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve resolve "^1.3.3" semver "^5.3.0" -ember-cli@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.6.0.tgz#9d0e3ca165eb56ba904900d5133041d3f8410868" +ember-cli@~3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.7.1.tgz#f307bcd68aaf083612717ab32133120272d89170" + integrity sha512-hlQK32xZEubHRdAo8s6JKvDTBB41wKghW3m0IewS+sZTV92Z6DJoZXlH5taETcnc5qMR1Ifml25Z2ezyNL/OBA== dependencies: - amd-name-resolver "^1.2.0" - babel-plugin-transform-es2015-modules-amd "^6.24.1" + "@babel/plugin-transform-modules-amd" "^7.2.0" + amd-name-resolver "^1.3.1" + babel-plugin-module-resolver "^3.1.1" bower-config "^1.3.0" bower-endpoint-parser "0.2.2" broccoli "^2.0.0" broccoli-amd-funnel "^2.0.1" - broccoli-babel-transpiler "^6.5.0" + broccoli-babel-transpiler "^7.1.1" broccoli-builder "^0.18.14" broccoli-concat "^3.7.3" broccoli-config-loader "^1.0.1" @@ -3129,7 +3262,7 @@ ember-cli@~3.6.0: calculate-cache-key-for-tree "^1.1.0" capture-exit "^1.2.0" chalk "^2.4.1" - ci-info "^1.1.3" + ci-info "^2.0.0" clean-base-url "^1.0.0" compression "^1.7.3" configstore "^4.0.0" @@ -3137,7 +3270,7 @@ ember-cli@~3.6.0: core-object "^3.1.5" dag-map "^2.0.2" diff "^3.5.0" - ember-cli-broccoli-sane-watcher "^2.1.1" + ember-cli-broccoli-sane-watcher "^3.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" @@ -3153,8 +3286,8 @@ ember-cli@~3.6.0: fixturify "^0.3.4" fixturify-project "^1.5.3" fs-extra "^7.0.0" - fs-tree-diff "^0.5.7" - get-caller-file "^1.0.0" + fs-tree-diff "^1.0.0" + get-caller-file "^2.0.0" git-repo-info "^2.0.0" glob "^7.1.2" heimdalljs "^0.2.5" @@ -3192,13 +3325,14 @@ ember-cli@~3.6.0: tree-sync "^1.2.2" uuid "^3.3.2" validate-npm-package-name "^3.0.0" - walk-sync "^0.3.2" + walk-sync "^1.0.0" watch-detector "^0.1.0" - yam "^0.0.24" + yam "^1.0.0" ember-compatibility-helpers@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.1.2.tgz#ae0ee4a7a2858b5ffdf79b428c23aee85c47d93d" + integrity sha512-yN163MzERpotO8M0b+q+kXs4i3Nx6aIriiZHWv+yXQzr2TAtYlVwg9V7/3+jcurOa3oDEYDpN7y9UZ6q3mnoTg== dependencies: babel-plugin-debug-macros "^0.2.0" ember-cli-version-checker "^2.1.1" @@ -3242,9 +3376,10 @@ ember-maybe-import-regenerator@^0.1.6: ember-cli-babel "^6.0.0-beta.4" regenerator-runtime "^0.9.5" -ember-qunit@^3.5.0: +ember-qunit@^3.4.1: 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.26" broccoli-funnel "^2.0.1" @@ -3282,12 +3417,13 @@ ember-source-channel-url@^1.0.1, ember-source-channel-url@^1.1.0: dependencies: got "^8.0.1" -ember-source@~3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.6.1.tgz#61a286e4a954e2e514a25df6d97bfe5a380c1cfd" +ember-source@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.7.0.tgz#99d8d306daf05a7a8063adcb944b04a9c9c94be7" + integrity sha512-4Ne361XAwLV0hYfFSbZP8NJUzD1IZLWHO1ON9Hb67K9B67H+3CF6SdbE+3+V+WiIom1n93/M35A72sNmh9CTjg== dependencies: broccoli-funnel "^2.0.1" - broccoli-merge-trees "^2.0.0" + broccoli-merge-trees "^3.0.2" chalk "^2.3.0" ember-cli-babel "^7.1.3" ember-cli-get-component-path-option "^1.0.0" @@ -3301,6 +3437,18 @@ ember-source@~3.6.1: jquery "^3.3.1" resolve "^1.6.0" +ember-template-lint@^1.0.0-beta.5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-1.0.0.tgz#fda969d69c4cfac443b58eb3852603cf58aef111" + integrity sha512-8hWUwKRXyLctmDs2v4Lz9Gwch6N7/+1YrdgrxjZmBBhkQ4tD+I0XtVbQFGFY+sIeMxSApam7DOkCT37n3imuYw== + dependencies: + "@glimmer/compiler" "^0.38.0" + chalk "^2.0.0" + globby "^8.0.1" + minimatch "^3.0.4" + resolve "^1.1.3" + strip-bom "^3.0.0" + ember-try-config@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-3.0.0.tgz#012d8c90cae9eb624e2b62040bf7e76a1aa58edc" @@ -3312,9 +3460,10 @@ ember-try-config@^3.0.0: rsvp "^4.8.1" semver "^5.5.0" -ember-try@^1.0.0-beta.2: +ember-try@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-1.1.0.tgz#194d5843a79b5a9fc0e4c07445ebc18c08a91e78" + integrity sha512-NL1rKPz2LuyVEqwoNV+SQD4c2w1/A0rrdeT6jqTYqlt/P7y3+SWcsxyReBnImebaIu7Drtz6p9yiAsrJq5Chyg== dependencies: chalk "^2.3.0" cli-table3 "^0.5.1" @@ -3418,6 +3567,18 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.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: + 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" + es-abstract@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" @@ -3428,9 +3589,10 @@ es-abstract@^1.9.0: is-callable "^1.1.3" is-regex "^1.0.4" -es-to-primitive@^1.1.1: +es-to-primitive@^1.1.1, 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: is-callable "^1.1.4" is-date-object "^1.0.1" @@ -3736,6 +3898,15 @@ external-editor@^1.1.0: spawn-sync "^1.0.15" tmp "^0.0.29" +external-editor@^2.0.4: + 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" + tmp "^0.0.33" + external-editor@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" @@ -3769,6 +3940,18 @@ 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" +fast-glob@^2.0.2: + 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" @@ -4072,6 +4255,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.0: + 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" @@ -4159,10 +4352,15 @@ genfun@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1" -get-caller-file@^1.0.0, get-caller-file@^1.0.1: +get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" +get-caller-file@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.1.tgz#25835260d3a2b9665fcdbb08cb039a7bbf7011c0" + integrity sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg== + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -4243,6 +4441,19 @@ git-write-pkt-line@0.1.0: bops "0.0.3" through "~2.2.7" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^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: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -4296,6 +4507,19 @@ globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" +globby@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + got@^6.7.1: version "6.7.1" resolved "http://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -4346,7 +4570,7 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" -handlebars@^4.0.11, handlebars@^4.0.4: +handlebars@^4.0.11, handlebars@^4.0.4, handlebars@^4.0.6: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" dependencies: @@ -4443,7 +4667,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1: +has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: @@ -4583,9 +4807,10 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: 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" @@ -4599,6 +4824,11 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +ignore@^3.3.5: + 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.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -4686,6 +4916,26 @@ inquirer@^2: strip-ansi "^3.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" + inquirer@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" @@ -4811,7 +5061,7 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^2.1.0: +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" @@ -4841,6 +5091,13 @@ is-glob@^3.1.0: dependencies: 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= + dependencies: + is-extglob "^2.1.1" + is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -5771,6 +6028,11 @@ merge-trees@^2.0.0: fs-updater "^1.0.4" heimdalljs "^0.2.5" +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.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" @@ -5779,7 +6041,7 @@ methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" -micromatch@^3.0.4, micromatch@^3.1.4: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" dependencies: @@ -6310,6 +6572,14 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +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: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -6549,6 +6819,11 @@ passwd-user@^1.2.1: dependencies: exec-file-sync "^2.0.0" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -6591,6 +6866,13 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +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 "^3.0.0" + performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -6798,6 +7080,14 @@ quick-temp@^0.1.2, quick-temp@^0.1.3, quick-temp@^0.1.5, quick-temp@^0.1.8: rimraf "^2.5.4" underscore.string "~3.3.4" +qunit-dom@^0.8.0: + version "0.8.4" + resolved "https://registry.yarnpkg.com/qunit-dom/-/qunit-dom-0.8.4.tgz#8b75a73040df1735280fc2fab4c6a1a7f518488b" + integrity sha512-Ab2wCPQP2G2XdbIwhlUHMp3ROHh4XnqmK0ogHlpxwVIv+cXbW3/L6F9ucCThAMkjqCaxwZQQR+LaUHaaMxDCmw== + dependencies: + broccoli-funnel "^2.0.0" + broccoli-merge-trees "^3.0.1" + qunit@~2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.6.2.tgz#551210c5cf857258a4fe39a7fe15d9e14dfef22c" @@ -7192,7 +7482,7 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@^1.1.6, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: +resolve@^1.1.3, resolve@^1.1.6, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" dependencies: @@ -7271,6 +7561,18 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= + rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" @@ -7299,7 +7601,7 @@ safe-regex@^1.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" -sane@^2.4.1, sane@^2.5.2: +sane@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" dependencies: @@ -7430,6 +7732,11 @@ silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: dependencies: debug "^2.2.0" +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== + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -8317,6 +8624,14 @@ util-extend@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" +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" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -8375,6 +8690,14 @@ walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2, walk-sync@^0.3.3: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" +walk-sync@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.0.1.tgz#6f38270392e297e5fd7b51eec9241be4242557c8" + integrity sha512-4Fyvn+KDGOF90ugcpErAMsNEF7r9ogk4SCNHZFkvmP+kr1rMSjpLbq9aYbEnYsL4dvVduLBm95TIz8WmqRAAgg== + dependencies: + ensure-posix-path "^1.0.0" + matcher-collection "^1.0.0" + walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -8535,9 +8858,10 @@ yallist@^3.0.0, yallist@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" -yam@^0.0.24: - version "0.0.24" - resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.24.tgz#11e9630444735f66a561d29221407de6d037cd95" +yam@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yam/-/yam-1.0.0.tgz#7f6c91dc0f5de75a031e6da6b3907c3d25ab0de5" + integrity sha512-Hv9xxHtsJ9228wNhk03xnlDReUuWVvHwM4rIbjdAXYvHLs17xjuyF50N6XXFMN6N0omBaqgOok/MCK3At9fTAg== dependencies: fs-extra "^4.0.2" lodash.merge "^4.6.0"