From 9a1c3e394b1629d8733e280cca845e854e3e1c76 Mon Sep 17 00:00:00 2001
From: Thomas Wang <wangxgwxg@gmail.com>
Date: Tue, 20 Nov 2018 13:13:57 -0800
Subject: [PATCH] Setup addon tests

use npm run instead of yarn in travis to work around
https://github.com/tomdale/ember-cli-addon-tests/issues/198
---
 .eslintignore                                 |  2 +
 .travis.yml                                   |  2 +-
 package.json                                  |  4 +
 test/fastboot-build-test.js                   | 63 ++++++++++++
 test/fastboot-test.js                         | 52 ++++++++++
 test/fixtures/dummy/app/app.js                | 14 +++
 test/fixtures/dummy/app/components/.gitkeep   |  0
 test/fixtures/dummy/app/controllers/.gitkeep  |  0
 test/fixtures/dummy/app/helpers/.gitkeep      |  0
 test/fixtures/dummy/app/index.html            | 25 +++++
 test/fixtures/dummy/app/models/.gitkeep       |  0
 test/fixtures/dummy/app/resolver.js           |  3 +
 test/fixtures/dummy/app/router.js             | 12 +++
 test/fixtures/dummy/app/routes/.gitkeep       |  0
 test/fixtures/dummy/app/routes/index.js       | 15 +++
 test/fixtures/dummy/app/styles/app.css        |  0
 .../dummy/app/templates/application.hbs       |  3 +
 .../dummy/app/templates/components/.gitkeep   |  0
 test/fixtures/dummy/app/templates/index.hbs   |  7 ++
 test/fixtures/dummy/config/environment.js     | 55 +++++++++++
 test/fixtures/dummy/config/targets.js         | 18 ++++
 test/fixtures/dummy/ember-cli-build.js        | 12 +++
 test/fixtures/dummy/public/omg.json           |  3 +
 test/fixtures/dummy/public/robots.txt         |  3 +
 yarn.lock                                     | 99 +++++++++++++++++--
 25 files changed, 385 insertions(+), 7 deletions(-)
 create mode 100644 test/fastboot-build-test.js
 create mode 100644 test/fastboot-test.js
 create mode 100644 test/fixtures/dummy/app/app.js
 create mode 100644 test/fixtures/dummy/app/components/.gitkeep
 create mode 100644 test/fixtures/dummy/app/controllers/.gitkeep
 create mode 100644 test/fixtures/dummy/app/helpers/.gitkeep
 create mode 100644 test/fixtures/dummy/app/index.html
 create mode 100644 test/fixtures/dummy/app/models/.gitkeep
 create mode 100644 test/fixtures/dummy/app/resolver.js
 create mode 100644 test/fixtures/dummy/app/router.js
 create mode 100644 test/fixtures/dummy/app/routes/.gitkeep
 create mode 100644 test/fixtures/dummy/app/routes/index.js
 create mode 100644 test/fixtures/dummy/app/styles/app.css
 create mode 100644 test/fixtures/dummy/app/templates/application.hbs
 create mode 100644 test/fixtures/dummy/app/templates/components/.gitkeep
 create mode 100644 test/fixtures/dummy/app/templates/index.hbs
 create mode 100644 test/fixtures/dummy/config/environment.js
 create mode 100644 test/fixtures/dummy/config/targets.js
 create mode 100644 test/fixtures/dummy/ember-cli-build.js
 create mode 100644 test/fixtures/dummy/public/omg.json
 create mode 100644 test/fixtures/dummy/public/robots.txt

diff --git a/.eslintignore b/.eslintignore
index fd20a38c..a2fa8a46 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -17,3 +17,5 @@
 /.node_modules.ember-try/
 /bower.json.ember-try
 /package.json.ember-try
+
+test/fixtures
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 8f9f23f7..6a945a5c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -32,7 +32,7 @@ jobs:
       script:
         - yarn lint:js
         - yarn test
-        - yarn test:node
+        - npm run test:node
 
     - name: "Floating Dependencies"
       script:
