From 37a06d4f52953066babc5f2305661e2f1c35e6c0 Mon Sep 17 00:00:00 2001 From: Sergio Arbeo Date: Fri, 13 Oct 2017 14:41:41 +0200 Subject: [PATCH] [DEPRECATION canary] Deprecate Ember.String an prototype extension This PR deprecates the use of String prototype extension and Ember.String namespace. Methods coming from ember-runtime --- A new `StringUtils` object is added, to be used internally by Ember instead of using the same object being exposed as `Ember.String`. This simplifies testing and the changes required in the rest of the code. Also, dropping the deprecated code will be much simpler. Methods coming from ember-glimmer --- Deprecated versions are being added and reexported as the same global the non-deprecated versions were. Besides, the non-deprecated version is being exported under the new global `Ember.Template`. --- .../ember-application/lib/system/resolver.js | 2 +- .../lib/container_debug_adapter.js | 2 +- .../lib/data_adapter.js | 2 +- packages/ember-glimmer/lib/helpers/-class.js | 2 +- .../lib/helpers/-normalize-class.js | 2 +- packages/ember-glimmer/lib/helpers/loc.js | 2 +- packages/ember-glimmer/lib/index.js | 4 +- packages/ember-glimmer/lib/utils/bindings.js | 2 +- packages/ember-glimmer/lib/utils/string.js | 28 +++++++++ packages/ember-glimmer/tests/utils/helpers.js | 4 +- .../ember-glimmer/tests/utils/string-test.js | 18 +++++- packages/ember-routing/lib/system/route.js | 2 +- packages/ember-runtime/lib/ext/string.js | 57 +++++++++++-------- packages/ember-runtime/lib/index.js | 2 +- packages/ember-runtime/lib/system/string.js | 54 +++++++++++++++--- .../tests/system/string/camelize_test.js | 8 ++- .../tests/system/string/capitalize_test.js | 8 ++- .../tests/system/string/classify_test.js | 8 ++- .../tests/system/string/dasherize_test.js | 8 ++- .../tests/system/string/decamelize_test.js | 8 ++- .../tests/system/string/fmt_string_test.js | 7 ++- .../tests/system/string/loc_test.js | 8 ++- .../tests/system/string/underscore_test.js | 8 ++- .../tests/system/string/w_test.js | 8 ++- packages/ember/lib/index.js | 28 ++++++++- packages/ember/tests/reexports_test.js | 6 +- .../ember/tests/routing/query_params_test.js | 2 +- .../router_service_test/urlFor_test.js | 4 +- 28 files changed, 233 insertions(+), 61 deletions(-) diff --git a/packages/ember-application/lib/system/resolver.js b/packages/ember-application/lib/system/resolver.js index 0dcdd32e7b1..448f7b9c2fe 100644 --- a/packages/ember-application/lib/system/resolver.js +++ b/packages/ember-application/lib/system/resolver.js @@ -7,8 +7,8 @@ import { dictionary } from 'ember-utils'; import { get } from 'ember-metal'; import { assert, info } from 'ember-debug'; import { - String as StringUtils, Object as EmberObject, + StringUtils, Namespace } from 'ember-runtime'; import validateType from '../utils/validate-type'; diff --git a/packages/ember-extension-support/lib/container_debug_adapter.js b/packages/ember-extension-support/lib/container_debug_adapter.js index 70da9e83929..53907ac7f5f 100644 --- a/packages/ember-extension-support/lib/container_debug_adapter.js +++ b/packages/ember-extension-support/lib/container_debug_adapter.js @@ -2,7 +2,7 @@ import Ember from 'ember-metal'; // Ember as namespace import { A as emberA, typeOf, - String as StringUtils, + StringUtils, Namespace, Object as EmberObject } from 'ember-runtime'; diff --git a/packages/ember-extension-support/lib/data_adapter.js b/packages/ember-extension-support/lib/data_adapter.js index 8772dff5047..1899b7501b0 100644 --- a/packages/ember-extension-support/lib/data_adapter.js +++ b/packages/ember-extension-support/lib/data_adapter.js @@ -1,7 +1,7 @@ import { getOwner } from 'ember-utils'; import { get, run } from 'ember-metal'; import { - String as StringUtils, + StringUtils, Namespace, Object as EmberObject, A as emberA, diff --git a/packages/ember-glimmer/lib/helpers/-class.js b/packages/ember-glimmer/lib/helpers/-class.js index 2d780793490..cd4e49df763 100644 --- a/packages/ember-glimmer/lib/helpers/-class.js +++ b/packages/ember-glimmer/lib/helpers/-class.js @@ -1,5 +1,5 @@ import { InternalHelperReference } from '../utils/references'; -import { String as StringUtils } from 'ember-runtime'; +import { StringUtils } from 'ember-runtime'; function classHelper({ positional }) { let path = positional.at(0); diff --git a/packages/ember-glimmer/lib/helpers/-normalize-class.js b/packages/ember-glimmer/lib/helpers/-normalize-class.js index 4d347ac658a..981ec177649 100644 --- a/packages/ember-glimmer/lib/helpers/-normalize-class.js +++ b/packages/ember-glimmer/lib/helpers/-normalize-class.js @@ -1,5 +1,5 @@ import { InternalHelperReference } from '../utils/references'; -import { String as StringUtils } from 'ember-runtime'; +import { StringUtils } from 'ember-runtime'; function normalizeClass({ positional, named }) { let classNameParts = positional.at(0).value().split('.'); diff --git a/packages/ember-glimmer/lib/helpers/loc.js b/packages/ember-glimmer/lib/helpers/loc.js index 21456734c00..c82ad0a7b36 100644 --- a/packages/ember-glimmer/lib/helpers/loc.js +++ b/packages/ember-glimmer/lib/helpers/loc.js @@ -4,7 +4,7 @@ @submodule ember-glimmer */ import { InternalHelperReference } from '../utils/references'; -import { String as StringUtils } from 'ember-runtime'; +import { StringUtils } from 'ember-runtime'; /** Calls [Ember.String.loc](/api/classes/Ember.String.html#method_loc) with the diff --git a/packages/ember-glimmer/lib/index.js b/packages/ember-glimmer/lib/index.js index 066e98f0477..e3792d5c6d7 100644 --- a/packages/ember-glimmer/lib/index.js +++ b/packages/ember-glimmer/lib/index.js @@ -97,7 +97,7 @@ {{/each}} {{/with}} ``` - + NOTE: The alias should not reuse a name from the bound property path. For example: `{{#with foo.bar as |foo|}}` is not supported because it attempts to alias using @@ -268,7 +268,9 @@ export { SafeString, escapeExpression, htmlSafe, + deprecatedHTMLSafe, isHTMLSafe, + deprecatedIsHTMLSafe, getSafeString as _getSafeString } from './utils/string'; export { diff --git a/packages/ember-glimmer/lib/utils/bindings.js b/packages/ember-glimmer/lib/utils/bindings.js index 98112257981..23d4f8ed862 100644 --- a/packages/ember-glimmer/lib/utils/bindings.js +++ b/packages/ember-glimmer/lib/utils/bindings.js @@ -9,7 +9,7 @@ import { } from '@glimmer/wire-format'; import { assert } from 'ember-debug'; import { get } from 'ember-metal'; -import { String as StringUtils } from 'ember-runtime'; +import { StringUtils } from 'ember-runtime'; import { ROOT_REF } from '../component'; import { htmlSafe, isHTMLSafe } from './string'; diff --git a/packages/ember-glimmer/lib/utils/string.js b/packages/ember-glimmer/lib/utils/string.js index 1d47ee14af0..a6182e16307 100644 --- a/packages/ember-glimmer/lib/utils/string.js +++ b/packages/ember-glimmer/lib/utils/string.js @@ -87,6 +87,7 @@ export function escapeExpression(string) { @static @return {Handlebars.SafeString} A string that will not be HTML escaped by Handlebars. @public + @deprecated */ export function htmlSafe(str) { if (str === null || str === undefined) { @@ -97,6 +98,19 @@ export function htmlSafe(str) { return new SafeString(str); } +export function deprecatedHTMLSafe(str) { + deprecate( + 'Ember.String namespace is deprecated. Please, import `htmlSafe` from `ember/template`.', + false, + { + id: 'ember-glimmer/ember-string-html-safe', + until: '3.5.0', + url: '' + } + ); + return htmlSafe(str); +} + /** Detects if a string was decorated using `Ember.String.htmlSafe`. @@ -113,7 +127,21 @@ export function htmlSafe(str) { @static @return {Boolean} `true` if the string was decorated with `htmlSafe`, `false` otherwise. @public + @deprecated */ export function isHTMLSafe(str) { return str && typeof str.toHTML === 'function'; } + +export function deprecatedIsHTMLSafe(str) { + deprecate( + 'Ember.String namespace is deprecated. Please, import `isHTMLSafe` from `ember/template`.', + false, + { + id: 'ember-glimmer/ember-string-is-html-safe', + until: '3.5.0', + url: '' + } + ); + return isHTMLSafe(str); +} diff --git a/packages/ember-glimmer/tests/utils/helpers.js b/packages/ember-glimmer/tests/utils/helpers.js index 15d318177f5..aa7ebd9993e 100644 --- a/packages/ember-glimmer/tests/utils/helpers.js +++ b/packages/ember-glimmer/tests/utils/helpers.js @@ -14,7 +14,9 @@ export { InteractiveRender, InertRenderer, htmlSafe, + deprecatedHTMLSafe, SafeString, DOMChanges, - isHTMLSafe + isHTMLSafe, + deprecatedIsHTMLSafe } from 'ember-glimmer'; diff --git a/packages/ember-glimmer/tests/utils/string-test.js b/packages/ember-glimmer/tests/utils/string-test.js index c3fe64b1934..7a7513b327e 100644 --- a/packages/ember-glimmer/tests/utils/string-test.js +++ b/packages/ember-glimmer/tests/utils/string-test.js @@ -1,8 +1,19 @@ -import { SafeString, htmlSafe, isHTMLSafe } from './helpers'; +import { + SafeString, + htmlSafe, + deprecatedHTMLSafe, + isHTMLSafe, + deprecatedIsHTMLSafe +} from './helpers'; import { TestCase } from './abstract-test-case'; import { moduleFor } from './test-case'; moduleFor('SafeString', class extends TestCase { + ['@test deprecated version is deprecated']() { + expectDeprecation(/ember\/template/); + deprecatedHTMLSafe("Hello"); + } + ['@test htmlSafe should return an instance of SafeString']() { let safeString = htmlSafe('you need to be more bold'); @@ -25,6 +36,11 @@ moduleFor('SafeString', class extends TestCase { }); moduleFor('SafeString isHTMLSafe', class extends TestCase { + ['@test deprecated version is deprecated']() { + expectDeprecation(/ember\/template/); + deprecatedIsHTMLSafe("Hello"); + } + ['@test isHTMLSafe should detect SafeString']() { let safeString = htmlSafe('Emphasize the important things.'); diff --git a/packages/ember-routing/lib/system/route.js b/packages/ember-routing/lib/system/route.js index a8f374a7738..36d34a397ad 100644 --- a/packages/ember-routing/lib/system/route.js +++ b/packages/ember-routing/lib/system/route.js @@ -14,7 +14,7 @@ import { DEBUG } from 'ember-env-flags'; import { typeOf, copy, - String as StringUtils, + StringUtils, Object as EmberObject, A as emberA, Evented, diff --git a/packages/ember-runtime/lib/ext/string.js b/packages/ember-runtime/lib/ext/string.js index 946b6ed57af..6f5bb74c3e7 100644 --- a/packages/ember-runtime/lib/ext/string.js +++ b/packages/ember-runtime/lib/ext/string.js @@ -15,9 +15,27 @@ import { capitalize, classify } from '../system/string'; +import { deprecate } from 'ember-debug'; +import { assign } from 'ember-utils'; const StringPrototype = String.prototype; +function deprecateEmberStringExtension(fn, opts = {}) { + let { name } = fn; + return function(...args) { + deprecate( + opts.message || `Extending String prototype is deprecated. Please, use ${name} from '@ember/string' instead.`, + false, + opts.options || { + id: 'ember-runtime/string-prototype-extension', + until: '3.5.0', + url: '' + } + ); + return fn(this, args); + } +} + if (ENV.EXTEND_PROTOTYPES.String) { /** See [Ember.String.fmt](/api/classes/Ember.String.html#method_fmt). @@ -38,9 +56,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { @for String @private */ - StringPrototype.w = function () { - return w(this); - }; + StringPrototype.w = deprecateEmberStringExtension(w); /** See [Ember.String.loc](/api/classes/Ember.String.html#method_loc). @@ -49,9 +65,14 @@ if (ENV.EXTEND_PROTOTYPES.String) { @for String @private */ - StringPrototype.loc = function (...args) { - return loc(this, args); - }; + StringPrototype.loc = deprecateEmberStringExtension(loc, { + message: '`loc` is deprecated. Please, use an i18n addon instead. See https://emberobserver.com/categories/internationalization for a list of them.', + options: { + id: 'ember-string-utils/loc', + until: '3.5.0', + url: '' + } + }); /** See [Ember.String.camelize](/api/classes/Ember.String.html#method_camelize). @@ -60,9 +81,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { @for String @private */ - StringPrototype.camelize = function () { - return camelize(this); - }; + StringPrototype.camelize = deprecateEmberStringExtension(camelize); /** See [Ember.String.decamelize](/api/classes/Ember.String.html#method_decamelize). @@ -71,9 +90,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { @for String @private */ - StringPrototype.decamelize = function () { - return decamelize(this); - }; + StringPrototype.decamelize = deprecateEmberStringExtension(decamelize); /** See [Ember.String.dasherize](/api/classes/Ember.String.html#method_dasherize). @@ -82,9 +99,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { @for String @private */ - StringPrototype.dasherize = function () { - return dasherize(this); - }; + StringPrototype.dasherize = deprecateEmberStringExtension(dasherize); /** See [Ember.String.underscore](/api/classes/Ember.String.html#method_underscore). @@ -93,9 +108,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { @for String @private */ - StringPrototype.underscore = function () { - return underscore(this); - }; + StringPrototype.underscore = deprecateEmberStringExtension(underscore); /** See [Ember.String.classify](/api/classes/Ember.String.html#method_classify). @@ -104,9 +117,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { @for String @private */ - StringPrototype.classify = function () { - return classify(this); - }; + StringPrototype.classify = deprecateEmberStringExtension(classify); /** See [Ember.String.capitalize](/api/classes/Ember.String.html#method_capitalize). @@ -115,7 +126,5 @@ if (ENV.EXTEND_PROTOTYPES.String) { @for String @private */ - StringPrototype.capitalize = function () { - return capitalize(this); - }; + StringPrototype.capitalize = deprecateEmberStringExtension(capitalize); } diff --git a/packages/ember-runtime/lib/index.js b/packages/ember-runtime/lib/index.js index e4422e17fcb..d85d817aa22 100644 --- a/packages/ember-runtime/lib/index.js +++ b/packages/ember-runtime/lib/index.js @@ -4,7 +4,7 @@ */ export { default as Object, FrameworkObject } from './system/object'; -export { default as String } from './system/string'; +export { default as String, StringUtils } from './system/string'; export { default as RegistryProxyMixin, buildFakeRegistryWithDeprecations diff --git a/packages/ember-runtime/lib/system/string.js b/packages/ember-runtime/lib/system/string.js index ff30a89a256..0b7acfad2db 100644 --- a/packages/ember-runtime/lib/system/string.js +++ b/packages/ember-runtime/lib/system/string.js @@ -116,6 +116,22 @@ function capitalize(str) { return CAPITALIZE_CACHE.get(str); } +function deprecateEmberStringUtil(fn, opts = {}) { + let { name } = fn; + return function (...args) { + deprecate( + opts.message || `Ember.String namespace is deprecated. Please, use ${name} from '@ember/string' instead.`, + false, + opts.options || { + id: 'ember-runtime/string-prototype-extension', + until: '3.5.0', + url: '' + } + ); + return fn(...args); + }; +} + /** Defines string helper methods including string formatting and localization. Unless `EmberENV.EXTEND_PROTOTYPES.String` is `false` these methods will also be @@ -149,7 +165,7 @@ export default { @public @deprecated Use ES6 template strings instead: http://babeljs.io/docs/learn-es2015/#template-strings */ - fmt, + fmt: deprecateEmberStringUtil(fmt), /** Formats the passed string, but first looks up the string in the localized @@ -175,8 +191,9 @@ export default { @param {Array} formats Optional array of parameters to interpolate into string. @return {String} formatted string @public + @deprecated Use @ember/string addon instead. */ - loc, + loc: deprecateEmberStringUtil(loc), /** Splits a string into separate units separated by spaces, eliminating any @@ -197,8 +214,9 @@ export default { @param {String} str The string to split @return {Array} array containing the split strings @public + @deprecated Use @ember/string addon instead. */ - w, + w: deprecateEmberStringUtil(w), /** Converts a camelized string into all lower case separated by underscores. @@ -214,8 +232,9 @@ export default { @param {String} str The string to decamelize. @return {String} the decamelized string. @public + @deprecated Use @ember/string addon instead. */ - decamelize, + decamelize: deprecateEmberStringUtil(decamelize), /** Replaces underscores, spaces, or camelCase with dashes. @@ -232,8 +251,9 @@ export default { @param {String} str The string to dasherize. @return {String} the dasherized string. @public + @deprecated Use @ember/string addon instead. */ - dasherize, + dasherize: deprecateEmberStringUtil(dasherize), /** Returns the lowerCamelCase form of a string. @@ -251,8 +271,9 @@ export default { @param {String} str The string to camelize. @return {String} the camelized string. @public + @deprecated Use @ember/string addon instead. */ - camelize, + camelize: deprecateEmberStringUtil(camelize), /** Returns the UpperCamelCase form of a string. @@ -269,8 +290,9 @@ export default { @param {String} str the string to classify @return {String} the classified string @public + @deprecated Use @ember/string addon instead. */ - classify, + classify: deprecateEmberStringUtil(classify), /** More general than decamelize. Returns the lower\_case\_and\_underscored @@ -288,8 +310,9 @@ export default { @param {String} str The string to underscore. @return {String} the underscored string. @public + @deprecated Use @ember/string addon instead. */ - underscore, + underscore: deprecateEmberStringUtil(underscore), /** Returns the Capitalized form of a string @@ -306,8 +329,9 @@ export default { @param {String} str The string to capitalize. @return {String} The capitalized string. @public + @deprecated Use @ember/string addon instead. */ - capitalize + capitalize: deprecateEmberStringUtil(capitalize) }; export { @@ -321,3 +345,15 @@ export { underscore, capitalize }; + +export const StringUtils = { + fmt, + loc, + w, + decamelize, + dasherize, + camelize, + classify, + underscore, + capitalize +}; diff --git a/packages/ember-runtime/tests/system/string/camelize_test.js b/packages/ember-runtime/tests/system/string/camelize_test.js index dc41046a15d..140ff114b3b 100644 --- a/packages/ember-runtime/tests/system/string/camelize_test.js +++ b/packages/ember-runtime/tests/system/string/camelize_test.js @@ -1,5 +1,5 @@ import { ENV } from 'ember-environment'; -import { camelize } from '../../../system/string'; +import { camelize, default as EmberString } from '../../../system/string'; QUnit.module('EmberStringUtils.camelize'); @@ -9,10 +9,16 @@ if (!ENV.EXTEND_PROTOTYPES.String) { }); } +QUnit.test('Ember.String.camelize is deprecated', function() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.camelize('hello world'); +}); + function test(given, expected, description) { QUnit.test(description, function() { deepEqual(camelize(given), expected); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); deepEqual(given.camelize(), expected); } }) diff --git a/packages/ember-runtime/tests/system/string/capitalize_test.js b/packages/ember-runtime/tests/system/string/capitalize_test.js index 98f40d51e7d..1703c0446e6 100644 --- a/packages/ember-runtime/tests/system/string/capitalize_test.js +++ b/packages/ember-runtime/tests/system/string/capitalize_test.js @@ -1,5 +1,5 @@ import { ENV } from 'ember-environment'; -import { capitalize } from '../../../system/string'; +import { capitalize, default as EmberString } from '../../../system/string'; QUnit.module('EmberStringUtils.capitalize'); @@ -9,10 +9,16 @@ if (!ENV.EXTEND_PROTOTYPES.String) { }); } +QUnit.test('Ember.String.capitalize is deprecated', function() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.capitalize('hello world'); +}); + function test(given, expected, description) { QUnit.test(description, function () { deepEqual(capitalize(given), expected); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); deepEqual(given.capitalize(), expected); } }); diff --git a/packages/ember-runtime/tests/system/string/classify_test.js b/packages/ember-runtime/tests/system/string/classify_test.js index 3900ad83b64..2c0ebeee940 100644 --- a/packages/ember-runtime/tests/system/string/classify_test.js +++ b/packages/ember-runtime/tests/system/string/classify_test.js @@ -1,5 +1,5 @@ import { ENV } from 'ember-environment'; -import { classify } from '../../../system/string'; +import { classify, default as EmberString } from '../../../system/string'; QUnit.module('EmberStringUtils.classify'); @@ -9,10 +9,16 @@ if (!ENV.EXTEND_PROTOTYPES.String) { }); } +QUnit.test('Ember.String.classify is deprecated', function() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.classify('hello world'); +}); + function test(given, expected, description) { QUnit.test(description, function() { deepEqual(classify(given), expected); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); deepEqual(given.classify(), expected); } }); diff --git a/packages/ember-runtime/tests/system/string/dasherize_test.js b/packages/ember-runtime/tests/system/string/dasherize_test.js index aecf1a516df..0f0b34d341c 100644 --- a/packages/ember-runtime/tests/system/string/dasherize_test.js +++ b/packages/ember-runtime/tests/system/string/dasherize_test.js @@ -1,5 +1,5 @@ import { ENV } from 'ember-environment'; -import { dasherize } from '../../../system/string'; +import { dasherize, default as EmberString } from '../../../system/string'; QUnit.module('EmberStringUtils.dasherize'); @@ -9,10 +9,16 @@ if (!ENV.EXTEND_PROTOTYPES.String) { }); } +QUnit.test('Ember.String.dasherize is deprecated', function() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.dasherize('HelloWorld'); +}); + function test(given, expected, description) { QUnit.test(description, function () { deepEqual(dasherize(given), expected); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); deepEqual(given.dasherize(), expected); } }); diff --git a/packages/ember-runtime/tests/system/string/decamelize_test.js b/packages/ember-runtime/tests/system/string/decamelize_test.js index e0d3b99a411..411117c1957 100644 --- a/packages/ember-runtime/tests/system/string/decamelize_test.js +++ b/packages/ember-runtime/tests/system/string/decamelize_test.js @@ -1,5 +1,5 @@ import { ENV } from 'ember-environment'; -import { decamelize } from '../../../system/string'; +import { decamelize, default as EmberString } from '../../../system/string'; QUnit.module('EmberStringUtils.decamelize'); @@ -9,10 +9,16 @@ if (!ENV.EXTEND_PROTOTYPES.String) { }); } +QUnit.test('Ember.String.decamelize is deprecated', function() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.decamelize('HelloWorld'); +}); + function test(given, expected, description) { QUnit.test(description, function() { deepEqual(decamelize(given), expected); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); deepEqual(given.decamelize(), expected); } }); diff --git a/packages/ember-runtime/tests/system/string/fmt_string_test.js b/packages/ember-runtime/tests/system/string/fmt_string_test.js index 86e7b141af4..be6f2785221 100644 --- a/packages/ember-runtime/tests/system/string/fmt_string_test.js +++ b/packages/ember-runtime/tests/system/string/fmt_string_test.js @@ -1,5 +1,5 @@ import { ENV } from 'ember-environment'; -import { fmt } from '../../../system/string'; +import { fmt, default as EmberString } from '../../../system/string'; QUnit.module('EmberStringUtils.fmt'); @@ -9,6 +9,11 @@ if (!ENV.EXTEND_PROTOTYPES.String) { }); } +QUnit.test('Ember.String.fmt is deprecated', function() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.fmt('Hello %@ %@', ['John', 'Doe']); +}); + function test(given, args, expected, description) { QUnit.test(description, function() { expectDeprecation('Ember.String.fmt is deprecated, use ES6 template strings instead.'); diff --git a/packages/ember-runtime/tests/system/string/loc_test.js b/packages/ember-runtime/tests/system/string/loc_test.js index 0bc313a6649..3af941202d7 100644 --- a/packages/ember-runtime/tests/system/string/loc_test.js +++ b/packages/ember-runtime/tests/system/string/loc_test.js @@ -1,6 +1,6 @@ import Ember from 'ember-metal'; // ES6TODO Ember.STRINGS import { ENV } from 'ember-environment'; -import { loc } from '../../../system/string'; +import { loc, default as EmberString } from '../../../system/string'; let oldString; @@ -26,10 +26,16 @@ if (!ENV.EXTEND_PROTOTYPES.String) { }); } +QUnit.test('Ember.String.loc is deprecated', function() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.loc('_Hello World', []); +}); + function test(given, args, expected, description) { QUnit.test(description, function() { equal(loc(given, args), expected); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/`loc` is deprecated/) equal(given.loc(...args), expected); } }); diff --git a/packages/ember-runtime/tests/system/string/underscore_test.js b/packages/ember-runtime/tests/system/string/underscore_test.js index f634afd308f..7744bcefda0 100644 --- a/packages/ember-runtime/tests/system/string/underscore_test.js +++ b/packages/ember-runtime/tests/system/string/underscore_test.js @@ -1,5 +1,5 @@ import { ENV } from 'ember-environment'; -import { underscore } from '../../../system/string'; +import { underscore, default as EmberString } from '../../../system/string'; QUnit.module('EmberStringUtils.underscore'); @@ -9,10 +9,16 @@ if (!ENV.EXTEND_PROTOTYPES.String) { }); } +QUnit.test('Ember.String.underscore is deprecated', function() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.underscore('hello world'); +}); + function test(given, expected, description) { QUnit.test(description, function() { deepEqual(underscore(given), expected); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); deepEqual(given.underscore(), expected); } }); diff --git a/packages/ember-runtime/tests/system/string/w_test.js b/packages/ember-runtime/tests/system/string/w_test.js index c37b54f5b43..39f6c23f781 100644 --- a/packages/ember-runtime/tests/system/string/w_test.js +++ b/packages/ember-runtime/tests/system/string/w_test.js @@ -1,5 +1,5 @@ import { ENV } from 'ember-environment'; -import { w } from '../../../system/string'; +import { w, default as EmberString } from '../../../system/string'; QUnit.module('EmberStringUtils.w'); @@ -9,10 +9,16 @@ if (!ENV.EXTEND_PROTOTYPES.String) { }); } +QUnit.test('Ember.String.w is deprecated', function() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.w('Hello World'); +}); + function test(given, expected, description) { QUnit.test(description, function() { deepEqual(w(given), expected); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); deepEqual(given.w(), expected); } }); diff --git a/packages/ember/lib/index.js b/packages/ember/lib/index.js index 4234ec4b451..0fc24de55e7 100644 --- a/packages/ember/lib/index.js +++ b/packages/ember/lib/index.js @@ -462,9 +462,11 @@ import { TextField, TextArea, LinkComponent, + deprecatedHTMLSafe, htmlSafe, template, escapeExpression, + deprecatedIsHTMLSafe, isHTMLSafe, getTemplates, setTemplates, @@ -481,6 +483,15 @@ Ember.LinkComponent = LinkComponent; if (ENV.EXTEND_PROTOTYPES.String) { String.prototype.htmlSafe = function() { + deprecate( + `Extending String prototype is deprecated. Please, use htmlSafe from 'ember/template'.`, + false, + { + id: 'ember-runtime/string-prototype-extension', + until: '3.5.0', + url: '' + } + ); return htmlSafe(this); }; } @@ -495,9 +506,9 @@ Object.defineProperty(EmberHandlebars, 'SafeString', { EmberHTMLBars.template = EmberHandlebars.template = template; EmberHandleBarsUtils.escapeExpression = escapeExpression; -EmberString.htmlSafe = htmlSafe; +EmberString.htmlSafe = deprecatedHTMLSafe; -EmberString.isHTMLSafe = isHTMLSafe; +EmberString.isHTMLSafe = deprecatedIsHTMLSafe; /** Global hash of shared templates. This will automatically be populated @@ -516,6 +527,19 @@ Object.defineProperty(Ember, 'TEMPLATES', { enumerable: false }); +/** + Global for safe usage of methods coming from module 'ember/template'. + + @property Template + @for Ember + @type Object + @private + */ +Ember.Template = { + htmlSafe, + isHTMLSafe +}; + import VERSION from './version'; export { VERSION }; diff --git a/packages/ember/tests/reexports_test.js b/packages/ember/tests/reexports_test.js index 2dd102d99c6..0c387dfffe5 100644 --- a/packages/ember/tests/reexports_test.js +++ b/packages/ember/tests/reexports_test.js @@ -145,7 +145,9 @@ QUnit.module('ember reexports'); ['Handlebars.template', 'ember-glimmer', 'template'], ['Handlebars.SafeString', 'ember-glimmer', { get: '_getSafeString' }], ['Handlebars.Utils.escapeExpression', 'ember-glimmer', 'escapeExpression'], - ['String.htmlSafe', 'ember-glimmer', 'htmlSafe'], + ['String.htmlSafe', 'ember-glimmer', 'deprecatedHTMLSafe'], + ['Template.htmlSafe', 'ember-glimmer', 'htmlSafe'], + ['Template.isHTMLSafe', 'ember-glimmer', 'isHTMLSafe'], // ember-runtime ['_RegistryProxyMixin', 'ember-runtime', 'RegistryProxyMixin'], @@ -225,7 +227,7 @@ QUnit.module('ember reexports'); }); QUnit.test('Ember.String.isHTMLSafe exports correctly', function(assert) { - confirmExport(Ember, assert, 'String.isHTMLSafe', 'ember-glimmer', 'isHTMLSafe'); + confirmExport(Ember, assert, 'String.isHTMLSafe', 'ember-glimmer', 'deprecatedIsHTMLSafe'); }); if (EMBER_METAL_WEAKMAP) { diff --git a/packages/ember/tests/routing/query_params_test.js b/packages/ember/tests/routing/query_params_test.js index 5640658542b..53e1b56b79f 100644 --- a/packages/ember/tests/routing/query_params_test.js +++ b/packages/ember/tests/routing/query_params_test.js @@ -3,7 +3,7 @@ import { RSVP, Object as EmberObject, A as emberA, - String as StringUtils + StringUtils } from 'ember-runtime'; import { run, 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 92ae2fa3178..df605d5deb1 100644 --- a/packages/ember/tests/routing/router_service_test/urlFor_test.js +++ b/packages/ember/tests/routing/router_service_test/urlFor_test.js @@ -1,7 +1,7 @@ import { Controller, inject, - String + StringUtils } from 'ember-runtime'; import { Route, NoneLocation } from 'ember-routing'; import { @@ -16,7 +16,7 @@ import { import { EMBER_ROUTING_ROUTER_SERVICE } from 'ember/features'; function setupController(app, name) { - let controllerName = `${String.capitalize(name)}Controller`; + let controllerName = `${StringUtils.capitalize(name)}Controller`; Object.defineProperty(app, controllerName, { get() {