From 4fc3dd5256421e79b4c179e23ef3acf2d1f40c00 Mon Sep 17 00:00:00 2001 From: Sergio Arbeo Date: Fri, 6 Apr 2018 14:34:21 +0200 Subject: [PATCH] [DEPRECATION canary] Deprecate Ember.String and 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`. The `Ember.Template` is just a placeholder until the final global is chosen. --- .../ember-application/lib/system/resolver.js | 2 +- .../lib/container_debug_adapter.js | 8 +-- packages/ember-glimmer/index.ts | 9 +++- .../lib/component-managers/curly.ts | 2 +- packages/ember-glimmer/lib/helpers/-class.ts | 2 +- .../lib/helpers/-normalize-class.ts | 2 +- packages/ember-glimmer/lib/helpers/loc.ts | 2 +- packages/ember-glimmer/lib/utils/bindings.ts | 2 +- packages/ember-glimmer/lib/utils/string.ts | 30 +++++++++++ packages/ember-glimmer/tests/utils/helpers.js | 2 + .../ember-glimmer/tests/utils/string-test.js | 19 ++++++- packages/ember-routing/lib/system/route.js | 2 +- packages/ember-runtime/index.d.ts | 12 +++++ packages/ember-runtime/lib/ext/string.js | 53 ++++++++++--------- packages/ember-runtime/lib/index.js | 2 +- packages/ember-runtime/lib/system/string.js | 52 +++++++++++++++--- .../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/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 | 8 +-- .../router_service_test/urlFor_test.js | 4 +- 28 files changed, 241 insertions(+), 70 deletions(-) diff --git a/packages/ember-application/lib/system/resolver.js b/packages/ember-application/lib/system/resolver.js index 97f5c0e50f6..5c4ac82e1c7 100644 --- a/packages/ember-application/lib/system/resolver.js +++ b/packages/ember-application/lib/system/resolver.js @@ -5,7 +5,7 @@ import { dictionary } from 'ember-utils'; import { get, findNamespace } from 'ember-metal'; import { assert, info } from 'ember-debug'; -import { String as StringUtils, Object as EmberObject } from 'ember-runtime'; +import { StringUtils, Object as EmberObject } from 'ember-runtime'; import validateType from '../utils/validate-type'; import { getTemplate } from 'ember-glimmer'; import { DEBUG } from 'ember-env-flags'; diff --git a/packages/ember-extension-support/lib/container_debug_adapter.js b/packages/ember-extension-support/lib/container_debug_adapter.js index 22ba1924758..5af736fd6d9 100644 --- a/packages/ember-extension-support/lib/container_debug_adapter.js +++ b/packages/ember-extension-support/lib/container_debug_adapter.js @@ -1,10 +1,4 @@ -import { - A as emberA, - typeOf, - String as StringUtils, - Namespace, - Object as EmberObject, -} from 'ember-runtime'; +import { A as emberA, typeOf, StringUtils, Namespace, Object as EmberObject } from 'ember-runtime'; /** @module @ember/debug diff --git a/packages/ember-glimmer/index.ts b/packages/ember-glimmer/index.ts index e3367b097e5..a0c1c82f6bc 100644 --- a/packages/ember-glimmer/index.ts +++ b/packages/ember-glimmer/index.ts @@ -268,7 +268,14 @@ export { default as LinkComponent } from './lib/components/link-to'; export { default as Component, ROOT_REF } from './lib/component'; export { default as Helper, helper } from './lib/helper'; export { default as Environment } from './lib/environment'; -export { SafeString, escapeExpression, htmlSafe, isHTMLSafe } from './lib/utils/string'; +export { + SafeString, + deprecatedHTMLSafe, + deprecatedIsHTMLSafe, + escapeExpression, + htmlSafe, + isHTMLSafe, +} from './lib/utils/string'; export { Renderer, InertRenderer, diff --git a/packages/ember-glimmer/lib/component-managers/curly.ts b/packages/ember-glimmer/lib/component-managers/curly.ts index 084ddc5bef6..6b1aec8a234 100644 --- a/packages/ember-glimmer/lib/component-managers/curly.ts +++ b/packages/ember-glimmer/lib/component-managers/curly.ts @@ -25,7 +25,7 @@ import { assert, deprecate } from 'ember-debug'; import { DEBUG } from 'ember-env-flags'; import { ENV } from 'ember-environment'; import { _instrumentStart, get } from 'ember-metal'; -import { String as StringUtils } from 'ember-runtime'; +import { StringUtils } from 'ember-runtime'; import { assign, getOwner, guidFor } from 'ember-utils'; import { addChildView, OwnedTemplateMeta, setViewElement } from 'ember-views'; import { BOUNDS, DIRTY_TAG, HAS_BLOCK, IS_DISPATCHING_ATTRS, ROOT_REF } from '../component'; diff --git a/packages/ember-glimmer/lib/helpers/-class.ts b/packages/ember-glimmer/lib/helpers/-class.ts index 741532c5ee3..e9fecb147ff 100644 --- a/packages/ember-glimmer/lib/helpers/-class.ts +++ b/packages/ember-glimmer/lib/helpers/-class.ts @@ -1,5 +1,5 @@ import { Arguments, VM } from '@glimmer/runtime'; -import { String as StringUtils } from 'ember-runtime'; +import { StringUtils } from 'ember-runtime'; import { InternalHelperReference } from '../utils/references'; function classHelper({ positional }: any) { diff --git a/packages/ember-glimmer/lib/helpers/-normalize-class.ts b/packages/ember-glimmer/lib/helpers/-normalize-class.ts index c9a5b8b6766..312c62ae41a 100644 --- a/packages/ember-glimmer/lib/helpers/-normalize-class.ts +++ b/packages/ember-glimmer/lib/helpers/-normalize-class.ts @@ -1,5 +1,5 @@ import { Arguments, VM } from '@glimmer/runtime'; -import { String as StringUtils } from 'ember-runtime'; +import { StringUtils } from 'ember-runtime'; import { InternalHelperReference } from '../utils/references'; function normalizeClass({ positional }: any) { diff --git a/packages/ember-glimmer/lib/helpers/loc.ts b/packages/ember-glimmer/lib/helpers/loc.ts index 5fd3dcba0ad..4d636311ae7 100644 --- a/packages/ember-glimmer/lib/helpers/loc.ts +++ b/packages/ember-glimmer/lib/helpers/loc.ts @@ -2,7 +2,7 @@ @module ember */ -import { String as StringUtils } from 'ember-runtime'; +import { StringUtils } from 'ember-runtime'; import { helper } from '../helper'; /** diff --git a/packages/ember-glimmer/lib/utils/bindings.ts b/packages/ember-glimmer/lib/utils/bindings.ts index 6f41a90a8fe..89649993448 100644 --- a/packages/ember-glimmer/lib/utils/bindings.ts +++ b/packages/ember-glimmer/lib/utils/bindings.ts @@ -4,7 +4,7 @@ import { ElementOperations, PrimitiveReference } from '@glimmer/runtime'; import { Core, Ops } 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 { Component } from './curly-component-state-bucket'; import { referenceFromParts } from './references'; diff --git a/packages/ember-glimmer/lib/utils/string.ts b/packages/ember-glimmer/lib/utils/string.ts index ff2c2ba6ce0..0fb03dd62c8 100644 --- a/packages/ember-glimmer/lib/utils/string.ts +++ b/packages/ember-glimmer/lib/utils/string.ts @@ -2,6 +2,8 @@ @module @ember/string */ +import { deprecate } from 'ember-debug'; + export class SafeString { public string: string; @@ -74,6 +76,7 @@ export function escapeExpression(string: any): string { @static @return {Handlebars.SafeString} A string that will not be HTML escaped by Handlebars. @public + @deprecated */ export function htmlSafe(str: string) { if (str === null || str === undefined) { @@ -84,6 +87,19 @@ export function htmlSafe(str: string) { return new SafeString(str); } +export function deprecatedHTMLSafe(str: string) { + 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 `htmlSafe`. @@ -102,7 +118,21 @@ export function htmlSafe(str: string) { @static @return {Boolean} `true` if the string was decorated with `htmlSafe`, `false` otherwise. @public + @deprecated */ export function isHTMLSafe(str: any | null | undefined): str is SafeString { return str !== null && typeof str === 'object' && typeof str.toHTML === 'function'; } + +export function deprecatedIsHTMLSafe(str: any | null | undefined): str is SafeString { + 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 fe4ad324989..eca6f8518b6 100644 --- a/packages/ember-glimmer/tests/utils/helpers.js +++ b/packages/ember-glimmer/tests/utils/helpers.js @@ -9,7 +9,9 @@ export { InteractiveRender, InertRenderer, htmlSafe, + deprecatedHTMLSafe, SafeString, DOMChanges, 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 58587ca0ba4..e53f41d4a8b 100644 --- a/packages/ember-glimmer/tests/utils/string-test.js +++ b/packages/ember-glimmer/tests/utils/string-test.js @@ -1,10 +1,23 @@ -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/); + let safeString = deprecatedHTMLSafe('Hello'); + + this.assert.ok(safeString instanceof SafeString, 'should be a SafeString'); + } + ['@test htmlSafe should return an instance of SafeString']() { let safeString = htmlSafe('you need to be more bold'); @@ -30,6 +43,10 @@ moduleFor( 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 43476a0d931..b595d75ab81 100644 --- a/packages/ember-routing/lib/system/route.js +++ b/packages/ember-routing/lib/system/route.js @@ -5,7 +5,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/index.d.ts b/packages/ember-runtime/index.d.ts index bd8cc8ebd5b..aa7668d9b36 100644 --- a/packages/ember-runtime/index.d.ts +++ b/packages/ember-runtime/index.d.ts @@ -21,3 +21,15 @@ export const String: { export function isEmberArray(arr: any): boolean; export function _contentFor(proxy: any): any; + +export const StringUtils: { + fmt(s: string, ...args: any[]): string, + loc(s: string, ...args: any[]): string, + w(s: string): string[], + decamelize(s: string): string, + dasherize(s: string): string, + camelize(s: string): string, + classify(s: string): string, + underscore(s: string): string, + capitalize(s: string): string +} diff --git a/packages/ember-runtime/lib/ext/string.js b/packages/ember-runtime/lib/ext/string.js index 80c6aaafa79..c544edbac65 100644 --- a/packages/ember-runtime/lib/ext/string.js +++ b/packages/ember-runtime/lib/ext/string.js @@ -3,6 +3,7 @@ */ import { ENV } from 'ember-environment'; +import { deprecate } from 'ember-debug'; import { w, loc, @@ -16,6 +17,23 @@ import { const StringPrototype = String.prototype; +function deprecateEmberStringPrototypeExtension(name, fn, opts = {}) { + return function() { + deprecate( + opts.message || + `String prototype extensions are deprecated. Please, us ${name} from '@ember/string' instead.`, + false, + opts.options || { + id: 'ember-string.prototype_extensions', + until: '3.5.0', + url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-string-prototype-extensions', + } + ); + + return fn(this, ...arguments); + }; +} + if (ENV.EXTEND_PROTOTYPES.String) { /** See [String.w](/api/ember/release/classes/String/methods/w?anchor=w). @@ -29,9 +47,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { configurable: true, enumerable: false, writeable: true, - value: function() { - return w(this); - }, + value: deprecateEmberStringPrototypeExtension('w', w), }); /** @@ -46,9 +62,10 @@ if (ENV.EXTEND_PROTOTYPES.String) { configurable: true, enumerable: false, writeable: true, - value: function(...args) { - return loc(this, args); - }, + value: deprecateEmberStringPrototypeExtension('loc', loc, { + message: + '`loc` is deprecated. Please, use an i18n addon instead. See https://emberobserver.com/categories/internationalization for a list of them.', + }), }); /** @@ -63,9 +80,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { configurable: true, enumerable: false, writeable: true, - value: function() { - return camelize(this); - }, + value: deprecateEmberStringPrototypeExtension('camelize', camelize), }); /** @@ -80,9 +95,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { configurable: true, enumerable: false, writeable: true, - value: function() { - return decamelize(this); - }, + value: deprecateEmberStringPrototypeExtension('decamelize', decamelize), }); /** @@ -97,9 +110,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { configurable: true, enumerable: false, writeable: true, - value: function() { - return dasherize(this); - }, + value: deprecateEmberStringPrototypeExtension('dasherize', dasherize), }); /** @@ -114,9 +125,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { configurable: true, enumerable: false, writeable: true, - value: function() { - return underscore(this); - }, + value: deprecateEmberStringPrototypeExtension('underscore', underscore), }); /** @@ -131,9 +140,7 @@ if (ENV.EXTEND_PROTOTYPES.String) { configurable: true, enumerable: false, writeable: true, - value: function() { - return classify(this); - }, + value: deprecateEmberStringPrototypeExtension('classify', classify), }); /** @@ -148,8 +155,6 @@ if (ENV.EXTEND_PROTOTYPES.String) { configurable: true, enumerable: false, writeable: true, - value: function() { - return capitalize(this); - }, + value: deprecateEmberStringPrototypeExtension('capitalize', capitalize), }); } diff --git a/packages/ember-runtime/lib/index.js b/packages/ember-runtime/lib/index.js index 0de8abba677..8fd68581c40 100644 --- a/packages/ember-runtime/lib/index.js +++ b/packages/ember-runtime/lib/index.js @@ -1,5 +1,5 @@ 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 } from './mixins/registry_proxy'; export { default as ContainerProxyMixin } from './mixins/container_proxy'; export { default as copy } from './copy'; diff --git a/packages/ember-runtime/lib/system/string.js b/packages/ember-runtime/lib/system/string.js index 1ecabc14c9e..88b78eb3721 100644 --- a/packages/ember-runtime/lib/system/string.js +++ b/packages/ember-runtime/lib/system/string.js @@ -1,6 +1,7 @@ /** @module @ember/string */ +import { deprecate } from 'ember-debug'; import { Cache } from 'ember-metal'; import { inspect } from 'ember-utils'; import { isArray } from '../utils'; @@ -82,6 +83,22 @@ function _fmt(str, formats) { }); } +export function deprecateEmberStringUtil(name, fn, opts = {}) { + return function() { + deprecate( + opts.message || + `Ember.String namespace is deprecated. Please, use ${name} from '@ember/string' instead.`, + false, + opts.options || { + id: 'ember-string.namespace', + until: '3.5.0', + url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-string-namespace', + } + ); + return fn(...arguments); + }; +} + function loc(str, formats) { if (!isArray(formats) || arguments.length > 2) { formats = Array.prototype.slice.call(arguments, 1); @@ -153,8 +170,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', loc), /** Splits a string into separate units separated by spaces, eliminating any @@ -177,8 +195,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', w), /** Converts a camelized string into all lower case separated by underscores. @@ -194,8 +213,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', decamelize), /** Replaces underscores, spaces, or camelCase with dashes. @@ -212,8 +232,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', dasherize), /** Returns the lowerCamelCase form of a string. @@ -231,8 +252,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', camelize), /** Returns the UpperCamelCase form of a string. @@ -249,8 +271,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', classify), /** More general than decamelize. Returns the lower\_case\_and\_underscored @@ -268,8 +291,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', underscore), /** Returns the Capitalized form of a string @@ -286,8 +310,20 @@ 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', capitalize), }; export { loc, w, decamelize, dasherize, camelize, classify, underscore, capitalize }; + +export const StringUtils = { + 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 a3b3cf245fc..30ec73d8a03 100644 --- a/packages/ember-runtime/tests/system/string/camelize_test.js +++ b/packages/ember-runtime/tests/system/string/camelize_test.js @@ -1,10 +1,11 @@ import { ENV } from 'ember-environment'; -import { camelize } from '../../../system/string'; +import { camelize, default as EmberString } from '../../../system/string'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; function test(assert, given, expected, description) { assert.deepEqual(camelize(given), expected, description); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); assert.deepEqual(given.camelize(), expected, description); } } @@ -12,6 +13,11 @@ function test(assert, given, expected, description) { moduleFor( 'EmberStringUtils.camelize', class extends AbstractTestCase { + ['@test Ember.String.camelize is deprecated']() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.camelize('hello world'); + } + ['@test String.prototype.camelize is not modified without EXTEND_PROTOTYPES'](assert) { if (!ENV.EXTEND_PROTOTYPES.String) { assert.ok( diff --git a/packages/ember-runtime/tests/system/string/capitalize_test.js b/packages/ember-runtime/tests/system/string/capitalize_test.js index a3feaa2ea08..6ce7683c81f 100644 --- a/packages/ember-runtime/tests/system/string/capitalize_test.js +++ b/packages/ember-runtime/tests/system/string/capitalize_test.js @@ -1,10 +1,11 @@ import { ENV } from 'ember-environment'; -import { capitalize } from '../../../system/string'; +import { capitalize, default as EmberString } from '../../../system/string'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; function test(assert, given, expected, description) { assert.deepEqual(capitalize(given), expected, description); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); assert.deepEqual(given.capitalize(), expected, description); } } @@ -12,6 +13,11 @@ function test(assert, given, expected, description) { moduleFor( 'EmberStringUtils.capitalize', class extends AbstractTestCase { + ['@test Ember.String.capitalize is deprecated']() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.capitalize('hello world'); + } + ['@test String.prototype.capitalize is not modified without EXTEND_PROTOTYPES'](assert) { if (!ENV.EXTEND_PROTOTYPES.String) { assert.ok( diff --git a/packages/ember-runtime/tests/system/string/classify_test.js b/packages/ember-runtime/tests/system/string/classify_test.js index a12ff0a9d7b..fa76b8c6691 100644 --- a/packages/ember-runtime/tests/system/string/classify_test.js +++ b/packages/ember-runtime/tests/system/string/classify_test.js @@ -1,10 +1,11 @@ import { ENV } from 'ember-environment'; -import { classify } from '../../../system/string'; +import { classify, default as EmberString } from '../../../system/string'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; function test(assert, given, expected, description) { assert.deepEqual(classify(given), expected, description); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); assert.deepEqual(given.classify(), expected, description); } } @@ -12,6 +13,11 @@ function test(assert, given, expected, description) { moduleFor( 'EmberStringUtils.classify', class extends AbstractTestCase { + ['@test Ember.String.classify is deprecated']() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.classify('hello world'); + } + ['@test String.prototype.classify is not modified without EXTEND_PROTOTYPES'](assert) { if (!ENV.EXTEND_PROTOTYPES.String) { assert.ok( diff --git a/packages/ember-runtime/tests/system/string/dasherize_test.js b/packages/ember-runtime/tests/system/string/dasherize_test.js index 326e76a8bba..ac353a9d633 100644 --- a/packages/ember-runtime/tests/system/string/dasherize_test.js +++ b/packages/ember-runtime/tests/system/string/dasherize_test.js @@ -1,10 +1,11 @@ import { ENV } from 'ember-environment'; -import { dasherize } from '../../../system/string'; +import { dasherize, default as EmberString } from '../../../system/string'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; function test(assert, given, expected, description) { assert.deepEqual(dasherize(given), expected, description); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); assert.deepEqual(given.dasherize(), expected, description); } } @@ -12,6 +13,11 @@ function test(assert, given, expected, description) { moduleFor( 'EmberStringUtils.dasherize', class extends AbstractTestCase { + ['@test Ember.String.dasherize is deprecated']() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.dasherize('hello world'); + } + ['@test String.prototype.dasherize is not modified without EXTEND_PROTOTYPES'](assert) { if (!ENV.EXTEND_PROTOTYPES.String) { assert.ok( diff --git a/packages/ember-runtime/tests/system/string/decamelize_test.js b/packages/ember-runtime/tests/system/string/decamelize_test.js index 874fb8688bf..ebb316ebb97 100644 --- a/packages/ember-runtime/tests/system/string/decamelize_test.js +++ b/packages/ember-runtime/tests/system/string/decamelize_test.js @@ -1,10 +1,11 @@ import { ENV } from 'ember-environment'; -import { decamelize } from '../../../system/string'; +import { decamelize, default as EmberString } from '../../../system/string'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; function test(assert, given, expected, description) { assert.deepEqual(decamelize(given), expected, description); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); assert.deepEqual(given.decamelize(), expected, description); } } @@ -12,6 +13,11 @@ function test(assert, given, expected, description) { moduleFor( 'EmberStringUtils.decamelize', class extends AbstractTestCase { + ['@test Ember.String.decamelize is deprecated']() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.decamelize('hello world'); + } + ['@test String.prototype.decamelize is not modified without EXTEND_PROTOTYPES'](assert) { if (!ENV.EXTEND_PROTOTYPES.String) { assert.ok( diff --git a/packages/ember-runtime/tests/system/string/loc_test.js b/packages/ember-runtime/tests/system/string/loc_test.js index da90663a151..f5e7516bd14 100644 --- a/packages/ember-runtime/tests/system/string/loc_test.js +++ b/packages/ember-runtime/tests/system/string/loc_test.js @@ -1,5 +1,5 @@ import { ENV } from 'ember-environment'; -import { loc } from '../../../system/string'; +import { default as EmberString, loc } from '../../../system/string'; import { setStrings, getStrings } from '../../../string_registry'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; @@ -8,6 +8,7 @@ let oldString; function test(assert, given, args, expected, description) { assert.equal(loc(given, args), expected, description); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/`loc` is deprecated/); assert.deepEqual(given.loc(...args), expected, description); } } @@ -29,6 +30,11 @@ moduleFor( setStrings(oldString); } + ['@test Ember.String.loc is deprecated']() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.loc('_Hello Worl', []); + } + ['@test String.prototype.loc is not available without EXTEND_PROTOTYPES'](assert) { if (!ENV.EXTEND_PROTOTYPES.String) { assert.ok('undefined' === typeof String.prototype.loc, 'String.prototype helper disabled'); diff --git a/packages/ember-runtime/tests/system/string/underscore_test.js b/packages/ember-runtime/tests/system/string/underscore_test.js index 4589c39e1d4..71fb802648e 100644 --- a/packages/ember-runtime/tests/system/string/underscore_test.js +++ b/packages/ember-runtime/tests/system/string/underscore_test.js @@ -1,10 +1,11 @@ import { ENV } from 'ember-environment'; -import { underscore } from '../../../system/string'; +import { underscore, default as EmberString } from '../../../system/string'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; function test(assert, given, expected, description) { assert.deepEqual(underscore(given), expected, description); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); assert.deepEqual(given.underscore(), expected, description); } } @@ -12,6 +13,11 @@ function test(assert, given, expected, description) { moduleFor( 'EmberStringUtils.underscore', class extends AbstractTestCase { + ['@test Ember.String.underscore is deprecated']() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.underscore('hello world'); + } + ['@test String.prototype.underscore is not available without EXTEND_PROTOTYPES'](assert) { if (!ENV.EXTEND_PROTOTYPES.String) { assert.ok( diff --git a/packages/ember-runtime/tests/system/string/w_test.js b/packages/ember-runtime/tests/system/string/w_test.js index 06c4109dbbb..37132c34843 100644 --- a/packages/ember-runtime/tests/system/string/w_test.js +++ b/packages/ember-runtime/tests/system/string/w_test.js @@ -1,10 +1,11 @@ import { ENV } from 'ember-environment'; -import { w } from '../../../system/string'; +import { w, default as EmberString } from '../../../system/string'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; function test(assert, given, expected, description) { assert.deepEqual(w(given), expected, description); if (ENV.EXTEND_PROTOTYPES.String) { + expectDeprecation(/@ember\/string/); assert.deepEqual(given.w(), expected, description); } } @@ -12,6 +13,11 @@ function test(assert, given, expected, description) { moduleFor( 'EmberStringUtils.w', class extends AbstractTestCase { + ['@test Ember.String.w is deprecated']() { + expectDeprecation(/Ember.String namespace is deprecated/); + EmberString.w('hello world'); + } + ['@test String.prototype.w is not available without EXTEND_PROTOTYPES'](assert) { if (!ENV.EXTEND_PROTOTYPES.String) { assert.ok('undefined' === typeof String.prototype.w, 'String.prototype helper disabled'); diff --git a/packages/ember/lib/index.js b/packages/ember/lib/index.js index 4eba21a8fb8..1a9bf0a1e73 100644 --- a/packages/ember/lib/index.js +++ b/packages/ember/lib/index.js @@ -85,6 +85,8 @@ import { Checkbox, Component, componentManager, + deprecatedHTMLSafe, + deprecatedIsHTMLSafe, escapeExpression, getTemplates, Helper, @@ -424,11 +426,20 @@ Ember.HTMLBars = { if (ENV.EXTEND_PROTOTYPES.String) { String.prototype.htmlSafe = function() { + EmberDebug.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); }; } -EmberString.htmlSafe = htmlSafe; -EmberString.isHTMLSafe = isHTMLSafe; +EmberString.htmlSafe = deprecatedHTMLSafe; +EmberString.isHTMLSafe = deprecatedIsHTMLSafe; /** Global hash of shared templates. This will automatically be populated @@ -447,6 +458,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, +}; + /** The semantic version diff --git a/packages/ember/tests/reexports_test.js b/packages/ember/tests/reexports_test.js index 1d7fd96fad0..0006c26e67d 100644 --- a/packages/ember/tests/reexports_test.js +++ b/packages/ember/tests/reexports_test.js @@ -19,7 +19,7 @@ moduleFor( } ['@test Ember.String.isHTMLSafe exports correctly'](assert) { - confirmExport(Ember, assert, 'String.isHTMLSafe', 'ember-glimmer', 'isHTMLSafe'); + confirmExport(Ember, assert, 'String.isHTMLSafe', 'ember-glimmer', 'deprecatedIsHTMLSafe'); } } ); @@ -172,7 +172,9 @@ let allExports = [ ['Handlebars.template', 'ember-glimmer', 'template'], ['HTMLBars.template', 'ember-glimmer', 'template'], ['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'], ['_setComponentManager', 'ember-glimmer', 'componentManager'], // ember-runtime diff --git a/packages/ember/tests/routing/query_params_test.js b/packages/ember/tests/routing/query_params_test.js index c919b6009e0..ad983c4308e 100644 --- a/packages/ember/tests/routing/query_params_test.js +++ b/packages/ember/tests/routing/query_params_test.js @@ -1,10 +1,4 @@ -import { - Controller, - RSVP, - Object as EmberObject, - A as emberA, - String as StringUtils, -} from 'ember-runtime'; +import { Controller, RSVP, Object as EmberObject, A as emberA, StringUtils } from 'ember-runtime'; import { run, get, computed, peekMeta } from 'ember-metal'; import { Route } from 'ember-routing'; 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 3f688ffe4fe..c984e6b9fae 100644 --- a/packages/ember/tests/routing/router_service_test/urlFor_test.js +++ b/packages/ember/tests/routing/router_service_test/urlFor_test.js @@ -1,4 +1,4 @@ -import { Controller, String } from 'ember-runtime'; +import { Controller, StringUtils } from 'ember-runtime'; import { Route } from 'ember-routing'; import { get } from 'ember-metal'; import { RouterTestCase, moduleFor } from 'internal-test-helpers'; @@ -6,7 +6,7 @@ import { RouterTestCase, moduleFor } from 'internal-test-helpers'; 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() {