diff --git a/package.json b/package.json
index e0d2b762..79b11f6b 100644
--- a/package.json
+++ b/package.json
@@ -37,8 +37,10 @@
     "broccoli-asset-rev": "^3.0.0",
     "broccoli-test-helper": "^2.0.0",
     "chai": "^4.1.2",
+    "chai-fs": "^2.0.0",
     "co": "^4.6.0",
     "ember-cli": "~3.5.1",
+    "ember-cli-addon-tests": "^0.11.0",
     "ember-cli-dependency-checker": "^3.0.0",
     "ember-cli-htmlbars": "^3.0.1",
     "ember-cli-fastboot": "^2.0.0",
@@ -58,6 +60,8 @@
     "eslint": "^5.9.0",
     "eslint-plugin-ember": "^6.0.1",
     "eslint-plugin-node": "^8.0.0",
+    "fs-extra": "^7.0.1",
+    "glob": "^7.1.3",
     "lerna-changelog": "^0.8.2",
     "loader.js": "^4.2.3",
     "mocha": "^5.2.0"
diff --git a/test/fastboot-build-test.js b/test/fastboot-build-test.js
new file mode 100644
index 00000000..f2663323
--- /dev/null
+++ b/test/fastboot-build-test.js
@@ -0,0 +1,63 @@
+'use strict';
+const chai = require('chai');
+const expect = chai.expect;
+chai.use(require('chai-fs'));
+
+const glob = require('glob');
+
+const AddonTestApp = require('ember-cli-addon-tests').AddonTestApp;
+
+describe('it builds with ember-cli-fastboot', function() {
+  this.timeout(300000);
+
+  let app;
+
+  beforeEach(function() {
+    app = new AddonTestApp();
+
+    return app
+      .create('dummy', { skipNpm: true })
+      .then(app =>
+        app.editPackageJSON(pkg => {
+          pkg.devDependencies['ember-cli-fastboot'] = '*';
+        })
+      )
+      .then(() => app.run('npm', 'install'));
+  });
+
+  it('builds into dist/ember-fetch/fetch-fastboot.js', function() {
+    return app.runEmberCommand('build').then(function() {
+      expect(app.filePath('dist/index.html')).to.be.a.file();
+      expect(app.filePath('dist/ember-fetch/fastboot-fetch.js')).to.be.a.file();
+      expect(app.filePath('dist/assets/dummy-fastboot.js')).to.be.a.file();
+    });
+  });
+
+  it('produces a production build with --environment=production', function() {
+    return app
+      .runEmberCommand('build', '--environment=production')
+      .then(function() {
+        expect(app.filePath('dist/index.html')).to.be.a.file();
+        expect(find('dist/ember-fetch/fastboot-fetch-*.js')).to.be.a.file();
+        expect(find('dist/ember-fetch/fastboot-fetch-*.js')).to.match(
+          /fastboot-fetch-\w{32}/,
+          'file name should contain MD5 fingerprint'
+        );
+
+        expect(find('dist/assets/dummy-fastboot-*.js')).to.be.a.file();
+        expect(find('dist/assets/dummy-fastboot-*.js')).to.match(
+          /dummy-fastboot-\w{32}/,
+          'file name should contain MD5 fingerprint'
+        );
+      });
+  });
+
+  function find(globPath) {
+    globPath = app.filePath(globPath);
+    let files = glob.sync(globPath);
+
+    expect(files.length).to.equal(1, globPath);
+
+    return files[0];
+  }
+});
diff --git a/test/fastboot-test.js b/test/fastboot-test.js
new file mode 100644
index 00000000..96e5a521
--- /dev/null
+++ b/test/fastboot-test.js
@@ -0,0 +1,52 @@
+'use strict';
+const request = require('request');
+const get = require('rsvp').denodeify(request);
+const chai = require('chai');
+const expect = chai.expect;
+chai.use(require('chai-fs'));
+
+const AddonTestApp = require('ember-cli-addon-tests').AddonTestApp;
+
+describe('renders in fastboot build', function() {
+  this.timeout(300000);
+
+  let app;
+
+  beforeEach(function() {
+    app = new AddonTestApp();
+
+    return app
+      .create('dummy', { skipNpm: true })
+      .then(app =>
+        app.editPackageJSON(pkg => {
+          pkg.devDependencies['ember-cli-fastboot'] = '*';
+          // These 2 are in ember-fetch's package.json, symlinking to dummy won't help resolve
+          pkg.devDependencies['abortcontroller-polyfill'] = '*';
+          pkg.devDependencies['node-fetch'] = '*';
+        })
+      )
+      .then(function() {
+        return app.run('npm', 'install');
+      })
+      .then(function() {
+        return app.startServer({
+          command: 'serve'
+        });
+      });
+  });
+
+  afterEach(function() {
+    return app.stopServer();
+  });
+
+  it('fetches in fastboot mode', function() {
+    return get({
+      url: 'http://localhost:49741/',
+      headers: {
+        Accept: 'text/html'
+      }
+    }).then(function(response) {
+      expect(response.body).to.contain('Hello World! fetch');
+    });
+  });
+});
diff --git a/test/fixtures/dummy/app/app.js b/test/fixtures/dummy/app/app.js
new file mode 100644
index 00000000..b3b2bd67
--- /dev/null
+++ b/test/fixtures/dummy/app/app.js
@@ -0,0 +1,14 @@
+import Application from '@ember/application';
+import Resolver from './resolver';
+import loadInitializers from 'ember-load-initializers';
+import config from './config/environment';
+
+const App = Application.extend({
+  modulePrefix: config.modulePrefix,
+  podModulePrefix: config.podModulePrefix,
+  Resolver
+});
+
+loadInitializers(App, config.modulePrefix);
+
+export default App;
diff --git a/test/fixtures/dummy/app/components/.gitkeep b/test/fixtures/dummy/app/components/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/test/fixtures/dummy/app/controllers/.gitkeep b/test/fixtures/dummy/app/controllers/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/test/fixtures/dummy/app/helpers/.gitkeep b/test/fixtures/dummy/app/helpers/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/test/fixtures/dummy/app/index.html b/test/fixtures/dummy/app/index.html
new file mode 100644
index 00000000..61400b20
--- /dev/null
+++ b/test/fixtures/dummy/app/index.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>Dummy</title>
+    <meta name="description" content="">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+    {{content-for "head"}}
+
+    <link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css">
+    <link integrity="" rel="stylesheet" href="{{rootURL}}assets/dummy.css">
+
+    {{content-for "head-footer"}}
+  </head>
+  <body>
+    {{content-for "body"}}
+
+    <script src="{{rootURL}}assets/vendor.js"></script>
+    <script src="{{rootURL}}assets/dummy.js"></script>
+
+    {{content-for "body-footer"}}
+  </body>
+</html>
diff --git a/test/fixtures/dummy/app/models/.gitkeep b/test/fixtures/dummy/app/models/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/test/fixtures/dummy/app/resolver.js b/test/fixtures/dummy/app/resolver.js
new file mode 100644
index 00000000..2fb563d6
--- /dev/null
+++ b/test/fixtures/dummy/app/resolver.js
@@ -0,0 +1,3 @@
+import Resolver from 'ember-resolver';
+
+export default Resolver;
diff --git a/test/fixtures/dummy/app/router.js b/test/fixtures/dummy/app/router.js
new file mode 100644
index 00000000..d0bb0095
--- /dev/null
+++ b/test/fixtures/dummy/app/router.js
@@ -0,0 +1,12 @@
+import EmberRouter from '@ember/routing/router';
+import config from './config/environment';
+
+const Router = EmberRouter.extend({
+  location: config.locationType,
+  rootURL: config.rootURL
+});
+
+Router.map(function() {
+});
+
+export default Router;
diff --git a/test/fixtures/dummy/app/routes/.gitkeep b/test/fixtures/dummy/app/routes/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/test/fixtures/dummy/app/routes/index.js b/test/fixtures/dummy/app/routes/index.js
new file mode 100644
index 00000000..b0e19f27
--- /dev/null
+++ b/test/fixtures/dummy/app/routes/index.js
@@ -0,0 +1,15 @@
+import Route from '@ember/routing/route';
+import { hash } from 'rsvp';
+import fetch from 'fetch';
+import ajax from 'ember-fetch/ajax';
+
+export default Route.extend({
+  model: function() {
+    return hash({
+      fetch: fetch('/omg.json').then(function(request) {
+        return request.json();
+      }),
+      ajax: ajax('/omg.json')
+    });
+  }
+});
diff --git a/test/fixtures/dummy/app/styles/app.css b/test/fixtures/dummy/app/styles/app.css
new file mode 100644
index 00000000..e69de29b
diff --git a/test/fixtures/dummy/app/templates/application.hbs b/test/fixtures/dummy/app/templates/application.hbs
new file mode 100644
index 00000000..f8bc38e7
--- /dev/null
+++ b/test/fixtures/dummy/app/templates/application.hbs
@@ -0,0 +1,3 @@
+<h2 id="title">Welcome to Ember</h2>
+
+{{outlet}}
diff --git a/test/fixtures/dummy/app/templates/components/.gitkeep b/test/fixtures/dummy/app/templates/components/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/test/fixtures/dummy/app/templates/index.hbs b/test/fixtures/dummy/app/templates/index.hbs
new file mode 100644
index 00000000..821a4151
--- /dev/null
+++ b/test/fixtures/dummy/app/templates/index.hbs
@@ -0,0 +1,7 @@
+<div class="fetch">
+  Hello {{model.fetch.name}}! fetch
+</div>
+
+<div class="ajax">
+  Hello {{model.ajax.name}}! ajax
+</div>
\ No newline at end of file
diff --git a/test/fixtures/dummy/config/environment.js b/test/fixtures/dummy/config/environment.js
new file mode 100644
index 00000000..d54171f3
--- /dev/null
+++ b/test/fixtures/dummy/config/environment.js
@@ -0,0 +1,55 @@
+'use strict';
+
+module.exports = function(environment) {
+  let ENV = {
+    modulePrefix: 'dummy',
+    environment,
+    rootURL: '/',
+    locationType: 'auto',
+    EmberENV: {
+      FEATURES: {
+        // Here you can enable experimental features on an ember canary build
+        // e.g. 'with-controller': true
+      },
+      EXTEND_PROTOTYPES: {
+        // Prevent Ember Data from overriding Date.parse.
+        Date: false
+      }
+    },
+
+    APP: {
+      // Here you can pass flags/options to your application instance
+      // when it is created
+    },
+
+    fastboot: {
+      hostWhitelist: [/^localhost:\d+$/]
+    }
+  };
+
+  if (environment === 'development') {
+    // ENV.APP.LOG_RESOLVER = true;
+    // ENV.APP.LOG_ACTIVE_GENERATION = true;
+    // ENV.APP.LOG_TRANSITIONS = true;
+    // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
+    // ENV.APP.LOG_VIEW_LOOKUPS = true;
+  }
+
+  if (environment === 'test') {
+    // Testem prefers this...
+    ENV.locationType = 'none';
+
+    // keep test console output quieter
+    ENV.APP.LOG_ACTIVE_GENERATION = false;
+    ENV.APP.LOG_VIEW_LOOKUPS = false;
+
+    ENV.APP.rootElement = '#ember-testing';
+    ENV.APP.autoboot = false;
+  }
+
+  if (environment === 'production') {
+    // here you can enable a production-specific feature
+  }
+
+  return ENV;
+};
diff --git a/test/fixtures/dummy/config/targets.js b/test/fixtures/dummy/config/targets.js
new file mode 100644
index 00000000..8ffae363
--- /dev/null
+++ b/test/fixtures/dummy/config/targets.js
@@ -0,0 +1,18 @@
+'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
+};
diff --git a/test/fixtures/dummy/ember-cli-build.js b/test/fixtures/dummy/ember-cli-build.js
new file mode 100644
index 00000000..c97cc4ce
--- /dev/null
+++ b/test/fixtures/dummy/ember-cli-build.js
@@ -0,0 +1,12 @@
+'use strict';
+
+const EmberApp = require('ember-cli/lib/broccoli/ember-app');
+
+module.exports = function(defaults) {
+  let app = new EmberApp(defaults, {
+    // Add options here
+    'ember-fetch': {
+    }
+  });
+  return app.toTree();
+};
diff --git a/test/fixtures/dummy/public/omg.json b/test/fixtures/dummy/public/omg.json
new file mode 100644
index 00000000..7f9c526a
--- /dev/null
+++ b/test/fixtures/dummy/public/omg.json
@@ -0,0 +1,3 @@
+{
+  "name": "World"
+}
\ No newline at end of file
diff --git a/test/fixtures/dummy/public/robots.txt b/test/fixtures/dummy/public/robots.txt
new file mode 100644
index 00000000..f5916452
--- /dev/null
+++ b/test/fixtures/dummy/public/robots.txt
@@ -0,0 +1,3 @@
+# http://www.robotstxt.org
+User-agent: *
+Disallow:
diff --git a/yarn.lock b/yarn.lock
index 99832cd6..6f324c16 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -846,6 +846,14 @@ array-equal@^1.0.0:
   resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
   integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
 
