Repository: ember-cli/ember-cli
Pull request #8820 (2019-09-03 14:08:23)

Issue deprecation when enabling MODULE_UNIFICATION flag.
MODULE_UNIFICATION has always required using canary versions of Ember and ember-cli. `ember-source` has disabled the feature completely so that apps can no longer enable the feature at all.

This implements a basic system for ember-cli to tell folks that were leveraging that experiment that we will be removing support from ember-cli. This will _likely_ be removed in ember-cli@3.17 (after the next LTS release).

Begins addressing https://github.com/ember-cli/ember-cli/issues/8790.


Patch:
diff --git a/blueprints/addon/index.js b/blueprints/addon/index.js
index ba2796aa0..28fdf89a5 100644
--- a/blueprints/addon/index.js
+++ b/blueprints/addon/index.js
@@ -75,10 +75,10 @@ module.exports = {
     contents.devDependencies['ember-disable-prototype-extensions'] = '^1.1.3';
 
     // add ember-try
-    contents.devDependencies['ember-try'] = '^1.2.1';
+    contents.devDependencies['ember-try'] = '^1.0.0';
 
     // add ember-source-channel-url
-    contents.devDependencies['ember-source-channel-url'] = '^2.0.1';
+    contents.devDependencies['ember-source-channel-url'] = '^1.1.0';
 
     // add `ember-try` as `test:all` script in addons
     contents.scripts['test:all'] = 'ember try:each';
diff --git a/blueprints/app/files/package.json b/blueprints/app/files/package.json
index 78da8f776..b8f8083b1 100644
--- a/blueprints/app/files/package.json
+++ b/blueprints/app/files/package.json
@@ -19,32 +19,32 @@
   },
   "devDependencies": {
     "@ember/optional-features": "^0.7.0",
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.0.2",
     "broccoli-asset-rev": "^3.0.0",
     "ember-cli": "~<%= emberCLIVersion %>",
     "ember-cli-app-version": "^3.2.0",
-    "ember-cli-babel": "^7.11.0",
+    "ember-cli-babel": "^7.7.3",
     "ember-cli-dependency-checker": "^3.1.0",
     "ember-cli-eslint": "^5.1.0",
-    "ember-cli-htmlbars": "^3.1.0",
-    "ember-cli-htmlbars-inline-precompile": "^3.0.0",
-    "ember-cli-inject-live-reload": "^2.0.1",
+    "ember-cli-htmlbars": "^3.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^2.1.0",
+    "ember-cli-inject-live-reload": "^1.8.2",
     "ember-cli-sri": "^2.1.1",
-    "ember-cli-template-lint": "^1.0.0-beta.3",
-    "ember-cli-uglify": "^3.0.0",
+    "ember-cli-template-lint": "^1.0.0-beta.1",
+    "ember-cli-uglify": "^2.1.0",
     "ember-data": "~3.13.0-beta.0",
     "ember-export-application-global": "^2.0.0",
-    "ember-fetch": "^6.7.0",
-    "ember-load-initializers": "^2.1.0",
+    "ember-fetch": "^6.4.0",
+    "ember-load-initializers": "^2.0.0",
     "ember-maybe-import-regenerator": "^0.1.6",
-    "ember-qunit": "^4.5.1",
-    "ember-resolver": "^5.2.1",
+    "ember-qunit": "^4.4.1",
+    "ember-resolver": "^5.0.1",
     "ember-source": "~3.13.0-beta.2<% if (welcome) { %>",
     "ember-welcome-page": "^4.0.0<% } %>",
-    "eslint-plugin-ember": "^7.0.0",
-    "eslint-plugin-node": "^9.2.0",
+    "eslint-plugin-ember": "^6.2.0",
+    "eslint-plugin-node": "^9.0.1",
     "loader.js": "^4.7.0",
-    "qunit-dom": "^0.9.0"
+    "qunit-dom": "^0.8.4"
   },
   "engines": {
     "node": "8.* || >= 10.*"
diff --git a/blueprints/module-unification-app/files/package.json b/blueprints/module-unification-app/files/package.json
index a776590cc..9145e7577 100644
--- a/blueprints/module-unification-app/files/package.json
+++ b/blueprints/module-unification-app/files/package.json
@@ -19,32 +19,32 @@
   },
   "devDependencies": {
     "@ember/optional-features": "^0.7.0",
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.0.2",
     "broccoli-asset-rev": "^3.0.0",
     "ember-cli": "github:ember-cli/ember-cli",
     "ember-cli-app-version": "^3.2.0",
-    "ember-cli-babel": "^7.11.0",
+    "ember-cli-babel": "^7.7.3",
     "ember-cli-dependency-checker": "^3.1.0",
     "ember-cli-eslint": "^5.1.0",
-    "ember-cli-htmlbars": "^3.1.0",
-    "ember-cli-htmlbars-inline-precompile": "^3.0.0",
-    "ember-cli-inject-live-reload": "^2.0.1",
+    "ember-cli-htmlbars": "^3.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^2.1.0",
+    "ember-cli-inject-live-reload": "^1.8.2",
     "ember-cli-sri": "^2.1.1",
-    "ember-cli-template-lint": "^1.0.0-beta.3",
-    "ember-cli-uglify": "^3.0.0",
+    "ember-cli-template-lint": "^1.0.0-beta.1",
+    "ember-cli-uglify": "^2.1.0",
     "ember-data": "~3.13.0-beta.0",
     "ember-export-application-global": "^2.0.0",
-    "ember-fetch": "^6.7.0",
-    "ember-load-initializers": "^2.1.0",
+    "ember-fetch": "^6.4.0",
+    "ember-load-initializers": "^2.0.0",
     "ember-maybe-import-regenerator": "^0.1.6",
-    "ember-qunit": "^4.5.1",
-    "ember-resolver": "^5.2.1",
+    "ember-qunit": "^4.4.1",
+    "ember-resolver": "^5.0.1",
     "ember-source": "<%= emberCanaryVersion %><% if (welcome) { %>",
     "ember-welcome-page": "^4.0.0<% } %>",
-    "eslint-plugin-ember": "^7.0.0",
-    "eslint-plugin-node": "^9.2.0",
+    "eslint-plugin-ember": "^6.2.0",
+    "eslint-plugin-node": "^9.0.1",
     "loader.js": "^4.7.0",
-    "qunit-dom": "^0.9.0"
+    "qunit-dom": "^0.8.4"
   },
   "engines": {
     "node": "8.* || >= 10.*"
diff --git a/lib/experiments/index.js b/lib/experiments/index.js
index 135b02ad1..760be99c5 100644
--- a/lib/experiments/index.js
+++ b/lib/experiments/index.js
@@ -1,5 +1,6 @@
 'use strict';
 
+const chalk = require('chalk');
 const availableExperiments = Object.freeze([
   'PACKAGER',
   'MODULE_UNIFICATION',
@@ -8,7 +9,9 @@ const availableExperiments = Object.freeze([
   'BROCCOLI_WATCHER',
 ]);
 
+const deprecatedExperiments = Object.freeze(['MODULE_UNIFICATION']);
 const enabledExperiments = Object.freeze(['SYSTEM_TEMP']);
+const deprecatedExperimentsDeprecationsIssued = [];
 
 function isExperimentEnabled(experimentName) {
   if (!availableExperiments.includes(experimentName)) {
@@ -21,6 +24,19 @@ function isExperimentEnabled(experimentName) {
 
   let experimentEnvironmentVariable = `EMBER_CLI_${experimentName}`;
   let experimentValue = process.env[experimentEnvironmentVariable];
+
+  if (deprecatedExperiments.includes(experimentName)) {
+    let deprecationPreviouslyIssued = deprecatedExperimentsDeprecationsIssued.includes(experimentName);
+    let isSpecifiedByUser = experimentValue !== undefined;
+
+    if (!deprecationPreviouslyIssued && isSpecifiedByUser) {
+      console.warn(
+        chalk.yellow(`The ${experimentName} experiment in ember-cli has been deprecated and will be removed.`)
+      );
+      deprecatedExperimentsDeprecationsIssued.push(experimentName);
+    }
+  }
+
   if (enabledExperiments.includes(experimentName)) {
     return experimentValue !== 'false';
   } else {
@@ -28,4 +44,9 @@ function isExperimentEnabled(experimentName) {
   }
 }
 
-module.exports = { isExperimentEnabled };
+module.exports = {
+  isExperimentEnabled,
+
+  // exported for testing purposes
+  _deprecatedExperimentsDeprecationsIssued: deprecatedExperimentsDeprecationsIssued,
+};


Test patch:
diff --git a/tests/fixtures/addon/npm/package.json b/tests/fixtures/addon/npm/package.json
index bdcea02d8..caa3403c7 100644
--- a/tests/fixtures/addon/npm/package.json
+++ b/tests/fixtures/addon/npm/package.json
@@ -21,34 +21,34 @@
     "test:all": "ember try:each"
   },
   "dependencies": {
-    "ember-cli-babel": "^7.11.0",
-    "ember-cli-htmlbars": "^3.1.0"
+    "ember-cli-babel": "^7.7.3",
+    "ember-cli-htmlbars": "^3.0.1"
   },
   "devDependencies": {
     "@ember/optional-features": "^0.7.0",
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.0.2",
     "broccoli-asset-rev": "^3.0.0",
     "ember-cli": "~<%= emberCLIVersion %>",
     "ember-cli-dependency-checker": "^3.1.0",
     "ember-cli-eslint": "^5.1.0",
-    "ember-cli-htmlbars-inline-precompile": "^3.0.0",
-    "ember-cli-inject-live-reload": "^2.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^2.1.0",
+    "ember-cli-inject-live-reload": "^1.8.2",
     "ember-cli-sri": "^2.1.1",
-    "ember-cli-template-lint": "^1.0.0-beta.3",
-    "ember-cli-uglify": "^3.0.0",
+    "ember-cli-template-lint": "^1.0.0-beta.1",
+    "ember-cli-uglify": "^2.1.0",
     "ember-disable-prototype-extensions": "^1.1.3",
     "ember-export-application-global": "^2.0.0",
-    "ember-load-initializers": "^2.1.0",
+    "ember-load-initializers": "^2.0.0",
     "ember-maybe-import-regenerator": "^0.1.6",
-    "ember-qunit": "^4.5.1",
-    "ember-resolver": "^5.2.1",
+    "ember-qunit": "^4.4.1",
+    "ember-resolver": "^5.0.1",
     "ember-source": "~3.13.0-beta.2",
-    "ember-source-channel-url": "^2.0.1",
-    "ember-try": "^1.2.1",
-    "eslint-plugin-ember": "^7.0.0",
-    "eslint-plugin-node": "^9.2.0",
+    "ember-source-channel-url": "^1.1.0",
+    "ember-try": "^1.0.0",
+    "eslint-plugin-ember": "^6.2.0",
+    "eslint-plugin-node": "^9.0.1",
     "loader.js": "^4.7.0",
-    "qunit-dom": "^0.9.0"
+    "qunit-dom": "^0.8.4"
   },
   "engines": {
     "node": "8.* || >= 10.*"
diff --git a/tests/fixtures/addon/yarn/package.json b/tests/fixtures/addon/yarn/package.json
index 6b51f4d47..cc6868c83 100644
--- a/tests/fixtures/addon/yarn/package.json
+++ b/tests/fixtures/addon/yarn/package.json
@@ -21,35 +21,35 @@
     "test:all": "ember try:each"
   },
   "dependencies": {
-    "ember-cli-babel": "^7.11.0",
-    "ember-cli-htmlbars": "^3.1.0"
+    "ember-cli-babel": "^7.7.3",
+    "ember-cli-htmlbars": "^3.0.1"
   },
   "devDependencies": {
     "@ember/optional-features": "^0.7.0",
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.0.2",
     "broccoli-asset-rev": "^3.0.0",
     "ember-cli": "~<%= emberCLIVersion %>",
     "ember-cli-dependency-checker": "^3.1.0",
     "ember-cli-eslint": "^5.1.0",
-    "ember-cli-htmlbars-inline-precompile": "^3.0.0",
-    "ember-cli-inject-live-reload": "^2.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^2.1.0",
+    "ember-cli-inject-live-reload": "^1.8.2",
     "ember-cli-sri": "^2.1.1",
-    "ember-cli-template-lint": "^1.0.0-beta.3",
-    "ember-cli-uglify": "^3.0.0",
+    "ember-cli-template-lint": "^1.0.0-beta.1",
+    "ember-cli-uglify": "^2.1.0",
     "ember-disable-prototype-extensions": "^1.1.3",
     "ember-export-application-global": "^2.0.0",
-    "ember-load-initializers": "^2.1.0",
+    "ember-load-initializers": "^2.0.0",
     "ember-maybe-import-regenerator": "^0.1.6",
-    "ember-qunit": "^4.5.1",
-    "ember-resolver": "^5.2.1",
+    "ember-qunit": "^4.4.1",
+    "ember-resolver": "^5.0.1",
     "ember-source": "~3.13.0-beta.2",
-    "ember-source-channel-url": "^2.0.1",
-    "ember-try": "^1.2.1",
+    "ember-source-channel-url": "^1.1.0",
+    "ember-try": "^1.0.0",
     "ember-welcome-page": "^4.0.0",
-    "eslint-plugin-ember": "^7.0.0",
-    "eslint-plugin-node": "^9.2.0",
+    "eslint-plugin-ember": "^6.2.0",
+    "eslint-plugin-node": "^9.0.1",
     "loader.js": "^4.7.0",
-    "qunit-dom": "^0.9.0"
+    "qunit-dom": "^0.8.4"
   },
   "engines": {
     "node": "8.* || >= 10.*"
diff --git a/tests/fixtures/app/npm/package.json b/tests/fixtures/app/npm/package.json
index 3888fb888..f0d6d8df6 100644
--- a/tests/fixtures/app/npm/package.json
+++ b/tests/fixtures/app/npm/package.json
@@ -19,31 +19,31 @@
   },
   "devDependencies": {
     "@ember/optional-features": "^0.7.0",
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.0.2",
     "broccoli-asset-rev": "^3.0.0",
     "ember-cli": "~<%= emberCLIVersion %>",
     "ember-cli-app-version": "^3.2.0",
-    "ember-cli-babel": "^7.11.0",
+    "ember-cli-babel": "^7.7.3",
     "ember-cli-dependency-checker": "^3.1.0",
     "ember-cli-eslint": "^5.1.0",
-    "ember-cli-htmlbars": "^3.1.0",
-    "ember-cli-htmlbars-inline-precompile": "^3.0.0",
-    "ember-cli-inject-live-reload": "^2.0.1",
+    "ember-cli-htmlbars": "^3.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^2.1.0",
+    "ember-cli-inject-live-reload": "^1.8.2",
     "ember-cli-sri": "^2.1.1",
-    "ember-cli-template-lint": "^1.0.0-beta.3",
-    "ember-cli-uglify": "^3.0.0",
+    "ember-cli-template-lint": "^1.0.0-beta.1",
+    "ember-cli-uglify": "^2.1.0",
     "ember-data": "~3.13.0-beta.0",
     "ember-export-application-global": "^2.0.0",
-    "ember-fetch": "^6.7.0",
-    "ember-load-initializers": "^2.1.0",
+    "ember-fetch": "^6.4.0",
+    "ember-load-initializers": "^2.0.0",
     "ember-maybe-import-regenerator": "^0.1.6",
-    "ember-qunit": "^4.5.1",
-    "ember-resolver": "^5.2.1",
+    "ember-qunit": "^4.4.1",
+    "ember-resolver": "^5.0.1",
     "ember-source": "~3.13.0-beta.2",
-    "eslint-plugin-ember": "^7.0.0",
-    "eslint-plugin-node": "^9.2.0",
+    "eslint-plugin-ember": "^6.2.0",
+    "eslint-plugin-node": "^9.0.1",
     "loader.js": "^4.7.0",
-    "qunit-dom": "^0.9.0"
+    "qunit-dom": "^0.8.4"
   },
   "engines": {
     "node": "8.* || >= 10.*"
diff --git a/tests/fixtures/app/yarn/package.json b/tests/fixtures/app/yarn/package.json
index 06a07af6c..b6096f1f6 100644
--- a/tests/fixtures/app/yarn/package.json
+++ b/tests/fixtures/app/yarn/package.json
@@ -19,32 +19,32 @@
   },
   "devDependencies": {
     "@ember/optional-features": "^0.7.0",
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.0.2",
     "broccoli-asset-rev": "^3.0.0",
     "ember-cli": "~<%= emberCLIVersion %>",
     "ember-cli-app-version": "^3.2.0",
-    "ember-cli-babel": "^7.11.0",
+    "ember-cli-babel": "^7.7.3",
     "ember-cli-dependency-checker": "^3.1.0",
     "ember-cli-eslint": "^5.1.0",
-    "ember-cli-htmlbars": "^3.1.0",
-    "ember-cli-htmlbars-inline-precompile": "^3.0.0",
-    "ember-cli-inject-live-reload": "^2.0.1",
+    "ember-cli-htmlbars": "^3.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^2.1.0",
+    "ember-cli-inject-live-reload": "^1.8.2",
     "ember-cli-sri": "^2.1.1",
-    "ember-cli-template-lint": "^1.0.0-beta.3",
-    "ember-cli-uglify": "^3.0.0",
+    "ember-cli-template-lint": "^1.0.0-beta.1",
+    "ember-cli-uglify": "^2.1.0",
     "ember-data": "~3.13.0-beta.0",
     "ember-export-application-global": "^2.0.0",
-    "ember-fetch": "^6.7.0",
-    "ember-load-initializers": "^2.1.0",
+    "ember-fetch": "^6.4.0",
+    "ember-load-initializers": "^2.0.0",
     "ember-maybe-import-regenerator": "^0.1.6",
-    "ember-qunit": "^4.5.1",
-    "ember-resolver": "^5.2.1",
+    "ember-qunit": "^4.4.1",
+    "ember-resolver": "^5.0.1",
     "ember-source": "~3.13.0-beta.2",
     "ember-welcome-page": "^4.0.0",
-    "eslint-plugin-ember": "^7.0.0",
-    "eslint-plugin-node": "^9.2.0",
+    "eslint-plugin-ember": "^6.2.0",
+    "eslint-plugin-node": "^9.0.1",
     "loader.js": "^4.7.0",
-    "qunit-dom": "^0.9.0"
+    "qunit-dom": "^0.8.4"
   },
   "engines": {
     "node": "8.* || >= 10.*"
diff --git a/tests/fixtures/module-unification-addon/npm/package.json b/tests/fixtures/module-unification-addon/npm/package.json
index a2aa2afe7..43f46f873 100644
--- a/tests/fixtures/module-unification-addon/npm/package.json
+++ b/tests/fixtures/module-unification-addon/npm/package.json
@@ -21,34 +21,34 @@
     "test:all": "ember try:each"
   },
   "dependencies": {
-    "ember-cli-babel": "^7.11.0",
-    "ember-cli-htmlbars": "^3.1.0"
+    "ember-cli-babel": "^7.7.3",
+    "ember-cli-htmlbars": "^3.0.1"
   },
   "devDependencies": {
     "@ember/optional-features": "^0.7.0",
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.0.2",
     "broccoli-asset-rev": "^3.0.0",
     "ember-cli": "<%= emberCLIVersion %>",
     "ember-cli-dependency-checker": "^3.1.0",
     "ember-cli-eslint": "^5.1.0",
-    "ember-cli-htmlbars-inline-precompile": "^3.0.0",
-    "ember-cli-inject-live-reload": "^2.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^2.1.0",
+    "ember-cli-inject-live-reload": "^1.8.2",
     "ember-cli-sri": "^2.1.1",
-    "ember-cli-template-lint": "^1.0.0-beta.3",
-    "ember-cli-uglify": "^3.0.0",
+    "ember-cli-template-lint": "^1.0.0-beta.1",
+    "ember-cli-uglify": "^2.1.0",
     "ember-disable-prototype-extensions": "^1.1.3",
     "ember-export-application-global": "^2.0.0",
-    "ember-load-initializers": "^2.1.0",
+    "ember-load-initializers": "^2.0.0",
     "ember-maybe-import-regenerator": "^0.1.6",
-    "ember-qunit": "^4.5.1",
-    "ember-resolver": "^5.2.1",
+    "ember-qunit": "^4.4.1",
+    "ember-resolver": "^5.0.1",
     "ember-source": "<%= emberCanaryVersion %>",
-    "ember-source-channel-url": "^2.0.1",
-    "ember-try": "^1.2.1",
-    "eslint-plugin-ember": "^7.0.0",
-    "eslint-plugin-node": "^9.2.0",
+    "ember-source-channel-url": "^1.1.0",
+    "ember-try": "^1.0.0",
+    "eslint-plugin-ember": "^6.2.0",
+    "eslint-plugin-node": "^9.0.1",
     "loader.js": "^4.7.0",
-    "qunit-dom": "^0.9.0"
+    "qunit-dom": "^0.8.4"
   },
   "engines": {
     "node": "8.* || >= 10.*"
diff --git a/tests/fixtures/module-unification-addon/yarn/package.json b/tests/fixtures/module-unification-addon/yarn/package.json
index ad5603aa1..0cdc94920 100644
--- a/tests/fixtures/module-unification-addon/yarn/package.json
+++ b/tests/fixtures/module-unification-addon/yarn/package.json
@@ -21,35 +21,35 @@
     "test:all": "ember try:each"
   },
   "dependencies": {
-    "ember-cli-babel": "^7.11.0",
-    "ember-cli-htmlbars": "^3.1.0"
+    "ember-cli-babel": "^7.7.3",
+    "ember-cli-htmlbars": "^3.0.1"
   },
   "devDependencies": {
     "@ember/optional-features": "^0.7.0",
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.0.2",
     "broccoli-asset-rev": "^3.0.0",
     "ember-cli": "<%= emberCLIVersion %>",
     "ember-cli-dependency-checker": "^3.1.0",
     "ember-cli-eslint": "^5.1.0",
-    "ember-cli-htmlbars-inline-precompile": "^3.0.0",
-    "ember-cli-inject-live-reload": "^2.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^2.1.0",
+    "ember-cli-inject-live-reload": "^1.8.2",
     "ember-cli-sri": "^2.1.1",
-    "ember-cli-template-lint": "^1.0.0-beta.3",
-    "ember-cli-uglify": "^3.0.0",
+    "ember-cli-template-lint": "^1.0.0-beta.1",
+    "ember-cli-uglify": "^2.1.0",
     "ember-disable-prototype-extensions": "^1.1.3",
     "ember-export-application-global": "^2.0.0",
-    "ember-load-initializers": "^2.1.0",
+    "ember-load-initializers": "^2.0.0",
     "ember-maybe-import-regenerator": "^0.1.6",
-    "ember-qunit": "^4.5.1",
-    "ember-resolver": "^5.2.1",
+    "ember-qunit": "^4.4.1",
+    "ember-resolver": "^5.0.1",
     "ember-source": "<%= emberCanaryVersion %>",
-    "ember-source-channel-url": "^2.0.1",
-    "ember-try": "^1.2.1",
+    "ember-source-channel-url": "^1.1.0",
+    "ember-try": "^1.0.0",
     "ember-welcome-page": "^4.0.0",
-    "eslint-plugin-ember": "^7.0.0",
-    "eslint-plugin-node": "^9.2.0",
+    "eslint-plugin-ember": "^6.2.0",
+    "eslint-plugin-node": "^9.0.1",
     "loader.js": "^4.7.0",
-    "qunit-dom": "^0.9.0"
+    "qunit-dom": "^0.8.4"
   },
   "engines": {
     "node": "8.* || >= 10.*"
diff --git a/tests/fixtures/module-unification-app/npm/package.json b/tests/fixtures/module-unification-app/npm/package.json
index 78f27f985..a540d3ad8 100644
--- a/tests/fixtures/module-unification-app/npm/package.json
+++ b/tests/fixtures/module-unification-app/npm/package.json
@@ -19,31 +19,31 @@
   },
   "devDependencies": {
     "@ember/optional-features": "^0.7.0",
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.0.2",
     "broccoli-asset-rev": "^3.0.0",
     "ember-cli": "github:ember-cli/ember-cli",
     "ember-cli-app-version": "^3.2.0",
-    "ember-cli-babel": "^7.11.0",
+    "ember-cli-babel": "^7.7.3",
     "ember-cli-dependency-checker": "^3.1.0",
     "ember-cli-eslint": "^5.1.0",
-    "ember-cli-htmlbars": "^3.1.0",
-    "ember-cli-htmlbars-inline-precompile": "^3.0.0",
-    "ember-cli-inject-live-reload": "^2.0.1",
+    "ember-cli-htmlbars": "^3.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^2.1.0",
+    "ember-cli-inject-live-reload": "^1.8.2",
     "ember-cli-sri": "^2.1.1",
-    "ember-cli-template-lint": "^1.0.0-beta.3",
-    "ember-cli-uglify": "^3.0.0",
+    "ember-cli-template-lint": "^1.0.0-beta.1",
+    "ember-cli-uglify": "^2.1.0",
     "ember-data": "~3.13.0-beta.0",
     "ember-export-application-global": "^2.0.0",
-    "ember-fetch": "^6.7.0",
-    "ember-load-initializers": "^2.1.0",
+    "ember-fetch": "^6.4.0",
+    "ember-load-initializers": "^2.0.0",
     "ember-maybe-import-regenerator": "^0.1.6",
-    "ember-qunit": "^4.5.1",
-    "ember-resolver": "^5.2.1",
+    "ember-qunit": "^4.4.1",
+    "ember-resolver": "^5.0.1",
     "ember-source": "<%= emberCanaryVersion %>",
-    "eslint-plugin-ember": "^7.0.0",
-    "eslint-plugin-node": "^9.2.0",
+    "eslint-plugin-ember": "^6.2.0",
+    "eslint-plugin-node": "^9.0.1",
     "loader.js": "^4.7.0",
-    "qunit-dom": "^0.9.0"
+    "qunit-dom": "^0.8.4"
   },
   "engines": {
     "node": "8.* || >= 10.*"
diff --git a/tests/fixtures/module-unification-app/yarn/package.json b/tests/fixtures/module-unification-app/yarn/package.json
index 551bb1009..24515e09d 100644
--- a/tests/fixtures/module-unification-app/yarn/package.json
+++ b/tests/fixtures/module-unification-app/yarn/package.json
@@ -19,32 +19,32 @@
   },
   "devDependencies": {
     "@ember/optional-features": "^0.7.0",
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.0.2",
     "broccoli-asset-rev": "^3.0.0",
     "ember-cli": "github:ember-cli/ember-cli",
     "ember-cli-app-version": "^3.2.0",
-    "ember-cli-babel": "^7.11.0",
+    "ember-cli-babel": "^7.7.3",
     "ember-cli-dependency-checker": "^3.1.0",
     "ember-cli-eslint": "^5.1.0",
-    "ember-cli-htmlbars": "^3.1.0",
-    "ember-cli-htmlbars-inline-precompile": "^3.0.0",
-    "ember-cli-inject-live-reload": "^2.0.1",
+    "ember-cli-htmlbars": "^3.0.1",
+    "ember-cli-htmlbars-inline-precompile": "^2.1.0",
+    "ember-cli-inject-live-reload": "^1.8.2",
     "ember-cli-sri": "^2.1.1",
-    "ember-cli-template-lint": "^1.0.0-beta.3",
-    "ember-cli-uglify": "^3.0.0",
+    "ember-cli-template-lint": "^1.0.0-beta.1",
+    "ember-cli-uglify": "^2.1.0",
     "ember-data": "~3.13.0-beta.0",
     "ember-export-application-global": "^2.0.0",
-    "ember-fetch": "^6.7.0",
-    "ember-load-initializers": "^2.1.0",
+    "ember-fetch": "^6.4.0",
+    "ember-load-initializers": "^2.0.0",
     "ember-maybe-import-regenerator": "^0.1.6",
-    "ember-qunit": "^4.5.1",
-    "ember-resolver": "^5.2.1",
+    "ember-qunit": "^4.4.1",
+    "ember-resolver": "^5.0.1",
     "ember-source": "<%= emberCanaryVersion %>",
     "ember-welcome-page": "^4.0.0",
-    "eslint-plugin-ember": "^7.0.0",
-    "eslint-plugin-node": "^9.2.0",
+    "eslint-plugin-ember": "^6.2.0",
+    "eslint-plugin-node": "^9.0.1",
     "loader.js": "^4.7.0",
-    "qunit-dom": "^0.9.0"
+    "qunit-dom": "^0.8.4"
   },
   "engines": {
     "node": "8.* || >= 10.*"
diff --git a/tests/unit/blueprints/addon-test.js b/tests/unit/blueprints/addon-test.js
index 60dc9123e..fca89c049 100644
--- a/tests/unit/blueprints/addon-test.js
+++ b/tests/unit/blueprints/addon-test.js
@@ -81,8 +81,8 @@ describe('blueprint - addon', function() {
   "dependencies": {},\n\
   "devDependencies": {\n\
     "ember-disable-prototype-extensions": "^1.1.3",\n\
-    "ember-source-channel-url": "^2.0.1",\n\
-    "ember-try": "^1.2.1"\n\
+    "ember-source-channel-url": "^1.1.0",\n\
+    "ember-try": "^1.0.0"\n\
   },\n\
   "ember-addon": {\n\
     "configPath": "tests/dummy/config"\n\
diff --git a/tests/unit/experiments-test.js b/tests/unit/experiments-test.js
index 086e5751b..b8a29f2df 100644
--- a/tests/unit/experiments-test.js
+++ b/tests/unit/experiments-test.js
@@ -1,7 +1,8 @@
 'use strict';
 
+const chalk = require('chalk');
 const expect = require('chai').expect;
-const { isExperimentEnabled } = require('../../lib/experiments');
+const { isExperimentEnabled, _deprecatedExperimentsDeprecationsIssued } = require('../../lib/experiments');
 
 function resetProcessEnv(originalProcessEnv) {
   for (let key in process.env) {
@@ -19,9 +20,11 @@ function resetProcessEnv(originalProcessEnv) {
   }
 }
 
+const ORIGINAL_CONSOLE = Object.assign({}, console);
+
 describe('experiments', function() {
   describe('isExperimentEnabled', function() {
-    let originalProcessEnv;
+    let originalProcessEnv, warnings;
 
     beforeEach(function() {
       originalProcessEnv = Object.assign({}, process.env);
@@ -33,10 +36,15 @@ describe('experiments', function() {
       delete process.env.EMBER_CLI_PACKAGER;
       delete process.env.EMBER_CLI_DELAYED_TRANSPILATION;
       delete process.env.EMBER_CLI_SYSTEM_TEMP;
+
+      warnings = [];
+      console.warn = warning => warnings.push(warning);
     });
 
     afterEach(function() {
       resetProcessEnv(originalProcessEnv);
+      Object.assign(console, ORIGINAL_CONSOLE);
+      _deprecatedExperimentsDeprecationsIssued.length = 0;
     });
 
     it('should return true for all experiments when `EMBER_CLI_ENABLE_ALL_EXPERIMENTS` is set', function() {
@@ -45,25 +53,51 @@ describe('experiments', function() {
       expect(isExperimentEnabled('PACKAGER')).to.be.true;
       expect(isExperimentEnabled('SYSTEM_TEMP')).to.be.true;
       expect(isExperimentEnabled('DELAYED_TRANSPILATION')).to.be.true;
+
+      expect(warnings).to.deep.equal([]);
     });
 
     it('should have SYSTEM_TEMP disabled when environment flag is present', function() {
       process.env.EMBER_CLI_SYSTEM_TEMP = 'false';
       expect(isExperimentEnabled('SYSTEM_TEMP')).to.be.false;
+
+      expect(warnings).to.deep.equal([]);
     });
 
     it('setting an already disabled feature to false does not enable it', function() {
       process.env.EMBER_CLI_PACKAGER = 'false';
       expect(isExperimentEnabled('PACKAGER')).to.be.false;
+
+      expect(warnings).to.deep.equal([]);
     });
 
     it('should have MODULE_UNIFICATION disabled by default', function() {
       expect(isExperimentEnabled('MODULE_UNIFICATION')).to.be.false;
+
+      expect(warnings).to.deep.equal([]);
     });
 
     it('should have MODULE_UNIFICATION enabled when environment variable is set', function() {
       process.env.EMBER_CLI_MODULE_UNIFICATION = 'true';
       expect(isExperimentEnabled('MODULE_UNIFICATION')).to.be.true;
+
+      expect(warnings).to.deep.equal([
+        chalk.yellow(`The MODULE_UNIFICATION experiment in ember-cli has been deprecated and will be removed.`),
+      ]);
+    });
+
+    it('only emits deprecation warnings once', function() {
+      process.env.EMBER_CLI_MODULE_UNIFICATION = 'true';
+      expect(isExperimentEnabled('MODULE_UNIFICATION')).to.be.true;
+
+      expect(warnings).to.deep.equal([
+        chalk.yellow(`The MODULE_UNIFICATION experiment in ember-cli has been deprecated and will be removed.`),
+      ]);
+
+      warnings = [];
+      expect(isExperimentEnabled('MODULE_UNIFICATION')).to.be.true;
+
+      expect(warnings).to.deep.equal([]);
     });
   });
 });