From 568369e36d516676f69ad5640f928cb726820cb5 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 12:39:50 -0400 Subject: [PATCH 01/16] Wrap `Ember.EXTEND_PROTOTYPES` for svelting. --- packages/@ember/deprecated-features/index.ts | 1 + packages/ember/index.js | 33 +++++++++++--------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index a19471f674e..d7233f8e26a 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -1 +1,2 @@ export const PROPERTY_BASED_DESCRIPTORS = !!'3.2.0'; +export const EMBER_EXTEND_PROTOTYPES = !!'3.2.0-beta.5'; diff --git a/packages/ember/index.js b/packages/ember/index.js index 273bc05c3a5..062391dad03 100644 --- a/packages/ember/index.js +++ b/packages/ember/index.js @@ -125,6 +125,7 @@ import Map from '@ember/map'; import MapWithDefault from '@ember/map/with-default'; import OrderedSet from '@ember/map/lib/ordered-set'; import { assign, merge } from '@ember/polyfills'; +import { EMBER_EXTEND_PROTOTYPES } from '@ember/deprecated-features'; // ****ember-environment**** @@ -146,21 +147,23 @@ Object.defineProperty(Ember, 'lookup', { enumerable: false, }); -Object.defineProperty(Ember, 'EXTEND_PROTOTYPES', { - enumerable: false, - get() { - deprecate( - 'Accessing Ember.EXTEND_PROTOTYPES is deprecated, please migrate to Ember.ENV.EXTEND_PROTOTYPES', - false, - { - id: 'ember-env.old-extend-prototypes', - until: '4.0.0', - } - ); - - return ENV.EXTEND_PROTOTYPES; - }, -}); +if (EMBER_EXTEND_PROTOTYPES) { + Object.defineProperty(Ember, 'EXTEND_PROTOTYPES', { + enumerable: false, + get() { + deprecate( + 'Accessing Ember.EXTEND_PROTOTYPES is deprecated, please migrate to Ember.ENV.EXTEND_PROTOTYPES', + false, + { + id: 'ember-env.old-extend-prototypes', + until: '4.0.0', + } + ); + + return ENV.EXTEND_PROTOTYPES; + }, + }); +} // ****@ember/application**** Ember.getOwner = getOwner; From d30119fdcc50b3c3af4d97701035167b3987cecc Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 12:56:48 -0400 Subject: [PATCH 02/16] Wrap deprecated Ember.deprecate features for svelting. --- packages/@ember/debug/lib/deprecate.ts | 20 ++++++++++++++++++-- packages/@ember/deprecated-features/index.ts | 3 +++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/@ember/debug/lib/deprecate.ts b/packages/@ember/debug/lib/deprecate.ts index 4f1418034f4..bf7725e38f6 100644 --- a/packages/@ember/debug/lib/deprecate.ts +++ b/packages/@ember/debug/lib/deprecate.ts @@ -1,3 +1,8 @@ +import { + DEPRECATE_ID_MISSING, + DEPRECATE_OPTIONS_MISSING, + DEPRECATE_UNTIL_MISSING, +} from '@ember/deprecated-features'; import { DEBUG } from '@glimmer/env'; import { ENV } from 'ember-environment'; @@ -190,6 +195,7 @@ if (DEBUG) { } if ( + DEPRECATE_OPTIONS_MISSING && (!options || (!options.id && !options.until)) && ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true ) { @@ -200,7 +206,12 @@ if (DEBUG) { }); } - if (options && !options.id && ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) { + if ( + DEPRECATE_ID_MISSING && + options && + !options.id && + ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true + ) { deprecate(missingOptionsIdDeprecation, false, { id: 'ember-debug.deprecate-id-missing', until: '3.0.0', @@ -208,7 +219,12 @@ if (DEBUG) { }); } - if (options && !options.until && ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) { + if ( + DEPRECATE_UNTIL_MISSING && + options && + !options.until && + ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true + ) { deprecate(missingOptionsUntilDeprecation, !!(options && options.until), { id: 'ember-debug.deprecate-until-missing', until: '3.0.0', diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index d7233f8e26a..dcc7bf5a440 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -1,2 +1,5 @@ export const PROPERTY_BASED_DESCRIPTORS = !!'3.2.0'; export const EMBER_EXTEND_PROTOTYPES = !!'3.2.0-beta.5'; +export const DEPRECATE_OPTIONS_MISSING = !!'2.1.0-beta.1'; +export const DEPRECATE_ID_MISSING = !!'2.1.0-beta.1'; +export const DEPRECATE_UNTIL_MISSING = !!'2.1.0-beta.1'; From 8c1790495ffaa7e4369da532bbc21eb1273991f4 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 13:04:19 -0400 Subject: [PATCH 03/16] Wrap `sync` queue support for svelting. --- packages/@ember/deprecated-features/index.ts | 1 + packages/@ember/runloop/index.js | 21 +++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index dcc7bf5a440..68c1472a50f 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -3,3 +3,4 @@ export const EMBER_EXTEND_PROTOTYPES = !!'3.2.0-beta.5'; export const DEPRECATE_OPTIONS_MISSING = !!'2.1.0-beta.1'; export const DEPRECATE_ID_MISSING = !!'2.1.0-beta.1'; export const DEPRECATE_UNTIL_MISSING = !!'2.1.0-beta.1'; +export const RUN_SYNC = !!'3.0.0-beta.4'; diff --git a/packages/@ember/runloop/index.js b/packages/@ember/runloop/index.js index 317d4d801fa..fdca2d426ca 100644 --- a/packages/@ember/runloop/index.js +++ b/packages/@ember/runloop/index.js @@ -2,6 +2,7 @@ import { assert, deprecate, isTesting } from '@ember/debug'; import { onErrorTarget } from 'ember-error-handling'; import { beginPropertyChanges, endPropertyChanges } from 'ember-metal'; import Backburner from 'backburner'; +import { RUN_SYNC } from '@ember/deprecated-features'; let currentRunLoop = null; export function getCurrentRunLoop() { @@ -30,7 +31,6 @@ export const _rsvpErrorQueue = `${Math.random()}${Date.now()}`.replace('.', ''); @private */ export const queues = [ - 'sync', 'actions', // used in router transitions to prevent unnecessary loading state entry @@ -46,17 +46,24 @@ export const queues = [ _rsvpErrorQueue, ]; -export const backburner = new Backburner(queues, { - sync: { - before: beginPropertyChanges, - after: endPropertyChanges, - }, +let backburnerOptions = { defaultQueue: 'actions', onBegin, onEnd, onErrorTarget, onErrorMethod: 'onerror', -}); +}; + +if (RUN_SYNC) { + queues.unshift('sync'); + + backburnerOptions.sync = { + before: beginPropertyChanges, + after: endPropertyChanges, + }; +} + +export const backburner = new Backburner(queues, backburnerOptions); /** @module @ember/runloop From 553af3a6c623f7b090aebd02b27694c4fd39a619 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 13:10:52 -0400 Subject: [PATCH 04/16] Wrap `resolver` as function deprecation for svelting. --- packages/@ember/deprecated-features/index.ts | 1 + packages/container/lib/registry.ts | 23 ++++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index 68c1472a50f..76952cd5dcf 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -4,3 +4,4 @@ export const DEPRECATE_OPTIONS_MISSING = !!'2.1.0-beta.1'; export const DEPRECATE_ID_MISSING = !!'2.1.0-beta.1'; export const DEPRECATE_UNTIL_MISSING = !!'2.1.0-beta.1'; export const RUN_SYNC = !!'3.0.0-beta.4'; +export const REGISTRY_RESOLVER_AS_FUNCTION = !!'2.3.0-beta.3'; diff --git a/packages/container/lib/registry.ts b/packages/container/lib/registry.ts index 26b7b747c98..cba00564838 100644 --- a/packages/container/lib/registry.ts +++ b/packages/container/lib/registry.ts @@ -1,4 +1,5 @@ import { assert, deprecate } from '@ember/debug'; +import { REGISTRY_RESOLVER_AS_FUNCTION } from '@ember/deprecated-features'; import { assign } from '@ember/polyfills'; import { DEBUG } from '@glimmer/env'; import { ENV } from 'ember-environment'; @@ -118,8 +119,17 @@ export default class Registry implements IRegistry { assert(missingResolverFunctionsDeprecation, typeof this.resolver !== 'function'); } - if (typeof this.resolver === 'function' && ENV._ENABLE_RESOLVER_FUNCTION_SUPPORT === true) { - deprecateResolverFunction(this); + if ( + REGISTRY_RESOLVER_AS_FUNCTION && + typeof this.resolver === 'function' && + ENV._ENABLE_RESOLVER_FUNCTION_SUPPORT === true + ) { + deprecate(missingResolverFunctionsDeprecation, false, { + id: 'ember-application.registry-resolver-as-function', + until: '3.0.0', + url: 'https://emberjs.com/deprecations/v2.x#toc_registry-resolver-as-function', + }); + this.resolver = { resolve: this.resolver as Resolve }; } this.registrations = dictionary(options.registrations || null); @@ -710,15 +720,6 @@ export default class Registry implements IRegistry { } } -function deprecateResolverFunction(registry: Registry): void { - deprecate(missingResolverFunctionsDeprecation, false, { - id: 'ember-application.registry-resolver-as-function', - until: '3.0.0', - url: 'https://emberjs.com/deprecations/v2.x#toc_registry-resolver-as-function', - }); - registry.resolver = { resolve: registry.resolver as Resolve }; -} - export declare class DebugRegistry extends Registry { normalizeInjectionsHash(hash: { [key: string]: LazyInjection }): Injection[]; validateInjections(injections: Injection[]): void; From 2eba9e24867d24bcd469cd539ba41e2bd7ed1bdc Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 13:16:59 -0400 Subject: [PATCH 05/16] Wrap Ember.Logger for svelting... --- packages/@ember/deprecated-features/index.ts | 1 + packages/ember-console/index.js | 140 ++++++++++--------- packages/ember/index.js | 6 +- 3 files changed, 79 insertions(+), 68 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index 76952cd5dcf..fa0ea336408 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -5,3 +5,4 @@ export const DEPRECATE_ID_MISSING = !!'2.1.0-beta.1'; export const DEPRECATE_UNTIL_MISSING = !!'2.1.0-beta.1'; export const RUN_SYNC = !!'3.0.0-beta.4'; export const REGISTRY_RESOLVER_AS_FUNCTION = !!'2.3.0-beta.3'; +export const LOGGER = !!'3.2.0-beta.1'; diff --git a/packages/ember-console/index.js b/packages/ember-console/index.js index 5dadfed3e8d..a5d8b83e57a 100644 --- a/packages/ember-console/index.js +++ b/packages/ember-console/index.js @@ -1,4 +1,5 @@ import { deprecate } from '@ember/debug'; +import { LOGGER } from '@ember/deprecated-features'; // Deliver message that the function is deprecated @@ -9,6 +10,7 @@ const DEPRECATION_URL = /** @module ember */ + /** Inside Ember-Metal, simply uses the methods from `imports.console`. Override this to provide more robust logging functionality. @@ -19,8 +21,11 @@ const DEPRECATION_URL = @namespace Ember @public */ -export default { - /** +let DEPRECATED_LOGGER; + +if (LOGGER) { + DEPRECATED_LOGGER = { + /** Logs the arguments to the console. You can pass as many arguments as you want and they will be joined together with a space. @@ -35,16 +40,16 @@ export default { @param {*} arguments @public */ - log() { - deprecate(DEPRECATION_MESSAGE, false, { - id: DEPRECATION_ID, - until: '4.0.0', - url: DEPRECATION_URL, - }); - return console.log(...arguments); // eslint-disable-line no-console - }, - - /** + log() { + deprecate(DEPRECATION_MESSAGE, false, { + id: DEPRECATION_ID, + until: '4.0.0', + url: DEPRECATION_URL, + }); + return console.log(...arguments); // eslint-disable-line no-console + }, + + /** Prints the arguments to the console with a warning icon. You can pass as many arguments as you want and they will be joined together with a space. @@ -58,16 +63,16 @@ export default { @param {*} arguments @public */ - warn() { - deprecate(DEPRECATION_MESSAGE, false, { - id: DEPRECATION_ID, - until: '4.0.0', - url: DEPRECATION_URL, - }); - return console.warn(...arguments); // eslint-disable-line no-console - }, - - /** + warn() { + deprecate(DEPRECATION_MESSAGE, false, { + id: DEPRECATION_ID, + until: '4.0.0', + url: DEPRECATION_URL, + }); + return console.warn(...arguments); // eslint-disable-line no-console + }, + + /** Prints the arguments to the console with an error icon, red text and a stack trace. You can pass as many arguments as you want and they will be joined together with a space. @@ -81,16 +86,16 @@ export default { @param {*} arguments @public */ - error() { - deprecate(DEPRECATION_MESSAGE, false, { - id: DEPRECATION_ID, - until: '4.0.0', - url: DEPRECATION_URL, - }); - return console.error(...arguments); // eslint-disable-line no-console - }, - - /** + error() { + deprecate(DEPRECATION_MESSAGE, false, { + id: DEPRECATION_ID, + until: '4.0.0', + url: DEPRECATION_URL, + }); + return console.error(...arguments); // eslint-disable-line no-console + }, + + /** Logs the arguments to the console. You can pass as many arguments as you want and they will be joined together with a space. @@ -105,16 +110,16 @@ export default { @param {*} arguments @public */ - info() { - deprecate(DEPRECATION_MESSAGE, false, { - id: DEPRECATION_ID, - until: '4.0.0', - url: DEPRECATION_URL, - }); - return console.info(...arguments); // eslint-disable-line no-console - }, - - /** + info() { + deprecate(DEPRECATION_MESSAGE, false, { + id: DEPRECATION_ID, + until: '4.0.0', + url: DEPRECATION_URL, + }); + return console.info(...arguments); // eslint-disable-line no-console + }, + + /** Logs the arguments to the console in blue text. You can pass as many arguments as you want and they will be joined together with a space. @@ -129,21 +134,21 @@ export default { @param {*} arguments @public */ - debug() { - deprecate(DEPRECATION_MESSAGE, false, { - id: DEPRECATION_ID, - until: '4.0.0', - url: DEPRECATION_URL, - }); - /* eslint-disable no-console */ - if (console.debug) { - return console.debug(...arguments); - } - return console.info(...arguments); - /* eslint-enable no-console */ - }, - - /** + debug() { + deprecate(DEPRECATION_MESSAGE, false, { + id: DEPRECATION_ID, + until: '4.0.0', + url: DEPRECATION_URL, + }); + /* eslint-disable no-console */ + if (console.debug) { + return console.debug(...arguments); + } + return console.info(...arguments); + /* eslint-enable no-console */ + }, + + /** If the value passed into `Ember.Logger.assert` is not truthy it will throw an error with a stack trace. ```javascript @@ -158,12 +163,15 @@ export default { @param {String} message Assertion message on failed @public */ - assert() { - deprecate(DEPRECATION_MESSAGE, false, { - id: DEPRECATION_ID, - until: '4.0.0', - url: DEPRECATION_URL, - }); - return console.assert(...arguments); // eslint-disable-line no-console - }, -}; + assert() { + deprecate(DEPRECATION_MESSAGE, false, { + id: DEPRECATION_ID, + until: '4.0.0', + url: DEPRECATION_URL, + }); + return console.assert(...arguments); // eslint-disable-line no-console + }, + }; +} + +export default DEPRECATED_LOGGER; diff --git a/packages/ember/index.js b/packages/ember/index.js index 062391dad03..73b04a64ff2 100644 --- a/packages/ember/index.js +++ b/packages/ember/index.js @@ -125,7 +125,7 @@ import Map from '@ember/map'; import MapWithDefault from '@ember/map/with-default'; import OrderedSet from '@ember/map/lib/ordered-set'; import { assign, merge } from '@ember/polyfills'; -import { EMBER_EXTEND_PROTOTYPES } from '@ember/deprecated-features'; +import { LOGGER, EMBER_EXTEND_PROTOTYPES } from '@ember/deprecated-features'; // ****ember-environment**** @@ -355,7 +355,9 @@ Object.defineProperty(Ember, 'testing', { Ember._Backburner = Backburner; // ****ember-console**** -Ember.Logger = Logger; +if (LOGGER) { + Ember.Logger = Logger; +} // ****ember-runtime**** Ember.A = A; From 68f98c1535cbf6133a794921abbf330a342a15f5 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 13:23:08 -0400 Subject: [PATCH 06/16] Wrap positional param conflict support for svelting. --- packages/@ember/deprecated-features/index.ts | 1 + .../lib/component-managers/curly.ts | 25 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index fa0ea336408..ada17a3e837 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -6,3 +6,4 @@ export const DEPRECATE_UNTIL_MISSING = !!'2.1.0-beta.1'; export const RUN_SYNC = !!'3.0.0-beta.4'; export const REGISTRY_RESOLVER_AS_FUNCTION = !!'2.3.0-beta.3'; export const LOGGER = !!'3.2.0-beta.1'; +export const POSITIONAL_PARAM_CONFLICT = !!'3.1.0-beta.1'; diff --git a/packages/ember-glimmer/lib/component-managers/curly.ts b/packages/ember-glimmer/lib/component-managers/curly.ts index a8f43a3b68e..ee772c05162 100644 --- a/packages/ember-glimmer/lib/component-managers/curly.ts +++ b/packages/ember-glimmer/lib/component-managers/curly.ts @@ -1,4 +1,5 @@ import { assert, deprecate } from '@ember/debug'; +import { POSITIONAL_PARAM_CONFLICT } from '@ember/deprecated-features'; import { _instrumentStart } from '@ember/instrumentation'; import { assign } from '@ember/polyfills'; import { DEBUG } from '@glimmer/env'; @@ -181,17 +182,19 @@ export default class CurlyComponentManager const count = Math.min(positionalParams.length, args.positional.length); named = {}; assign(named, args.named.capture().map); - for (let i = 0; i < count; i++) { - const name = positionalParams[i]; - deprecate( - `You cannot specify both a positional param (at position ${i}) and the hash argument \`${name}\`.`, - !args.named.has(name), - { - id: 'ember-glimmer.positional-param-conflict', - until: '3.5.0', - } - ); - named[name] = args.positional.at(i); + if (POSITIONAL_PARAM_CONFLICT) { + for (let i = 0; i < count; i++) { + const name = positionalParams[i]; + deprecate( + `You cannot specify both a positional param (at position ${i}) and the hash argument \`${name}\`.`, + !args.named.has(name), + { + id: 'ember-glimmer.positional-param-conflict', + until: '3.5.0', + } + ); + named[name] = args.positional.at(i); + } } } else { return null; From ebf8d1291ecdee750b304b95bb31a5b530804668 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 13:26:37 -0400 Subject: [PATCH 07/16] Wrap `didInitAttrs` legacy support for svelte. --- packages/@ember/deprecated-features/index.ts | 1 + packages/ember-metal/lib/events.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index ada17a3e837..7c52f8a5211 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -7,3 +7,4 @@ export const RUN_SYNC = !!'3.0.0-beta.4'; export const REGISTRY_RESOLVER_AS_FUNCTION = !!'2.3.0-beta.3'; export const LOGGER = !!'3.2.0-beta.1'; export const POSITIONAL_PARAM_CONFLICT = !!'3.1.0-beta.1'; +export const DID_INIT_ATTRS = !!'2.6.0-beta.1'; diff --git a/packages/ember-metal/lib/events.ts b/packages/ember-metal/lib/events.ts index db21fc43e69..43c4ef9c29a 100644 --- a/packages/ember-metal/lib/events.ts +++ b/packages/ember-metal/lib/events.ts @@ -2,6 +2,7 @@ @module @ember/object */ import { assert, deprecate } from '@ember/debug'; +import { DID_INIT_ATTRS } from '@ember/deprecated-features'; import { ENV } from 'ember-environment'; import { Meta, meta as metaFor, peekMeta } from 'ember-meta'; import { setListeners } from 'ember-utils'; @@ -46,7 +47,7 @@ export function addListener( ) { assert('You must pass at least an object and event name to addListener', !!obj && !!eventName); - if (ENV._ENABLE_DID_INIT_ATTRS_SUPPORT === true) { + if (DID_INIT_ATTRS && ENV._ENABLE_DID_INIT_ATTRS_SUPPORT === true) { deprecate( `didInitAttrs called in ${obj && obj.toString && obj.toString()}.`, eventName !== 'didInitAttrs', From 5e9d186c7054bc642cac8132c8eddf66aa5a388b Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 13:32:33 -0400 Subject: [PATCH 08/16] Wrap propertyWillChange/propertyDidChange for svelting. --- packages/@ember/deprecated-features/index.ts | 2 + packages/ember-metal/lib/property_events.ts | 58 ++++++++++++-------- packages/ember/index.js | 15 ++++- 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index 7c52f8a5211..7f5f94b6063 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -8,3 +8,5 @@ export const REGISTRY_RESOLVER_AS_FUNCTION = !!'2.3.0-beta.3'; export const LOGGER = !!'3.2.0-beta.1'; export const POSITIONAL_PARAM_CONFLICT = !!'3.1.0-beta.1'; export const DID_INIT_ATTRS = !!'2.6.0-beta.1'; +export const PROPERTY_WILL_CHANGE = !!'3.1.0-beta.1'; +export const PROPERTY_DID_CHANGE = !!'3.1.0-beta.1'; diff --git a/packages/ember-metal/lib/property_events.ts b/packages/ember-metal/lib/property_events.ts index b5f18a8d167..fec7a95df7c 100644 --- a/packages/ember-metal/lib/property_events.ts +++ b/packages/ember-metal/lib/property_events.ts @@ -1,4 +1,8 @@ import { deprecate } from '@ember/debug'; +import { + PROPERTY_DID_CHANGE as ENABLE_PROPERTY_DID_CHANGE, + PROPERTY_WILL_CHANGE as ENABLE_PROPERTY_WILL_CHANGE, +} from '@ember/deprecated-features'; import { DEBUG } from '@glimmer/env'; import { descriptorFor, Meta, peekMeta } from 'ember-meta'; import { symbol } from 'ember-utils'; @@ -27,17 +31,20 @@ let deferred = 0; @for Ember @private */ -function propertyWillChange() { - deprecate( - `'propertyWillChange' is deprecated and has no effect. It is safe to remove this call.`, - false, - { - id: 'ember-metal.deprecate-propertyWillChange', - until: '3.5.0', - url: - 'https://emberjs.com/deprecations/v3.x/#toc_use-notifypropertychange-instead-of-propertywillchange-and-propertydidchange', - } - ); +let propertyWillChange; +if (ENABLE_PROPERTY_WILL_CHANGE) { + propertyWillChange = function propertyWillChange() { + deprecate( + `'propertyWillChange' is deprecated and has no effect. It is safe to remove this call.`, + false, + { + id: 'ember-metal.deprecate-propertyWillChange', + until: '3.5.0', + url: + 'https://emberjs.com/deprecations/v3.x/#toc_use-notifypropertychange-instead-of-propertywillchange-and-propertydidchange', + } + ); + }; } /** @@ -45,19 +52,22 @@ function propertyWillChange() { @for Ember @private */ -function propertyDidChange(obj: object, keyName: string, _meta: Meta) { - deprecate( - `'propertyDidChange' is deprecated in favor of 'notifyPropertyChange'. It is safe to change this call to 'notifyPropertyChange'.`, - false, - { - id: 'ember-metal.deprecate-propertyDidChange', - until: '3.5.0', - url: - 'https://emberjs.com/deprecations/v3.x/#toc_use-notifypropertychange-instead-of-propertywillchange-and-propertydidchange', - } - ); - - notifyPropertyChange(obj, keyName, _meta); +let propertyDidChange; +if (ENABLE_PROPERTY_DID_CHANGE) { + propertyDidChange = function propertyDidChange(obj: object, keyName: string, _meta: Meta) { + deprecate( + `'propertyDidChange' is deprecated in favor of 'notifyPropertyChange'. It is safe to change this call to 'notifyPropertyChange'.`, + false, + { + id: 'ember-metal.deprecate-propertyDidChange', + until: '3.5.0', + url: + 'https://emberjs.com/deprecations/v3.x/#toc_use-notifypropertychange-instead-of-propertywillchange-and-propertydidchange', + } + ); + + notifyPropertyChange(obj, keyName, _meta); + }; } /** diff --git a/packages/ember/index.js b/packages/ember/index.js index 73b04a64ff2..e8f9a9949c5 100644 --- a/packages/ember/index.js +++ b/packages/ember/index.js @@ -125,7 +125,12 @@ import Map from '@ember/map'; import MapWithDefault from '@ember/map/with-default'; import OrderedSet from '@ember/map/lib/ordered-set'; import { assign, merge } from '@ember/polyfills'; -import { LOGGER, EMBER_EXTEND_PROTOTYPES } from '@ember/deprecated-features'; +import { + PROPERTY_WILL_CHANGE, + PROPERTY_DID_CHANGE, + LOGGER, + EMBER_EXTEND_PROTOTYPES, +} from '@ember/deprecated-features'; // ****ember-environment**** @@ -283,8 +288,12 @@ Ember.isNone = metal.isNone; Ember.isEmpty = metal.isEmpty; Ember.isBlank = metal.isBlank; Ember.isPresent = metal.isPresent; -Ember.propertyWillChange = metal.propertyWillChange; -Ember.propertyDidChange = metal.propertyDidChange; +if (PROPERTY_WILL_CHANGE) { + Ember.propertyWillChange = metal.propertyWillChange; +} +if (PROPERTY_DID_CHANGE) { + Ember.propertyDidChange = metal.propertyDidChange; +} Ember.notifyPropertyChange = metal.notifyPropertyChange; Ember.overrideChains = metal.overrideChains; Ember.beginPropertyChanges = metal.beginPropertyChanges; From 74db72b715a885242276b2bb8c36d539df3251a9 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 13:39:10 -0400 Subject: [PATCH 09/16] Wrap `router.router` deprecation for svelting. --- packages/@ember/deprecated-features/index.ts | 1 + packages/ember-routing/lib/system/route.js | 27 +++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index 7f5f94b6063..731d578021c 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -10,3 +10,4 @@ export const POSITIONAL_PARAM_CONFLICT = !!'3.1.0-beta.1'; export const DID_INIT_ATTRS = !!'2.6.0-beta.1'; export const PROPERTY_WILL_CHANGE = !!'3.1.0-beta.1'; export const PROPERTY_DID_CHANGE = !!'3.1.0-beta.1'; +export const ROUTER_ROUTER = !!'3.2.0-beta.1'; diff --git a/packages/ember-routing/lib/system/route.js b/packages/ember-routing/lib/system/route.js index d934cd11bd7..b7b850be6b2 100644 --- a/packages/ember-routing/lib/system/route.js +++ b/packages/ember-routing/lib/system/route.js @@ -1,3 +1,4 @@ +import { ROUTER_ROUTER } from '@ember/deprecated-features'; import { getOwner } from 'ember-owner'; import { assign } from '@ember/polyfills'; import { once } from '@ember/runloop'; @@ -110,18 +111,20 @@ let Route = EmberObject.extend(ActionHandler, Evented, { */ queryParams: {}, - router: computed('_router', function() { - deprecate( - 'Route#router is an intimate API that has been renamed to Route#_router. However you might want to consider using the router service', - false, - { - id: 'ember-routing.route-router', - until: '3.5.0', - url: 'https://emberjs.com/deprecations/v3.x#toc_ember-routing-route-router', - } - ); - return this._router; - }), + router: ROUTER_ROUTER + ? computed('_router', function() { + deprecate( + 'Route#router is an intimate API that has been renamed to Route#_router. However you might want to consider using the router service', + false, + { + id: 'ember-routing.route-router', + until: '3.5.0', + url: 'https://emberjs.com/deprecations/v3.x#toc_ember-routing-route-router', + } + ); + return this._router; + }) + : undefined, /** The name of the route, dot-delimited. From 910551533a0bb049c51750f4d79f0a1f2e9b05c0 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 13:48:06 -0400 Subject: [PATCH 10/16] Wrap `{{render` orphan `{{outlet}}` support for svelting. --- packages/@ember/deprecated-features/index.ts | 1 + packages/ember-routing/lib/system/router.js | 40 ++++++++++---------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index 731d578021c..173447b49aa 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -11,3 +11,4 @@ export const DID_INIT_ATTRS = !!'2.6.0-beta.1'; export const PROPERTY_WILL_CHANGE = !!'3.1.0-beta.1'; export const PROPERTY_DID_CHANGE = !!'3.1.0-beta.1'; export const ROUTER_ROUTER = !!'3.2.0-beta.1'; +export const ORPHAN_OUTLET_RENDER = !!'2.11.0-beta.1'; diff --git a/packages/ember-routing/lib/system/router.js b/packages/ember-routing/lib/system/router.js index 5b617e51280..8ca26358d57 100644 --- a/packages/ember-routing/lib/system/router.js +++ b/packages/ember-routing/lib/system/router.js @@ -11,6 +11,7 @@ import EmberLocation from '../location/api'; import { resemblesURL, getActiveTargetName, calculateCacheKey, extractRouteArgs } from '../utils'; import RouterState from './router_state'; import { DEBUG } from '@glimmer/env'; +import { ORPHAN_OUTLET_RENDER } from '@ember/deprecated-features'; /** @module @ember/routing @@ -1534,7 +1535,7 @@ function appendLiveRoute(liveRoutes, defaultParentState, renderOptions) { if (target) { set(target.outlets, renderOptions.outlet, myState); } else { - if (renderOptions.into) { + if (ORPHAN_OUTLET_RENDER && renderOptions.into) { deprecate( `Rendering into a {{render}} helper that resolves to an {{outlet}} is deprecated.`, false, @@ -1552,7 +1553,23 @@ function appendLiveRoute(liveRoutes, defaultParentState, renderOptions) { // helper, and people are allowed to target templates rendered // by the render helper. So instead we defer doing anyting with // these orphan renders until afterRender. - appendOrphan(liveRoutes, renderOptions.into, myState); + if (!liveRoutes.outlets.__ember_orphans__) { + liveRoutes.outlets.__ember_orphans__ = { + render: { + name: '__ember_orphans__', + }, + outlets: Object.create(null), + }; + } + + liveRoutes.outlets.__ember_orphans__.outlets[renderOptions.into] = myState; + schedule('afterRender', () => { + // `wasUsed` gets set by the render helper. + assert( + `You attempted to render into '${renderOptions.into}' but it was not found`, + liveRoutes.outlets.__ember_orphans__.outlets[renderOptions.into].wasUsed + ); + }); } else { liveRoutes = myState; } @@ -1563,25 +1580,6 @@ function appendLiveRoute(liveRoutes, defaultParentState, renderOptions) { }; } -function appendOrphan(liveRoutes, into, myState) { - if (!liveRoutes.outlets.__ember_orphans__) { - liveRoutes.outlets.__ember_orphans__ = { - render: { - name: '__ember_orphans__', - }, - outlets: Object.create(null), - }; - } - liveRoutes.outlets.__ember_orphans__.outlets[into] = myState; - schedule('afterRender', () => { - // `wasUsed` gets set by the render helper. - assert( - `You attempted to render into '${into}' but it was not found`, - liveRoutes.outlets.__ember_orphans__.outlets[into].wasUsed - ); - }); -} - function representEmptyRoute(liveRoutes, defaultParentState, route) { // the route didn't render anything let alreadyAppended = findLiveRoute(liveRoutes, route.routeName); From d05a89abdbf188029a02f0d904edc168f8963473 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 13:52:10 -0400 Subject: [PATCH 11/16] Wrap ArrayMixin's @each property for svelting. --- packages/@ember/deprecated-features/index.ts | 1 + packages/ember-runtime/lib/mixins/array.js | 22 ++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index 173447b49aa..fdfc65c0708 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -12,3 +12,4 @@ export const PROPERTY_WILL_CHANGE = !!'3.1.0-beta.1'; export const PROPERTY_DID_CHANGE = !!'3.1.0-beta.1'; export const ROUTER_ROUTER = !!'3.2.0-beta.1'; export const ORPHAN_OUTLET_RENDER = !!'2.11.0-beta.1'; +export const ARRAY_AT_EACH = !!'3.1.0-beta.1'; diff --git a/packages/ember-runtime/lib/mixins/array.js b/packages/ember-runtime/lib/mixins/array.js index 529d0ba44b9..6a204aba44c 100644 --- a/packages/ember-runtime/lib/mixins/array.js +++ b/packages/ember-runtime/lib/mixins/array.js @@ -2,6 +2,7 @@ @module @ember/array */ +import { ARRAY_AT_EACH } from '@ember/deprecated-features'; import { DEBUG } from '@glimmer/env'; import { HAS_NATIVE_PROXY } from 'ember-utils'; import { PROXY_CONTENT } from 'ember-metal'; @@ -1154,17 +1155,20 @@ const ArrayMixin = Mixin.create(Enumerable, { ``` @property @each + @deprecated @public */ - '@each': computed(function() { - deprecate(`Getting the '@each' property on object ${toString(this)} is deprecated`, false, { - id: 'ember-metal.getting-each', - until: '3.5.0', - url: 'https://emberjs.com/deprecations/v3.x#toc_getting-the-each-property', - }); - - return eachProxyFor(this); - }).readOnly(), + '@each': ARRAY_AT_EACH + ? computed(function() { + deprecate(`Getting the '@each' property on object ${toString(this)} is deprecated`, false, { + id: 'ember-metal.getting-each', + until: '3.5.0', + url: 'https://emberjs.com/deprecations/v3.x#toc_getting-the-each-property', + }); + + return eachProxyFor(this); + }).readOnly() + : undefined, }); const OUT_OF_RANGE_EXCEPTION = 'Index out of range'; From e469bbac312633536b95790ab7dc9235c9bc29d3 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 13:55:13 -0400 Subject: [PATCH 12/16] Wrap targetObject for svelting... --- packages/@ember/deprecated-features/index.ts | 1 + .../lib/mixins/target_action_support.js | 37 ++++++++++--------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index fdfc65c0708..e8d30830b37 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -13,3 +13,4 @@ export const PROPERTY_DID_CHANGE = !!'3.1.0-beta.1'; export const ROUTER_ROUTER = !!'3.2.0-beta.1'; export const ORPHAN_OUTLET_RENDER = !!'2.11.0-beta.1'; export const ARRAY_AT_EACH = !!'3.1.0-beta.1'; +export const TARGET_OBJECT = !!'2.18.0-beta.1'; diff --git a/packages/ember-runtime/lib/mixins/target_action_support.js b/packages/ember-runtime/lib/mixins/target_action_support.js index 32d77c2ee53..4a2ebb6ceb5 100644 --- a/packages/ember-runtime/lib/mixins/target_action_support.js +++ b/packages/ember-runtime/lib/mixins/target_action_support.js @@ -5,6 +5,7 @@ import { context } from 'ember-environment'; import { get, Mixin, computed, descriptor } from 'ember-metal'; import { assert, deprecate } from '@ember/debug'; +import { TARGET_OBJECT } from '@ember/deprecated-features'; /** `Ember.TargetActionSupport` is a mixin that can be included in a class to add a `triggerAction` method with semantics similar to the Handlebars @@ -19,22 +20,24 @@ doing more complex event handling in Components. */ export default Mixin.create({ target: null, - targetObject: descriptor({ - configurable: true, - enumerable: false, - get() { - let message = `${this} Usage of \`targetObject\` is deprecated. Please use \`target\` instead.`; - let options = { id: 'ember-runtime.using-targetObject', until: '3.5.0' }; - deprecate(message, false, options); - return this._targetObject; - }, - set(value) { - let message = `${this} Usage of \`targetObject\` is deprecated. Please use \`target\` instead.`; - let options = { id: 'ember-runtime.using-targetObject', until: '3.5.0' }; - deprecate(message, false, options); - this._targetObject = value; - }, - }), + targetObject: TARGET_OBJECT + ? descriptor({ + configurable: true, + enumerable: false, + get() { + let message = `${this} Usage of \`targetObject\` is deprecated. Please use \`target\` instead.`; + let options = { id: 'ember-runtime.using-targetObject', until: '3.5.0' }; + deprecate(message, false, options); + return this._targetObject; + }, + set(value) { + let message = `${this} Usage of \`targetObject\` is deprecated. Please use \`target\` instead.`; + let options = { id: 'ember-runtime.using-targetObject', until: '3.5.0' }; + deprecate(message, false, options); + this._targetObject = value; + }, + }) + : undefined, action: null, actionContext: null, @@ -161,7 +164,7 @@ function getTarget(instance) { } // if _targetObject use it - if (instance._targetObject) { + if (TARGET_OBJECT && instance._targetObject) { return instance._targetObject; } From 62c2a1c39a905f881e0fffa321f440069e02e89d Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 15:12:19 -0400 Subject: [PATCH 13/16] Wrap `{{render}}` support for svelting. --- packages/@ember/deprecated-features/index.ts | 1 + .../lib/component-managers/render.ts | 241 +++++++++--------- packages/ember-glimmer/lib/resolver.ts | 6 +- packages/ember-glimmer/lib/syntax.ts | 5 +- packages/ember-glimmer/lib/syntax/render.ts | 142 ++++++----- .../lib/plugins/deprecate-render-model.js | 67 ++--- .../lib/plugins/deprecate-render.js | 77 +++--- .../lib/plugins/index.js | 9 +- 8 files changed, 295 insertions(+), 253 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index e8d30830b37..b0318e5a203 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -14,3 +14,4 @@ export const ROUTER_ROUTER = !!'3.2.0-beta.1'; export const ORPHAN_OUTLET_RENDER = !!'2.11.0-beta.1'; export const ARRAY_AT_EACH = !!'3.1.0-beta.1'; export const TARGET_OBJECT = !!'2.18.0-beta.1'; +export const RENDER_HELPER = !!'2.11.0-beta.1'; diff --git a/packages/ember-glimmer/lib/component-managers/render.ts b/packages/ember-glimmer/lib/component-managers/render.ts index 08aa5824d18..96de8acda5c 100644 --- a/packages/ember-glimmer/lib/component-managers/render.ts +++ b/packages/ember-glimmer/lib/component-managers/render.ts @@ -1,3 +1,4 @@ +import { RENDER_HELPER } from '@ember/deprecated-features'; import { ComponentCapabilities } from '@glimmer/interfaces'; import { CONSTANT_TAG, Tag, VersionedPathReference } from '@glimmer/reference'; import { Arguments, ComponentDefinition, Invocation, WithStaticLayout } from '@glimmer/runtime'; @@ -18,49 +19,6 @@ export interface RenderDefinitionState { template: OwnedTemplate; } -export abstract class AbstractRenderManager - extends AbstractManager - implements WithStaticLayout { - create( - env: Environment, - definition: RenderDefinitionState, - args: Arguments, - dynamicScope: DynamicScope - ): T { - let { name } = definition; - - if (DEBUG) { - this._pushToDebugStack(`controller:${name} (with the render helper)`, env); - } - - if (dynamicScope.rootOutletState) { - dynamicScope.outletState = new OrphanedOutletReference(dynamicScope.rootOutletState, name); - } - - return this.createRenderState(args, env.owner, name); - } - - abstract createRenderState(args: Arguments, owner: Owner, name: string): T; - - getLayout({ template }: RenderDefinitionState): Invocation { - const layout = template!.asLayout(); - return { - handle: layout.compile(), - symbolTable: layout.symbolTable, - }; - } - - getSelf({ controller }: T) { - return new RootReference(controller); - } -} - -if (DEBUG) { - AbstractRenderManager.prototype.didRenderLayout = function() { - this.debugStack.pop(); - }; -} - export interface RenderState { controller: any; } @@ -69,94 +27,147 @@ export interface RenderStateWithModel extends RenderState { model: VersionedPathReference; } -const CAPABILITIES = { - dynamicLayout: false, - dynamicTag: false, - prepareArgs: false, - createArgs: false, - attributeHook: false, - elementHook: false, - createCaller: true, - dynamicScope: true, - updateHook: true, - createInstance: true, +let NON_SINGLETON_RENDER_MANAGER: any; +let SINGLETON_RENDER_MANAGER: any; +let RenderDefinition: { + new (name: string, template: OwnedTemplate, manager: any): ComponentDefinition; }; -class SingletonRenderManager extends AbstractRenderManager { - createRenderState(_args: Arguments, owner: Owner, name: string) { - let controller = owner.lookup(`controller:${name}`) || generateController(owner, name); - return { controller }; - } +if (RENDER_HELPER) { + abstract class AbstractRenderManager + extends AbstractManager + implements WithStaticLayout { + create( + env: Environment, + definition: RenderDefinitionState, + args: Arguments, + dynamicScope: DynamicScope + ): T { + let { name } = definition; + + if (DEBUG) { + this._pushToDebugStack(`controller:${name} (with the render helper)`, env); + } + + if (dynamicScope.rootOutletState) { + dynamicScope.outletState = new OrphanedOutletReference(dynamicScope.rootOutletState, name); + } + + return this.createRenderState(args, env.owner, name); + } - getCapabilities(_: RenderDefinitionState): ComponentCapabilities { - return CAPABILITIES; - } + abstract createRenderState(args: Arguments, owner: Owner, name: string): T; - getTag(): Tag { - // todo this should be the tag of the state args - return CONSTANT_TAG; + getLayout({ template }: RenderDefinitionState): Invocation { + const layout = template!.asLayout(); + return { + handle: layout.compile(), + symbolTable: layout.symbolTable, + }; + } + + getSelf({ controller }: T) { + return new RootReference(controller); + } } - getDestructor() { - return null; + if (DEBUG) { + AbstractRenderManager.prototype.didRenderLayout = function() { + this.debugStack.pop(); + }; } -} -export const SINGLETON_RENDER_MANAGER = new SingletonRenderManager(); - -const NONSINGLETON_CAPABILITIES: ComponentCapabilities = { - dynamicLayout: false, - dynamicTag: false, - prepareArgs: false, - createArgs: true, - attributeHook: false, - elementHook: false, - dynamicScope: true, - createCaller: false, - updateHook: true, - createInstance: true, -}; + const CAPABILITIES = { + dynamicLayout: false, + dynamicTag: false, + prepareArgs: false, + createArgs: false, + attributeHook: false, + elementHook: false, + createCaller: true, + dynamicScope: true, + updateHook: true, + createInstance: true, + }; -class NonSingletonRenderManager extends AbstractRenderManager { - createRenderState(args: Arguments, owner: Owner, name: string) { - let model = args.positional.at(1); - let factory = - owner.factoryFor(`controller:${name}`) || - generateControllerFactory(owner, `controller:${name}`); - let controller = factory.create({ model: model.value() }); - return { controller, model }; - } + class SingletonRenderManager extends AbstractRenderManager { + createRenderState(_args: Arguments, owner: Owner, name: string) { + let controller = owner.lookup(`controller:${name}`) || generateController(owner, name); + return { controller }; + } - update({ controller, model }: RenderStateWithModel) { - controller.set('model', model.value()); - } + getCapabilities(_: RenderDefinitionState): ComponentCapabilities { + return CAPABILITIES; + } - getCapabilities(_: RenderDefinitionState): ComponentCapabilities { - return NONSINGLETON_CAPABILITIES; - } + getTag(): Tag { + // todo this should be the tag of the state args + return CONSTANT_TAG; + } - getTag({ model }: RenderStateWithModel): Tag { - return model.tag; + getDestructor() { + return null; + } } - getDestructor({ controller }: RenderStateWithModel) { - return controller; - } -} + SINGLETON_RENDER_MANAGER = new SingletonRenderManager(); + + const NONSINGLETON_CAPABILITIES: ComponentCapabilities = { + dynamicLayout: false, + dynamicTag: false, + prepareArgs: false, + createArgs: true, + attributeHook: false, + elementHook: false, + dynamicScope: true, + createCaller: false, + updateHook: true, + createInstance: true, + }; -export const NON_SINGLETON_RENDER_MANAGER = new NonSingletonRenderManager(); + class NonSingletonRenderManager extends AbstractRenderManager { + createRenderState(args: Arguments, owner: Owner, name: string) { + let model = args.positional.at(1); + let factory = + owner.factoryFor(`controller:${name}`) || + generateControllerFactory(owner, `controller:${name}`); + let controller = factory.create({ model: model.value() }); + return { controller, model }; + } -export class RenderDefinition implements ComponentDefinition { - public state: RenderDefinitionState; + update({ controller, model }: RenderStateWithModel) { + controller.set('model', model.value()); + } - constructor( - name: string, - template: OwnedTemplate, - public manager: SingletonRenderManager | NonSingletonRenderManager - ) { - this.state = { - name, - template, - }; + getCapabilities(_: RenderDefinitionState): ComponentCapabilities { + return NONSINGLETON_CAPABILITIES; + } + + getTag({ model }: RenderStateWithModel): Tag { + return model.tag; + } + + getDestructor({ controller }: RenderStateWithModel) { + return controller; + } } + + NON_SINGLETON_RENDER_MANAGER = new NonSingletonRenderManager(); + + RenderDefinition = class RenderDefinition implements ComponentDefinition { + public state: RenderDefinitionState; + + constructor( + name: string, + template: OwnedTemplate, + public manager: SingletonRenderManager | NonSingletonRenderManager + ) { + this.state = { + name, + template, + }; + } + }; } + +export { RenderDefinition, NON_SINGLETON_RENDER_MANAGER, SINGLETON_RENDER_MANAGER }; diff --git a/packages/ember-glimmer/lib/resolver.ts b/packages/ember-glimmer/lib/resolver.ts index 50850da781e..e4d8dfba7b5 100644 --- a/packages/ember-glimmer/lib/resolver.ts +++ b/packages/ember-glimmer/lib/resolver.ts @@ -1,5 +1,6 @@ import { EMBER_MODULE_UNIFICATION, GLIMMER_CUSTOM_COMPONENT_MANAGER } from '@ember/canary-features'; import { assert } from '@ember/debug'; +import { RENDER_HELPER } from '@ember/deprecated-features'; import { _instrumentStart } from '@ember/instrumentation'; import { ComponentDefinition, @@ -75,9 +76,12 @@ const BUILTINS_HELPERS = { '-get-dynamic-var': getDynamicVar, '-mount': mountHelper, '-outlet': outletHelper, - '-render': renderHelper, }; +if (RENDER_HELPER) { + BUILTINS_HELPERS['-render'] = renderHelper; +} + const BUILTIN_MODIFIERS = { action: new ActionModifierManager(), }; diff --git a/packages/ember-glimmer/lib/syntax.ts b/packages/ember-glimmer/lib/syntax.ts index 1ee747cd431..b887b38e753 100644 --- a/packages/ember-glimmer/lib/syntax.ts +++ b/packages/ember-glimmer/lib/syntax.ts @@ -1,5 +1,6 @@ import { EMBER_TEMPLATE_BLOCK_LET_HELPER } from '@ember/canary-features'; import { assert } from '@ember/debug'; +import { RENDER_HELPER } from '@ember/deprecated-features'; import { CompilableBlock } from '@glimmer/interfaces'; import { Macros, OpcodeBuilder } from '@glimmer/opcode-compiler'; import { Option } from '@glimmer/util'; @@ -97,7 +98,9 @@ export function registerMacros(macro: any) { export function populateMacros(macros: Macros) { let { inlines, blocks } = macros; inlines.add('outlet', outletMacro); - inlines.add('render', renderMacro); + if (RENDER_HELPER) { + inlines.add('render', renderMacro); + } inlines.add('mount', mountMacro); inlines.add('input', inputMacro); inlines.add('textarea', textAreaMacro); diff --git a/packages/ember-glimmer/lib/syntax/render.ts b/packages/ember-glimmer/lib/syntax/render.ts index cb116b9cb2a..9cfc728bc64 100644 --- a/packages/ember-glimmer/lib/syntax/render.ts +++ b/packages/ember-glimmer/lib/syntax/render.ts @@ -5,6 +5,7 @@ // Remove after 3.4 once _ENABLE_RENDER_SUPPORT flag is no longer needed. import { assert } from '@ember/debug'; +import { RENDER_HELPER } from '@ember/deprecated-features'; import { Option } from '@glimmer/interfaces'; import { OpcodeBuilder } from '@glimmer/opcode-compiler'; import { isConst, VersionedPathReference } from '@glimmer/reference'; @@ -21,64 +22,71 @@ import Environment from '../environment'; import { OwnedTemplate } from '../template'; import { UnboundReference } from '../utils/references'; -export function renderHelper( +let renderHelper: ( vm: VM, args: Arguments -): VersionedPathReference { - let env = vm.env as Environment; - let nameRef = args.positional.at(0); +) => VersionedPathReference; - assert( - `The first argument of {{render}} must be quoted, e.g. {{render "sidebar"}}.`, - isConst(nameRef) - ); - // tslint:disable-next-line:max-line-length - assert( - `The second argument of {{render}} must be a path, e.g. {{render "post" post}}.`, - args.positional.length === 1 || !isConst(args.positional.at(1)) - ); - - let templateName = nameRef.value() as string; - - // tslint:disable-next-line:max-line-length - assert( - `You used \`{{render '${templateName}'}}\`, but '${templateName}' can not be found as a template.`, - env.owner.hasRegistration(`template:${templateName}`) - ); - - let template = env.owner.lookup(`template:${templateName}`); - - let controllerName: string; - - if (args.named.has('controller')) { - let controllerNameRef = args.named.get('controller'); +if (RENDER_HELPER) { + renderHelper = function renderHelper( + vm: VM, + args: Arguments + ): VersionedPathReference { + let env = vm.env as Environment; + let nameRef = args.positional.at(0); + assert( + `The first argument of {{render}} must be quoted, e.g. {{render "sidebar"}}.`, + isConst(nameRef) + ); // tslint:disable-next-line:max-line-length assert( - `The controller argument for {{render}} must be quoted, e.g. {{render "sidebar" controller="foo"}}.`, - isConst(controllerNameRef) + `The second argument of {{render}} must be a path, e.g. {{render "post" post}}.`, + args.positional.length === 1 || !isConst(args.positional.at(1)) ); - // TODO should be ensuring this to string here - controllerName = controllerNameRef.value() as string; + let templateName = nameRef.value() as string; // tslint:disable-next-line:max-line-length assert( - `The controller name you supplied '${controllerName}' did not resolve to a controller.`, - env.owner.hasRegistration(`controller:${controllerName}`) + `You used \`{{render '${templateName}'}}\`, but '${templateName}' can not be found as a template.`, + env.owner.hasRegistration(`template:${templateName}`) ); - } else { - controllerName = templateName; - } - - if (args.positional.length === 1) { - let def = new RenderDefinition(controllerName, template, SINGLETON_RENDER_MANAGER); - return UnboundReference.create(curry(def)); - } else { - let def = new RenderDefinition(controllerName, template, NON_SINGLETON_RENDER_MANAGER); - let captured = args.capture(); - return UnboundReference.create(curry(def, captured)); - } + + let template = env.owner.lookup(`template:${templateName}`); + + let controllerName: string; + + if (args.named.has('controller')) { + let controllerNameRef = args.named.get('controller'); + + // tslint:disable-next-line:max-line-length + assert( + `The controller argument for {{render}} must be quoted, e.g. {{render "sidebar" controller="foo"}}.`, + isConst(controllerNameRef) + ); + + // TODO should be ensuring this to string here + controllerName = controllerNameRef.value() as string; + + // tslint:disable-next-line:max-line-length + assert( + `The controller name you supplied '${controllerName}' did not resolve to a controller.`, + env.owner.hasRegistration(`controller:${controllerName}`) + ); + } else { + controllerName = templateName; + } + + if (args.positional.length === 1) { + let def = new RenderDefinition(controllerName, template, SINGLETON_RENDER_MANAGER); + return UnboundReference.create(curry(def)); + } else { + let def = new RenderDefinition(controllerName, template, NON_SINGLETON_RENDER_MANAGER); + let captured = args.capture(); + return UnboundReference.create(curry(def, captured)); + } + }; } /** @@ -153,24 +161,34 @@ export function renderHelper( @public @deprecated Use a component instead */ -export function renderMacro( +let renderMacro: ( _name: string, params: Option, hash: Option, builder: OpcodeBuilder -) { - if (ENV._ENABLE_RENDER_SUPPORT === true) { - // TODO needs makeComponentDefinition a helper that returns a curried definition - // TODO not sure all args are for definition or component - // likely the controller name should be a arg to create? - let expr: WireFormat.Expressions.Helper = [ - WireFormat.Ops.Helper, - '-render', - params || [], - hash, - ]; - builder.dynamicComponent(expr, null, null, false, null, null); - return true; - } - return false; +) => boolean; +if (RENDER_HELPER) { + renderMacro = function renderMacro( + _name: string, + params: Option, + hash: Option, + builder: OpcodeBuilder + ) { + if (RENDER_HELPER && ENV._ENABLE_RENDER_SUPPORT === true) { + // TODO needs makeComponentDefinition a helper that returns a curried definition + // TODO not sure all args are for definition or component + // likely the controller name should be a arg to create? + let expr: WireFormat.Expressions.Helper = [ + WireFormat.Ops.Helper, + '-render', + params || [], + hash, + ]; + builder.dynamicComponent(expr, null, null, false, null, null); + return true; + } + return false; + }; } + +export { renderHelper, renderMacro }; diff --git a/packages/ember-template-compiler/lib/plugins/deprecate-render-model.js b/packages/ember-template-compiler/lib/plugins/deprecate-render-model.js index 998a9929f56..1bcdb5806bd 100644 --- a/packages/ember-template-compiler/lib/plugins/deprecate-render-model.js +++ b/packages/ember-template-compiler/lib/plugins/deprecate-render-model.js @@ -1,43 +1,46 @@ import { deprecate } from '@ember/debug'; +import { RENDER_HELPER } from '@ember/deprecated-features'; import calculateLocationDisplay from '../system/calculate-location-display'; // Remove after 3.4 once _ENABLE_RENDER_SUPPORT flag is no longer needed. export default function deprecateRenderModel(env) { - let { moduleName } = env.meta; + if (RENDER_HELPER) { + let { moduleName } = env.meta; - return { - name: 'deprecate-render-model', + let deprecationMessage = (node, param) => { + let sourceInformation = calculateLocationDisplay(moduleName, node.loc); + let componentName = node.params[0].original; + let modelName = param.original; + let original = `{{render "${componentName}" ${modelName}}}`; + let preferred = `{{${componentName} model=${modelName}}}`; - visitor: { - MustacheStatement(node) { - if (node.path.original === 'render' && node.params.length > 1) { - node.params.forEach(param => { - if (param.type !== 'PathExpression') { - return; - } + return ( + `Please refactor \`${original}\` to a component and invoke via` + + ` \`${preferred}\`. ${sourceInformation}` + ); + }; - deprecate(deprecationMessage(moduleName, node, param), false, { - id: 'ember-template-compiler.deprecate-render-model', - until: '3.0.0', - url: - 'https://emberjs.com/deprecations/v2.x#toc_model-param-in-code-render-code-helper', - }); - }); - } - }, - }, - }; -} + return { + name: 'deprecate-render-model', -function deprecationMessage(moduleName, node, param) { - let sourceInformation = calculateLocationDisplay(moduleName, node.loc); - let componentName = node.params[0].original; - let modelName = param.original; - let original = `{{render "${componentName}" ${modelName}}}`; - let preferred = `{{${componentName} model=${modelName}}}`; + visitor: { + MustacheStatement(node) { + if (node.path.original === 'render' && node.params.length > 1) { + node.params.forEach(param => { + if (param.type !== 'PathExpression') { + return; + } - return ( - `Please refactor \`${original}\` to a component and invoke via` + - ` \`${preferred}\`. ${sourceInformation}` - ); + deprecate(deprecationMessage(node, param), false, { + id: 'ember-template-compiler.deprecate-render-model', + until: '3.0.0', + url: + 'https://emberjs.com/deprecations/v2.x#toc_model-param-in-code-render-code-helper', + }); + }); + } + }, + }, + }; + } } diff --git a/packages/ember-template-compiler/lib/plugins/deprecate-render.js b/packages/ember-template-compiler/lib/plugins/deprecate-render.js index 2175425727a..7740647e766 100644 --- a/packages/ember-template-compiler/lib/plugins/deprecate-render.js +++ b/packages/ember-template-compiler/lib/plugins/deprecate-render.js @@ -1,52 +1,49 @@ import { deprecate } from '@ember/debug'; +import { RENDER_HELPER } from '@ember/deprecated-features'; import calculateLocationDisplay from '../system/calculate-location-display'; // Remove after 3.4 once _ENABLE_RENDER_SUPPORT flag is no longer needed. export default function deprecateRender(env) { - let { moduleName } = env.meta; - - return { - name: 'deprecate-render', - - visitor: { - MustacheStatement(node) { - if (node.path.original !== 'render') { - return; - } - if (node.params.length !== 1) { - return; - } - - each(node.params, param => { - if (param.type !== 'StringLiteral') { + if (RENDER_HELPER) { + let { moduleName } = env.meta; + + let deprecationMessage = node => { + let sourceInformation = calculateLocationDisplay(moduleName, node.loc); + let componentName = node.params[0].original; + let original = `{{render "${componentName}"}}`; + let preferred = `{{${componentName}}}`; + + return ( + `Please refactor \`${original}\` to a component and invoke via` + + ` \`${preferred}\`. ${sourceInformation}` + ); + }; + + return { + name: 'deprecate-render', + + visitor: { + MustacheStatement(node) { + if (node.path.original !== 'render') { return; } + if (node.params.length !== 1) { + return; + } + + node.params.forEach(param => { + if (param.type !== 'StringLiteral') { + return; + } - deprecate(deprecationMessage(moduleName, node), false, { - id: 'ember-template-compiler.deprecate-render', - until: '3.0.0', - url: 'https://emberjs.com/deprecations/v2.x#toc_code-render-code-helper', + deprecate(deprecationMessage(node), false, { + id: 'ember-template-compiler.deprecate-render', + until: '3.0.0', + url: 'https://emberjs.com/deprecations/v2.x#toc_code-render-code-helper', + }); }); - }); + }, }, - }, - }; -} - -function each(list, callback) { - for (let i = 0, l = list.length; i < l; i++) { - callback(list[i]); + }; } } - -function deprecationMessage(moduleName, node) { - let sourceInformation = calculateLocationDisplay(moduleName, node.loc); - let componentName = node.params[0].original; - let original = `{{render "${componentName}"}}`; - let preferred = `{{${componentName}}}`; - - return ( - `Please refactor \`${original}\` to a component and invoke via` + - ` \`${preferred}\`. ${sourceInformation}` - ); -} diff --git a/packages/ember-template-compiler/lib/plugins/index.js b/packages/ember-template-compiler/lib/plugins/index.js index 049f22cbdd0..a9b9ef14f45 100644 --- a/packages/ember-template-compiler/lib/plugins/index.js +++ b/packages/ember-template-compiler/lib/plugins/index.js @@ -17,6 +17,8 @@ import AssertInputHelperWithoutBlock from './assert-input-helper-without-block'; import TransformInElement from './transform-in-element'; import AssertIfHelperWithoutArguments from './assert-if-helper-without-arguments'; +import { RENDER_HELPER } from '@ember/deprecated-features'; + const transforms = [ TransformDotComponentInvocation, TransformOldBindingSyntax, @@ -25,8 +27,6 @@ const transforms = [ TransformInlineLinkTo, TransformOldClassBindingSyntax, TransformQuotedBindingsIntoJustBindings, - DeprecateRenderModel, - DeprecateRender, AssertReservedNamedArguments, TransformActionSyntax, TransformInputTypeSyntax, @@ -38,4 +38,9 @@ const transforms = [ AssertIfHelperWithoutArguments, ]; +if (RENDER_HELPER) { + transforms.push(DeprecateRenderModel); + transforms.push(DeprecateRender); +} + export default Object.freeze(transforms); From 9f8298fb6b7421e58ef1167544dde63bd6ad851c Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 15:33:51 -0400 Subject: [PATCH 14/16] Wrap "fooBinding" support for svelting. --- packages/@ember/deprecated-features/index.ts | 1 + packages/ember-meta/lib/meta.ts | 107 ++++++++++-------- packages/ember-metal/lib/mixin.ts | 11 +- .../ember-runtime/lib/system/core_object.js | 5 +- .../lib/plugins/index.js | 7 +- .../plugins/transform-old-binding-syntax.js | 100 ++++++++-------- 6 files changed, 125 insertions(+), 106 deletions(-) diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index b0318e5a203..32eafaa69e3 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -15,3 +15,4 @@ export const ORPHAN_OUTLET_RENDER = !!'2.11.0-beta.1'; export const ARRAY_AT_EACH = !!'3.1.0-beta.1'; export const TARGET_OBJECT = !!'2.18.0-beta.1'; export const RENDER_HELPER = !!'2.11.0-beta.1'; +export const BINDING_SUPPORT = !!'2.7.0-beta.1'; diff --git a/packages/ember-meta/lib/meta.ts b/packages/ember-meta/lib/meta.ts index 6ea8eb34c96..a9c065a4a18 100644 --- a/packages/ember-meta/lib/meta.ts +++ b/packages/ember-meta/lib/meta.ts @@ -1,4 +1,5 @@ import { assert } from '@ember/debug'; +import { BINDING_SUPPORT } from '@ember/deprecated-features'; import { DEBUG } from '@glimmer/env'; import { Tag } from '@glimmer/reference'; import { ENV } from 'ember-environment'; @@ -64,7 +65,7 @@ export class Meta { this._descriptors = undefined; this._watching = undefined; this._mixins = undefined; - if (ENV._ENABLE_BINDING_SUPPORT) { + if (BINDING_SUPPORT && ENV._ENABLE_BINDING_SUPPORT) { this._bindings = undefined; } this._deps = undefined; @@ -390,67 +391,75 @@ export class Meta { } writeBindings(subkey: string, value: any) { - assert( - 'Cannot invoke `meta.writeBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', - ENV._ENABLE_BINDING_SUPPORT - ); - assert( - this.isMetaDestroyed() - ? `Cannot add a binding for \`${subkey}\` on \`${toString( - this.source - )}\` after it has been destroyed.` - : '', - !this.isMetaDestroyed() - ); - - let map = this._getOrCreateOwnMap('_bindings'); - map[subkey] = value; + if (BINDING_SUPPORT) { + assert( + 'Cannot invoke `meta.writeBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', + ENV._ENABLE_BINDING_SUPPORT + ); + assert( + this.isMetaDestroyed() + ? `Cannot add a binding for \`${subkey}\` on \`${toString( + this.source + )}\` after it has been destroyed.` + : '', + !this.isMetaDestroyed() + ); + + let map = this._getOrCreateOwnMap('_bindings'); + map[subkey] = value; + } } peekBindings(subkey: string) { - assert( - 'Cannot invoke `meta.peekBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', - ENV._ENABLE_BINDING_SUPPORT - ); - return this._findInherited('_bindings', subkey); + if (BINDING_SUPPORT) { + assert( + 'Cannot invoke `meta.peekBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', + ENV._ENABLE_BINDING_SUPPORT + ); + return this._findInherited('_bindings', subkey); + } } forEachBindings(fn: Function) { - assert( - 'Cannot invoke `meta.forEachBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', - ENV._ENABLE_BINDING_SUPPORT - ); - - let pointer: Meta | undefined = this; - let seen: { [key: string]: any } | undefined; - while (pointer !== undefined) { - let map = pointer._bindings; - if (map !== undefined) { - for (let key in map) { - // cleanup typing - seen = seen === undefined ? Object.create(null) : seen; - if (seen![key] === undefined) { - seen![key] = true; - fn(key, map[key]); + if (BINDING_SUPPORT) { + assert( + 'Cannot invoke `meta.forEachBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', + ENV._ENABLE_BINDING_SUPPORT + ); + + let pointer: Meta | undefined = this; + let seen: { [key: string]: any } | undefined; + while (pointer !== undefined) { + let map = pointer._bindings; + if (map !== undefined) { + for (let key in map) { + // cleanup typing + seen = seen === undefined ? Object.create(null) : seen; + if (seen![key] === undefined) { + seen![key] = true; + fn(key, map[key]); + } } } + pointer = pointer.parent; } - pointer = pointer.parent; } } clearBindings() { - assert( - 'Cannot invoke `meta.clearBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', - ENV._ENABLE_BINDING_SUPPORT - ); - assert( - this.isMetaDestroyed() - ? `Cannot clear bindings on \`${toString(this.source)}\` after it has been destroyed.` - : '', - !this.isMetaDestroyed() - ); - this._bindings = undefined; + if (BINDING_SUPPORT) { + assert( + 'Cannot invoke `meta.clearBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', + ENV._ENABLE_BINDING_SUPPORT + ); + assert( + this.isMetaDestroyed() + ? `Cannot clear bindings on \`${toString(this.source)}\` after it has been destroyed.` + : '', + !this.isMetaDestroyed() + ); + this._bindings = undefined; + } } writeDescriptors(subkey: string, value: any) { diff --git a/packages/ember-metal/lib/mixin.ts b/packages/ember-metal/lib/mixin.ts index f78b3306acf..b163d04d81d 100644 --- a/packages/ember-metal/lib/mixin.ts +++ b/packages/ember-metal/lib/mixin.ts @@ -2,6 +2,7 @@ @module @ember/object */ import { assert } from '@ember/debug'; +import { BINDING_SUPPORT } from '@ember/deprecated-features'; import { assign } from '@ember/polyfills'; import { DEBUG } from '@glimmer/env'; import { ENV } from 'ember-environment'; @@ -404,6 +405,7 @@ function applyMixin(obj: { [key: string]: any }, mixins: Mixin[], partial: boole } if ( + BINDING_SUPPORT && ENV._ENABLE_BINDING_SUPPORT && typeof Mixin.detectBinding === 'function' && Mixin.detectBinding(key) @@ -414,7 +416,12 @@ function applyMixin(obj: { [key: string]: any }, mixins: Mixin[], partial: boole defineProperty(obj, key, desc, value, meta); } - if (ENV._ENABLE_BINDING_SUPPORT && !partial && typeof Mixin.finishPartial === 'function') { + if ( + BINDING_SUPPORT && + ENV._ENABLE_BINDING_SUPPORT && + !partial && + typeof Mixin.finishPartial === 'function' + ) { Mixin.finishPartial(obj, meta); } @@ -684,7 +691,7 @@ function buildMixinsArray(mixins: MixinLike[] | undefined): Mixin[] | undefined type MixinLike = Mixin | { [key: string]: any }; -if (ENV._ENABLE_BINDING_SUPPORT) { +if (BINDING_SUPPORT && ENV._ENABLE_BINDING_SUPPORT) { // slotting this so that the legacy addon can add the function here // without triggering an error due to the Object.seal done below Mixin.finishPartial = null; diff --git a/packages/ember-runtime/lib/system/core_object.js b/packages/ember-runtime/lib/system/core_object.js index 2bd6b2da564..b88dde31e11 100644 --- a/packages/ember-runtime/lib/system/core_object.js +++ b/packages/ember-runtime/lib/system/core_object.js @@ -3,6 +3,7 @@ */ import { FACTORY_FOR } from 'container'; +import { BINDING_SUPPORT } from '@ember/deprecated-features'; import { assign } from '@ember/polyfills'; import { guidFor, @@ -151,7 +152,7 @@ function makeCtor(base) { let keyName = keyNames[i]; let value = properties[keyName]; - if (ENV._ENABLE_BINDING_SUPPORT && Mixin.detectBinding(keyName)) { + if (BINDING_SUPPORT && ENV._ENABLE_BINDING_SUPPORT && Mixin.detectBinding(keyName)) { m.writeBindings(keyName, value); } @@ -204,7 +205,7 @@ function makeCtor(base) { } } - if (ENV._ENABLE_BINDING_SUPPORT) { + if (BINDING_SUPPORT && ENV._ENABLE_BINDING_SUPPORT) { Mixin.finishPartial(self, m); } diff --git a/packages/ember-template-compiler/lib/plugins/index.js b/packages/ember-template-compiler/lib/plugins/index.js index a9b9ef14f45..bdcd7aa3197 100644 --- a/packages/ember-template-compiler/lib/plugins/index.js +++ b/packages/ember-template-compiler/lib/plugins/index.js @@ -17,11 +17,10 @@ import AssertInputHelperWithoutBlock from './assert-input-helper-without-block'; import TransformInElement from './transform-in-element'; import AssertIfHelperWithoutArguments from './assert-if-helper-without-arguments'; -import { RENDER_HELPER } from '@ember/deprecated-features'; +import { BINDING_SUPPORT, RENDER_HELPER } from '@ember/deprecated-features'; const transforms = [ TransformDotComponentInvocation, - TransformOldBindingSyntax, TransformAngleBracketComponents, TransformTopLevelComponents, TransformInlineLinkTo, @@ -43,4 +42,8 @@ if (RENDER_HELPER) { transforms.push(DeprecateRender); } +if (BINDING_SUPPORT) { + transforms.push(TransformOldBindingSyntax); +} + export default Object.freeze(transforms); diff --git a/packages/ember-template-compiler/lib/plugins/transform-old-binding-syntax.js b/packages/ember-template-compiler/lib/plugins/transform-old-binding-syntax.js index 0925463be14..e97ec53ccaf 100644 --- a/packages/ember-template-compiler/lib/plugins/transform-old-binding-syntax.js +++ b/packages/ember-template-compiler/lib/plugins/transform-old-binding-syntax.js @@ -1,68 +1,66 @@ import { assert, deprecate } from '@ember/debug'; +import { BINDING_SUPPORT } from '@ember/deprecated-features'; import calculateLocationDisplay from '../system/calculate-location-display'; export default function transformOldBindingSyntax(env) { - let { moduleName } = env.meta; - let b = env.syntax.builders; + if (BINDING_SUPPORT) { + let { moduleName } = env.meta; + let b = env.syntax.builders; - return { - name: 'transform-old-binding-syntax', - - visitor: { - BlockStatement(node) { - processHash(b, node, moduleName); - }, + let exprToString = expr => { + switch (expr.type) { + case 'StringLiteral': + return `"${expr.original}"`; + case 'PathExpression': + return expr.original; + } + }; - MustacheStatement(node) { - processHash(b, node, moduleName); - }, - }, - }; -} + let processHash = node => { + for (let i = 0; i < node.hash.pairs.length; i++) { + let pair = node.hash.pairs[i]; + let { key, value } = pair; -function processHash(b, node, moduleName) { - for (let i = 0; i < node.hash.pairs.length; i++) { - let pair = node.hash.pairs[i]; - let { key, value } = pair; + let sourceInformation = calculateLocationDisplay(moduleName, pair.loc); - let sourceInformation = calculateLocationDisplay(moduleName, pair.loc); + if (key === 'classBinding') { + return; + } - if (key === 'classBinding') { - return; - } + assert( + `Setting 'attributeBindings' via template helpers is not allowed ${sourceInformation}`, + key !== 'attributeBindings' + ); - assert( - `Setting 'attributeBindings' via template helpers is not allowed ${sourceInformation}`, - key !== 'attributeBindings' - ); + if (key.substr(-7) === 'Binding') { + let newKey = key.slice(0, -7); - if (key.substr(-7) === 'Binding') { - let newKey = key.slice(0, -7); + deprecate( + `You're using legacy binding syntax: ${key}=${exprToString( + value + )} ${sourceInformation}. Please replace with ${newKey}=${value.original}`, + false, + { + id: 'ember-template-compiler.transform-old-binding-syntax', + until: '3.0.0', + } + ); - deprecate( - `You're using legacy binding syntax: ${key}=${exprToString( - value - )} ${sourceInformation}. Please replace with ${newKey}=${value.original}`, - false, - { - id: 'ember-template-compiler.transform-old-binding-syntax', - until: '3.0.0', + pair.key = newKey; + if (value.type === 'StringLiteral') { + pair.value = b.path(value.original); + } } - ); - - pair.key = newKey; - if (value.type === 'StringLiteral') { - pair.value = b.path(value.original); } - } - } -} + }; -function exprToString(expr) { - switch (expr.type) { - case 'StringLiteral': - return `"${expr.original}"`; - case 'PathExpression': - return expr.original; + return { + name: 'transform-old-binding-syntax', + + visitor: { + BlockStatement: processHash, + MustacheStatement: processHash, + }, + }; } } From 27b0de5652cf84b4180558431a978fd7bbd64560 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 15:35:05 -0400 Subject: [PATCH 15/16] Ensure @ember/deprecated-features ends up in template compiler build. --- ember-cli-build.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ember-cli-build.js b/ember-cli-build.js index 778a987f069..47b390e557d 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -182,6 +182,7 @@ module.exports = function() { '@ember/canary-features/**', '@ember/debug/index.js', '@ember/debug/lib/**', + '@ember/deprecated-features/**', '@ember/error/index.js', '@ember/polyfills/index.js', '@ember/polyfills/lib/**', From 3313226ff5360fffb498a28fefa463c91ce5adcb Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Thu, 24 May 2018 15:35:52 -0400 Subject: [PATCH 16/16] Remove outdated `features.json` file. --- features.json | 47 ----------------------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 features.json diff --git a/features.json b/features.json deleted file mode 100644 index c7bc423e427..00000000000 --- a/features.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "deprecations": { - "container-lookupFactory": "2.12.0", - "ember-application.injected-container": "2.3.0", - "ember-application.app-instance-registry": "2.1.0", - "ember-application.registry-resolver-as-function": "2.3.0", - "ember-application.app-instance-container": "2.1.0", - "ember-application.app-initializer-initialize-arguments": "2.1.0", - "ember-application.validate-type": "1.13.0", - "ember-debug.deprecate-options-missing": "2.1.0", - "ember-debug.deprecate-id-missing": "2.1.0", - "ember-debug.deprecate-until-missing": "2.1.0", - "ember-debug.warn-options-missing": "2.1.0", - "ember-debug.warn-id-missing": "2.1.0", - "ember-routing-views.controller-wrapped-param": "2.0.0", - "ember-htmlbars.make-bound-helper": "1.13.6", - "ember-htmlbars.ember-handlebars-safestring": "2.8.0", - "ember-metal.binding": "2.7.0", - "ember-views.did-init-attrs": "2.6.0", - "ember-metal.required": "2.0.0", - "ember-metal.observer-argument-order": "2.0.0", - "ember-metal.immediate-observer": "2.0.0", - "ember-views.render-double-modify": "2.0.0", - "ember-routing.router-resource": "2.0.0", - "ember-routing.top-level-render-helper": "2.11.0", - "ember-runtime.controller-content": "2.16.0", - "ember-runtime.controller-proxy": "2.0.0", - "ember-runtime.action-handler-_actions": "2.0.0", - "ember-runtime.enumerable-contains": "2.7.0", - "ember-runtime.frozen-copy": "2.0.0", - "ember-runtime.freezable-init": "2.0.0", - "ember-string-utils.fmt": "2.0.0", - "ember-template-compiler.deprecate-render-model": "2.6.0", - "ember-template-compiler.deprecate-render": "2.11.0", - "ember-template-compiler.transform-input-on-to-onEvent.dynamic-value": "2.1.0", - "ember-template-compiler.transform-input-on-to-onEvent.no-action": "2.1.0", - "ember-template-compiler.transform-input-on-to-onEvent.normalized-on": "2.1.0", - "ember-template-compiler.transform-old-binding-syntax": "2.1.0", - "ember-testing.test-waiters": "2.7.0", - "ember-views.lifecycle-hook-arguments": "2.12.0", - "ember-views.render-to-element": "2.11.0", - "ember-metal.ember-k": "2.12.0", - "ember-metal.ember-backburner": "2.7.0", - "ember-metal.ember.keys": "1.13.3", - "ember-metal.ember-create": "1.13.3" - } -}