+array-events@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/array-events/-/array-events-0.2.0.tgz#ff42ac53e66f485d6f883234c32252bc2286130e"
+  integrity sha1-/0KsU+ZvSF1viDI0wyJSvCKGEw4=
+  dependencies:
+    async-arrays "*"
+    extended-emitter "*"
+
 array-find-index@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
@@ -910,6 +918,13 @@ ast-types@0.9.6:
   resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
   integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=
 
+async-arrays@*:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-arrays/-/async-arrays-1.0.1.tgz#347af2b70f2a7a5767a2d5679cc42bbf1c220fd9"
+  integrity sha1-NHrytw8qeldnotVnnMQrvxwiD9k=
+  dependencies:
+    sift "*"
+
 async-disk-cache@^1.2.1:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.3.tgz#6040486660b370e4051cd9fa9fee275e1fae3728"
@@ -1621,6 +1636,13 @@ better-assert@~1.0.0:
   resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.2.tgz#c83c3d74233ba7674e4f313cb2a2b70f54e94b7c"
   integrity sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg==
 
+bit-mask@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/bit-mask/-/bit-mask-1.0.2.tgz#42f708362119611d6223cd53202c79428bf70b81"
+  integrity sha512-UGtq08LSiazxL4zVmBzrhdCWnT4RWx3JhhD/3crhfv8xxjnVHxf/WoVjEstjSUaZeZRP7kZrWNqup1VvUClCaQ==
+  dependencies:
+    array-events "^0.2.0"
+
 blank-object@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9"
