From 7bf379b31d15f67a1e3e0ef897954784d32f844a Mon Sep 17 00:00:00 2001 From: Chad Hietala Date: Mon, 20 Mar 2017 12:54:38 -0700 Subject: [PATCH 1/2] Introduce babel-plugin-debug-macros for code stripping --- .travis.yml | 21 +- broccoli/features.js | 10 + broccoli/lint.js | 3 + broccoli/minify.js | 3 + broccoli/packages.js | 15 +- broccoli/to-es5.js | 31 +-- broccoli/version.js | 1 - ember-cli-build.js | 20 +- package.json | 2 + packages/container/lib/container.js | 133 +++++------ packages/container/tests/container_test.js | 210 +++++++----------- .../lib/system/application.js | 16 +- .../ember-application/lib/system/resolver.js | 7 +- .../default_resolver_test.js | 49 ++-- .../dependency_injection/to_string_test.js | 7 +- packages/ember-debug/lib/index.js | 1 - .../ember-glimmer/lib/components/link-to.js | 8 +- packages/ember-glimmer/lib/environment.js | 46 ++-- packages/ember-glimmer/lib/helpers/action.js | 7 +- .../ember-glimmer/lib/helpers/component.js | 7 +- .../lib/syntax/abstract-manager.js | 6 +- .../lib/syntax/curly-component.js | 36 +-- packages/ember-glimmer/lib/syntax/mount.js | 13 +- packages/ember-glimmer/lib/syntax/outlet.js | 15 +- packages/ember-glimmer/lib/syntax/render.js | 15 +- .../ember-glimmer/lib/utils/debug-stack.js | 6 +- .../ember-glimmer/lib/utils/references.js | 43 ++-- .../integration/application/rendering-test.js | 4 +- .../integration/components/append-test.js | 59 +---- .../components/curly-components-test.js | 11 +- .../components/dynamic-components-test.js | 4 +- .../integration/event-dispatcher-test.js | 4 +- .../helpers/closure-action-test.js | 4 +- .../helpers/element-action-test.js | 4 +- .../tests/integration/helpers/render-test.js | 4 +- .../tests/integration/mount-test.js | 4 +- .../tests/integration/outlet-test.js | 8 +- .../tests/unit/utils/debug-stack-test.js | 6 +- packages/ember-metal/lib/instrumentation.js | 4 +- packages/ember-metal/lib/libraries.js | 5 +- packages/ember-metal/lib/meta.js | 48 ++-- packages/ember-metal/lib/mixin.js | 10 +- packages/ember-metal/lib/properties.js | 7 +- packages/ember-metal/lib/property_events.js | 8 +- packages/ember-metal/lib/property_set.js | 7 +- packages/ember-metal/lib/transaction.js | 24 +- packages/ember-metal/lib/watch_key.js | 8 +- .../tests/accessors/mandatory_setters_test.js | 4 +- packages/ember-metal/tests/libraries_test.js | 5 +- .../lib/location/history_location.js | 8 +- .../lib/system/generate_controller.js | 7 +- packages/ember-routing/lib/system/route.js | 7 +- packages/ember-routing/lib/system/router.js | 22 +- .../tests/location/history_location_test.js | 4 +- .../tests/system/controller_for_test.js | 4 +- .../lib/mixins/container_proxy.js | 71 +++--- .../ember-runtime/lib/system/core_object.js | 10 +- packages/ember-runtime/lib/system/object.js | 7 +- .../tests/controllers/controller_test.js | 10 +- packages/ember-runtime/tests/inject_test.js | 12 +- .../tests/system/object/create_test.js | 4 +- .../tests/system/object/destroy_test.js | 4 +- packages/ember-testing/lib/helpers.js | 4 +- .../ember-testing/lib/helpers/pause_test.js | 7 +- packages/ember-testing/tests/helpers_test.js | 4 +- .../ember-views/lib/mixins/view_support.js | 7 +- .../ember-views/lib/views/states/in_dom.js | 7 +- packages/ember/lib/index.js | 10 +- packages/ember/tests/helpers/link_to_test.js | 4 +- packages/ember/tests/reexports_test.js | 4 +- .../routing/router_service_test/basic_test.js | 4 +- .../currenturl_lifecycle_test.js | 4 +- .../router_service_test/replaceWith_test.js | 4 +- .../router_service_test/transitionTo_test.js | 4 +- .../router_service_test/urlFor_test.js | 4 +- .../internal-test-helpers/lib/build-owner.js | 13 +- yarn.lock | 26 +++ 77 files changed, 624 insertions(+), 625 deletions(-) diff --git a/.travis.yml b/.travis.yml index d974a430d7d..03aa2e209dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,13 +9,24 @@ addons: firefox: "latest" cache: - yarn: true + directories: + - $Home/.yarn-cache before_install: - - curl -o- -L https://yarnpkg.com/install.sh | bash - - "phantomjs --version" - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start +- | + phantomjs --version + export DISPLAY=:99.0 + sh -e /etc/init.d/xvfb start + + sudo apt-key adv --fetch-keys http://dl.yarnpkg.com/debian/pubkey.gpg + echo "deb http://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list + sudo apt-get update -qq + sudo apt-get install -y -qq yarn + yarn --version + +install: +- | + yarn install after_success: - "./bin/publish_builds" diff --git a/broccoli/features.js b/broccoli/features.js index e83e2d0529b..93a66cacb11 100644 --- a/broccoli/features.js +++ b/broccoli/features.js @@ -35,5 +35,15 @@ function getFeatures(isDebug) { return features; } +function toConst(features) { + let consted = {}; + Object.keys(features).forEach((feature) => { + consted[feature.toUpperCase().replace(/-/g, '_')] = features[feature] + }); + + return consted; +} + +module.exports.toConst = toConst; module.exports.RELEASE = getFeatures(false); module.exports.DEBUG = getFeatures(true); \ No newline at end of file diff --git a/broccoli/lint.js b/broccoli/lint.js index 89bed4eb093..7420144bbe4 100644 --- a/broccoli/lint.js +++ b/broccoli/lint.js @@ -1,3 +1,6 @@ +/* eslint-env node */ +'use strict'; + const ESLint = require('broccoli-lint-eslint'); module.exports = function _lint(tree) { diff --git a/broccoli/minify.js b/broccoli/minify.js index 5524cdff0f1..16c55afd58b 100644 --- a/broccoli/minify.js +++ b/broccoli/minify.js @@ -1,3 +1,6 @@ +/* eslint-env node */ +'use strict'; + const Funnel = require('broccoli-funnel'); const Uglify = require('broccoli-uglify-js'); const path = require('path'); diff --git a/broccoli/packages.js b/broccoli/packages.js index 681c3435616..0b774be476a 100644 --- a/broccoli/packages.js +++ b/broccoli/packages.js @@ -9,9 +9,11 @@ const funnelLib = require('./funnel-lib'); const { VERSION } = require('./version'); const WriteFile = require('broccoli-file-creator'); const StringReplace = require('broccoli-string-replace'); -const { RELEASE, DEBUG } = require('./features'); +const { RELEASE, DEBUG, toConst } = require('./features'); const GlimmerTemplatePrecompiler = require('./glimmer-template-compiler'); const VERSION_PLACEHOLDER = /VERSION_STRING_PLACEHOLDER/g; +const { stripIndent } = require('common-tags'); + module.exports.routerES = function _routerES() { return new Rollup(findLib('router_js', 'lib'), { @@ -233,7 +235,16 @@ module.exports.emberLicense = function _emberLicense() { } module.exports.emberFeaturesES = function _emberFeaturesES(production = false) { - let content = 'export default ' + JSON.stringify(production ? RELEASE : DEBUG) + ';\n'; + let FEATURES = production ? RELEASE : DEBUG; + let content = stripIndent` + const FEATURES = ${JSON.stringify(FEATURES)}; + export default FEATURES; + + ${Object.keys(toConst(FEATURES)).map((FEATURE) => { + return `export const ${FEATURE} = FEATURES["${FEATURE.replace(/_/g, '-').toLowerCase()}"];` + }).join('\n')} + `; + return new WriteFile('ember/features.js', content, { annotation: `ember/features ${production ? 'production' : 'debug' }` }); diff --git a/broccoli/to-es5.js b/broccoli/to-es5.js index 46043de086e..6f53ca0df94 100644 --- a/broccoli/to-es5.js +++ b/broccoli/to-es5.js @@ -3,7 +3,7 @@ const Babel = require('broccoli-babel-transpiler'); const injectBabelHelpers = require('./transforms/inject-babel-helpers'); -const { RELEASE, DEBUG } = require('./features'); +const { RELEASE, DEBUG, toConst } = require('./features'); module.exports = function toES5(tree, _options) { let options = Object.assign({ @@ -11,12 +11,22 @@ module.exports = function toES5(tree, _options) { }, _options); options.plugins = [ injectBabelHelpers, - ['feature-flags', { - import: { - name: 'isFeatureEnabled', - module: 'ember-debug' + ['debug-macros', { + debugTools: { + source: 'ember-debug' }, - features: options.environment === 'production' ? RELEASE : DEBUG + envFlags: { + source: 'ember-env-flags', + flags: { DEBUG: options.environment !== 'production' } + }, + features: { + name: 'ember', + source: 'ember/features', + flags: options.environment === 'production' ? toConst(RELEASE) : toConst(DEBUG) + }, + externalizeHelpers: { + module: true + } }], ['transform-es2015-template-literals', {loose: true}], ['transform-es2015-arrow-functions'], @@ -28,7 +38,7 @@ module.exports = function toES5(tree, _options) { ['transform-es2015-block-scoping'], ['check-es2015-constants'], ['transform-es2015-classes', {loose: true}], - ['transform-proto-to-assign'], + ['transform-proto-to-assign'] ]; if (options.inlineHelpers) { @@ -37,12 +47,7 @@ module.exports = function toES5(tree, _options) { } if (options.environment === 'production') { - options.plugins.push([ - 'filter-imports', { - 'ember-debug/deprecate': ['deprecate'], - 'ember-debug': ['assert', 'debug', 'deprecate', 'info', 'runInDebug', 'warn', 'debugSeal', 'debugFreeze'] - } - ]); + options.plugins.push(['minify-dead-code-elimination', { 'optimizeRawSize': true }]); } delete options.environment; diff --git a/broccoli/version.js b/broccoli/version.js index fc0e6f2e1f0..90729f5296d 100644 --- a/broccoli/version.js +++ b/broccoli/version.js @@ -7,7 +7,6 @@ const path = require('path'); module.exports.VERSION = (() => { let info = getGitInfo(path.resolve(__dirname, '..')); if (info.tag) { - console.log('herr'); return info.tag.replace(/^v/, ''); } diff --git a/ember-cli-build.js b/ember-cli-build.js index 32a23250c76..292b810ed0b 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -42,8 +42,24 @@ const SHOULD_ROLLUP = true; module.exports = function(options) { let tokenizer = simpleHTMLTokenizerES(); - let container = emberPkgES('container', SHOULD_ROLLUP, ['ember-debug', 'ember-utils', 'ember-environment']); - let emberMetal = emberPkgES('ember-metal', SHOULD_ROLLUP, ['ember-debug', 'ember-environment', 'ember-utils', '@glimmer/reference', 'require', 'backburner', 'ember-console']); + let container = emberPkgES('container', SHOULD_ROLLUP, [ + 'ember-debug', + 'ember-utils', + 'ember-environment', + 'ember-env-flags', + 'ember/features' + ]); + let emberMetal = emberPkgES('ember-metal', SHOULD_ROLLUP, [ + 'ember-debug', + 'ember-environment', + 'ember-utils', + '@glimmer/reference', + 'require', + 'backburner', + 'ember-console', + 'ember-env-flags', + 'ember/features' + ]); let emberEnvironment = emberPkgES('ember-environment', SHOULD_ROLLUP); let emberConsole = emberPkgES('ember-console', SHOULD_ROLLUP, ['ember-environment']); let emberMain = emberPkgES('ember'); diff --git a/package.json b/package.json index 18870b49605..84c52054f62 100644 --- a/package.json +++ b/package.json @@ -59,8 +59,10 @@ "devDependencies": { "aws-sdk": "~2.2.43", "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-debug-macros": "^0.0.6", "babel-plugin-feature-flags": "^0.3.1", "babel-plugin-filter-imports": "^0.3.1", + "babel-plugin-minify-dead-code-elimination": "^0.1.4", "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", "babel-plugin-transform-es2015-block-scoping": "^6.23.0", "babel-plugin-transform-es2015-classes": "^6.23.0", diff --git a/packages/container/lib/container.js b/packages/container/lib/container.js index 523512a3971..b95b3850ce1 100644 --- a/packages/container/lib/container.js +++ b/packages/container/lib/container.js @@ -1,4 +1,5 @@ -import { assert, deprecate, runInDebug, isFeatureEnabled } from 'ember-debug'; +import { assert, deprecate } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; /* globals Proxy */ import { dictionary, @@ -10,6 +11,9 @@ import { HAS_NATIVE_PROXY } from 'ember-utils'; import { ENV } from 'ember-environment'; +import { + EMBER_NO_DOUBLE_EXTEND +} from 'ember/features'; const CONTAINER_OVERRIDE = symbol('CONTAINER_OVERRIDE'); export const FACTORY_FOR = symbol('FACTORY_FOR'); @@ -126,7 +130,7 @@ Container.prototype = { lookupFactory(fullName, options) { assert('fullName must be a proper full name', this.registry.validateFullName(fullName)); - deprecate('Using "_lookupFactory" is deprecated. Please use container.factoryFor instead.', !isFeatureEnabled('ember-factory-for'), { id: 'container-lookupFactory', until: '2.13.0', url: 'http://emberjs.com/deprecations/v2.x/#toc_migrating-from-_lookupfactory-to-factoryfor' }); + deprecate('Using "_lookupFactory" is deprecated. Please use container.factoryFor instead.', false, { id: 'container-lookupFactory', until: '2.13.0', url: 'http://emberjs.com/deprecations/v2.x/#toc_migrating-from-_lookupfactory-to-factoryfor' }); return deprecatedFactoryFor(this, this.registry.normalize(fullName), options); }, @@ -143,13 +147,8 @@ Container.prototype = { * of factoryFor, which always returns the registered class. */ [FACTORY_FOR](fullName, options = {}) { - if (isFeatureEnabled('ember-no-double-extend')) { - if (isFeatureEnabled('ember-factory-for')) { - return this.factoryFor(fullName, options); - } else { - /* This throws in case of a poorly designed build */ - throw new Error('If ember-no-double-extend is enabled, ember-factory-for must also be enabled'); - } + if (EMBER_NO_DOUBLE_EXTEND) { + return this.factoryFor(fullName, options); } let factory = this[LOOKUP_FACTORY](fullName, options); if (factory === undefined) { @@ -157,9 +156,9 @@ Container.prototype = { } let manager = new DeprecatedFactoryManager(this, factory, fullName); - runInDebug(() => { + if (DEBUG) { manager = wrapManagerInDeprecationProxy(manager); - }); + } return manager; }, @@ -198,46 +197,8 @@ Container.prototype = { */ ownerInjection() { return { [OWNER]: this.owner }; - } -}; - -/* - * Wrap a factory manager in a proxy which will not permit properties to be - * set on the manager. - */ -function wrapManagerInDeprecationProxy(manager) { - if (HAS_NATIVE_PROXY) { - let validator = { - get(obj, prop) { - if (prop !== 'class' && prop !== 'create') { - throw new Error(`You attempted to access "${prop}" on a factory manager created by container#factoryFor. "${prop}" is not a member of a factory manager."`); - } - - return obj[prop]; - }, - set(obj, prop, value) { - throw new Error(`You attempted to set "${prop}" on a factory manager created by container#factoryFor. A factory manager is a read-only construct.`); - } - }; - - // Note: - // We have to proxy access to the manager here so that private property - // access doesn't cause the above errors to occur. - let m = manager; - let proxiedManager = { - class: m.class, - create(props) { - return m.create(props); - } - }; - - return new Proxy(proxiedManager, validator); - } - - return manager; -} + }, -if (isFeatureEnabled('ember-factory-for')) { /** Given a fullName, return the corresponding factory. The consumer of the factory is responsible for the destruction of any factory instances, as there is no @@ -250,7 +211,7 @@ if (isFeatureEnabled('ember-factory-for')) { @param {String} [options.source] The fullname of the request source (used for local lookup) @return {any} */ - Container.prototype.factoryFor = function _factoryFor(fullName, options = {}) { + factoryFor(fullName, options = {}) { let normalizedName = this.registry.normalize(fullName); assert('fullName must be a proper full name', this.registry.validateFullName(normalizedName)); @@ -275,13 +236,49 @@ if (isFeatureEnabled('ember-factory-for')) { let manager = new FactoryManager(this, factory, fullName, normalizedName); - runInDebug(() => { + if (DEBUG) { manager = wrapManagerInDeprecationProxy(manager); - }); + } this.factoryManagerCache[normalizedName] = manager; return manager; - }; + } +}; + +/* + * Wrap a factory manager in a proxy which will not permit properties to be + * set on the manager. + */ +function wrapManagerInDeprecationProxy(manager) { + if (HAS_NATIVE_PROXY) { + let validator = { + get(obj, prop) { + if (prop !== 'class' && prop !== 'create') { + throw new Error(`You attempted to access "${prop}" on a factory manager created by container#factoryFor. "${prop}" is not a member of a factory manager."`); + } + + return obj[prop]; + }, + set(obj, prop, value) { + throw new Error(`You attempted to set "${prop}" on a factory manager created by container#factoryFor. A factory manager is a read-only construct.`); + } + }; + + // Note: + // We have to proxy access to the manager here so that private property + // access doesn't cause the above errors to occur. + let m = manager; + let proxiedManager = { + class: m.class, + create(props) { + return m.create(props); + } + }; + + return new Proxy(proxiedManager, validator); + } + + return manager; } function isSingleton(container, fullName) { @@ -306,22 +303,8 @@ function lookup(container, fullName, options = {}) { return container.cache[fullName]; } - if (isFeatureEnabled('ember-factory-for')) { - return instantiateFactory(container, fullName, options); - } else { - let factory = deprecatedFactoryFor(container, fullName); - let value = instantiate(factory, {}, container, fullName); - - if (value === undefined) { - return; - } - - if (isSingleton(container, fullName) && options.singleton !== false) { - container.cache[fullName] = value; - } - return value; - } + return instantiateFactory(container, fullName, options); } function isSingletonClass(container, fullName, { instantiate, singleton }) { @@ -388,9 +371,9 @@ function buildInjections() /* container, ...injections */{ } } - runInDebug(() => { + if (DEBUG) { container.registry.validateInjections(injections); - }); + } let markAsDynamic = false; for (let i = 0; i < injections.length; i++) { @@ -493,7 +476,7 @@ function instantiate(factory, props, container, fullName) { validationCache = container.validationCache; - runInDebug(() => { + if (DEBUG) { // Ensure that all lazy injections are valid at instantiation time if (!validationCache[fullName] && typeof factory._lazyInjections === 'function') { lazyInjections = factory._lazyInjections(); @@ -501,7 +484,7 @@ function instantiate(factory, props, container, fullName) { container.registry.validateInjections(lazyInjections); } - }); + } validationCache[fullName] = true; @@ -658,7 +641,7 @@ class FactoryManager { props[NAME_KEY] = this.madeToString || (this.madeToString = this.container.registry.makeToString(this.class, this.fullName)); - runInDebug(() => { + if (DEBUG) { let lazyInjections; let validationCache = this.container.validationCache; // Ensure that all lazy injections are valid at instantiation time @@ -670,7 +653,7 @@ class FactoryManager { } validationCache[this.fullName] = true; - }); + } if (!this.class.create) { throw new Error(`Failed to create an instance of '${this.normalizedName}'. Most likely an improperly defined class or` + ` an invalid module export.`); diff --git a/packages/container/tests/container_test.js b/packages/container/tests/container_test.js index 3d04fc8108d..4033b5eab2e 100644 --- a/packages/container/tests/container_test.js +++ b/packages/container/tests/container_test.js @@ -3,7 +3,7 @@ import { ENV } from 'ember-environment'; import { get } from 'ember-metal'; import { Registry } from '..'; import { factory } from 'internal-test-helpers'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_NO_DOUBLE_EXTEND } from 'ember/features'; import { LOOKUP_FACTORY, FACTORY_FOR } from 'container'; let originalModelInjections; @@ -570,65 +570,6 @@ QUnit.test('A deprecated `container` property is appended to every object instan }, 'Using the injected `container` is deprecated. Please use the `getOwner` helper instead to access the owner of this object.'); }); -// This is testing that container was passed as an option -QUnit.test('A deprecated `container` property is appended to every object instantiated from a non-extendable factory, and a fake container is available during instantiation.', function() { - if (!isFeatureEnabled('ember-factory-for')) { - expect(8); - } else { - expect(1); - ok(true, '[SKIPPED] This will be removed when `factoryFor` lands.'); - } - - let owner = {}; - let registry = new Registry(); - let container = registry.container({ owner }); - - // Define a simple non-extendable factory - function PostController(options) { - this.container = options.container; - } - - PostController.create = function(options) { - ok(options.container, 'fake container has been injected and is available during `create`.'); - - expectDeprecation(() => { - options.container.lookup('abc:one'); - }, 'Using the injected `container` is deprecated. Please use the `getOwner` helper to access the owner of this object and then call `lookup` instead.'); - - expectDeprecation(() => { - options.container.lookupFactory('abc:two'); - }, 'Using the injected `container` is deprecated. Please use the `getOwner` helper to access the owner of this object and then call `_lookupFactory` instead.'); - - // non-deprecated usage of `lookup` and `_lookupFactory` - owner.lookup = function(fullName) { - equal(fullName, 'abc:one', 'lookup on owner called properly'); - }; - owner._lookupFactory = function(fullName) { - equal(fullName, 'abc:two', '_lookupFactory on owner called properly'); - }; - let foundOwner = getOwner(options); - foundOwner.lookup('abc:one'); - foundOwner._lookupFactory('abc:two'); - - return new PostController(options); - }; - - registry.register('controller:post', PostController); - - if (!isFeatureEnabled('ember-factory-for')) { - let postController = container.lookup('controller:post'); - - expectDeprecation(() => { - get(postController, 'container'); - }, 'Using the injected `container` is deprecated. Please use the `getOwner` helper instead to access the owner of this object.'); - - expectDeprecation(() => { - let c = postController.container; - strictEqual(c, container, 'Injected container is now regular (not fake) container, but access is still deprecated.'); - }, 'Using the injected `container` is deprecated. Please use the `getOwner` helper instead to access the owner of this object.'); - } -}); - QUnit.test('An extendable factory can provide `container` upon create, with a deprecation', function(assert) { let registry = new Registry(); let container = registry.container(); @@ -698,107 +639,106 @@ QUnit.test('#[FACTORY_FOR] class is the injected factory', (assert) => { registry.register('component:foo-bar', Component); let factoryManager = container[FACTORY_FOR]('component:foo-bar'); - if (isFeatureEnabled('ember-no-double-extend')) { + if (EMBER_NO_DOUBLE_EXTEND) { assert.deepEqual(factoryManager.class, Component, 'No double extend'); } else { assert.deepEqual(factoryManager.class, lookupFactory('component:foo-bar', container), 'Double extended class'); } }); -if (isFeatureEnabled('ember-factory-for')) { - QUnit.test('#factoryFor must supply a fullname', (assert) => { - let registry = new Registry(); - let container = registry.container(); - assert.throws(() => { - container.factoryFor('chad-bar'); - }, /Invalid Fullname, expected: 'type:name' got: chad-bar/); - }); +QUnit.test('#factoryFor must supply a fullname', (assert) => { + let registry = new Registry(); + let container = registry.container(); + assert.throws(() => { + container.factoryFor('chad-bar'); + }, /Invalid Fullname, expected: 'type:name' got: chad-bar/); +}); - QUnit.test('#factoryFor returns a factory manager', (assert) => { - let registry = new Registry(); - let container = registry.container(); +QUnit.test('#factoryFor returns a factory manager', (assert) => { + let registry = new Registry(); + let container = registry.container(); - let Component = factory(); - registry.register('component:foo-bar', Component); + let Component = factory(); + registry.register('component:foo-bar', Component); - let factoryManager = container.factoryFor('component:foo-bar'); - assert.ok(factoryManager.create); - assert.ok(factoryManager.class); - }); + let factoryManager = container.factoryFor('component:foo-bar'); + assert.ok(factoryManager.create); + assert.ok(factoryManager.class); +}); + +QUnit.test('#factoryFor returns a cached factory manager for the same type', (assert) => { + let registry = new Registry(); + let container = registry.container(); - QUnit.test('#factoryFor returns a cached factory manager for the same type', (assert) => { - let registry = new Registry(); - let container = registry.container(); + let Component = factory(); + registry.register('component:foo-bar', Component); + registry.register('component:baz-bar', Component); - let Component = factory(); - registry.register('component:foo-bar', Component); - registry.register('component:baz-bar', Component); + let factoryManager1 = container.factoryFor('component:foo-bar'); + let factoryManager2 = container.factoryFor('component:foo-bar'); + let factoryManager3 = container.factoryFor('component:baz-bar'); - let factoryManager1 = container.factoryFor('component:foo-bar'); - let factoryManager2 = container.factoryFor('component:foo-bar'); - let factoryManager3 = container.factoryFor('component:baz-bar'); + assert.equal(factoryManager1, factoryManager2, 'cache hit'); + assert.notEqual(factoryManager1, factoryManager3, 'cache miss'); +}); - assert.equal(factoryManager1, factoryManager2, 'cache hit'); - assert.notEqual(factoryManager1, factoryManager3, 'cache miss'); - }); +QUnit.test('#factoryFor class returns the factory function', (assert) => { + let registry = new Registry(); + let container = registry.container(); - QUnit.test('#factoryFor class returns the factory function', (assert) => { - let registry = new Registry(); - let container = registry.container(); + let Component = factory(); + registry.register('component:foo-bar', Component); - let Component = factory(); - registry.register('component:foo-bar', Component); + let factoryManager = container.factoryFor('component:foo-bar'); + assert.deepEqual(factoryManager.class, Component, 'No double extend'); +}); - let factoryManager = container.factoryFor('component:foo-bar'); - assert.deepEqual(factoryManager.class, Component, 'No double extend'); - }); +QUnit.test('#factoryFor instance have a common parent', (assert) => { + let registry = new Registry(); + let container = registry.container(); - QUnit.test('#factoryFor instance have a common parent', (assert) => { - let registry = new Registry(); - let container = registry.container(); + let Component = factory(); + registry.register('component:foo-bar', Component); - let Component = factory(); - registry.register('component:foo-bar', Component); + let factoryManager1 = container.factoryFor('component:foo-bar'); + let factoryManager2 = container.factoryFor('component:foo-bar'); + let instance1 = factoryManager1.create({ foo: 'foo' }); + let instance2 = factoryManager2.create({ bar: 'bar' }); - let factoryManager1 = container.factoryFor('component:foo-bar'); - let factoryManager2 = container.factoryFor('component:foo-bar'); - let instance1 = factoryManager1.create({ foo: 'foo' }); - let instance2 = factoryManager2.create({ bar: 'bar' }); + assert.deepEqual(instance1.constructor, instance2.constructor); +}); - assert.deepEqual(instance1.constructor, instance2.constructor); - }); +QUnit.test('#factoryFor created instances come with instance injections', (assert) => { + let registry = new Registry(); + let container = registry.container(); - QUnit.test('#factoryFor created instances come with instance injections', (assert) => { - let registry = new Registry(); - let container = registry.container(); + let Component = factory(); + let Ajax = factory(); + registry.register('component:foo-bar', Component); + registry.register('util:ajax', Ajax); + registry.injection('component:foo-bar', 'ajax', 'util:ajax'); - let Component = factory(); - let Ajax = factory(); - registry.register('component:foo-bar', Component); - registry.register('util:ajax', Ajax); - registry.injection('component:foo-bar', 'ajax', 'util:ajax'); + let componentFactory = container.factoryFor('component:foo-bar'); + let component = componentFactory.create(); - let componentFactory = container.factoryFor('component:foo-bar'); - let component = componentFactory.create(); + assert.ok(component.ajax); + assert.ok(component.ajax instanceof Ajax); +}); - assert.ok(component.ajax); - assert.ok(component.ajax instanceof Ajax); - }); +QUnit.test('#factoryFor options passed to create clobber injections', (assert) => { + let registry = new Registry(); + let container = registry.container(); - QUnit.test('#factoryFor options passed to create clobber injections', (assert) => { - let registry = new Registry(); - let container = registry.container(); + let Component = factory(); + let Ajax = factory(); + registry.register('component:foo-bar', Component); + registry.register('util:ajax', Ajax); + registry.injection('component:foo-bar', 'ajax', 'util:ajax'); - let Component = factory(); - let Ajax = factory(); - registry.register('component:foo-bar', Component); - registry.register('util:ajax', Ajax); - registry.injection('component:foo-bar', 'ajax', 'util:ajax'); + let componentFactory = container.factoryFor('component:foo-bar'); - let componentFactory = container.factoryFor('component:foo-bar'); + let instrance = componentFactory.create({ ajax: 'fetch' }); - let instrance = componentFactory.create({ ajax: 'fetch' }); + assert.equal(instrance.ajax, 'fetch'); +}); - assert.equal(instrance.ajax, 'fetch'); - }); -} diff --git a/packages/ember-application/lib/system/application.js b/packages/ember-application/lib/system/application.js index 55ce53e5089..18bd9e15001 100644 --- a/packages/ember-application/lib/system/application.js +++ b/packages/ember-application/lib/system/application.js @@ -4,7 +4,8 @@ */ import { dictionary } from 'ember-utils'; import { ENV, environment } from 'ember-environment'; -import { assert, runInDebug, debug, isTesting } from 'ember-debug'; +import { assert, debug, isTesting } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; import { libraries, get, @@ -33,7 +34,7 @@ import { privatize as P } from 'container'; import Engine from './engine'; import { setupApplicationRegistry } from 'ember-glimmer'; import { RouterService } from 'ember-routing'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_ROUTING_ROUTER_SERVICE } from 'ember/features'; let librariesRegistered = false; @@ -339,7 +340,10 @@ const Application = Engine.extend({ } registerLibraries(); - runInDebug(() => logLibraryVersions()); + + if (DEBUG) { + logLibraryVersions(); + } // Start off the number of deferrals at 1. This will be decremented by // the Application's own `boot` method. @@ -1039,7 +1043,7 @@ function commonSetupRegistry(registry) { registry.register(P`-bucket-cache:main`, BucketCache); - if (isFeatureEnabled('ember-routing-router-service')) { + if (EMBER_ROUTING_ROUTER_SERVICE) { registry.register('service:router', RouterService); registry.injection('service:router', 'router', 'router:main'); } @@ -1056,7 +1060,7 @@ function registerLibraries() { } function logLibraryVersions() { - runInDebug(() => { + if (DEBUG) { if (ENV.LOG_VERSION) { // we only need to see this once per Application#init ENV.LOG_VERSION = false; @@ -1074,7 +1078,7 @@ function logLibraryVersions() { } debug('-------------------------------'); } - }); + } } export default Application; diff --git a/packages/ember-application/lib/system/resolver.js b/packages/ember-application/lib/system/resolver.js index b69022d25d9..9297b580989 100644 --- a/packages/ember-application/lib/system/resolver.js +++ b/packages/ember-application/lib/system/resolver.js @@ -5,7 +5,7 @@ import { dictionary } from 'ember-utils'; import { get } from 'ember-metal'; -import { assert, info, runInDebug } from 'ember-debug'; +import { assert, info } from 'ember-debug'; import { String as StringUtils, Object as EmberObject, @@ -13,6 +13,7 @@ import { } from 'ember-runtime'; import validateType from '../utils/validate-type'; import { getTemplate } from 'ember-glimmer'; +import { DEBUG } from 'ember-env-flags'; export const Resolver = EmberObject.extend({ /* @@ -172,11 +173,11 @@ export default EmberObject.extend({ resolved = resolved || this.resolveOther(parsedName); - runInDebug(() => { + if (DEBUG) { if (parsedName.root && parsedName.root.LOG_RESOLVER) { this._logLookup(resolved, parsedName); } - }); + } if (resolved) { validateType(resolved, parsedName); diff --git a/packages/ember-application/tests/system/dependency_injection/default_resolver_test.js b/packages/ember-application/tests/system/dependency_injection/default_resolver_test.js index ebc5633e1aa..0db438ff834 100644 --- a/packages/ember-application/tests/system/dependency_injection/default_resolver_test.js +++ b/packages/ember-application/tests/system/dependency_injection/default_resolver_test.js @@ -1,11 +1,6 @@ /* globals EmberDev */ import { context } from 'ember-environment'; import { run } from 'ember-metal'; -import { - isFeatureEnabled, - getDebugFunction, - setDebugFunction -} from 'ember-debug'; import { Controller, Service, @@ -23,6 +18,7 @@ import { makeBoundHelper as makeHTMLBarsBoundHelper } from 'ember-glimmer'; import { compile } from 'ember-template-compiler'; +import { getDebugFunction, setDebugFunction } from 'ember-debug'; let registry, locator, application, originalLookup, originalInfo; @@ -71,11 +67,9 @@ QUnit.test('the default resolver looks up templates in Ember.TEMPLATES', functio equal(locator.lookupFactory('template:fooBar.baz'), fooBarBazTemplate, 'resolves template:foo_bar.baz'); }); - if (isFeatureEnabled('ember-factory-for')) { - equal(locator.factoryFor('template:foo').class, fooTemplate, 'resolves template:foo'); - equal(locator.factoryFor('template:fooBar').class, fooBarTemplate, 'resolves template:foo_bar'); - equal(locator.factoryFor('template:fooBar.baz').class, fooBarBazTemplate, 'resolves template:foo_bar.baz'); - } + equal(locator.factoryFor('template:foo').class, fooTemplate, 'resolves template:foo'); + equal(locator.factoryFor('template:fooBar').class, fooBarTemplate, 'resolves template:foo_bar'); + equal(locator.factoryFor('template:fooBar.baz').class, fooBarBazTemplate, 'resolves template:foo_bar.baz'); }); QUnit.test('the default resolver looks up basic name as no prefix', function() { @@ -98,9 +92,8 @@ QUnit.test('the default resolver resolves models on the namespace', function() { ignoreDeprecation(() => { detectEqual(application.Post, locator.lookupFactory('model:post'), 'looks up Post model on application'); }); - if (isFeatureEnabled('ember-factory-for')) { - detectEqual(application.Post, locator.factoryFor('model:post').class, 'looks up Post model on application'); - } + + detectEqual(application.Post, locator.factoryFor('model:post').class, 'looks up Post model on application'); }); QUnit.test('the default resolver resolves *:main on the namespace', function() { @@ -109,29 +102,27 @@ QUnit.test('the default resolver resolves *:main on the namespace', function() { ignoreDeprecation(() => { detectEqual(application.FooBar, locator.lookupFactory('foo-bar:main'), 'looks up FooBar type without name on application'); }); - if (isFeatureEnabled('ember-factory-for')) { - detectEqual(application.FooBar, locator.factoryFor('foo-bar:main').class, 'looks up FooBar type without name on application'); - } + + detectEqual(application.FooBar, locator.factoryFor('foo-bar:main').class, 'looks up FooBar type without name on application'); }); -if (isFeatureEnabled('ember-factory-for')) { - QUnit.test('the default resolver resolves container-registered helpers', function() { - let shorthandHelper = makeHelper(() => {}); - let helper = Helper.extend(); +QUnit.test('the default resolver resolves container-registered helpers', function() { + let shorthandHelper = makeHelper(() => {}); + let helper = Helper.extend(); - application.register('helper:shorthand', shorthandHelper); - application.register('helper:complete', helper); + application.register('helper:shorthand', shorthandHelper); + application.register('helper:complete', helper); - let lookedUpShorthandHelper = locator.factoryFor('helper:shorthand').class; + let lookedUpShorthandHelper = locator.factoryFor('helper:shorthand').class; - ok(lookedUpShorthandHelper.isHelperInstance, 'shorthand helper isHelper'); + ok(lookedUpShorthandHelper.isHelperInstance, 'shorthand helper isHelper'); - let lookedUpHelper = locator.factoryFor('helper:complete').class; + let lookedUpHelper = locator.factoryFor('helper:complete').class; + + ok(lookedUpHelper.isHelperFactory, 'complete helper is factory'); + ok(helper.detect(lookedUpHelper), 'looked up complete helper'); +}); - ok(lookedUpHelper.isHelperFactory, 'complete helper is factory'); - ok(helper.detect(lookedUpHelper), 'looked up complete helper'); - }); -} QUnit.test('the default resolver resolves container-registered helpers via lookupFor', function() { let shorthandHelper = makeHelper(() => {}); diff --git a/packages/ember-application/tests/system/dependency_injection/to_string_test.js b/packages/ember-application/tests/system/dependency_injection/to_string_test.js index bb8ebfea983..43aa71f8e34 100644 --- a/packages/ember-application/tests/system/dependency_injection/to_string_test.js +++ b/packages/ember-application/tests/system/dependency_injection/to_string_test.js @@ -4,7 +4,6 @@ import { run } from 'ember-metal'; import Application from '../../../system/application'; import { Object as EmberObject } from 'ember-runtime'; import DefaultResolver from '../../../system/resolver'; -import { isFeatureEnabled } from 'ember-debug'; let originalLookup, App, originalModelInjections; @@ -34,11 +33,7 @@ QUnit.module('Ember.Application Dependency Injection – toString', { QUnit.test('factories', function() { let PostFactory; - if (isFeatureEnabled('ember-factory-for')) { - PostFactory = App.__container__.factoryFor('model:post').class; - } else { - PostFactory = App.__container__.lookupFactory('model:post'); - } + PostFactory = App.__container__.factoryFor('model:post').class; equal(PostFactory.toString(), 'App.Post', 'expecting the model to be post'); }); diff --git a/packages/ember-debug/lib/index.js b/packages/ember-debug/lib/index.js index a015cf5ce51..ebe3e2b05cd 100644 --- a/packages/ember-debug/lib/index.js +++ b/packages/ember-debug/lib/index.js @@ -20,7 +20,6 @@ export let debugFunctions = { debug() {}, deprecate() {}, deprecateFunc(...args) { return args[args.length - 1]; }, - runInDebug() {}, debugSeal() {}, debugFreeze() {} }; diff --git a/packages/ember-glimmer/lib/components/link-to.js b/packages/ember-glimmer/lib/components/link-to.js index 75726c1c190..780b8f03764 100644 --- a/packages/ember-glimmer/lib/components/link-to.js +++ b/packages/ember-glimmer/lib/components/link-to.js @@ -307,7 +307,7 @@ */ import Logger from 'ember-console'; -import { assert, deprecate, runInDebug } from 'ember-debug'; +import { assert, deprecate } from 'ember-debug'; import { get, computed, @@ -321,7 +321,7 @@ import { import { isSimpleClick } from 'ember-views'; import layout from '../templates/link-to'; import EmberComponent, { HAS_BLOCK } from '../component'; - +import { DEBUG } from 'ember-env-flags'; /** `Ember.LinkComponent` renders an element whose `click` event triggers a @@ -710,7 +710,7 @@ const LinkComponent = EmberComponent.extend({ let routing = get(this, '_routing'); let queryParams = get(this, 'queryParams.values'); - runInDebug(() => { + if (DEBUG) { /* * Unfortunately, to get decent error messages, we need to do this. * In some future state we should be able to use a "feature flag" @@ -727,7 +727,7 @@ const LinkComponent = EmberComponent.extend({ } catch (e) { assert('You attempted to define a `{{link-to "' + qualifiedRouteName + '"}}` but did not pass the parameters required for generating its dynamic segments. ' + e.message); } - }); + } return routing.generateURL(qualifiedRouteName, models, queryParams); }), diff --git a/packages/ember-glimmer/lib/environment.js b/packages/ember-glimmer/lib/environment.js index c860e4d16fc..97047a7998f 100644 --- a/packages/ember-glimmer/lib/environment.js +++ b/packages/ember-glimmer/lib/environment.js @@ -1,6 +1,8 @@ import { guidFor, OWNER } from 'ember-utils'; import { Cache } from 'ember-metal'; -import { assert, warn, runInDebug, isFeatureEnabled } from 'ember-debug'; +import { assert, warn } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; +import { EMBER_NO_DOUBLE_EXTEND } from 'ember/features'; import { lookupPartial, hasPartial, @@ -128,7 +130,9 @@ export default class Environment extends GlimmerEnvironment { '-get-dynamic-var': getDynamicVar }; - runInDebug(() => this.debugStack = new DebugStack()); + if (DEBUG) { + this.debugStack = new DebugStack() + } } macros() { @@ -204,32 +208,18 @@ export default class Environment extends GlimmerEnvironment { let blockMeta = symbolTable.getMeta(); let owner = blockMeta.owner; let options = blockMeta.moduleName && { source: `template:${blockMeta.moduleName}` } || {}; - - if (isFeatureEnabled('ember-factory-for')) { - let helperFactory = owner[FACTORY_FOR](`helper:${name}`, options) || owner[FACTORY_FOR](`helper:${name}`); - - // TODO: try to unify this into a consistent protocol to avoid wasteful closure allocations - if (helperFactory.class.isHelperInstance) { - return (vm, args) => SimpleHelperReference.create(helperFactory.class.compute, args); - } else if (helperFactory.class.isHelperFactory) { - if (!isFeatureEnabled('ember-no-double-extend')) { - helperFactory = helperFactory.create(); - } - return (vm, args) => ClassBasedHelperReference.create(helperFactory, vm, args); - } else { - throw new Error(`${name} is not a helper`); + let helperFactory = owner[FACTORY_FOR](`helper:${name}`, options) || owner[FACTORY_FOR](`helper:${name}`); + + // TODO: try to unify this into a consistent protocol to avoid wasteful closure allocations + if (helperFactory.class.isHelperInstance) { + return (vm, args) => SimpleHelperReference.create(helperFactory.class.compute, args); + } else if (helperFactory.class.isHelperFactory) { + if (!EMBER_NO_DOUBLE_EXTEND) { + helperFactory = helperFactory.create(); } + return (vm, args) => ClassBasedHelperReference.create(helperFactory, vm, args); } else { - let helperFactory = owner.lookup(`helper:${name}`, options) || owner.lookup(`helper:${name}`); - - // TODO: try to unify this into a consistent protocol to avoid wasteful closure allocations - if (helperFactory.isHelperInstance) { - return (vm, args) => SimpleHelperReference.create(helperFactory.compute, args); - } else if (helperFactory.isHelperFactory) { - return (vm, args) => ClassBasedHelperReference.create(helperFactory, vm, args); - } else { - throw new Error(`${name} is not a helper`); - } + throw new Error(`${name} is not a helper`); } } @@ -294,7 +284,7 @@ export default class Environment extends GlimmerEnvironment { } } -runInDebug(() => { +if (DEBUG) { class StyleAttributeManager extends AttributeManager { setAttribute(dom, element, value) { warn(constructStyleDeprecationMessage(value), (() => { @@ -326,4 +316,4 @@ runInDebug(() => { return GlimmerEnvironment.prototype.attributeFor.call(this, element, attribute, isTrusting); }; -}); +} diff --git a/packages/ember-glimmer/lib/helpers/action.js b/packages/ember-glimmer/lib/helpers/action.js index d732069ee9c..bb254cd130e 100644 --- a/packages/ember-glimmer/lib/helpers/action.js +++ b/packages/ember-glimmer/lib/helpers/action.js @@ -12,7 +12,8 @@ import { import { UnboundReference } from '../utils/references'; import { EvaluatedPositionalArgs } from '@glimmer/runtime'; import { isConst } from '@glimmer/reference'; -import { runInDebug, assert } from 'ember-debug'; +import { assert } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; export const INVOKE = symbol('INVOKE'); export const ACTION = symbol('ACTION'); @@ -343,9 +344,9 @@ function makeArgsProcessor(valuePathRef, actionArgsRef) { function makeDynamicClosureAction(context, targetRef, actionRef, processArgs, debugKey) { // We don't allow undefined/null values, so this creates a throw-away action to trigger the assertions - runInDebug(function() { + if (DEBUG) { makeClosureAction(context, targetRef.value(), actionRef.value(), processArgs, debugKey); - }); + } return function(...args) { return makeClosureAction(context, targetRef.value(), actionRef.value(), processArgs, debugKey)(...args); diff --git a/packages/ember-glimmer/lib/helpers/component.js b/packages/ember-glimmer/lib/helpers/component.js index 02ca10030bb..c9c67da18d0 100644 --- a/packages/ember-glimmer/lib/helpers/component.js +++ b/packages/ember-glimmer/lib/helpers/component.js @@ -14,7 +14,8 @@ import { EvaluatedPositionalArgs, isComponentDefinition } from '@glimmer/runtime'; -import { assert, runInDebug } from 'ember-debug'; +import { assert } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; /** The `{{component}}` helper lets you add instances of `Ember.Component` to a @@ -212,9 +213,9 @@ let EMPTY_BLOCKS = { inverse: null }; -runInDebug(() => { +if (DEBUG) { EMPTY_BLOCKS = Object.freeze(EMPTY_BLOCKS); -}); +} function curryArgs(definition, newArgs) { let { args, ComponentClass } = definition; diff --git a/packages/ember-glimmer/lib/syntax/abstract-manager.js b/packages/ember-glimmer/lib/syntax/abstract-manager.js index 94c0b6e6885..9674a5e563c 100644 --- a/packages/ember-glimmer/lib/syntax/abstract-manager.js +++ b/packages/ember-glimmer/lib/syntax/abstract-manager.js @@ -1,10 +1,10 @@ -import { runInDebug } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; class AbstractManager { } -runInDebug(() => { +if (DEBUG) { AbstractManager.prototype._pushToDebugStack = function(name, environment) { this.debugStack = environment.debugStack; this.debugStack.push(name); @@ -14,6 +14,6 @@ runInDebug(() => { this.debugStack = environment.debugStack; this.debugStack.pushEngine(name); }; -}); +} export default AbstractManager; diff --git a/packages/ember-glimmer/lib/syntax/curly-component.js b/packages/ember-glimmer/lib/syntax/curly-component.js index 0900650c8b3..a3f6aafa2a3 100644 --- a/packages/ember-glimmer/lib/syntax/curly-component.js +++ b/packages/ember-glimmer/lib/syntax/curly-component.js @@ -20,9 +20,9 @@ import { _instrumentStart } from 'ember-metal'; import { - assert, - runInDebug + assert } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; import { dispatchLifeCycleHook, setViewElement @@ -65,7 +65,7 @@ function processComponentInitializationAssertions(component, props) { } export function validatePositionalParameters(named, positional, positionalParamsDefinition) { - runInDebug(() => { + if (DEBUG) { if (!named || !positional || !positional.length) { return; } @@ -88,7 +88,7 @@ export function validatePositionalParameters(named, positional, positionalParams ); } } - }); + } } function aliasIdToElementId(args, props) { @@ -175,7 +175,9 @@ class CurlyComponentManager extends AbstractManager { } create(environment, definition, args, dynamicScope, callerSelfRef, hasBlock) { - runInDebug(() => this._pushToDebugStack(`component:${definition.name}`, environment)); + if (DEBUG) { + this._pushToDebugStack(`component:${definition.name}`, environment) + } let parentView = dynamicScope.view; @@ -220,9 +222,9 @@ class CurlyComponentManager extends AbstractManager { bucket.classRef = args.named.get('class'); } - runInDebug(() => { + if (DEBUG) { processComponentInitializationAssertions(component, props); - }); + } if (environment.isInteractive && component.tagName !== '') { component.trigger('willRender'); @@ -299,7 +301,9 @@ class CurlyComponentManager extends AbstractManager { bucket.component[BOUNDS] = bounds; bucket.finalize(); - runInDebug(() => this.debugStack.pop()); + if (DEBUG) { + this.debugStack.pop(); + } } getTag({ component }) { @@ -317,7 +321,9 @@ class CurlyComponentManager extends AbstractManager { update(bucket, _, dynamicScope) { let { component, args, argsRevision, environment } = bucket; - runInDebug(() => this._pushToDebugStack(component._debugContainerKey, environment)); + if (DEBUG) { + this._pushToDebugStack(component._debugContainerKey, environment) + } bucket.finalizer = _instrumentStart('render.component', rerenderInstrumentDetails, component); @@ -346,7 +352,9 @@ class CurlyComponentManager extends AbstractManager { didUpdateLayout(bucket) { bucket.finalize(); - runInDebug(() => this.debugStack.pop()); + if (DEBUG) { + this.debugStack.pop(); + } } didUpdate({ component, environment }) { @@ -367,7 +375,9 @@ class TopComponentManager extends CurlyComponentManager { create(environment, definition, args, dynamicScope, currentScope, hasBlock) { let component = definition.ComponentClass.create(); - runInDebug(() => this._pushToDebugStack(component._debugContainerKey, environment)); + if (DEBUG) { + this._pushToDebugStack(component._debugContainerKey, environment) + } let finalizer = _instrumentStart('render.component', initialRenderInstrumentDetails, component); @@ -386,9 +396,9 @@ class TopComponentManager extends CurlyComponentManager { } } - runInDebug(() => { + if (DEBUG) { processComponentInitializationAssertions(component, {}); - }); + } return new ComponentStateBucket(environment, component, args, finalizer); } diff --git a/packages/ember-glimmer/lib/syntax/mount.js b/packages/ember-glimmer/lib/syntax/mount.js index b20f6b5618c..fa8b923d6a8 100644 --- a/packages/ember-glimmer/lib/syntax/mount.js +++ b/packages/ember-glimmer/lib/syntax/mount.js @@ -6,12 +6,13 @@ import { ComponentDefinition } from '@glimmer/runtime'; import { UNDEFINED_REFERENCE } from '@glimmer/reference'; -import { assert, runInDebug } from 'ember-debug'; +import { assert } from 'ember-debug'; import { RootReference } from '../utils/references'; import { generateControllerFactory } from 'ember-routing'; import { OutletLayoutCompiler } from './outlet'; import { FACTORY_FOR } from 'container'; import AbstractManager from './abstract-manager'; +import { DEBUG } from 'ember-env-flags'; function dynamicEngineFor(vm, symbolTable) { let env = vm.env; @@ -90,7 +91,7 @@ class DynamicEngineReference { `Invalid engine name '${nameOrDef}' specified, engine name must be either a string, null or undefined.`, nameOrDef === null || nameOrDef === undefined ); - + return null; } } @@ -102,7 +103,9 @@ class MountManager extends AbstractManager { } create(environment, { name }, args, dynamicScope) { - runInDebug(() => this._pushEngineToDebugStack(`engine:${name}`, environment)); + if (DEBUG) { + this._pushEngineToDebugStack(`engine:${name}`, environment) + } dynamicScope.outletState = UNDEFINED_REFERENCE; @@ -135,7 +138,9 @@ class MountManager extends AbstractManager { didCreateElement() {} didRenderLayout() { - runInDebug(() => this.debugStack.pop()); + if (DEBUG) { + this.debugStack.pop() + } } didCreate(state) {} diff --git a/packages/ember-glimmer/lib/syntax/outlet.js b/packages/ember-glimmer/lib/syntax/outlet.js index 45536deb317..9fb4d3911e6 100644 --- a/packages/ember-glimmer/lib/syntax/outlet.js +++ b/packages/ember-glimmer/lib/syntax/outlet.js @@ -7,7 +7,7 @@ import { ComponentDefinition, CompiledArgs } from '@glimmer/runtime'; -import { runInDebug } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; import { _instrumentStart } from 'ember-metal'; import { RootReference } from '../utils/references'; import AbstractManager from './abstract-manager'; @@ -171,7 +171,9 @@ class OutletComponentManager extends AbstractManager { } create(environment, definition, args, dynamicScope) { - runInDebug(() => this._pushToDebugStack(`template:${definition.template.meta.moduleName}`, environment)); + if (DEBUG) { + this._pushToDebugStack(`template:${definition.template.meta.moduleName}`, environment); + } let outletStateReference = dynamicScope.outletState = dynamicScope.outletState.get('outlets').get(definition.outletName); let outletState = outletStateReference.value(); @@ -197,7 +199,9 @@ class OutletComponentManager extends AbstractManager { didRenderLayout(bucket) { bucket.finalize(); - runInDebug(() => this.debugStack.pop()); + if (DEBUG) { + this.debugStack.pop(); + } } didCreateElement() {} @@ -211,8 +215,9 @@ const MANAGER = new OutletComponentManager(); class TopLevelOutletComponentManager extends OutletComponentManager { create(environment, definition, args, dynamicScope) { - runInDebug(() => this._pushToDebugStack(`template:${definition.template.meta.moduleName}`, environment)); - + if (DEBUG) { + this._pushToDebugStack(`template:${definition.template.meta.moduleName}`, environment); + } return new StateBucket(dynamicScope.outletState.value()); } diff --git a/packages/ember-glimmer/lib/syntax/render.js b/packages/ember-glimmer/lib/syntax/render.js index 4a397f6b040..67d066a232c 100644 --- a/packages/ember-glimmer/lib/syntax/render.js +++ b/packages/ember-glimmer/lib/syntax/render.js @@ -6,7 +6,8 @@ import { ComponentDefinition } from '@glimmer/runtime'; import { ConstReference, isConst } from '@glimmer/reference'; -import { assert, runInDebug } from 'ember-debug'; +import { assert } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; import { RootReference } from '../utils/references'; import { generateController, generateControllerFactory } from 'ember-routing'; import { OutletLayoutCompiler } from './outlet'; @@ -159,18 +160,20 @@ class AbstractRenderManager extends AbstractManager { didUpdate() {} } -runInDebug(() => { +if (DEBUG) { AbstractRenderManager.prototype.didRenderLayout = function() { this.debugStack.pop(); }; -}); +} class SingletonRenderManager extends AbstractRenderManager { create(environment, definition, args, dynamicScope) { let { name, env } = definition; let controller = env.owner.lookup(`controller:${name}`) || generateController(env.owner, name); - runInDebug(() => this._pushToDebugStack(`controller:${name} (with the render helper)`, environment)); + if (DEBUG) { + this._pushToDebugStack(`controller:${name} (with the render helper)`, environment); + } if (dynamicScope.rootOutletState) { dynamicScope.outletState = dynamicScope.rootOutletState.getOrphan(name); @@ -191,7 +194,9 @@ class NonSingletonRenderManager extends AbstractRenderManager { let factory = controllerFactory || generateControllerFactory(env.owner, name); let controller = factory.create({ model: modelRef.value() }); - runInDebug(() => this._pushToDebugStack(`controller:${name} (with the render helper)`, environment)); + if (DEBUG) { + this._pushToDebugStack(`controller:${name} (with the render helper)`, environment); + } if (dynamicScope.rootOutletState) { dynamicScope.outletState = dynamicScope.rootOutletState.getOrphan(name); diff --git a/packages/ember-glimmer/lib/utils/debug-stack.js b/packages/ember-glimmer/lib/utils/debug-stack.js index f71da740a79..13c84d2d690 100644 --- a/packages/ember-glimmer/lib/utils/debug-stack.js +++ b/packages/ember-glimmer/lib/utils/debug-stack.js @@ -1,8 +1,8 @@ -import { runInDebug } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; let DebugStack; -runInDebug(function() { +if (DEBUG) { class Element { constructor(name) { this.name = name; @@ -61,6 +61,6 @@ runInDebug(function() { } } }; -}); +} export default DebugStack; diff --git a/packages/ember-glimmer/lib/utils/references.js b/packages/ember-glimmer/lib/utils/references.js index 060845466f8..bb0d7a37f1a 100644 --- a/packages/ember-glimmer/lib/utils/references.js +++ b/packages/ember-glimmer/lib/utils/references.js @@ -27,7 +27,12 @@ import { } from '@glimmer/runtime'; import emberToBool from './to-bool'; import { RECOMPUTE_TAG } from '../helper'; -import { isFeatureEnabled, runInDebug } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; +import { + EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER, + EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER, + MANDATORY_SETTER +} from 'ember/features'; export const UPDATE = symbol('UPDATE'); @@ -86,8 +91,8 @@ export class RootReference extends ConstReference { let TwoWayFlushDetectionTag; -if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || - isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { +if (EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER || + EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { TwoWayFlushDetectionTag = class { constructor(tag, key, ref) { this.tag = tag; @@ -140,14 +145,14 @@ export class RootPropertyReference extends PropertyReference { this._parentValue = parentValue; this._propertyKey = propertyKey; - if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || - isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER || + EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { this.tag = new TwoWayFlushDetectionTag(tagForProperty(parentValue, propertyKey), propertyKey, this); } else { this.tag = tagForProperty(parentValue, propertyKey); } - if (isFeatureEnabled('mandatory-setter')) { + if (MANDATORY_SETTER) { watchKey(parentValue, propertyKey); } } @@ -155,8 +160,8 @@ export class RootPropertyReference extends PropertyReference { compute() { let { _parentValue, _propertyKey } = this; - if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || - isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER || + EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { this.tag.didCompute(_parentValue); } @@ -179,8 +184,8 @@ export class NestedPropertyReference extends PropertyReference { this._parentObjectTag = parentObjectTag; this._propertyKey = propertyKey; - if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || - isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER || + EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { let tag = combine([parentReferenceTag, parentObjectTag]); this.tag = new TwoWayFlushDetectionTag(tag, propertyKey, this); } else { @@ -200,12 +205,12 @@ export class NestedPropertyReference extends PropertyReference { } if (typeof parentValue === 'object' && parentValue) { - if (isFeatureEnabled('mandatory-setter')) { + if (MANDATORY_SETTER) { watchKey(parentValue, _propertyKey); } - if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || - isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER || + EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { this.tag.didCompute(parentValue); } @@ -290,12 +295,12 @@ export class SimpleHelperReference extends CachedReference { let positionalValue = positional.value(); let namedValue = named.value(); - runInDebug(() => { + if (DEBUG) { if (HAS_NATIVE_WEAKMAP) { Object.freeze(positionalValue); Object.freeze(namedValue); } - }); + } let result = helper(positionalValue, namedValue); @@ -327,12 +332,12 @@ export class SimpleHelperReference extends CachedReference { let positionalValue = positional.value(); let namedValue = named.value(); - runInDebug(() => { + if (DEBUG) { if (HAS_NATIVE_WEAKMAP) { Object.freeze(positionalValue); Object.freeze(namedValue); } - }); + } return helper(positionalValue, namedValue); } @@ -359,12 +364,12 @@ export class ClassBasedHelperReference extends CachedReference { let positionalValue = positional.value(); let namedValue = named.value(); - runInDebug(() => { + if (DEBUG) { if (HAS_NATIVE_WEAKMAP) { Object.freeze(positionalValue); Object.freeze(namedValue); } - }); + } return instance.compute(positionalValue, namedValue); } diff --git a/packages/ember-glimmer/tests/integration/application/rendering-test.js b/packages/ember-glimmer/tests/integration/application/rendering-test.js index 37133e9c18a..708f9f138e7 100644 --- a/packages/ember-glimmer/tests/integration/application/rendering-test.js +++ b/packages/ember-glimmer/tests/integration/application/rendering-test.js @@ -2,8 +2,8 @@ import { Controller } from 'ember-runtime'; import { moduleFor, ApplicationTest } from '../../utils/test-case'; import { strip } from '../../utils/abstract-test-case'; import { Route } from 'ember-routing'; -import { isFeatureEnabled } from 'ember-debug'; import { Component } from 'ember-glimmer'; +import { EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER } from 'ember/features'; moduleFor('Application test: rendering', class extends ApplicationTest { @@ -400,7 +400,7 @@ moduleFor('Application test: rendering', class extends ApplicationTest { let expectedBacktrackingMessage = /modified "model\.name" twice on \[object Object\] in a single render\. It was rendered in "template:routeWithError" and modified in "component:x-foo"/; - if (isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { expectDeprecation(expectedBacktrackingMessage); return this.visit('/routeWithError'); } else { diff --git a/packages/ember-glimmer/tests/integration/components/append-test.js b/packages/ember-glimmer/tests/integration/components/append-test.js index bfd89001d3f..b94d3bb52e9 100644 --- a/packages/ember-glimmer/tests/integration/components/append-test.js +++ b/packages/ember-glimmer/tests/integration/components/append-test.js @@ -3,7 +3,6 @@ import { jQuery } from 'ember-views'; import { moduleFor, RenderingTest } from '../../utils/test-case'; import { Component, compile } from '../../utils/helpers'; import { strip } from '../../utils/abstract-test-case'; -import { isFeatureEnabled } from 'ember-debug'; class AbstractAppendTest extends RenderingTest { @@ -137,11 +136,7 @@ class AbstractAppendTest extends RenderingTest { let XParent; - if (isFeatureEnabled('ember-factory-for')) { - XParent = this.owner.factoryFor('component:x-parent'); - } else { - XParent = this.owner._lookupFactory('component:x-parent'); - } + XParent = this.owner.factoryFor('component:x-parent'); this.component = XParent.create({ foo: 'zomg' }); @@ -288,11 +283,7 @@ class AbstractAppendTest extends RenderingTest { let XParent; - if (isFeatureEnabled('ember-factory-for')) { - XParent = this.owner.factoryFor('component:x-parent'); - } else { - XParent = this.owner._lookupFactory('component:x-parent'); - } + XParent = this.owner.factoryFor('component:x-parent'); this.component = XParent.create({ foo: 'zomg' }); @@ -365,13 +356,8 @@ class AbstractAppendTest extends RenderingTest { let First, Second; - if (isFeatureEnabled('ember-factory-for')) { - First = this.owner.factoryFor('component:x-first'); - Second = this.owner.factoryFor('component:x-second'); - } else { - First = this.owner._lookupFactory('component:x-first'); - Second = this.owner._lookupFactory('component:x-second'); - } + First = this.owner.factoryFor('component:x-first'); + Second = this.owner.factoryFor('component:x-second'); let first = First.create({ foo: 'foo' }); let second = Second.create({ bar: 'bar' }); @@ -452,12 +438,7 @@ class AbstractAppendTest extends RenderingTest { didInsertElement() { element1 = this.element; - let SecondComponent; - if (isFeatureEnabled('ember-factory-for')) { - SecondComponent = owner.factoryFor('component:second-component'); - } else { - SecondComponent = owner._lookupFactory('component:second-component'); - } + let SecondComponent = owner.factoryFor('component:second-component'); append(SecondComponent.create()); } @@ -474,13 +455,7 @@ class AbstractAppendTest extends RenderingTest { }) }); - let FirstComponent; - - if (isFeatureEnabled('ember-factory-for')) { - FirstComponent = this.owner.factoryFor('component:first-component'); - } else { - FirstComponent = this.owner._lookupFactory('component:first-component'); - } + let FirstComponent = this.owner.factoryFor('component:first-component'); this.runTask(() => append(FirstComponent.create())); @@ -507,13 +482,8 @@ class AbstractAppendTest extends RenderingTest { didInsertElement() { element1 = this.element; - let OtherRoot; - if (isFeatureEnabled('ember-factory-for')) { - OtherRoot = owner.factoryFor('component:other-root'); - } else { - OtherRoot = owner._lookupFactory('component:other-root'); - } + let OtherRoot = owner.factoryFor('component:other-root'); this._instance = OtherRoot.create({ didInsertElement() { @@ -541,13 +511,8 @@ class AbstractAppendTest extends RenderingTest { didInsertElement() { element3 = this.element; - let OtherRoot; - if (isFeatureEnabled('ember-factory-for')) { - OtherRoot = owner.factoryFor('component:other-root'); - } else { - OtherRoot = owner._lookupFactory('component:other-root'); - } + let OtherRoot = owner.factoryFor('component:other-root'); this._instance = OtherRoot.create({ didInsertElement() { @@ -639,13 +604,7 @@ moduleFor('appendTo: a selector', class extends AbstractAppendTest { template: 'FOO BAR!' }); - let FooBar; - - if (isFeatureEnabled('ember-factory-for')) { - FooBar = this.owner.factoryFor('component:foo-bar'); - } else { - FooBar = this.owner._lookupFactory('component:foo-bar'); - } + let FooBar = this.owner.factoryFor('component:foo-bar'); this.component = FooBar.create(); diff --git a/packages/ember-glimmer/tests/integration/components/curly-components-test.js b/packages/ember-glimmer/tests/integration/components/curly-components-test.js index 3061d50c49a..e9303d7bb0c 100644 --- a/packages/ember-glimmer/tests/integration/components/curly-components-test.js +++ b/packages/ember-glimmer/tests/integration/components/curly-components-test.js @@ -7,7 +7,6 @@ import { computed, run } from 'ember-metal'; -import { isFeatureEnabled } from 'ember-debug'; import { Object as EmberObject, A as emberA, @@ -23,6 +22,10 @@ import { equalsElement, styles } from '../../utils/test-helpers'; +import { + EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER, + MANDATORY_SETTER +} from 'ember/features'; moduleFor('Components test: curly components', class extends RenderingTest { @@ -2135,7 +2138,7 @@ moduleFor('Components test: curly components', class extends RenderingTest { let expectedBacktrackingMessage = /modified "value" twice on <\(.+> in a single render\. It was rendered in "component:x-middle" and modified in "component:x-inner"/; - if (isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { expectDeprecation(expectedBacktrackingMessage); this.runTask(() => outer.set('value', 2)); } else { @@ -2187,7 +2190,7 @@ moduleFor('Components test: curly components', class extends RenderingTest { let expectedBacktrackingMessage = /modified "wrapper\.content" twice on in a single render\. It was rendered in "component:x-outer" and modified in "component:x-inner"/; - if (isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { expectDeprecation(expectedBacktrackingMessage); this.render('{{x-outer}}'); } else { @@ -2339,7 +2342,7 @@ moduleFor('Components test: curly components', class extends RenderingTest { this.assertText('initial value - initial value'); - if (isFeatureEnabled('mandatory-setter')) { + if (MANDATORY_SETTER) { expectAssertion(() => { component.bar = 'foo-bar'; }, /You must use Ember\.set\(\) to set the `bar` property \(of .+\) to `foo-bar`\./); diff --git a/packages/ember-glimmer/tests/integration/components/dynamic-components-test.js b/packages/ember-glimmer/tests/integration/components/dynamic-components-test.js index e66625415ea..93b467e515d 100644 --- a/packages/ember-glimmer/tests/integration/components/dynamic-components-test.js +++ b/packages/ember-glimmer/tests/integration/components/dynamic-components-test.js @@ -2,7 +2,7 @@ import { set, computed } from 'ember-metal'; import { Component } from '../../utils/helpers'; import { strip } from '../../utils/abstract-test-case'; import { moduleFor, RenderingTest } from '../../utils/test-case'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER } from 'ember/features'; moduleFor('Components test: dynamic components', class extends RenderingTest { @@ -731,7 +731,7 @@ moduleFor('Components test: dynamic components', class extends RenderingTest { let expectedBacktrackingMessage = /modified "person\.name" twice on \[object Object\] in a single render\. It was rendered in "component:outer-component" and modified in "component:error-component"/; - if (isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { expectDeprecation(expectedBacktrackingMessage); this.render('{{component componentName}}', { componentName: 'outer-component' }); } else { diff --git a/packages/ember-glimmer/tests/integration/event-dispatcher-test.js b/packages/ember-glimmer/tests/integration/event-dispatcher-test.js index 8b55b7f3838..08b15a79429 100644 --- a/packages/ember-glimmer/tests/integration/event-dispatcher-test.js +++ b/packages/ember-glimmer/tests/integration/event-dispatcher-test.js @@ -5,7 +5,7 @@ import { instrumentationReset, run } from 'ember-metal'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_IMPROVED_INSTRUMENTATION } from 'ember/features'; let canDataTransfer = !!document.createEvent('HTMLEvents').dataTransfer; @@ -180,7 +180,7 @@ moduleFor('EventDispatcher#setup', class extends RenderingTest { } }); -if (isFeatureEnabled('ember-improved-instrumentation')) { +if (EMBER_IMPROVED_INSTRUMENTATION) { moduleFor('EventDispatcher - Instrumentation', class extends RenderingTest { teardown() { super.teardown(); diff --git a/packages/ember-glimmer/tests/integration/helpers/closure-action-test.js b/packages/ember-glimmer/tests/integration/helpers/closure-action-test.js index cf473d4c25e..2504fdf96a8 100644 --- a/packages/ember-glimmer/tests/integration/helpers/closure-action-test.js +++ b/packages/ember-glimmer/tests/integration/helpers/closure-action-test.js @@ -5,12 +5,12 @@ import { instrumentationSubscribe, instrumentationUnsubscribe } from 'ember-metal'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_IMPROVED_INSTRUMENTATION } from 'ember/features'; import { RenderingTest, moduleFor } from '../../utils/test-case'; import { strip } from '../../utils/abstract-test-case'; import { Component, INVOKE } from '../../utils/helpers'; -if (isFeatureEnabled('ember-improved-instrumentation')) { +if (EMBER_IMPROVED_INSTRUMENTATION) { moduleFor('Helpers test: closure {{action}} improved instrumentation', class extends RenderingTest { subscribe(eventName, options) { diff --git a/packages/ember-glimmer/tests/integration/helpers/element-action-test.js b/packages/ember-glimmer/tests/integration/helpers/element-action-test.js index e6c53e08216..ac3b0e68038 100644 --- a/packages/ember-glimmer/tests/integration/helpers/element-action-test.js +++ b/packages/ember-glimmer/tests/integration/helpers/element-action-test.js @@ -6,7 +6,7 @@ import { instrumentationSubscribe, instrumentationReset } from 'ember-metal'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_IMPROVED_INSTRUMENTATION } from 'ember/features'; import { Object as EmberObject, A as emberA } from 'ember-runtime'; @@ -31,7 +31,7 @@ function getActionIds(element) { return getActionAttributes(element).map(attribute => attribute.slice('data-ember-action-'.length)); } -if (isFeatureEnabled('ember-improved-instrumentation')) { +if (EMBER_IMPROVED_INSTRUMENTATION) { moduleFor('Helpers test: element action instrumentation', class extends RenderingTest { teardown() { super.teardown(); diff --git a/packages/ember-glimmer/tests/integration/helpers/render-test.js b/packages/ember-glimmer/tests/integration/helpers/render-test.js index 8e9476b5c7e..d8c50f8f5a9 100644 --- a/packages/ember-glimmer/tests/integration/helpers/render-test.js +++ b/packages/ember-glimmer/tests/integration/helpers/render-test.js @@ -1,7 +1,7 @@ import { observer, set, computed } from 'ember-metal'; import { Controller } from 'ember-runtime'; import { RenderingTest, moduleFor } from '../../utils/test-case'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER } from 'ember/features'; moduleFor('Helpers test: {{render}}', class extends RenderingTest { ['@test should render given template']() { @@ -451,7 +451,7 @@ moduleFor('Helpers test: {{render}}', class extends RenderingTest { this.registerTemplate('outer', `Hi {{model.name}} | {{render 'inner' model}}`); this.registerTemplate('inner', `Hi {{propertyWithError}}`); - if (isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { expectDeprecation(expectedBacktrackingMessage); this.render(`{{render 'outer' person}}`, { person }); } else { diff --git a/packages/ember-glimmer/tests/integration/mount-test.js b/packages/ember-glimmer/tests/integration/mount-test.js index 824a299fe74..4bfb8c65e9d 100644 --- a/packages/ember-glimmer/tests/integration/mount-test.js +++ b/packages/ember-glimmer/tests/integration/mount-test.js @@ -8,7 +8,7 @@ import { compile, Component } from '../utils/helpers'; import { Controller } from 'ember-runtime'; import { set } from 'ember-metal'; import { Engine, getEngineParent } from 'ember-application'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER } from 'ember/features'; moduleFor('{{mount}} assertions', class extends RenderingTest { ['@test it asserts that only a single param is passed']() { @@ -106,7 +106,7 @@ moduleFor('{{mount}} test', class extends ApplicationTest { let expectedBacktrackingMessage = /modified "person\.name" twice on \[object Object\] in a single render\. It was rendered in "template:route-with-mount" \(in "engine:chat"\) and modified in "component:component-with-backtracking-set" \(in "engine:chat"\)/; - if (isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { expectDeprecation(expectedBacktrackingMessage); return this.visit('/route-with-mount'); } else { diff --git a/packages/ember-glimmer/tests/integration/outlet-test.js b/packages/ember-glimmer/tests/integration/outlet-test.js index 542b8848463..0737836ea9a 100644 --- a/packages/ember-glimmer/tests/integration/outlet-test.js +++ b/packages/ember-glimmer/tests/integration/outlet-test.js @@ -1,18 +1,12 @@ import { RenderingTest, moduleFor } from '../utils/test-case'; import { runAppend } from 'internal-test-helpers'; import { set } from 'ember-metal'; -import { isFeatureEnabled } from 'ember-debug'; moduleFor('outlet view', class extends RenderingTest { constructor() { super(...arguments); - let CoreOutlet; - if (isFeatureEnabled('ember-factory-for')) { - CoreOutlet = this.owner.factoryFor('view:-outlet'); - } else { - CoreOutlet = this.owner._lookupFactory('view:-outlet'); - } + let CoreOutlet = this.owner.factoryFor('view:-outlet'); this.component = CoreOutlet.create(); } diff --git a/packages/ember-glimmer/tests/unit/utils/debug-stack-test.js b/packages/ember-glimmer/tests/unit/utils/debug-stack-test.js index 6ea29d25dc7..ce70d45d941 100644 --- a/packages/ember-glimmer/tests/unit/utils/debug-stack-test.js +++ b/packages/ember-glimmer/tests/unit/utils/debug-stack-test.js @@ -1,7 +1,7 @@ import DebugStack from 'ember-glimmer/utils/debug-stack'; -import { runInDebug } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; -runInDebug(() => { +if (DEBUG) { QUnit.module('Glimmer DebugStack'); QUnit.test('pushing and popping', function(assert) { @@ -29,4 +29,4 @@ runInDebug(() => { assert.equal(item, 'component:top-level-component'); assert.equal(stack.peek(), '"template:application"'); }); -}); +} diff --git a/packages/ember-metal/lib/instrumentation.js b/packages/ember-metal/lib/instrumentation.js index 30d9d9a3859..41f887e8181 100644 --- a/packages/ember-metal/lib/instrumentation.js +++ b/packages/ember-metal/lib/instrumentation.js @@ -2,7 +2,7 @@ /* global console */ import { ENV } from 'ember-environment'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_IMPROVED_INSTRUMENTATION } from 'ember/features'; /** The purpose of the Ember Instrumentation module is @@ -110,7 +110,7 @@ export function instrument(name, _payload, callback, binding) { } let flaggedInstrument; -if (isFeatureEnabled('ember-improved-instrumentation')) { +if (EMBER_IMPROVED_INSTRUMENTATION) { flaggedInstrument = instrument; } else { flaggedInstrument = (name, payload, callback) => callback(); diff --git a/packages/ember-metal/lib/libraries.js b/packages/ember-metal/lib/libraries.js index 8831d464030..408338bddd3 100644 --- a/packages/ember-metal/lib/libraries.js +++ b/packages/ember-metal/lib/libraries.js @@ -1,4 +1,5 @@ -import { warn, isFeatureEnabled } from 'ember-debug'; +import { warn } from 'ember-debug'; +import { EMBER_LIBRARIES_ISREGISTERED } from 'ember/features'; /** Helper class that allows you to register your library with Ember. @@ -62,7 +63,7 @@ Libraries.prototype = { } }; -if (isFeatureEnabled('ember-libraries-isregistered')) { +if (EMBER_LIBRARIES_ISREGISTERED) { Libraries.prototype.isRegistered = function(name) { return !!this._getLibraryByName(name); }; diff --git a/packages/ember-metal/lib/meta.js b/packages/ember-metal/lib/meta.js index ac88b33bcaa..6561fb00dfa 100644 --- a/packages/ember-metal/lib/meta.js +++ b/packages/ember-metal/lib/meta.js @@ -4,7 +4,13 @@ import { symbol } from 'ember-utils'; import { protoMethods as listenerMethods } from './meta_listeners'; -import { runInDebug, assert, isFeatureEnabled } from 'ember-debug'; +import { assert } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; +import { + EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER, + EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER, + MANDATORY_SETTER +} from 'ember/features'; import { removeChainWatcher } from './chains'; @@ -64,8 +70,7 @@ const SOURCE_DESTROYED = 1 << 2; const META_DESTROYED = 1 << 3; const IS_PROXY = 1 << 4; -if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || - isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { +if (EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER || EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { members.lastRendered = ownMap; if (has('ember-debug')) { //https://github.com/emberjs/ember.js/issues/14732 members.lastRenderedReferenceMap = ownMap; @@ -78,7 +83,9 @@ const META_FIELD = '__ember_meta__'; export class Meta { constructor(obj, parentMeta) { - runInDebug(() => counters.metaInstantiated++); + if (DEBUG) { + counters.metaInstantiated++; + } this._cache = undefined; this._weak = undefined; @@ -109,13 +116,12 @@ export class Meta { // inherited, and we can optimize it much better than JS runtimes. this.parent = parentMeta; - if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || - isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER || EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { this._lastRendered = undefined; - runInDebug(() => { + if (DEBUG) { this._lastRenderedReferenceMap = undefined; this._lastRenderedTemplateMap = undefined; - }); + } } this._initializeListeners(); @@ -469,7 +475,7 @@ const EMBER_META_PROPERTY = { descriptor: META_DESC }; -if (isFeatureEnabled('mandatory-setter')) { +if (MANDATORY_SETTER) { Meta.prototype.readInheritedValue = function(key, subkey) { let internalKey = `_${key}`; @@ -509,12 +515,16 @@ if (HAS_NATIVE_WEAKMAP) { let metaStore = new WeakMap(); setMeta = function WeakMap_setMeta(obj, meta) { - runInDebug(() => counters.setCalls++); + if (DEBUG) { + counters.setCalls++; + } metaStore.set(obj, meta); }; peekMeta = function WeakMap_peekMeta(obj) { - runInDebug(() => counters.peekCalls++); + if (DEBUG) { + counters.peekCalls++ + } return metaStore.get(obj); }; @@ -525,7 +535,9 @@ if (HAS_NATIVE_WEAKMAP) { while (pointer) { meta = metaStore.get(pointer); // jshint loopfunc:true - runInDebug(() => counters.peekCalls++); + if (DEBUG) { + counters.peekCalls++; + } // stop if we find a `null` value, since // that means the meta was deleted // any other truthy value is a "real" meta @@ -534,7 +546,9 @@ if (HAS_NATIVE_WEAKMAP) { } pointer = getPrototypeOf(pointer); - runInDebug(() => counters.peakPrototypeWalks++); + if (DEBUG) { + counters.peakPrototypeWalks++; + } } }; } else { @@ -558,7 +572,9 @@ if (HAS_NATIVE_WEAKMAP) { } export function deleteMeta(obj) { - runInDebug(() => counters.deleteCalls++); + if (DEBUG) { + counters.deleteCalls++; + } let meta = peekMeta(obj); if (meta) { @@ -585,7 +601,9 @@ export function deleteMeta(obj) { @return {Object} the meta hash for an object */ export function meta(obj) { - runInDebug(() => counters.metaCalls++); + if (DEBUG) { + counters.metaCalls++; + } let maybeMeta = peekMeta(obj); let parent; diff --git a/packages/ember-metal/lib/mixin.js b/packages/ember-metal/lib/mixin.js index 3ce23789ef6..fa3c7ab5853 100644 --- a/packages/ember-metal/lib/mixin.js +++ b/packages/ember-metal/lib/mixin.js @@ -15,9 +15,9 @@ import { debugSeal, assert, deprecate, - runInDebug, EmberError } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; import { meta as metaFor, peekMeta } from './meta'; import expandProperties from './expand_properties'; import { @@ -153,14 +153,14 @@ function applyConcatenatedProperties(obj, key, value, values) { } } - runInDebug(() => { + if (DEBUG) { // it is possible to use concatenatedProperties with strings (which cannot be frozen) // only freeze objects... if (typeof ret === 'object' && ret !== null) { // prevent mutating `concatenatedProperties` array after it is applied Object.freeze(ret); } - }); + } return ret; } @@ -168,11 +168,11 @@ function applyConcatenatedProperties(obj, key, value, values) { function applyMergedProperties(obj, key, value, values) { let baseValue = values[key] || obj[key]; - runInDebug(() => { + if (DEBUG) { if (isArray(value)) { // use conditional to avoid stringifying every time assert(`You passed in \`${JSON.stringify(value)}\` as the value for \`${key}\` but \`${key}\` cannot be an Array`, false); } - }); + } if (!baseValue) { return value; } diff --git a/packages/ember-metal/lib/properties.js b/packages/ember-metal/lib/properties.js index adc7e8a663d..c1142004723 100644 --- a/packages/ember-metal/lib/properties.js +++ b/packages/ember-metal/lib/properties.js @@ -2,9 +2,10 @@ @module ember-metal */ -import { assert, isFeatureEnabled } from 'ember-debug'; +import { assert } from 'ember-debug'; import { meta as metaFor, peekMeta } from './meta'; import { overrideChains } from './property_events'; +import { MANDATORY_SETTER } from 'ember/features'; // .......................................................... // DESCRIPTOR // @@ -143,7 +144,7 @@ export function defineProperty(obj, keyName, desc, data, meta) { if (desc instanceof Descriptor) { value = desc; - if (isFeatureEnabled('mandatory-setter')) { + if (MANDATORY_SETTER) { if (watching) { Object.defineProperty(obj, keyName, { configurable: true, @@ -162,7 +163,7 @@ export function defineProperty(obj, keyName, desc, data, meta) { if (desc == null) { value = data; - if (isFeatureEnabled('mandatory-setter')) { + if (MANDATORY_SETTER) { if (watching) { meta.writeValues(keyName, data); diff --git a/packages/ember-metal/lib/property_events.js b/packages/ember-metal/lib/property_events.js index 560b6455ca6..9e111856854 100644 --- a/packages/ember-metal/lib/property_events.js +++ b/packages/ember-metal/lib/property_events.js @@ -10,7 +10,10 @@ import { markObjectAsDirty } from './tags'; import ObserverSet from './observer_set'; -import { isFeatureEnabled } from 'ember-debug'; +import { + EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER, + EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER +} from 'ember/features'; import { assertNotRendered } from './transaction'; export let PROPERTY_DID_CHANGE = symbol('PROPERTY_DID_CHANGE'); @@ -112,8 +115,7 @@ function propertyDidChange(obj, keyName, _meta) { markObjectAsDirty(meta, keyName); - if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || - isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER || EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { assertNotRendered(obj, keyName, meta); } } diff --git a/packages/ember-metal/lib/property_set.js b/packages/ember-metal/lib/property_set.js index a161bd94d2a..1492f5b2578 100644 --- a/packages/ember-metal/lib/property_set.js +++ b/packages/ember-metal/lib/property_set.js @@ -1,5 +1,5 @@ import { toString } from 'ember-utils'; -import { assert, isFeatureEnabled, Error as EmberError } from 'ember-debug'; +import { assert, Error as EmberError } from 'ember-debug'; import { _getPath as getPath } from './property_get'; import { propertyWillChange, @@ -13,6 +13,7 @@ import { import { peekMeta } from './meta'; +import { MANDATORY_SETTER } from 'ember/features'; /** Sets the value of a property on an object, respecting computed properties @@ -66,7 +67,7 @@ export function set(obj, keyName, value, tolerant) { } else { propertyWillChange(obj, keyName); - if (isFeatureEnabled('mandatory-setter')) { + if (MANDATORY_SETTER) { setWithMandatorySetter(meta, obj, keyName, value); } else { obj[keyName] = value; @@ -78,7 +79,7 @@ export function set(obj, keyName, value, tolerant) { return value; } -if (isFeatureEnabled('mandatory-setter')) { +if (MANDATORY_SETTER) { var setWithMandatorySetter = (meta, obj, keyName, value) => { if (meta && meta.peekWatching(keyName) > 0) { makeEnumerable(obj, keyName); diff --git a/packages/ember-metal/lib/transaction.js b/packages/ember-metal/lib/transaction.js index b1e41e701a9..256978c3c98 100644 --- a/packages/ember-metal/lib/transaction.js +++ b/packages/ember-metal/lib/transaction.js @@ -1,12 +1,16 @@ import { meta as metaFor } from './meta'; -import { assert, runInDebug, deprecate, isFeatureEnabled } from 'ember-debug'; +import { assert, deprecate } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; +import { + EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER, + EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER +} from 'ember/features'; let runInTransaction, didRender, assertNotRendered; // detect-backtracking-rerender by default is debug build only // detect-glimmer-allow-backtracking-rerender can be enabled in custom builds -if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || - isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { +if (EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER || EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { let counter = 0; let inTransaction = false; let shouldReflush; @@ -15,9 +19,9 @@ if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || runInTransaction = (context, methodName) => { shouldReflush = false; inTransaction = true; - runInDebug(() => { + if (DEBUG) { debugStack = context.env.debugStack; - }); + } context[methodName](); inTransaction = false; counter++; @@ -30,7 +34,7 @@ if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || let lastRendered = meta.writableLastRendered(); lastRendered[key] = counter; - runInDebug(() => { + if (DEBUG) { let referenceMap = meta.writableLastRenderedReferenceMap(); referenceMap[key] = reference; @@ -38,7 +42,7 @@ if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || if (templateMap[key] === undefined) { templateMap[key] = debugStack.peek(); } - }); + } }; assertNotRendered = (object, key, _meta) => { @@ -46,7 +50,7 @@ if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || let lastRendered = meta.readableLastRendered(); if (lastRendered && lastRendered[key] === counter) { - runInDebug(() => { + if (DEBUG) { let templateMap = meta.readableLastRenderedTemplateMap(); let lastRenderedIn = templateMap[key]; let currentlyIn = debugStack.peek(); @@ -69,12 +73,12 @@ if (isFeatureEnabled('ember-glimmer-detect-backtracking-rerender') || let message = `You modified "${label}" twice on ${object} in a single render. It was rendered in ${lastRenderedIn} and modified in ${currentlyIn}. This was unreliable and slow in Ember 1.x and`; - if (isFeatureEnabled('ember-glimmer-allow-backtracking-rerender')) { + if (EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { deprecate(`${message} will be removed in Ember 3.0.`, false, { id: 'ember-views.render-double-modify', until: '3.0.0' }); } else { assert(`${message} is no longer supported. See https://github.com/emberjs/ember.js/issues/13948 for more details.`, false); } - }); + } shouldReflush = true; } diff --git a/packages/ember-metal/lib/watch_key.js b/packages/ember-metal/lib/watch_key.js index 48c93074932..2ce7f5c1f1b 100644 --- a/packages/ember-metal/lib/watch_key.js +++ b/packages/ember-metal/lib/watch_key.js @@ -1,5 +1,5 @@ import { lookupDescriptor } from 'ember-utils'; -import { isFeatureEnabled } from 'ember-debug'; +import { MANDATORY_SETTER } from 'ember/features'; import { meta as metaFor } from './meta'; @@ -31,7 +31,7 @@ export function watchKey(obj, keyName, meta) { obj.willWatchProperty(keyName); } - if (isFeatureEnabled('mandatory-setter')) { + if (MANDATORY_SETTER) { // NOTE: this is dropped for prod + minified builds handleMandatorySetter(m, obj, keyName); } @@ -41,7 +41,7 @@ export function watchKey(obj, keyName, meta) { } -if (isFeatureEnabled('mandatory-setter')) { +if (MANDATORY_SETTER) { let hasOwnProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key); let propertyIsEnumerable = (obj, key) => Object.prototype.propertyIsEnumerable.call(obj, key); @@ -108,7 +108,7 @@ export function unwatchKey(obj, keyName, _meta) { obj.didUnwatchProperty(keyName); } - if (isFeatureEnabled('mandatory-setter')) { + if (MANDATORY_SETTER) { // It is true, the following code looks quite WAT. But have no fear, It // exists purely to improve development ergonomics and is removed from // ember.min.js and ember.prod.js builds. diff --git a/packages/ember-metal/tests/accessors/mandatory_setters_test.js b/packages/ember-metal/tests/accessors/mandatory_setters_test.js index 1fb0a29bf6b..5f717cb66b6 100644 --- a/packages/ember-metal/tests/accessors/mandatory_setters_test.js +++ b/packages/ember-metal/tests/accessors/mandatory_setters_test.js @@ -1,4 +1,4 @@ -import { isFeatureEnabled } from 'ember-debug'; +import { MANDATORY_SETTER } from 'ember/features'; import { get, set, @@ -21,7 +21,7 @@ function hasMetaValue(object, property) { return metaFor(object).hasInValues(property); } -if (isFeatureEnabled('mandatory-setter')) { +if (MANDATORY_SETTER) { QUnit.test('does not assert if property is not being watched', function() { let obj = { someProp: null, diff --git a/packages/ember-metal/tests/libraries_test.js b/packages/ember-metal/tests/libraries_test.js index fb261b7ada2..13974c165f8 100644 --- a/packages/ember-metal/tests/libraries_test.js +++ b/packages/ember-metal/tests/libraries_test.js @@ -1,6 +1,7 @@ /* globals EmberDev */ -import { isFeatureEnabled, getDebugFunction, setDebugFunction } from 'ember-debug'; +import { getDebugFunction, setDebugFunction } from 'ember-debug'; import { Libraries } from '..'; +import { EMBER_LIBRARIES_ISREGISTERED } from 'ember/features'; let libs, registry; let originalWarn = getDebugFunction('warn'); @@ -40,7 +41,7 @@ QUnit.test('only the first registration of a library is stored', function() { equal(registry.length, 1); }); -if (isFeatureEnabled('ember-libraries-isregistered')) { +if (EMBER_LIBRARIES_ISREGISTERED) { QUnit.test('isRegistered returns correct value', function() { expect(3); diff --git a/packages/ember-routing/lib/location/history_location.js b/packages/ember-routing/lib/location/history_location.js index aabc723a3c0..e0f1127d8b9 100644 --- a/packages/ember-routing/lib/location/history_location.js +++ b/packages/ember-routing/lib/location/history_location.js @@ -2,7 +2,7 @@ import { get, set } from 'ember-metal'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_UNIQUE_LOCATION_HISTORY_STATE } from 'ember/features'; import { Object as EmberObject } from 'ember-runtime'; import EmberLocation from './api'; @@ -16,7 +16,7 @@ let popstateFired = false; let _uuid; -if (isFeatureEnabled('ember-unique-location-history-state')) { +if (EMBER_UNIQUE_LOCATION_HISTORY_STATE) { _uuid = function _uuid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r, v; @@ -173,7 +173,7 @@ export default EmberObject.extend({ */ pushState(path) { let state = { path }; - if (isFeatureEnabled('ember-unique-location-history-state')) { + if (EMBER_UNIQUE_LOCATION_HISTORY_STATE) { state.uuid = _uuid(); } @@ -194,7 +194,7 @@ export default EmberObject.extend({ */ replaceState(path) { let state = { path }; - if (isFeatureEnabled('ember-unique-location-history-state')) { + if (EMBER_UNIQUE_LOCATION_HISTORY_STATE) { state.uuid = _uuid(); } diff --git a/packages/ember-routing/lib/system/generate_controller.js b/packages/ember-routing/lib/system/generate_controller.js index d753bf40b28..bf3e9356bc0 100644 --- a/packages/ember-routing/lib/system/generate_controller.js +++ b/packages/ember-routing/lib/system/generate_controller.js @@ -1,6 +1,7 @@ import { get } from 'ember-metal'; import { FACTORY_FOR } from 'container'; -import { runInDebug, info } from 'ember-debug'; +import { info } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; /** @module ember @submodule ember-routing @@ -45,11 +46,11 @@ export default function generateController(owner, controllerName) { let fullName = `controller:${controllerName}`; let instance = owner.lookup(fullName); - runInDebug(() => { + if (DEBUG) { if (get(instance, 'namespace.LOG_ACTIVE_GENERATION')) { info(`generated -> ${fullName}`, { fullName }); } - }); + } return instance; } diff --git a/packages/ember-routing/lib/system/route.js b/packages/ember-routing/lib/system/route.js index a846ea76afa..6c8d8ce2a2c 100644 --- a/packages/ember-routing/lib/system/route.js +++ b/packages/ember-routing/lib/system/route.js @@ -8,7 +8,8 @@ import { run, isEmpty } from 'ember-metal'; -import { assert, runInDebug, info, Error as EmberError, isTesting } from 'ember-debug'; +import { assert, info, Error as EmberError, isTesting } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; import { typeOf, copy, @@ -2288,12 +2289,12 @@ function buildRenderOptions(route, namePassed, isDefaultRender, _name, options) assert(`Could not find "${name}" template, view, or component.`, isDefaultRender || template); - runInDebug(() => { + if (DEBUG) { let LOG_VIEW_LOOKUPS = get(route.router, 'namespace.LOG_VIEW_LOOKUPS'); if (LOG_VIEW_LOOKUPS && !template) { info(`Could not find "${name}" template. Nothing will be rendered`, { fullName: `template:${name}` }); } - }); + } return renderOptions; } diff --git a/packages/ember-routing/lib/system/router.js b/packages/ember-routing/lib/system/router.js index 14c9740d93d..daefe67e494 100644 --- a/packages/ember-routing/lib/system/router.js +++ b/packages/ember-routing/lib/system/router.js @@ -15,7 +15,6 @@ import { } from 'ember-metal'; import { EmberError, - runInDebug, deprecate, assert, info @@ -39,6 +38,7 @@ import { } from '../utils'; import RouterState from './router_state'; import { FACTORY_FOR } from 'container'; +import { DEBUG } from 'ember-env-flags'; /** @module ember @@ -109,11 +109,11 @@ const EmberRouter = EmberObject.extend(Evented, { } }); - runInDebug(() => { + if (DEBUG) { if (get(this, 'namespace.LOG_TRANSITIONS_INTERNAL')) { routerMicrolib.log = Logger.debug; } - }); + } routerMicrolib.map(dsl.generate()); }, @@ -269,11 +269,11 @@ const EmberRouter = EmberObject.extend(Evented, { // less surprising than didTransition being out of sync. run.once(this, this.trigger, 'didTransition'); - runInDebug(() => { + if (DEBUG) { if (get(this, 'namespace').LOG_TRANSITIONS) { Logger.log(`Transitioned into '${EmberRouter._routePath(infos)}'`); } - }); + } }, _setOutlets() { @@ -342,11 +342,11 @@ const EmberRouter = EmberObject.extend(Evented, { willTransition(oldInfos, newInfos, transition) { run.once(this, this.trigger, 'willTransition', transition); - runInDebug(() => { + if (DEBUG) { if (get(this, 'namespace').LOG_TRANSITIONS) { Logger.log(`Preparing to transition from '${EmberRouter._routePath(oldInfos)}' to '${EmberRouter._routePath(newInfos)}'`); } - }); + } }, handleURL(url) { @@ -400,12 +400,12 @@ const EmberRouter = EmberObject.extend(Evented, { updatePaths(this); - runInDebug(() => { + if (DEBUG) { let infos = this._routerMicrolib.currentHandlerInfos; if (get(this, 'namespace').LOG_TRANSITIONS) { Logger.log(`Intermediate-transitioned into '${EmberRouter._routePath(infos)}'`); } - }); + } }, replaceWith() { @@ -602,11 +602,11 @@ const EmberRouter = EmberObject.extend(Evented, { routeOwner.register(fullRouteName, DefaultRoute.extend()); handler = routeOwner.lookup(fullRouteName); - runInDebug(() => { + if (DEBUG) { if (get(this, 'namespace.LOG_ACTIVE_GENERATION')) { info(`generated -> ${fullRouteName}`, { fullName: fullRouteName }); } - }); + } } handler._setRouteName(routeName); diff --git a/packages/ember-routing/tests/location/history_location_test.js b/packages/ember-routing/tests/location/history_location_test.js index 8aef9f09063..67935fb1f4e 100644 --- a/packages/ember-routing/tests/location/history_location_test.js +++ b/packages/ember-routing/tests/location/history_location_test.js @@ -3,7 +3,7 @@ import { run } from 'ember-metal'; import HistoryLocation from '../../location/history_location'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_UNIQUE_LOCATION_HISTORY_STATE } from 'ember/features'; let FakeHistory, HistoryTestLocation, location; @@ -114,7 +114,7 @@ QUnit.test('base URL is removed when retrieving the current pathname', function( location.initState(); }); -if (isFeatureEnabled('ember-unique-location-history-state')) { +if (EMBER_UNIQUE_LOCATION_HISTORY_STATE) { QUnit.test('base URL is preserved when moving around', function() { expect(2); diff --git a/packages/ember-routing/tests/system/controller_for_test.js b/packages/ember-routing/tests/system/controller_for_test.js index 2b8b921dd96..3dad5aabfac 100644 --- a/packages/ember-routing/tests/system/controller_for_test.js +++ b/packages/ember-routing/tests/system/controller_for_test.js @@ -7,7 +7,7 @@ import { import controllerFor from '../../system/controller_for'; import generateController from '../../system/generate_controller'; import { buildOwner } from 'internal-test-helpers'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_NO_DOUBLE_EXTEND } from 'ember/features'; function buildInstance(namespace) { let owner = buildOwner(); @@ -100,7 +100,7 @@ QUnit.test('generateController should return controller:basic if provided', func controller = generateController(appInstance, 'home'); - if (isFeatureEnabled('ember-no-double-extend')) { + if (EMBER_NO_DOUBLE_EXTEND) { ok(controller instanceof BasicController, 'should return base class of controller'); } else { let doubleExtendedFactory; diff --git a/packages/ember-runtime/lib/mixins/container_proxy.js b/packages/ember-runtime/lib/mixins/container_proxy.js index de45a8f8773..850632cc42a 100644 --- a/packages/ember-runtime/lib/mixins/container_proxy.js +++ b/packages/ember-runtime/lib/mixins/container_proxy.js @@ -10,7 +10,6 @@ import { FACTORY_FOR, LOOKUP_FACTORY } from 'container'; -import { isFeatureEnabled } from 'ember-debug'; /** ContainerProxyMixin is used to provide public access to specific @@ -144,51 +143,49 @@ let containerProxyMixin = { if (this.__container__) { run(this.__container__, 'destroy'); } - } -}; + }, -if (isFeatureEnabled('ember-factory-for')) { - /** - Given a fullName return a factory manager. +/** + Given a fullName return a factory manager. - This method returns a manager which can be used for introspection of the - factory's class or for the creation of factory instances with initial - properties. The manager is an object with the following properties: + This method returns a manager which can be used for introspection of the + factory's class or for the creation of factory instances with initial + properties. The manager is an object with the following properties: - * `class` - The registered or resolved class. - * `create` - A function that will create an instance of the class with - any dependencies injected. + * `class` - The registered or resolved class. + * `create` - A function that will create an instance of the class with + any dependencies injected. - For example: + For example: - ```javascript - let owner = Ember.getOwner(otherInstance); - // the owner is commonly the `applicationInstance`, and can be accessed via - // an instance initializer. + ```javascript + let owner = Ember.getOwner(otherInstance); + // the owner is commonly the `applicationInstance`, and can be accessed via + // an instance initializer. - let factory = owner.factoryFor('service:bespoke'); + let factory = owner.factoryFor('service:bespoke'); - factory.class; - // The registered or resolved class. For example when used with an Ember-CLI - // app, this would be the default export from `app/services/bespoke.js`. + factory.class; + // The registered or resolved class. For example when used with an Ember-CLI + // app, this would be the default export from `app/services/bespoke.js`. - let instance = factory.create({ - someProperty: 'an initial property value' - }); - // Create an instance with any injections and the passed options as - // initial properties. - ``` + let instance = factory.create({ + someProperty: 'an initial property value' + }); + // Create an instance with any injections and the passed options as + // initial properties. + ``` - @public - @class ContainerProxyMixin - @method factoryFor - @param {String} fullName - @param {Object} options - @return {FactoryManager} - */ - containerProxyMixin.factoryFor = function ContainerProxyMixin_factoryFor(fullName, options = {}) { + @public + @class ContainerProxyMixin + @method factoryFor + @param {String} fullName + @param {Object} options + @return {FactoryManager} + */ + factoryFor(fullName, options = {}) { return this.__container__.factoryFor(fullName, options); - }; -} + } +}; export default Mixin.create(containerProxyMixin); diff --git a/packages/ember-runtime/lib/system/core_object.js b/packages/ember-runtime/lib/system/core_object.js index 164b70f399d..0c3f8a88973 100644 --- a/packages/ember-runtime/lib/system/core_object.js +++ b/packages/ember-runtime/lib/system/core_object.js @@ -34,7 +34,9 @@ import { } from 'ember-metal'; import ActionHandler from '../mixins/action_handler'; import { validatePropertyInjections } from '../inject'; -import { assert, runInDebug, isFeatureEnabled, Error as EmberError } from 'ember-debug'; +import { assert, Error as EmberError } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; +import { MANDATORY_SETTER } from 'ember/features'; let schedule = run.schedule; let applyMixin = Mixin._apply; @@ -147,7 +149,7 @@ function makeCtor() { if (typeof this.setUnknownProperty === 'function' && !(keyName in this)) { this.setUnknownProperty(keyName, value); } else { - if (isFeatureEnabled('mandatory-setter')) { + if (MANDATORY_SETTER) { defineProperty(this, keyName, null, value); // setup mandatory setter } else { this[keyName] = value; @@ -910,7 +912,7 @@ function injectedPropertyAssertion() { assert('Injected properties are invalid', validatePropertyInjections(this)); } -runInDebug(() => { +if (DEBUG) { /** Provides lookup-time type validation for injected properties. @@ -918,7 +920,7 @@ runInDebug(() => { @method _onLookup */ ClassMixinProps._onLookup = injectedPropertyAssertion; -}); +} /** Returns a hash of property names and container names that injected diff --git a/packages/ember-runtime/lib/system/object.js b/packages/ember-runtime/lib/system/object.js index 971933c2e48..6a3c39979bb 100644 --- a/packages/ember-runtime/lib/system/object.js +++ b/packages/ember-runtime/lib/system/object.js @@ -7,7 +7,8 @@ import { symbol } from 'ember-utils'; import { on } from 'ember-metal'; import CoreObject from './core_object'; import Observable from '../mixins/observable'; -import { runInDebug, assert } from 'ember-debug'; +import { assert } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; /** `Ember.Object` is the main base class for all Ember objects. It is a subclass @@ -25,7 +26,7 @@ EmberObject.toString = () => 'Ember.Object'; export let FrameworkObject = EmberObject; -runInDebug(() => { +if (DEBUG) { let INIT_WAS_CALLED = symbol('INIT_WAS_CALLED'); let ASSERT_INIT_WAS_CALLED = symbol('ASSERT_INIT_WAS_CALLED'); @@ -42,6 +43,6 @@ runInDebug(() => { ); }) }); -}); +} export default EmberObject; diff --git a/packages/ember-runtime/tests/controllers/controller_test.js b/packages/ember-runtime/tests/controllers/controller_test.js index d97a05d2898..6e6b5e5c447 100644 --- a/packages/ember-runtime/tests/controllers/controller_test.js +++ b/packages/ember-runtime/tests/controllers/controller_test.js @@ -6,7 +6,6 @@ import { Mixin, get } from 'ember-metal'; import EmberObject from '../../system/object'; import inject from '../../inject'; import { buildOwner } from 'internal-test-helpers'; -import { isFeatureEnabled } from 'ember-debug'; QUnit.module('Controller event handling'); @@ -162,13 +161,10 @@ if (!EmberDev.runningProdBuild) { owner.register('foo:main', AnObject); - if (isFeatureEnabled('ember-factory-for')) { - expectDeprecation(() => { - owner._lookupFactory('foo:main'); - }, /Using "_lookupFactory" is deprecated. Please use container.factoryFor instead./); - } else { + expectDeprecation(() => { owner._lookupFactory('foo:main'); - } + }, /Using "_lookupFactory" is deprecated. Please use container.factoryFor instead./); + }, /Defining an injected controller property on a non-controller is not allowed./); }); } diff --git a/packages/ember-runtime/tests/inject_test.js b/packages/ember-runtime/tests/inject_test.js index a55f97159ed..a7289fa1d2a 100644 --- a/packages/ember-runtime/tests/inject_test.js +++ b/packages/ember-runtime/tests/inject_test.js @@ -7,7 +7,6 @@ import { } from '../inject'; import EmberObject from '../system/object'; import { buildOwner } from 'internal-test-helpers'; -import { isFeatureEnabled } from 'ember-debug'; QUnit.module('inject'); @@ -34,15 +33,10 @@ if (!EmberDev.runningProdBuild) { owner.register('foo:main', AnObject); - if (isFeatureEnabled('ember-factory-for')) { - expect(2); - expectDeprecation(() => { - owner._lookupFactory('foo:main'); - }, /Using "_lookupFactory" is deprecated. Please use container.factoryFor instead./); - } else { - expect(1); + expect(2); + expectDeprecation(() => { owner._lookupFactory('foo:main'); - } + }, /Using "_lookupFactory" is deprecated. Please use container.factoryFor instead./); }); QUnit.test('attempting to inject a nonexistent container key should error', function() { diff --git a/packages/ember-runtime/tests/system/object/create_test.js b/packages/ember-runtime/tests/system/object/create_test.js index b6cd4905351..492cd8a7788 100644 --- a/packages/ember-runtime/tests/system/object/create_test.js +++ b/packages/ember-runtime/tests/system/object/create_test.js @@ -4,7 +4,7 @@ import { Mixin, observer } from 'ember-metal'; -import { isFeatureEnabled } from 'ember-debug'; +import { MANDATORY_SETTER } from 'ember/features'; import EmberObject from '../../../system/object'; QUnit.module('EmberObject.create', {}); @@ -30,7 +30,7 @@ QUnit.test('calls computed property setters', function() { equal(o.get('foo'), 'bar'); }); -if (isFeatureEnabled('mandatory-setter')) { +if (MANDATORY_SETTER) { QUnit.test('sets up mandatory setters for watched simple properties', function() { let MyClass = EmberObject.extend({ foo: null, diff --git a/packages/ember-runtime/tests/system/object/destroy_test.js b/packages/ember-runtime/tests/system/object/destroy_test.js index 8ae8c401642..921cfc2e148 100644 --- a/packages/ember-runtime/tests/system/object/destroy_test.js +++ b/packages/ember-runtime/tests/system/object/destroy_test.js @@ -9,7 +9,7 @@ import { } from 'ember-metal'; import { testBoth } from 'internal-test-helpers'; import EmberObject from '../../../system/object'; -import { isFeatureEnabled } from 'ember-debug'; +import { MANDATORY_SETTER } from 'ember/features'; QUnit.module('ember-runtime/system/object/destroy_test'); @@ -29,7 +29,7 @@ testBoth('should schedule objects to be destroyed at the end of the run loop', f ok(get(obj, 'isDestroyed'), 'object is destroyed after run loop finishes'); }); -if (isFeatureEnabled('mandatory-setter')) { +if (MANDATORY_SETTER) { // MANDATORY_SETTER moves value to meta.values // a destroyed object removes meta but leaves the accessor // that looks it up diff --git a/packages/ember-testing/lib/helpers.js b/packages/ember-testing/lib/helpers.js index 80fb9be450f..b8a3a7e9ca8 100644 --- a/packages/ember-testing/lib/helpers.js +++ b/packages/ember-testing/lib/helpers.js @@ -1,4 +1,4 @@ -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_TESTING_RESUME_TEST } from 'ember/features'; import { registerHelper as helper, registerAsyncHelper as asyncHelper @@ -32,6 +32,6 @@ helper('currentRouteName', currentRouteName); helper('currentPath', currentPath); helper('currentURL', currentURL); -if (isFeatureEnabled('ember-testing-resume-test')) { +if (EMBER_TESTING_RESUME_TEST) { helper('resumeTest', resumeTest); } diff --git a/packages/ember-testing/lib/helpers/pause_test.js b/packages/ember-testing/lib/helpers/pause_test.js index bd8fa1f6045..351e70737a6 100644 --- a/packages/ember-testing/lib/helpers/pause_test.js +++ b/packages/ember-testing/lib/helpers/pause_test.js @@ -4,7 +4,8 @@ */ import { RSVP } from 'ember-runtime'; import Logger from 'ember-console'; -import { assert, isFeatureEnabled } from 'ember-debug'; +import { assert } from 'ember-debug'; +import { EMBER_TESTING_RESUME_TEST } from 'ember/features'; let resume; @@ -37,12 +38,12 @@ export function resumeTest() { @public */ export function pauseTest() { - if (isFeatureEnabled('ember-testing-resume-test')) { + if (EMBER_TESTING_RESUME_TEST) { Logger.info('Testing paused. Use `resumeTest()` to continue.'); } return new RSVP.Promise((resolve) => { - if (isFeatureEnabled('ember-testing-resume-test')) { + if (EMBER_TESTING_RESUME_TEST) { resume = resolve; } }, 'TestAdapter paused promise'); diff --git a/packages/ember-testing/tests/helpers_test.js b/packages/ember-testing/tests/helpers_test.js index b2ffa4fd2b2..5aa77a3a73c 100644 --- a/packages/ember-testing/tests/helpers_test.js +++ b/packages/ember-testing/tests/helpers_test.js @@ -5,7 +5,7 @@ import { RSVP } from 'ember-runtime'; import { run } from 'ember-metal'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_TESTING_RESUME_TEST } from 'ember/features'; import { jQuery } from 'ember-views'; import { Component, @@ -812,7 +812,7 @@ QUnit.test('pauseTest pauses', function() { App.testHelpers.pauseTest(); }); -if (isFeatureEnabled('ember-testing-resume-test')) { +if (EMBER_TESTING_RESUME_TEST) { QUnit.test('resumeTest resumes paused tests', function() { expect(1); diff --git a/packages/ember-views/lib/mixins/view_support.js b/packages/ember-views/lib/mixins/view_support.js index 36997407169..84257912de3 100644 --- a/packages/ember-views/lib/mixins/view_support.js +++ b/packages/ember-views/lib/mixins/view_support.js @@ -1,10 +1,11 @@ import { guidFor, getOwner } from 'ember-utils'; import { descriptor, Mixin } from 'ember-metal'; -import { assert, deprecate, runInDebug } from 'ember-debug'; +import { assert, deprecate } from 'ember-debug'; import { environment } from 'ember-environment'; import { matches } from '../system/utils'; import { POST_INIT } from 'ember-runtime/system/core_object'; import jQuery from '../system/jquery'; +import { DEBUG } from 'ember-env-flags'; function K() { return this; } @@ -12,7 +13,7 @@ export let dispatchLifeCycleHook = (component, hook, oldAttrs, newAttrs) => { component.trigger(hook, { attrs: newAttrs, oldAttrs, newAttrs }); }; -runInDebug(() => { +if (DEBUG) { class Attrs { constructor(oldAttrs, newAttrs, message) { this._oldAttrs = oldAttrs; @@ -53,7 +54,7 @@ runInDebug(() => { component.trigger(hook, new Attrs(oldAttrs, newAttrs, `[DEPRECATED] Ember will stop passing arguments to component lifecycle hooks. Please change \`${component.toString()}#${hook}\` to stop taking arguments.`)); } }; -}); +} /** @class ViewMixin diff --git a/packages/ember-views/lib/views/states/in_dom.js b/packages/ember-views/lib/views/states/in_dom.js index 09cad2797b2..39b650e78db 100644 --- a/packages/ember-views/lib/views/states/in_dom.js +++ b/packages/ember-views/lib/views/states/in_dom.js @@ -1,6 +1,7 @@ import { assign } from 'ember-utils'; import { _addBeforeObserver } from 'ember-metal'; -import { runInDebug, Error as EmberError } from 'ember-debug'; +import { Error as EmberError } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; import hasElement from './has_element'; /** @@ -16,11 +17,11 @@ assign(inDOM, { // Ember.EventDispatcher to dispatch incoming events. view.renderer.register(view); - runInDebug(() => { + if (DEBUG) { _addBeforeObserver(view, 'elementId', () => { throw new EmberError('Changing a view\'s elementId after creation is not allowed'); }); - }); + } }, exit(view) { diff --git a/packages/ember/lib/index.js b/packages/ember/lib/index.js index fb5e96b03c5..eba3beb3350 100644 --- a/packages/ember/lib/index.js +++ b/packages/ember/lib/index.js @@ -9,6 +9,7 @@ import { Registry, Container } from 'container'; // ****ember-metal**** import Ember, * as metal from 'ember-metal'; +import { EMBER_METAL_WEAKMAP } from 'ember/features' // ember-utils exports Ember.getOwner = utils.getOwner; @@ -32,7 +33,8 @@ Ember.Registry = Registry; // need to import this directly, to ensure the babel feature // flag plugin works properly import * as EmberDebug from 'ember-debug'; -import { deprecate, runInDebug, deprecateFunc } from 'ember-debug'; +import { deprecate, deprecateFunc } from 'ember-debug'; +import { DEBUG } from 'ember-env-flags'; const computed = metal.computed; computed.alias = metal.alias; @@ -45,10 +47,10 @@ Ember.warn = EmberDebug.warn; Ember.debug = EmberDebug.debug; Ember.deprecate = function () { }; Ember.deprecateFunc = function() { }; -runInDebug(function() { +if (DEBUG) { Ember.deprecate = EmberDebug.deprecate; Ember.deprecateFunc = EmberDebug.deprecateFunc; -}); +} Ember.deprecateFunc = EmberDebug.deprecateFunc; Ember.runInDebug = EmberDebug.runInDebug; /** @@ -142,7 +144,7 @@ Ember.bind = metal.bind; Ember.Binding = metal.Binding; Ember.isGlobalPath = metal.isGlobalPath; -if (EmberDebug.isFeatureEnabled('ember-metal-weakmap')) { +if (EMBER_METAL_WEAKMAP) { Ember.WeakMap = metal.WeakMap; } diff --git a/packages/ember/tests/helpers/link_to_test.js b/packages/ember/tests/helpers/link_to_test.js index bb75b4e217f..077f6c5e819 100644 --- a/packages/ember/tests/helpers/link_to_test.js +++ b/packages/ember/tests/helpers/link_to_test.js @@ -18,7 +18,7 @@ import { Application } from 'ember-application'; import { jQuery } from 'ember-views'; import { compile } from 'ember-template-compiler'; import { setTemplates, setTemplate } from 'ember-glimmer'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_IMPROVED_INSTRUMENTATION } from 'ember-debug'; let Router, App, router, appInstance; @@ -118,7 +118,7 @@ QUnit.test('The {{link-to}} helper moves into the named route', function() { equal(jQuery('#home-link:not(.active)', '#qunit-fixture').length, 1, 'The other link was rendered without active class'); }); -if (isFeatureEnabled('ember-improved-instrumentation')) { +if (EMBER_IMPROVED_INSTRUMENTATION) { QUnit.test('The {{link-to}} helper fires an interaction event', function(assert) { assert.expect(2); Router.map(function(match) { diff --git a/packages/ember/tests/reexports_test.js b/packages/ember/tests/reexports_test.js index aaa3f421d90..c504b85d6b9 100644 --- a/packages/ember/tests/reexports_test.js +++ b/packages/ember/tests/reexports_test.js @@ -1,6 +1,6 @@ import Ember from '../index'; import { confirmExport } from 'internal-test-helpers'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_METAL_WEAKMAP } from 'ember/features'; QUnit.module('ember reexports'); @@ -226,7 +226,7 @@ QUnit.test('Ember.String.isHTMLSafe exports correctly', function(assert) { confirmExport(Ember, assert, 'String.isHTMLSafe', 'ember-glimmer', 'isHTMLSafe'); }); -if (isFeatureEnabled('ember-metal-weakmap')) { +if (EMBER_METAL_WEAKMAP) { QUnit.test('Ember.WeakMap exports correctly', function(assert) { confirmExport(Ember, assert, 'WeakMap', 'ember-metal', 'WeakMap'); }); diff --git a/packages/ember/tests/routing/router_service_test/basic_test.js b/packages/ember/tests/routing/router_service_test/basic_test.js index 09ecd6dd32c..d77f8616df5 100644 --- a/packages/ember/tests/routing/router_service_test/basic_test.js +++ b/packages/ember/tests/routing/router_service_test/basic_test.js @@ -10,9 +10,9 @@ import { moduleFor } from 'internal-test-helpers'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_ROUTING_ROUTER_SERVICE } from 'ember/features'; -if (isFeatureEnabled('ember-routing-router-service')) { +if (EMBER_ROUTING_ROUTER_SERVICE) { moduleFor('Router Service - main', class extends RouterTestCase { ['@test RouterService#currentRouteName is correctly set for top level route'](assert) { assert.expect(1); diff --git a/packages/ember/tests/routing/router_service_test/currenturl_lifecycle_test.js b/packages/ember/tests/routing/router_service_test/currenturl_lifecycle_test.js index 4a4cb5895a2..d85fb1cebcf 100644 --- a/packages/ember/tests/routing/router_service_test/currenturl_lifecycle_test.js +++ b/packages/ember/tests/routing/router_service_test/currenturl_lifecycle_test.js @@ -10,9 +10,9 @@ import { moduleFor } from 'internal-test-helpers'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_ROUTING_ROUTER_SERVICE } from 'ember/features'; -if (isFeatureEnabled('ember-routing-router-service')) { +if (EMBER_ROUTING_ROUTER_SERVICE) { let results = []; let ROUTE_NAMES = ['index', 'child', 'sister', 'brother']; diff --git a/packages/ember/tests/routing/router_service_test/replaceWith_test.js b/packages/ember/tests/routing/router_service_test/replaceWith_test.js index 252905051a0..eae51024eb0 100644 --- a/packages/ember/tests/routing/router_service_test/replaceWith_test.js +++ b/packages/ember/tests/routing/router_service_test/replaceWith_test.js @@ -5,9 +5,9 @@ import { } from 'internal-test-helpers'; import { Transition } from 'router'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_ROUTING_ROUTER_SERVICE } from 'ember/features'; -if (isFeatureEnabled('ember-routing-router-service')) { +if (EMBER_ROUTING_ROUTER_SERVICE) { moduleFor('Router Service - replaceWith', class extends RouterTestCase { constructor() { super(); diff --git a/packages/ember/tests/routing/router_service_test/transitionTo_test.js b/packages/ember/tests/routing/router_service_test/transitionTo_test.js index 6b1c39e6788..cdd836c6564 100644 --- a/packages/ember/tests/routing/router_service_test/transitionTo_test.js +++ b/packages/ember/tests/routing/router_service_test/transitionTo_test.js @@ -12,9 +12,9 @@ import { } from 'internal-test-helpers'; import { Transition } from 'router'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_ROUTING_ROUTER_SERVICE } from 'ember/features'; -if (isFeatureEnabled('ember-routing-router-service')) { +if (EMBER_ROUTING_ROUTER_SERVICE) { moduleFor('Router Service - transitionTo', class extends RouterTestCase { constructor() { super(); diff --git a/packages/ember/tests/routing/router_service_test/urlFor_test.js b/packages/ember/tests/routing/router_service_test/urlFor_test.js index b82955a4253..c17fcffa8e4 100644 --- a/packages/ember/tests/routing/router_service_test/urlFor_test.js +++ b/packages/ember/tests/routing/router_service_test/urlFor_test.js @@ -14,7 +14,7 @@ import { moduleFor } from 'internal-test-helpers'; -import { isFeatureEnabled } from 'ember-debug'; +import { EMBER_ROUTING_ROUTER_SERVICE } from 'ember/features'; function setupController(app, name) { let controllerName = `${String.capitalize(name)}Controller`; @@ -32,7 +32,7 @@ function buildQueryParams(queryParams) { }; } -if (isFeatureEnabled('ember-routing-router-service')) { +if (EMBER_ROUTING_ROUTER_SERVICE) { moduleFor('Router Service - urlFor', class extends RouterTestCase { ['@test RouterService#urlFor returns URL for simple route'](assert) { assert.expect(1); diff --git a/packages/internal-test-helpers/lib/build-owner.js b/packages/internal-test-helpers/lib/build-owner.js index 08ae4f1887f..7f7b868e60e 100644 --- a/packages/internal-test-helpers/lib/build-owner.js +++ b/packages/internal-test-helpers/lib/build-owner.js @@ -4,7 +4,6 @@ import { Application, ApplicationInstance } from 'ember-application'; -import { isFeatureEnabled } from 'ember-debug'; import { RegistryProxyMixin, ContainerProxyMixin, @@ -25,13 +24,11 @@ export default function buildOwner(options = {}) { } }); - if (isFeatureEnabled('ember-factory-for')) { - Owner.reopen({ - factoryFor() { - return this.__container__.factoryFor(...arguments); - } - }); - } + Owner.reopen({ + factoryFor() { + return this.__container__.factoryFor(...arguments); + } + }); let namespace = EmberObject.create({ Resolver: { create() { return resolver; } } diff --git a/yarn.lock b/yarn.lock index 502ad6c4ba4..eafbec7ee29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -528,6 +528,10 @@ babel-helper-hoist-variables@^6.22.0: babel-runtime "^6.22.0" babel-types "^6.22.0" +babel-helper-mark-eval-scopes@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.0.3.tgz#902f75aeb537336edc35eb9f52b6f09db7785328" + babel-helper-optimise-call-expression@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz#f3ee7eed355b4282138b33d02b78369e470622f5" @@ -535,6 +539,10 @@ babel-helper-optimise-call-expression@^6.23.0: babel-runtime "^6.22.0" babel-types "^6.23.0" +babel-helper-remove-or-void@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.0.1.tgz#f602790e465acf2dfbe84fb3dd210c43a2dd7262" + babel-helper-replace-supers@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz#eeaf8ad9b58ec4337ca94223bacdca1f8d9b4bfd" @@ -573,6 +581,12 @@ babel-plugin-dead-code-elimination@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" +babel-plugin-debug-macros@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.0.6.tgz#71bd1a4a736cc65d0e5308e17bba87044e321bde" + dependencies: + semver "^5.3.0" + babel-plugin-eval@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" @@ -597,6 +611,14 @@ babel-plugin-member-expression-literals@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" +babel-plugin-minify-dead-code-elimination@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.4.tgz#18b6ecfab77c29caca061d8210fa3495001e4fa1" + dependencies: + babel-helper-mark-eval-scopes "^0.0.3" + babel-helper-remove-or-void "^0.0.1" + lodash.some "^4.6.0" + babel-plugin-property-literals@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" @@ -3939,6 +3961,10 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" +lodash.some@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + lodash.template@^4.2.5: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" From 84ff4a84994716a4bf9d6764b0dc0f7d1e3ad025 Mon Sep 17 00:00:00 2001 From: Chad Hietala Date: Sat, 25 Mar 2017 13:26:08 -0700 Subject: [PATCH 2/2] Fix runtime feature flags --- broccoli/packages.js | 7 +++++-- packages/ember-debug/lib/features.js | 11 ++++------- packages/ember-debug/lib/index.js | 7 ++++--- packages/ember-template-compiler/lib/index.js | 4 ++-- packages/ember/lib/index.js | 5 +++-- packages/ember/tests/reexports_test.js | 2 +- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/broccoli/packages.js b/broccoli/packages.js index 0b774be476a..1a6484a4a11 100644 --- a/broccoli/packages.js +++ b/broccoli/packages.js @@ -237,8 +237,11 @@ module.exports.emberLicense = function _emberLicense() { module.exports.emberFeaturesES = function _emberFeaturesES(production = false) { let FEATURES = production ? RELEASE : DEBUG; let content = stripIndent` - const FEATURES = ${JSON.stringify(FEATURES)}; - export default FEATURES; + import { ENV } from 'ember-environment'; + import { assign } from 'ember-utils'; + export const DEFAULT_FEATURES = ${JSON.stringify(FEATURES)}; + export const FEATURES = assign(DEFAULT_FEATURES, ENV.FEATURES); + ${Object.keys(toConst(FEATURES)).map((FEATURE) => { return `export const ${FEATURE} = FEATURES["${FEATURE.replace(/_/g, '-').toLowerCase()}"];` diff --git a/packages/ember-debug/lib/features.js b/packages/ember-debug/lib/features.js index d076b4dc1ba..801d99a93b1 100644 --- a/packages/ember-debug/lib/features.js +++ b/packages/ember-debug/lib/features.js @@ -1,6 +1,6 @@ -import { assign } from 'ember-utils'; import { ENV } from 'ember-environment'; -import DEFAULT_FEATURES from 'ember/features'; +import * as FLAGS from 'ember/features'; +let { FEATURES } = FLAGS; /** The hash of enabled Canary features. Add to this, any canary features @@ -15,7 +15,8 @@ import DEFAULT_FEATURES from 'ember/features'; @since 1.1.0 @public */ -export const FEATURES = assign(DEFAULT_FEATURES, ENV.FEATURES); + +// Auto-generated /** Determine whether the specified `feature` is enabled. Used by Ember's @@ -44,7 +45,3 @@ export default function isEnabled(feature) { return false; } } - -export { - DEFAULT_FEATURES -}; diff --git a/packages/ember-debug/lib/index.js b/packages/ember-debug/lib/index.js index ebe3e2b05cd..e6a76e0b322 100644 --- a/packages/ember-debug/lib/index.js +++ b/packages/ember-debug/lib/index.js @@ -1,15 +1,16 @@ -import DEFAULT_FEATURES from 'ember/features'; import { ENV, environment } from 'ember-environment'; import Logger from 'ember-console'; import { isTesting } from './testing'; import EmberError from './error'; -import { default as isFeatureEnabled, FEATURES } from './features'; +import { default as isFeatureEnabled } from './features'; +import * as FLAGS from 'ember/features'; +let { DEFAULT_FEATURES, FEATURES } = FLAGS; import _deprecate from './deprecate'; import _warn from './warn'; export { registerHandler as registerWarnHandler } from './warn'; export { registerHandler as registerDeprecationHandler } from './deprecate'; -export { default as isFeatureEnabled, FEATURES } from './features'; +export { default as isFeatureEnabled } from './features'; export { default as Error } from './error'; export { isTesting, setTesting } from './testing'; diff --git a/packages/ember-template-compiler/lib/index.js b/packages/ember-template-compiler/lib/index.js index bb0fc9cd6db..2120b607e61 100644 --- a/packages/ember-template-compiler/lib/index.js +++ b/packages/ember-template-compiler/lib/index.js @@ -1,11 +1,11 @@ import _Ember from 'ember-metal'; -import { FEATURES } from 'ember-debug'; +import * as FLAGS from 'ember/features'; import { ENV } from 'ember-environment'; import VERSION from 'ember/version'; // private API used by ember-cli-htmlbars to setup ENV and FEATURES if (!_Ember.ENV) { _Ember.ENV = ENV; } -if (!_Ember.FEATURES) { _Ember.FEATURES = FEATURES; } +if (!_Ember.FEATURES) { _Ember.FEATURES = FLAGS.FEATURES; } if (!_Ember.VERSION) { _Ember.VERSION = VERSION; } export { _Ember }; diff --git a/packages/ember/lib/index.js b/packages/ember/lib/index.js index eba3beb3350..a368f9103dd 100644 --- a/packages/ember/lib/index.js +++ b/packages/ember/lib/index.js @@ -9,7 +9,8 @@ import { Registry, Container } from 'container'; // ****ember-metal**** import Ember, * as metal from 'ember-metal'; -import { EMBER_METAL_WEAKMAP } from 'ember/features' +import { EMBER_METAL_WEAKMAP } from 'ember/features'; +import * as FLAGS from 'ember/features' // ember-utils exports Ember.getOwner = utils.getOwner; @@ -80,7 +81,7 @@ Ember.getWithDefault = metal.getWithDefault; Ember._getPath = metal._getPath; Ember.set = metal.set; Ember.trySet = metal.trySet; -Ember.FEATURES = EmberDebug.FEATURES; +Ember.FEATURES = FLAGS.FEATURES; Ember.FEATURES.isEnabled = EmberDebug.isFeatureEnabled; Ember._Cache = metal.Cache; Ember.on = metal.on; diff --git a/packages/ember/tests/reexports_test.js b/packages/ember/tests/reexports_test.js index c504b85d6b9..f25e62fc973 100644 --- a/packages/ember/tests/reexports_test.js +++ b/packages/ember/tests/reexports_test.js @@ -47,7 +47,7 @@ QUnit.module('ember reexports'); ['onerror', 'ember-metal', { get: 'getOnerror', set: 'setOnerror' }], // ['create'], TODO: figure out what to do here // ['keys'], TODO: figure out what to do here - ['FEATURES', 'ember-debug'], + ['FEATURES', 'ember/features'], ['FEATURES.isEnabled', 'ember-debug', 'isFeatureEnabled'], ['Error', 'ember-debug'], ['META_DESC', 'ember-metal'],