@@ -2305,6 +2327,11 @@ calculate-cache-key-for-tree@^1.1.0:
   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"
@@ -2377,6 +2404,14 @@ caseless@~0.12.0:
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
   integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
 
+chai-fs@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/chai-fs/-/chai-fs-2.0.0.tgz#35ae039fbbb0710f5122aae17faba1e8f41107c6"
+  integrity sha1-Na4Dn7uwcQ9RIqrhf6uh6PQRB8Y=
+  dependencies:
+    bit-mask "^1.0.1"
+    readdir-enhanced "^1.4.0"
+
 chai@^4.1.2:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5"
@@ -2973,6 +3008,11 @@ delegates@^1.0.0:
   resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
   integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
 
+denodeify@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631"
+  integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE=
+
 depd@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
@@ -3075,6 +3115,21 @@ ember-assign-polyfill@~2.4.0:
     ember-cli-babel "^6.6.0"
     ember-cli-version-checker "^2.0.0"
 
+ember-cli-addon-tests@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/ember-cli-addon-tests/-/ember-cli-addon-tests-0.11.0.tgz#7f5a07ce91317b9b06c792274e6d6a2cc43f1ee9"
+  integrity sha1-f1oHzpExe5sGx5InTm1qLMQ/Huk=
+  dependencies:
+    chalk "^2.0.1"
+    debug "^3.0.0"
+    denodeify "^1.2.1"
+    findup-sync "^2.0.0"
+    fs-extra "^4.0.2"
+    lodash "^4.0.0"
+    semver "^5.3.0"
+    symlink-or-copy "^1.1.3"
+    temp "^0.8.3"
+
 ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.17.2, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2:
   version "6.17.2"
   resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.2.tgz#f0d53d2fb95e70c15d8db84760d045f88f458f69"
@@ -3689,7 +3744,7 @@ es-to-primitive@^1.1.1:
     is-date-object "^1.0.1"
     is-symbol "^1.0.2"
 
-es6-promise@^4.0.3:
+es6-promise@^4.0.3, es6-promise@^4.1.0:
   version "4.2.5"
   resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
   integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==
@@ -4039,6 +4094,14 @@ extend@^3.0.0, extend@~3.0.2:
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
   integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
 
+extended-emitter@*:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/extended-emitter/-/extended-emitter-1.0.2.tgz#a2521ab93f3b1b69a35ff3a35da9889385a99ba0"
+  integrity sha1-olIauT87G2mjX/OjXamIk4Wpm6A=
+  dependencies:
+    sift "*"
+    wolfy87-eventemitter "*"
+
 external-editor@^1.1.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b"
@@ -4455,7 +4518,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==
@@ -4650,6 +4713,11 @@ glob-parent@^2.0.0:
   dependencies:
     is-glob "^2.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@7.1.2:
   version "7.1.2"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
@@ -4673,7 +4741,7 @@ glob@^5.0.10:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^7.0.4, glob@^7.0.5, glob@^7.1.2:
+glob@^7.0.4, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3:
   version "7.1.3"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
   integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
@@ -6148,7 +6216,7 @@ lodash.values@~2.3.0:
   dependencies:
     lodash.keys "~2.3.0"
 
-lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1:
+lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1:
   version "4.17.11"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
   integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
@@ -7490,6 +7558,15 @@ readable-stream@~1.0.2:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
+readdir-enhanced@^1.4.0:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/readdir-enhanced/-/readdir-enhanced-1.5.2.tgz#61463048690ac6a455b75b62fa78a88f8dc85e53"
+  integrity sha1-YUYwSGkKxqRVt1ti+nioj43IXlM=
+  dependencies:
+    call-me-maybe "^1.0.1"
+    es6-promise "^4.1.0"
+    glob-to-regexp "^0.3.0"
+
 recast@^0.11.3:
   version "0.11.23"
   resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3"
@@ -8027,6 +8104,11 @@ shellwords@^0.1.1:
   resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
   integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
 
+sift@*:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08"
+  integrity sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==
+
 signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@@ -8496,7 +8578,7 @@ supports-color@^5.3.0:
   dependencies:
     has-flag "^3.0.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:
+symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.3, 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==
@@ -8533,7 +8615,7 @@ tar@^4:
     safe-buffer "^5.1.2"
     yallist "^3.0.2"
 
-temp@0.8.3:
+temp@0.8.3, temp@^0.8.3:
   version "0.8.3"
   resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
   integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=
@@ -9100,6 +9182,11 @@ wide-align@^1.1.0:
   dependencies:
     string-width "^1.0.2 || 2"
 
+wolfy87-eventemitter@*:
+  version "5.2.5"
+  resolved "https://registry.yarnpkg.com/wolfy87-eventemitter/-/wolfy87-eventemitter-5.2.5.tgz#e7af2adbb84e481c65edeb2a2e01032c8ff1b88f"
+  integrity sha512-1Og5JkuMNZfZcDn76HM1ktUqG8MOMWKpaGdExM1pcTloUNSBkx4Mti3/jRKSTt1vI3P7S8BTkFogqMbc7m3A7Q==
+
 wordwrap@~0.0.2:
   version "0.0.3"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"