From 1e5e32af9432908ef4bbdcacc17c996f802dca3d Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Sun, 2 Aug 2015 23:03:26 -0400 Subject: [PATCH 1/3] [CLEANUP beta] Fix load order of service module --- packages/ember-routing-views/lib/views/link.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ember-routing-views/lib/views/link.js b/packages/ember-routing-views/lib/views/link.js index 43b3fd20aa7..865c5bdd160 100644 --- a/packages/ember-routing-views/lib/views/link.js +++ b/packages/ember-routing-views/lib/views/link.js @@ -13,6 +13,7 @@ import { deprecatingAlias } from 'ember-metal/computed_macros'; import { isSimpleClick } from 'ember-views/system/utils'; import EmberComponent from 'ember-views/views/component'; import inject from 'ember-runtime/inject'; +import 'ember-runtime/system/service'; // creates inject.service import ControllerMixin from 'ember-runtime/mixins/controller'; import linkToTemplate from 'ember-htmlbars/templates/link-to'; From 26522af2413bd3d4c16773043e769afd2b0818a3 Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Sun, 2 Aug 2015 22:35:56 -0400 Subject: [PATCH 2/3] [CLEANUP beta] Remove legacy helper APIs --- .../default_resolver_test.js | 22 +- packages/ember-htmlbars/lib/compat.js | 14 - packages/ember-htmlbars/lib/compat/helper.js | 160 ------ .../lib/compat/make-bound-helper.js | 78 --- .../lib/compat/register-bound-helper.js | 138 ----- packages/ember-htmlbars/lib/helper.js | 2 +- packages/ember-htmlbars/lib/helpers/with.js | 2 +- packages/ember-htmlbars/lib/hooks/element.js | 2 +- .../ember-htmlbars/lib/hooks/invoke-helper.js | 4 +- .../lib/hooks/link-render-node.js | 33 +- packages/ember-htmlbars/lib/hooks/subexpr.js | 2 +- packages/ember-htmlbars/lib/main.js | 2 - .../lib/streams/built-in-helper.js | 6 +- .../lib/streams/compat-helper.js | 21 - packages/ember-htmlbars/lib/system/helper.js | 13 - .../lib/system/invoke-helper.js | 17 +- .../lib/system/lookup-helper.js | 10 +- .../lib/system/make-view-helper.js | 31 - .../tests/compat/helper_test.js | 359 ------------ .../tests/compat/make-view-helper_test.js | 52 -- .../tests/compat/make_bound_helper_test.js | 537 ------------------ .../tests/compat/precompile_test.js | 22 - .../tests/helpers/concat-test.js | 4 +- .../tests/helpers/custom_helper_test.js | 13 + .../tests/helpers/unbound_test.js | 307 +++++----- .../tests/integration/block_params_test.js | 31 +- .../integration/select_in_template_test.js | 2 +- .../tagless_views_rerender_test.js | 3 +- .../tests/system/lookup-helper_test.js | 8 +- .../tests/system/make_bound_helper_test.js | 235 -------- .../tests/system/make_view_helper_test.js | 68 --- .../tests/component_registration_test.js | 4 +- packages/ember/tests/controller_test.js | 3 +- .../tests/helpers/helper_registration_test.js | 48 +- packages/ember/tests/helpers/link_to_test.js | 4 +- .../link_to_transitioning_classes_test.js | 5 +- .../link_to_with_query_params_test.js | 5 +- packages/ember/tests/homepage_example_test.js | 4 +- packages/ember/tests/routing/basic_test.js | 3 +- .../ember/tests/routing/query_params_test.js | 5 +- ..._dependent_state_with_query_params_test.js | 5 +- .../overlapping_query_params_test.js | 5 +- .../query_params_paramless_link_to_test.js | 5 +- .../ember/tests/routing/substates_test.js | 5 +- .../ember/tests/routing/toplevel_dom_test.js | 4 +- .../ember/tests/view_instrumentation_test.js | 4 +- 46 files changed, 238 insertions(+), 2069 deletions(-) delete mode 100644 packages/ember-htmlbars/lib/compat/helper.js delete mode 100644 packages/ember-htmlbars/lib/compat/make-bound-helper.js delete mode 100644 packages/ember-htmlbars/lib/compat/register-bound-helper.js delete mode 100644 packages/ember-htmlbars/lib/streams/compat-helper.js delete mode 100644 packages/ember-htmlbars/lib/system/helper.js delete mode 100644 packages/ember-htmlbars/lib/system/make-view-helper.js delete mode 100644 packages/ember-htmlbars/tests/compat/helper_test.js delete mode 100644 packages/ember-htmlbars/tests/compat/make-view-helper_test.js delete mode 100644 packages/ember-htmlbars/tests/compat/make_bound_helper_test.js delete mode 100644 packages/ember-htmlbars/tests/compat/precompile_test.js delete mode 100644 packages/ember-htmlbars/tests/system/make_bound_helper_test.js delete mode 100644 packages/ember-htmlbars/tests/system/make_view_helper_test.js diff --git a/packages/ember-application/tests/system/dependency_injection/default_resolver_test.js b/packages/ember-application/tests/system/dependency_injection/default_resolver_test.js index 91223f97527..49e42b419ba 100644 --- a/packages/ember-application/tests/system/dependency_injection/default_resolver_test.js +++ b/packages/ember-application/tests/system/dependency_injection/default_resolver_test.js @@ -10,8 +10,6 @@ import EmberObject from 'ember-runtime/system/object'; import Namespace from 'ember-runtime/system/namespace'; import Application from 'ember-application/system/application'; import Helper, { helper as makeHelper } from 'ember-htmlbars/helper'; -import makeHandlebarsBoundHelper from 'ember-htmlbars/compat/make-bound-helper'; -import makeViewHelper from 'ember-htmlbars/system/make-view-helper'; import makeHTMLBarsBoundHelper from 'ember-htmlbars/system/make_bound_helper'; import { registerHelper @@ -123,41 +121,23 @@ QUnit.test('the default resolver resolves container-registered helpers', functio QUnit.test('the default resolver resolves helpers on the namespace', function() { let ShorthandHelper = makeHelper(function() {}); let CompleteHelper = Helper.extend(); - let LegacyBareFunctionHelper = function() {}; - let ViewHelper, LegacyHandlebarsBoundHelper, LegacyHTMLBarsBoundHelper; - - expectDeprecation(function() { - LegacyHandlebarsBoundHelper = makeHandlebarsBoundHelper(function() {}); - }, 'Using Ember.Handlebars.makeBoundHelper is deprecated. Please refactor to using `Ember.Helper.helper`.'); + let LegacyHTMLBarsBoundHelper; expectDeprecation(function() { LegacyHTMLBarsBoundHelper = makeHTMLBarsBoundHelper(function() {}); }, 'Using `Ember.HTMLBars.makeBoundHelper` is deprecated. Please refactor to using `Ember.Helper` or `Ember.Helper.helper`.'); - expectDeprecation(function() { - ViewHelper = makeViewHelper(function() {}); - }, '`Ember.Handlebars.makeViewHelper` and `Ember.HTMLBars.makeViewHelper` are deprecated. Please refactor to normal component usage.'); - application.ShorthandHelper = ShorthandHelper; application.CompleteHelper = CompleteHelper; - application.LegacyBareFunctionHelper = LegacyBareFunctionHelper; - application.LegacyHandlebarsBoundHelper = LegacyHandlebarsBoundHelper; application.LegacyHtmlBarsBoundHelper = LegacyHTMLBarsBoundHelper; // Must use lowered "tml" in "HTMLBars" for resolver to find this - application.ViewHelper = ViewHelper; let resolvedShorthand = registry.resolve('helper:shorthand'); let resolvedComplete = registry.resolve('helper:complete'); - let resolvedLegacy = registry.resolve('helper:legacy-bare-function'); - let resolvedLegacyHandlebars = registry.resolve('helper:legacy-handlebars-bound'); let resolvedLegacyHTMLBars = registry.resolve('helper:legacy-html-bars-bound'); - let resolvedView = registry.resolve('helper:view'); equal(resolvedShorthand, ShorthandHelper, 'resolve fetches the shorthand helper factory'); equal(resolvedComplete, CompleteHelper, 'resolve fetches the complete helper factory'); - ok(typeof resolvedLegacy === 'function', 'legacy function helper is resolved'); - equal(resolvedView, ViewHelper, 'resolves view helper'); equal(resolvedLegacyHTMLBars, LegacyHTMLBarsBoundHelper, 'resolves legacy HTMLBars bound helper'); - equal(resolvedLegacyHandlebars, LegacyHandlebarsBoundHelper, 'resolves legacy Handlebars bound helper'); }); QUnit.test('the default resolver resolves to the same instance no matter the notation ', function() { diff --git a/packages/ember-htmlbars/lib/compat.js b/packages/ember-htmlbars/lib/compat.js index ea895fa4059..0d794f30b3c 100644 --- a/packages/ember-htmlbars/lib/compat.js +++ b/packages/ember-htmlbars/lib/compat.js @@ -1,24 +1,10 @@ import Ember from 'ember-metal/core'; -import helpers from 'ember-htmlbars/helpers'; -import { - registerHandlebarsCompatibleHelper as compatRegisterHelper, - handlebarsHelper as compatHandlebarsHelper -} from 'ember-htmlbars/compat/helper'; -import compatMakeBoundHelper from 'ember-htmlbars/compat/make-bound-helper'; -import compatRegisterBoundHelper from 'ember-htmlbars/compat/register-bound-helper'; -import makeViewHelper from 'ember-htmlbars/system/make-view-helper'; import { SafeString, escapeExpression } from 'ember-htmlbars/utils/string'; var EmberHandlebars = Ember.Handlebars = Ember.Handlebars || {}; -EmberHandlebars.helpers = helpers; -EmberHandlebars.helper = compatHandlebarsHelper; -EmberHandlebars.registerHelper = compatRegisterHelper; -EmberHandlebars.registerBoundHelper = compatRegisterBoundHelper; -EmberHandlebars.makeBoundHelper = compatMakeBoundHelper; -EmberHandlebars.makeViewHelper = makeViewHelper; EmberHandlebars.SafeString = SafeString; EmberHandlebars.Utils = { diff --git a/packages/ember-htmlbars/lib/compat/helper.js b/packages/ember-htmlbars/lib/compat/helper.js deleted file mode 100644 index 95970c8f45b..00000000000 --- a/packages/ember-htmlbars/lib/compat/helper.js +++ /dev/null @@ -1,160 +0,0 @@ -/** -@module ember -@submodule ember-htmlbars -*/ - -import Ember from 'ember-metal/core'; -import helpers from 'ember-htmlbars/helpers'; -import View from 'ember-views/views/view'; -import Component from 'ember-views/views/component'; -import makeViewHelper from 'ember-htmlbars/system/make-view-helper'; -import makeBoundHelper from 'ember-htmlbars/compat/make-bound-helper'; -import { isStream } from 'ember-metal/streams/utils'; -import { registerKeyword } from 'ember-htmlbars/keywords'; - -var slice = [].slice; - -function calculateCompatType(item) { - if (isStream(item)) { - return 'ID'; - } else { - var itemType = typeof item; - - return itemType.toUpperCase(); - } -} - -function pathFor(param) { - if (isStream(param)) { - // param arguments to helpers may have their path prefixes with self. For - // example {{box-thing foo}} may have a param path of `self.foo` depending - // on scope. - if (param.source && param.source.dependee && param.source.dependee.label === 'self') { - return param.path.slice(5); - } else { - return param.path; - } - } else { - return param; - } -} - -/** - Wraps an Handlebars helper with an HTMLBars helper for backwards compatibility. - - @class HandlebarsCompatibleHelper - @constructor - @private -*/ -function HandlebarsCompatibleHelper(fn) { - this.helperFunction = function helperFunc(params, hash, options, env, scope) { - var param, fnResult; - var hasBlock = options.template && options.template.yield; - - var handlebarsOptions = { - hash: { }, - types: new Array(params.length), - hashTypes: { } - }; - - handlebarsOptions.hash = {}; - - if (hasBlock) { - handlebarsOptions.fn = function() { - options.template.yield(); - }; - - if (options.inverse.yield) { - handlebarsOptions.inverse = function() { - options.inverse.yield(); - }; - } - } - - for (var prop in hash) { - param = hash[prop]; - handlebarsOptions.hashTypes[prop] = calculateCompatType(param); - handlebarsOptions.hash[prop] = pathFor(param); - } - - var args = new Array(params.length); - for (var i = 0, l = params.length; i < l; i++) { - param = params[i]; - handlebarsOptions.types[i] = calculateCompatType(param); - args[i] = pathFor(param); - } - - handlebarsOptions.legacyGetPath = function(path) { - return env.hooks.get(env, scope, path).value(); - }; - - handlebarsOptions.data = { - view: scope.view - }; - - args.push(handlebarsOptions); - - fnResult = fn.apply(this, args); - - if (!options.template.yield) { - return fnResult; - } - }; - - this.isHTMLBars = true; -} - -HandlebarsCompatibleHelper.prototype = { - preprocessArguments() { } -}; - -export function registerHandlebarsCompatibleHelper(name, value) { - Ember.deprecate( - 'Ember.Handlebars.registerHelper is deprecated, please refactor to Ember.Helper.helper.', - false, - { id: 'ember-htmlbars.handlebars-register-helper', until: '2.0.0' } - ); - - if (value && value.isLegacyViewHelper) { - registerKeyword(name, function(morph, env, scope, params, hash, template, inverse, visitor) { - Ember.assert('You can only pass attributes (such as name=value) not bare ' + - 'values to a helper for a View found in \'' + value.viewClass + '\'', params.length === 0); - - env.hooks.keyword('view', morph, env, scope, [value.viewClass], hash, template, inverse, visitor); - return true; - }); - return; - } - - var helper; - - if (value && value.isHTMLBars) { - helper = value; - } else { - helper = new HandlebarsCompatibleHelper(value); - } - - helpers[name] = helper; -} - -export function handlebarsHelper(name, value) { - Ember.deprecate( - 'Ember.Handlebars.helper is deprecated, please refactor to Ember.Helper.helper', - false, - { id: 'ember-htmlbars.handlebars-helper', until: '2.0.0' } - ); - - Ember.assert(`You tried to register a component named '${name}', but component names must include a '-'`, - !Component.detect(value) || name.match(/-/)); - - if (View.detect(value)) { - helpers[name] = makeViewHelper(value); - } else { - var boundHelperArgs = slice.call(arguments, 1); - var boundFn = makeBoundHelper.apply(this, boundHelperArgs); - - helpers[name] = boundFn; - } -} - -export default HandlebarsCompatibleHelper; diff --git a/packages/ember-htmlbars/lib/compat/make-bound-helper.js b/packages/ember-htmlbars/lib/compat/make-bound-helper.js deleted file mode 100644 index f989e0118bb..00000000000 --- a/packages/ember-htmlbars/lib/compat/make-bound-helper.js +++ /dev/null @@ -1,78 +0,0 @@ -import Ember from 'ember-metal/core'; -import { - readArray, - readHash, - isStream -} from 'ember-metal/streams/utils'; - -/** -@module ember -@submodule ember-htmlbars -*/ - -/** - A helper function used by `registerBoundHelper`. Takes the - provided Handlebars helper function fn and returns it in wrapped - bound helper form. - - The main use case for using this outside of `registerBoundHelper` - is for registering helpers on the container: - - ```js - var boundHelperFn = Ember.Handlebars.makeBoundHelper(function(word) { - return word.toUpperCase(); - }); - - container.register('helper:my-bound-helper', boundHelperFn); - ``` - - In the above example, if the helper function hadn't been wrapped in - `makeBoundHelper`, the registered helper would be unbound. - - @method makeBoundHelper - @for Ember.Handlebars - @param {Function} fn - @param {String} dependentKeys* - @since 1.2.0 - @deprecated - @private -*/ - -export function makeBoundHelper(fn, ...dependentKeys) { - return { - _dependentKeys: dependentKeys, - - isHandlebarsCompat: true, - isHTMLBars: true, - - helperFunction(params, hash, templates) { - Ember.assert('registerBoundHelper-generated helpers do not support use with Handlebars blocks.', !templates.template.yield); - - var args = readArray(params); - var properties = new Array(params.length); - - for (var i = 0, l = params.length; i < l; i++) { - var param = params[i]; - - if (isStream(param)) { - properties[i] = param.label; - } else { - properties[i] = param; - } - } - - args.push({ hash: readHash(hash) , templates, data: { properties } }); - return fn.apply(undefined, args); - } - }; -} - -export default function deprecatedMakeBoundHelper(fn, ...dependentKeys) { - Ember.deprecate( - 'Using Ember.Handlebars.makeBoundHelper is deprecated. Please refactor to using `Ember.Helper.helper`.', - false, - { id: 'ember-htmlbars.handlebars-make-bound-helper', until: '2.0.0' } - ); - - return makeBoundHelper(...arguments); -} diff --git a/packages/ember-htmlbars/lib/compat/register-bound-helper.js b/packages/ember-htmlbars/lib/compat/register-bound-helper.js deleted file mode 100644 index 887ab59c36e..00000000000 --- a/packages/ember-htmlbars/lib/compat/register-bound-helper.js +++ /dev/null @@ -1,138 +0,0 @@ -/** -@module ember -@submodule ember-htmlbars -*/ - -import Ember from 'ember-metal/core'; -import helpers from 'ember-htmlbars/helpers'; -import { makeBoundHelper } from 'ember-htmlbars/compat/make-bound-helper'; - -var slice = [].slice; - -/** - Register a bound handlebars helper. Bound helpers behave similarly to regular - handlebars helpers, with the added ability to re-render when the underlying data - changes. - - ## Simple example - - ```javascript - Ember.Handlebars.registerBoundHelper('capitalize', function(value) { - return Ember.String.capitalize(value); - }); - ``` - - The above bound helper can be used inside of templates as follows: - - ```handlebars - {{capitalize name}} - ``` - - In this case, when the `name` property of the template's context changes, - the rendered value of the helper will update to reflect this change. - - ## Example with options - - Like normal handlebars helpers, bound helpers have access to the options - passed into the helper call. - - ```javascript - Ember.Handlebars.registerBoundHelper('repeat', function(value, options) { - var count = options.hash.count; - var a = []; - while(a.length < count) { - a.push(value); - } - return a.join(''); - }); - ``` - - This helper could be used in a template as follows: - - ```handlebars - {{repeat text count=3}} - ``` - - ## Example with bound options - - Bound hash options are also supported. Example: - - ```handlebars - {{repeat text count=numRepeats}} - ``` - - In this example, count will be bound to the value of - the `numRepeats` property on the context. If that property - changes, the helper will be re-rendered. - - ## Example with extra dependencies - - The `Ember.Handlebars.registerBoundHelper` method takes a variable length - third parameter which indicates extra dependencies on the passed in value. - This allows the handlebars helper to update when these dependencies change. - - ```javascript - Ember.Handlebars.registerBoundHelper('capitalizeName', function(value) { - return value.get('name').toUpperCase(); - }, 'name'); - ``` - - ## Example with multiple bound properties - - `Ember.Handlebars.registerBoundHelper` supports binding to - multiple properties, e.g.: - - ```javascript - Ember.Handlebars.registerBoundHelper('concatenate', function() { - var values = Array.prototype.slice.call(arguments, 0, -1); - return values.join('||'); - }); - ``` - - Which allows for template syntax such as `{{concatenate prop1 prop2}}` or - `{{concatenate prop1 prop2 prop3}}`. If any of the properties change, - the helper will re-render. Note that dependency keys cannot be - using in conjunction with multi-property helpers, since it is ambiguous - which property the dependent keys would belong to. - - ## Use with unbound helper - - The `{{unbound}}` helper can be used with bound helper invocations - to render them in their unbound form, e.g. - - ```handlebars - {{unbound capitalize name}} - ``` - - In this example, if the name property changes, the helper - will not re-render. - - ## Use with blocks not supported - - Bound helpers do not support use with Handlebars blocks or - the addition of child views of any kind. - - @method registerBoundHelper - @for Ember.Handlebars - @param {String} name - @param {Function} fn - @param {String} dependentKeys* - @private -*/ - -export function registerBoundHelper(name, fn) { - var boundHelperArgs = slice.call(arguments, 1); - var boundFn = makeBoundHelper.apply(this, boundHelperArgs); - - helpers[name] = boundFn; -} - -export default function deprecatedRegisterBoundHelper() { - Ember.deprecate( - '`Ember.Handlebars.registerBoundHelper` is deprecated. Please refactor to use `Ember.Helpers.helper`.', - false, - { id: 'ember-htmlbars.register-bound-helper', until: '2.0.0' } - ); - - return registerBoundHelper(...arguments); -} diff --git a/packages/ember-htmlbars/lib/helper.js b/packages/ember-htmlbars/lib/helper.js index a034f02741f..e09b0cb2349 100644 --- a/packages/ember-htmlbars/lib/helper.js +++ b/packages/ember-htmlbars/lib/helper.js @@ -45,7 +45,7 @@ import Object from 'ember-runtime/system/object'; @public */ var Helper = Object.extend({ - isHelper: true, + isHelperInstance: true, /** On a class-based helper, it may be useful to force a recomputation of that diff --git a/packages/ember-htmlbars/lib/helpers/with.js b/packages/ember-htmlbars/lib/helpers/with.js index 923b3572323..e4334963306 100644 --- a/packages/ember-htmlbars/lib/helpers/with.js +++ b/packages/ember-htmlbars/lib/helpers/with.js @@ -40,7 +40,7 @@ import shouldDisplay from 'ember-views/streams/should_display'; export default function withHelper(params, hash, options) { if (shouldDisplay(params[0])) { - this.yield([params[0]]); + options.template.yield([params[0]]); } else if (options.inverse && options.inverse.yield) { options.inverse.yield([]); } diff --git a/packages/ember-htmlbars/lib/hooks/element.js b/packages/ember-htmlbars/lib/hooks/element.js index 9815e3d3471..281bd7033c3 100644 --- a/packages/ember-htmlbars/lib/hooks/element.js +++ b/packages/ember-htmlbars/lib/hooks/element.js @@ -15,7 +15,7 @@ export default function emberElement(morph, env, scope, path, params, hash, visi var result; var helper = findHelper(path, scope.self, env); if (helper) { - var helperStream = buildHelperStream(helper, params, hash, { element: morph.element }, env, scope, null, path); + var helperStream = buildHelperStream(helper, params, hash, { element: morph.element }, env, scope, path); result = helperStream.value(); } else { result = env.hooks.get(env, scope, path); diff --git a/packages/ember-htmlbars/lib/hooks/invoke-helper.js b/packages/ember-htmlbars/lib/hooks/invoke-helper.js index 82bcb21f627..d188f960a34 100644 --- a/packages/ember-htmlbars/lib/hooks/invoke-helper.js +++ b/packages/ember-htmlbars/lib/hooks/invoke-helper.js @@ -12,7 +12,7 @@ export default function invokeHelper(morph, env, scope, visitor, params, hash, h return { handled: true }; } - var helperStream = buildHelperStream(helper, params, hash, templates, env, scope, context); + var helperStream = buildHelperStream(helper, params, hash, templates, env, scope); // Ember.Helper helpers are pure values, thus linkable if (helperStream.linkable) { @@ -38,6 +38,6 @@ export default function invokeHelper(morph, env, scope, visitor, params, hash, h return { link: true, value: helperStream }; } - // Legacy helpers are not linkable, they must run every rerender + // Built-in helpers are not linkable, they must run every rerender return { value: helperStream.value() }; } diff --git a/packages/ember-htmlbars/lib/hooks/link-render-node.js b/packages/ember-htmlbars/lib/hooks/link-render-node.js index 8ccca62eeb9..98baa6d7a94 100644 --- a/packages/ember-htmlbars/lib/hooks/link-render-node.js +++ b/packages/ember-htmlbars/lib/hooks/link-render-node.js @@ -5,8 +5,7 @@ import subscribe from 'ember-htmlbars/utils/subscribe'; import { isArray } from 'ember-runtime/utils'; -import { chain, read, readArray, isStream, addDependency } from 'ember-metal/streams/utils'; -import { findHelper } from 'ember-htmlbars/system/lookup-helper'; +import { chain, read, isStream, addDependency } from 'ember-metal/streams/utils'; export default function linkRenderNode(renderNode, env, scope, path, params, hash) { if (renderNode.streamUnsubscribers) { @@ -14,7 +13,6 @@ export default function linkRenderNode(renderNode, env, scope, path, params, has } var keyword = env.hooks.keywords[path]; - var helper; if (keyword && keyword.link) { keyword.link(renderNode.state, params, hash); } else { @@ -23,12 +21,6 @@ export default function linkRenderNode(renderNode, env, scope, path, params, has case 'unless': case 'if': params[0] = shouldDisplay(params[0]); break; case 'each': params[0] = eachParam(params[0]); break; - default: - helper = findHelper(path, env.view, env); - - if (helper && helper.isHandlebarsCompat && params[0]) { - params[0] = processHandlebarsCompatDepKeys(params[0], helper._dependentKeys); - } } } @@ -95,26 +87,3 @@ function getKey(obj, key) { return obj && obj[key]; } } - -function processHandlebarsCompatDepKeys(base, additionalKeys) { - if (!isStream(base) || additionalKeys.length === 0) { - return base; - } - - var depKeyStreams = []; - - var stream = chain(base, function() { - readArray(depKeyStreams); - - return read(base); - }, 'HandlebarsCompatHelper'); - - for (var i = 0, l = additionalKeys.length; i < l; i++) { - var depKeyStream = base.get(additionalKeys[i]); - - depKeyStreams.push(depKeyStream); - stream.addDependency(depKeyStream); - } - - return stream; -} diff --git a/packages/ember-htmlbars/lib/hooks/subexpr.js b/packages/ember-htmlbars/lib/hooks/subexpr.js index 362b75b7e0e..760aec645c1 100644 --- a/packages/ember-htmlbars/lib/hooks/subexpr.js +++ b/packages/ember-htmlbars/lib/hooks/subexpr.js @@ -21,7 +21,7 @@ export default function subexpr(env, scope, helperName, params, hash) { var label = labelForSubexpr(params, hash, helperName); var helper = lookupHelper(helperName, scope.self, env); - var helperStream = buildHelperStream(helper, params, hash, { template: {}, inverse: {} }, env, scope, null, label); + var helperStream = buildHelperStream(helper, params, hash, null, env, scope, label); for (var i = 0, l = params.length; i < l; i++) { helperStream.addDependency(params[i]); diff --git a/packages/ember-htmlbars/lib/main.js b/packages/ember-htmlbars/lib/main.js index 72629e8c0a0..3984c331482 100644 --- a/packages/ember-htmlbars/lib/main.js +++ b/packages/ember-htmlbars/lib/main.js @@ -32,7 +32,6 @@ import { registerPlugin } from 'ember-template-compiler'; -import makeViewHelper from 'ember-htmlbars/system/make-view-helper'; import makeBoundHelper from 'ember-htmlbars/system/make_bound_helper'; import { @@ -89,7 +88,6 @@ Ember.HTMLBars = { template: template, compile: compile, precompile: precompile, - makeViewHelper: makeViewHelper, makeBoundHelper: makeBoundHelper, registerPlugin: registerPlugin, DOMHelper diff --git a/packages/ember-htmlbars/lib/streams/built-in-helper.js b/packages/ember-htmlbars/lib/streams/built-in-helper.js index 77133780c36..b4d0938aaa1 100644 --- a/packages/ember-htmlbars/lib/streams/built-in-helper.js +++ b/packages/ember-htmlbars/lib/streams/built-in-helper.js @@ -5,7 +5,7 @@ import { getHashValues } from 'ember-htmlbars/streams/utils'; -export default function BuiltInHelperStream(helper, params, hash, templates, env, scope, context, label) { +export default function BuiltInHelperStream(helper, params, hash, templates, env, scope, label) { this.init(label); this.helper = helper; this.params = params; @@ -13,14 +13,12 @@ export default function BuiltInHelperStream(helper, params, hash, templates, env this.env = env; this.scope = scope; this.hash = hash; - this.context = context; } BuiltInHelperStream.prototype = Object.create(Stream.prototype); merge(BuiltInHelperStream.prototype, { compute() { - // Using call and undefined is probably not needed, these are only internal - return this.helper.call(this.context, getArrayValues(this.params), getHashValues(this.hash), this.templates, this.env, this.scope); + return this.helper(getArrayValues(this.params), getHashValues(this.hash), this.templates, this.env, this.scope); } }); diff --git a/packages/ember-htmlbars/lib/streams/compat-helper.js b/packages/ember-htmlbars/lib/streams/compat-helper.js deleted file mode 100644 index e8fc5863a23..00000000000 --- a/packages/ember-htmlbars/lib/streams/compat-helper.js +++ /dev/null @@ -1,21 +0,0 @@ -import Stream from 'ember-metal/streams/stream'; -import merge from 'ember-metal/merge'; - -export default function CompatHelperStream(helper, params, hash, templates, env, scope, label) { - this.init(label); - this.helper = helper.helperFunction; - this.params = params; - this.templates = templates; - this.env = env; - this.scope = scope; - this.hash = hash; -} - -CompatHelperStream.prototype = Object.create(Stream.prototype); - -merge(CompatHelperStream.prototype, { - compute() { - // Using call and undefined is probably not needed, these are only internal - return this.helper.call(undefined, this.params, this.hash, this.templates, this.env, this.scope); - } -}); diff --git a/packages/ember-htmlbars/lib/system/helper.js b/packages/ember-htmlbars/lib/system/helper.js deleted file mode 100644 index 351b80ae1c5..00000000000 --- a/packages/ember-htmlbars/lib/system/helper.js +++ /dev/null @@ -1,13 +0,0 @@ -/** -@module ember -@submodule ember-templates -*/ - -function Helper(helper) { - this.helperFunction = helper; - - this.isHelper = true; - this.isHTMLBars = true; -} - -export default Helper; diff --git a/packages/ember-htmlbars/lib/system/invoke-helper.js b/packages/ember-htmlbars/lib/system/invoke-helper.js index dc9fed06110..dfe945f41fa 100644 --- a/packages/ember-htmlbars/lib/system/invoke-helper.js +++ b/packages/ember-htmlbars/lib/system/invoke-helper.js @@ -2,17 +2,22 @@ import Ember from 'ember-metal/core'; import HelperInstanceStream from 'ember-htmlbars/streams/helper-instance'; import HelperFactoryStream from 'ember-htmlbars/streams/helper-factory'; import BuiltInHelperStream from 'ember-htmlbars/streams/built-in-helper'; -import CompatHelperStream from 'ember-htmlbars/streams/compat-helper'; -export function buildHelperStream(helper, params, hash, templates, env, scope, context, label) { - Ember.assert('Helpers may not be used in the block form, for example {{#my-helper}}{{/my-helper}}. Please use a component, or alternatively use the helper in combination with a built-in Ember helper, for example {{#if (my-helper)}}{{/if}}.', !helper.isHelperInstance || !helper.isHelperFactory && !templates.template.meta); +export function buildHelperStream(helper, params, hash, templates, env, scope, label) { + Ember.assert( + 'Helpers may not be used in the block form, for example {{#my-helper}}{{/my-helper}}. Please use a component, or alternatively use the helper in combination with a built-in Ember helper, for example {{#if (my-helper)}}{{/if}}.', + !(helper.isHelperInstance && !helper.isHelperFactory) || (!templates || !templates.template || !templates.template.meta) + ); + Ember.assert( + 'Helpers may not be used in the element form, for example
.', + !(helper.isHelperInstance && !helper.isHelperFactory) || (!templates || !templates.element) + ); if (helper.isHelperFactory) { return new HelperFactoryStream(helper, params, hash, label); } else if (helper.isHelperInstance) { return new HelperInstanceStream(helper, params, hash, label); - } else if (helper.helperFunction) { - return new CompatHelperStream(helper, params, hash, templates, env, scope, label); } else { - return new BuiltInHelperStream(helper, params, hash, templates, env, scope, context, label); + templates = templates || { template: {}, inverse: {} }; + return new BuiltInHelperStream(helper, params, hash, templates, env, scope, label); } } diff --git a/packages/ember-htmlbars/lib/system/lookup-helper.js b/packages/ember-htmlbars/lib/system/lookup-helper.js index e10cf348d6c..f870bc85903 100644 --- a/packages/ember-htmlbars/lib/system/lookup-helper.js +++ b/packages/ember-htmlbars/lib/system/lookup-helper.js @@ -5,7 +5,6 @@ import Ember from 'ember-metal/core'; import Cache from 'ember-metal/cache'; -import HandlebarsCompatibleHelper from 'ember-htmlbars/compat/helper'; export var CONTAINS_DASH_CACHE = new Cache(1000, function(key) { return key.indexOf('-') !== -1; @@ -21,10 +20,6 @@ export function validateLazyHelperName(helperName, container, keywords, knownHel } } -function isLegacyBareHelper(helper) { - return helper && (!helper.isHelperFactory && !helper.isHelperInstance && !helper.isHTMLBars); -} - /** Used to lookup/resolve handlebars helpers. The lookup order is: @@ -48,10 +43,7 @@ export function findHelper(name, view, env) { var helperName = 'helper:' + name; if (container.registry.has(helperName)) { helper = container.lookupFactory(helperName); - if (isLegacyBareHelper(helper)) { - Ember.deprecate(`The helper "${name}" is a deprecated bare function helper. Please use Ember.Helper.build to wrap helper functions.`, false, { id: 'ember-htmlbars.legacy-bare-helper', until: '3.0.0' }); - helper = new HandlebarsCompatibleHelper(helper); - } + Ember.assert(`Expected to find an Ember.Helper with the name ${helperName}, but found an object of type ${typeof helper} instead.`, helper.isHelperFactory || helper.isHelperInstance); } } } diff --git a/packages/ember-htmlbars/lib/system/make-view-helper.js b/packages/ember-htmlbars/lib/system/make-view-helper.js deleted file mode 100644 index 3e8a77cfb56..00000000000 --- a/packages/ember-htmlbars/lib/system/make-view-helper.js +++ /dev/null @@ -1,31 +0,0 @@ -import Ember from 'ember-metal/core'; - -/** -@module ember -@submodule ember-htmlbars -*/ - -/** - Returns a helper function that renders the provided ViewClass. - - Used internally by Ember.Handlebars.helper and other methods - involving helper/component registration. - - @private - @method makeViewHelper - @param {Function} ViewClass view class constructor - @since 1.2.0 -*/ -export default function makeViewHelper(ViewClass) { - Ember.deprecate( - '`Ember.Handlebars.makeViewHelper` and `Ember.HTMLBars.makeViewHelper` are deprecated. Please refactor to normal component usage.', - false, - { id: 'ember-htmlbars.make-view-helper', until: '2.0.0' } - ); - - return { - isLegacyViewHelper: true, - isHTMLBars: true, - viewClass: ViewClass - }; -} diff --git a/packages/ember-htmlbars/tests/compat/helper_test.js b/packages/ember-htmlbars/tests/compat/helper_test.js deleted file mode 100644 index b5964486bc7..00000000000 --- a/packages/ember-htmlbars/tests/compat/helper_test.js +++ /dev/null @@ -1,359 +0,0 @@ -import { - registerHandlebarsCompatibleHelper as registerHelper -} from 'ember-htmlbars/compat/helper'; - -import EmberView from 'ember-views/views/view'; -import Component from 'ember-views/views/component'; - -import makeViewHelper from 'ember-htmlbars/system/make-view-helper'; -import helpers from 'ember-htmlbars/helpers'; -import compile from 'ember-template-compiler/system/compile'; -import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; -import Registry from 'container/registry'; -import ComponentLookup from 'ember-views/component_lookup'; -import HandlebarsCompatibleHelper from 'ember-htmlbars/compat/helper'; - -import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; -import viewKeyword from 'ember-htmlbars/keywords/view'; - -var view, registry, container, originalViewKeyword; - -function registerHandlebarsCompatibleHelper() { - expectDeprecation('Ember.Handlebars.registerHelper is deprecated, please refactor to Ember.Helper.helper.'); - - return registerHelper(...arguments); -} - -QUnit.module('ember-htmlbars: compat - Handlebars compatible helpers', { - setup() { - originalViewKeyword = registerKeyword('view', viewKeyword); - - registry = new Registry(); - container = registry.container(); - registry.optionsForType('component', { singleton: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); - }, - teardown() { - runDestroy(view); - - delete helpers.test; - delete helpers['view-helper']; - - resetKeyword('view', originalViewKeyword); - } -}); - -QUnit.test('wraps provided function so that original path params are provided to the helper', function() { - expect(3); - - function someHelper(param1, param2, options) { - equal(param1, 'blammo'); - equal(param2, 'blazzico'); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - value: 'foo' - }, - template: compile('{{test "blammo" "blazzico"}}') - }); - - runAppend(view); -}); - -QUnit.test('combines `env` and `options` for the wrapped helper', function() { - expect(2); - - function someHelper(options) { - equal(options.data.view, view); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - value: 'foo' - }, - template: compile('{{test}}') - }); - - runAppend(view); -}); - -QUnit.test('combines `env` and `options` for the wrapped helper', function() { - expect(2); - - function someHelper(options) { - equal(options.data.view, view); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - value: 'foo' - }, - template: compile('{{test}}') - }); - - runAppend(view); -}); - -QUnit.test('has the correct options.data.view within a components layout', function() { - expect(1); - var component; - - registry.register('component:foo-bar', Component.extend({ - init() { - this._super(...arguments); - component = this; - } - })); - - registry.register('template:components/foo-bar', compile('{{my-thing}}')); - registry.register('helper:my-thing', new HandlebarsCompatibleHelper(function(options) { - equal(options.data.view, component, 'passed in view should match the current component'); - })); - - view = EmberView.create({ - container, - template: compile('{{foo-bar}}') - }); - - runAppend(view); -}); - -QUnit.test('adds `hash` into options `options` for the wrapped helper', function() { - expect(2); - - function someHelper(options) { - equal(options.hash.bestFriend, 'Jacquie'); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - value: 'foo' - }, - template: compile('{{test bestFriend="Jacquie"}}') - }); - - runAppend(view); -}); - -QUnit.test('bound `hash` params are provided with their original paths', function() { - expect(2); - - function someHelper(options) { - equal(options.hash.bestFriend, 'value'); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - value: 'Jacquie' - }, - template: compile('{{test bestFriend=value}}') - }); - - runAppend(view); -}); - -QUnit.test('bound ordered params are provided with their original paths', function() { - expect(3); - - function someHelper(param1, param2, options) { - equal(param1, 'first'); - equal(param2, 'second'); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - first: 'blammo', - second: 'blazzico' - }, - template: compile('{{test first second}}') - }); - - runAppend(view); -}); - -QUnit.test('registering a helper created from `Ember.Handlebars.makeViewHelper` does not double wrap the helper', function() { - expect(3); - - var ViewHelperComponent = Component.extend({ - layout: compile('woot!') - }); - - var helper; - expectDeprecation(function() { - helper = makeViewHelper(ViewHelperComponent); - }, '`Ember.Handlebars.makeViewHelper` and `Ember.HTMLBars.makeViewHelper` are deprecated. Please refactor to normal component usage.'); - - registerHandlebarsCompatibleHelper('view-helper', helper); - - view = EmberView.extend({ - template: compile('{{view-helper}}') - }).create(); - - runAppend(view); - - equal(view.$().text(), 'woot!'); -}); - -QUnit.test('makes helpful assertion when called with invalid arguments', function() { - expect(3); - - var ViewHelperComponent = Component.extend({ - layout: compile('woot!') - }); - - ViewHelperComponent.toString = function() { return 'Some Random Class'; }; - - var helper; - expectDeprecation(function() { - helper = makeViewHelper(ViewHelperComponent); - }, '`Ember.Handlebars.makeViewHelper` and `Ember.HTMLBars.makeViewHelper` are deprecated. Please refactor to normal component usage.'); - registerHandlebarsCompatibleHelper('view-helper', helper); - - view = EmberView.extend({ - template: compile('{{view-helper "hello"}}') - }).create(); - - expectAssertion(function() { - runAppend(view); - }, 'You can only pass attributes (such as name=value) not bare values to a helper for a View found in \'Some Random Class\''); -}); - -QUnit.test('does not add `options.fn` if no block was specified', function() { - expect(2); - - function someHelper(options) { - ok(!options.fn, '`options.fn` is not present when block is not specified'); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - value: 'foo' - }, - template: compile('{{test}}') - }); - - runAppend(view); -}); - -QUnit.test('does not return helper result if block was specified', function() { - expect(2); - - function someHelper(options) { - return 'asdf'; - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - value: 'foo' - }, - template: compile('{{#test}}lkj;{{/test}}') - }); - - runAppend(view); - - equal(view.$().text(), ''); -}); - -QUnit.test('allows usage of the template fn', function() { - expect(2); - - function someHelper(options) { - options.fn(); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - value: 'foo' - }, - template: compile('{{#test}}{{value}}{{/test}}') - }); - - runAppend(view); - - equal(view.$().text(), 'foo'); -}); - -QUnit.test('allows usage of the template inverse', function() { - expect(2); - - function someHelper(options) { - options.inverse(); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - value: 'foo' - }, - template: compile('{{#test}}Nothing to see here.{{else}}{{value}}{{/test}}') - }); - - runAppend(view); - - equal(view.$().text(), 'foo'); -}); - -QUnit.test('ordered param types are added to options.types', function() { - expect(4); - - function someHelper(param1, param2, param3, options) { - equal(options.types[0], 'NUMBER'); - equal(options.types[1], 'ID'); - equal(options.types[2], 'STRING'); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - first: 'blammo', - second: 'blazzico' - }, - template: compile('{{test 1 two "3"}}') - }); - - runAppend(view); -}); - -QUnit.test('`hash` params are to options.hashTypes', function() { - expect(4); - - function someHelper(options) { - equal(options.hashTypes.string, 'STRING'); - equal(options.hashTypes.number, 'NUMBER'); - equal(options.hashTypes.id, 'ID'); - } - - registerHandlebarsCompatibleHelper('test', someHelper); - - view = EmberView.create({ - controller: { - value: 'Jacquie' - }, - template: compile('{{test string="foo" number=42 id=someBoundThing}}') - }); - - runAppend(view); -}); diff --git a/packages/ember-htmlbars/tests/compat/make-view-helper_test.js b/packages/ember-htmlbars/tests/compat/make-view-helper_test.js deleted file mode 100644 index 6f60f46808f..00000000000 --- a/packages/ember-htmlbars/tests/compat/make-view-helper_test.js +++ /dev/null @@ -1,52 +0,0 @@ -import EmberView from 'ember-views/views/view'; -import Registry from 'container/registry'; -import compile from 'ember-template-compiler/system/compile'; -import makeViewHelper from 'ember-htmlbars/system/make-view-helper'; -import Component from 'ember-views/views/component'; -import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; - -import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; -import viewKeyword from 'ember-htmlbars/keywords/view'; - -var registry, container, view, originalViewKeyword; - -QUnit.module('ember-htmlbars: compat - makeViewHelper compat', { - setup() { - originalViewKeyword = registerKeyword('view', viewKeyword); - - registry = new Registry(); - container = registry.container(); - }, - - teardown() { - runDestroy(container); - runDestroy(view); - registry = container = view = null; - - resetKeyword('view', originalViewKeyword); - } -}); - -QUnit.test('makeViewHelper', function() { - expect(2); - - var ViewHelperComponent = Component.extend({ - layout: compile('woot!') - }); - - var helper; - expectDeprecation(function() { - helper = makeViewHelper(ViewHelperComponent); - }, '`Ember.Handlebars.makeViewHelper` and `Ember.HTMLBars.makeViewHelper` are deprecated. Please refactor to normal component usage.'); - - registry.register('helper:view-helper', helper); - - view = EmberView.extend({ - template: compile('{{view-helper}}'), - container: container - }).create(); - - runAppend(view); - - equal(view.$().text(), 'woot!'); -}); diff --git a/packages/ember-htmlbars/tests/compat/make_bound_helper_test.js b/packages/ember-htmlbars/tests/compat/make_bound_helper_test.js deleted file mode 100644 index 20bac9e4a96..00000000000 --- a/packages/ember-htmlbars/tests/compat/make_bound_helper_test.js +++ /dev/null @@ -1,537 +0,0 @@ -/*jshint newcap:false*/ -import Ember from 'ember-metal/core'; -import EmberView from 'ember-views/views/view'; -import run from 'ember-metal/run_loop'; -import EmberObject from 'ember-runtime/system/object'; -import { A } from 'ember-runtime/system/native_array'; - -// import {expectAssertion} from "ember-metal/tests/debug_helpers"; - -import { get } from 'ember-metal/property_get'; -import { set } from 'ember-metal/property_set'; -import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; -import { dasherize } from 'ember-runtime/system/string'; - -import EmberHandlebars from 'ember-htmlbars/compat'; - -var compile, helpers, helper; -compile = EmberHandlebars.compile; -helpers = EmberHandlebars.helpers; -helper = EmberHandlebars.helper; - -var view; - -var originalLookup = Ember.lookup; - -function registerRepeatHelper() { - expectDeprecationInHTMLBars(); - - helper('repeat', function(value, options) { - var count = options.hash.count || 1; - var a = []; - while (a.length < count) { - a.push(value); - } - return a.join(''); - }); -} - -function expectDeprecationInHTMLBars() { - // leave this empty function as a place holder to - // enable a deprecation notice -} - -QUnit.module('ember-htmlbars: compat - makeBoundHelper', { - setup() { - expectDeprecation('Using Ember.Handlebars.makeBoundHelper is deprecated. Please refactor to using `Ember.Helper.helper`.'); - }, - teardown() { - runDestroy(view); - Ember.lookup = originalLookup; - } -}); - -QUnit.test('should update bound helpers when properties change', function() { - expectDeprecationInHTMLBars(); - - helper('capitalize', function(value) { - return value.toUpperCase(); - }); - - view = EmberView.create({ - controller: EmberObject.create({ name: 'Brogrammer' }), - template: compile('{{capitalize name}}') - }); - - runAppend(view); - - equal(view.$().text(), 'BROGRAMMER', 'helper output is correct'); - - run(function() { - set(view, 'controller.name', 'wes'); - }); - - equal(view.$().text(), 'WES', 'helper output updated'); -}); - -QUnit.test('should update bound helpers in a subexpression when properties change', function() { - expectDeprecationInHTMLBars(); - - helper('dasherize', function(value) { - return dasherize(value); - }); - - helper('reverse', function(value) { - return value.split('').reverse().join(''); - }); - - ignoreDeprecation(function() { - view = EmberView.create({ - controller: { prop: 'isThing' }, - template: compile('
{{prop}}
') - }); - }); - - runAppend(view); - - equal(view.$('div[data-foo="gniht-si"]').text(), 'isThing', 'helper output is correct'); - - run(view, 'set', 'controller.prop', 'notThing'); - - equal(view.$('div[data-foo="gniht-ton"]').text(), 'notThing', 'helper output is correct'); -}); - -QUnit.test('should allow for computed properties with dependencies', function() { - expectDeprecationInHTMLBars(); - - helper('capitalizeName', function(value) { - return get(value, 'name').toUpperCase(); - }, 'name'); - - view = EmberView.create({ - controller: EmberObject.create({ - person: EmberObject.create({ - name: 'Brogrammer' - }) - }), - template: compile('{{capitalizeName person}}') - }); - - runAppend(view); - - equal(view.$().text(), 'BROGRAMMER', 'helper output is correct'); - - run(function() { - set(view, 'controller.person.name', 'wes'); - }); - - equal(view.$().text(), 'WES', 'helper output updated'); -}); - -QUnit.test('bound helpers should support options', function() { - registerRepeatHelper(); - - view = EmberView.create({ - controller: EmberObject.create({ text: 'ab' }), - template: compile('{{repeat text count=3}}') - }); - - runAppend(view); - - equal(view.$().text(), 'ababab', 'helper output is correct'); -}); - -QUnit.test('bound helpers should support keywords', function() { - expectDeprecationInHTMLBars(); - - helper('capitalize', function(value) { - return value.toUpperCase(); - }); - - view = EmberView.create({ - text: 'ab', - template: compile('{{capitalize view.text}}') - }); - - runAppend(view); - - equal(view.$().text(), 'AB', 'helper output is correct'); -}); - -QUnit.test('bound helper should support this keyword', function() { - expectDeprecationInHTMLBars(); - - helper('capitalize', function(value) { - return get(value, 'text').toUpperCase(); - }); - - view = EmberView.create({ - controller: EmberObject.create({ text: 'ab' }), - template: compile('{{capitalize this}}') - }); - - runAppend(view); - - equal(view.$().text(), 'AB', 'helper output is correct'); -}); - -QUnit.test('bound helpers should support bound options via `fooBinding` [DEPRECATED]', function() { - registerRepeatHelper(); - - var template; - - expectDeprecation(function() { - template = compile('{{repeat text countBinding="numRepeats"}}'); - }, /You're using legacy binding syntax: countBinding="numRepeats"/); - - view = EmberView.create({ - controller: EmberObject.create({ text: 'ab', numRepeats: 3 }), - template: template - }); - - runAppend(view); - - equal(view.$().text(), 'ababab', 'helper output is correct'); - - run(function() { - view.set('controller.numRepeats', 4); - }); - - equal(view.$().text(), 'abababab', 'helper correctly re-rendered after bound option was changed'); - - run(function() { - view.set('controller.numRepeats', 2); - view.set('controller.text', 'YES'); - }); - - equal(view.$().text(), 'YESYES', 'helper correctly re-rendered after both bound option and property changed'); -}); - -QUnit.test('bound helpers should support bound hash options', function() { - registerRepeatHelper(); - - view = EmberView.create({ - controller: EmberObject.create({ text: 'ab', numRepeats: 3 }), - template: compile('{{repeat text count=numRepeats}}') - }); - - runAppend(view); - - equal(view.$().text(), 'ababab', 'helper output is correct'); - - run(function() { - view.set('controller.numRepeats', 4); - }); - - equal(view.$().text(), 'abababab', 'helper correctly re-rendered after bound option was changed'); - - run(function() { - view.set('controller.numRepeats', 2); - view.set('controller.text', 'YES'); - }); - - equal(view.$().text(), 'YESYES', 'helper correctly re-rendered after both bound option and property changed'); -}); - -QUnit.test('bound helpers should support unquoted values as bound options', function() { - registerRepeatHelper(); - - view = EmberView.create({ - controller: EmberObject.create({ text: 'ab', numRepeats: 3 }), - template: compile('{{repeat text count=numRepeats}}') - }); - - runAppend(view); - - equal(view.$().text(), 'ababab', 'helper output is correct'); - - run(function() { - view.set('controller.numRepeats', 4); - }); - - equal(view.$().text(), 'abababab', 'helper correctly re-rendered after bound option was changed'); - - run(function() { - view.set('controller.numRepeats', 2); - view.set('controller.text', 'YES'); - }); - - equal(view.$().text(), 'YESYES', 'helper correctly re-rendered after both bound option and property changed'); -}); - - -QUnit.test('bound helpers should support multiple bound properties', function() { - expectDeprecationInHTMLBars(); - - helper('combine', function() { - return [].slice.call(arguments, 0, -1).join(''); - }); - - view = EmberView.create({ - controller: EmberObject.create({ thing1: 'ZOID', thing2: 'BERG' }), - template: compile('{{combine thing1 thing2}}') - }); - - runAppend(view); - - equal(view.$().text(), 'ZOIDBERG', 'helper output is correct'); - - run(function() { - view.set('controller.thing2', 'NERD'); - }); - - equal(view.$().text(), 'ZOIDNERD', 'helper correctly re-rendered after second bound helper property changed'); - - run(function() { - view.get('controller').setProperties({ - thing1: 'WOOT', - thing2: 'YEAH' - }); - }); - - equal(view.$().text(), 'WOOTYEAH', 'helper correctly re-rendered after both bound helper properties changed'); -}); - -QUnit.test('bound helpers should expose property names in options.data.properties', function() { - expectDeprecationInHTMLBars(); - - helper('echo', function() { - var options = arguments[arguments.length - 1]; - var values = [].slice.call(arguments, 0, -1); - var a = []; - for (var i = 0; i < values.length; ++i) { - var propertyName = options.data.properties[i]; - a.push(propertyName); - } - return a.join(' '); - }); - - view = EmberView.create({ - controller: EmberObject.create({ - thing1: 'ZOID', - thing2: 'BERG', - thing3: EmberObject.create({ - foo: 123 - }) - }), - template: compile('{{echo thing1 thing2 thing3.foo}}') - }); - - runAppend(view); - - equal(view.$().text(), 'thing1 thing2 thing3.foo', 'helper output is correct'); -}); - -QUnit.test('bound helpers can be invoked with zero args', function() { - expectDeprecationInHTMLBars(); - - helper('troll', function(options) { - return options.hash.text || 'TROLOLOL'; - }); - - view = EmberView.create({ - controller: EmberObject.create({ trollText: 'yumad' }), - template: compile('{{troll}} and {{troll text="bork"}}') - }); - - runAppend(view); - - equal(view.$().text(), 'TROLOLOL and bork', 'helper output is correct'); -}); - -QUnit.test('bound helpers should not be invoked with blocks', function() { - registerRepeatHelper(); - - view = EmberView.create({ - controller: EmberObject.create({}), - template: compile('{{#repeat}}Sorry, Charlie{{/repeat}}') - }); - - expectAssertion(function() { - runAppend(view); - }, /registerBoundHelper-generated helpers do not support use with Handlebars blocks/i); -}); - -QUnit.test('should observe dependent keys passed to registerBoundHelper', function() { - try { - expectDeprecationInHTMLBars(); - - var simplyObject = EmberObject.create({ - firstName: 'Jim', - lastName: 'Owen', - birthday: EmberObject.create({ - year: '2009' - }) - }); - - helper('fullName', function(value) { - return [ - value.get('firstName'), - value.get('lastName'), - value.get('birthday.year') - ].join(' '); - }, 'firstName', 'lastName', 'birthday.year'); - - view = EmberView.create({ - template: compile('{{fullName this}}'), - context: simplyObject - }); - runAppend(view); - - equal(view.$().text(), 'Jim Owen 2009', 'simply render the helper'); - - run(simplyObject, simplyObject.set, 'firstName', 'Tom'); - - equal(view.$().text(), 'Tom Owen 2009', 'render the helper after prop change'); - - run(simplyObject, simplyObject.set, 'birthday.year', '1692'); - - equal(view.$().text(), 'Tom Owen 1692', 'render the helper after path change'); - } finally { - delete helpers['fullName']; - } -}); - -QUnit.test('shouldn\'t treat raw numbers as bound paths', function() { - expectDeprecationInHTMLBars(); - - helper('sum', function(a, b) { - return a + b; - }); - - view = EmberView.create({ - controller: EmberObject.create({ aNumber: 1 }), - template: compile('{{sum aNumber 1}} {{sum 0 aNumber}} {{sum 5 6}}') - }); - - runAppend(view); - - equal(view.$().text(), '2 1 11', 'helper output is correct'); - - run(view, 'set', 'controller.aNumber', 5); - - equal(view.$().text(), '6 5 11', 'helper still updates as expected'); -}); - -QUnit.test('shouldn\'t treat quoted strings as bound paths', function() { - expectDeprecationInHTMLBars(); - - var helperCount = 0; - helper('combine', function(a, b, opt) { - helperCount++; - return a + b; - }); - - view = EmberView.create({ - controller: EmberObject.create({ word: 'jerkwater', loo: 'unused' }), - template: compile('{{combine word \'loo\'}} {{combine \'\' word}} {{combine \'will\' "didi"}}') - }); - - runAppend(view); - - equal(view.$().text(), 'jerkwaterloo jerkwater willdidi', 'helper output is correct'); - - run(view, 'set', 'controller.word', 'bird'); - equal(view.$().text(), 'birdloo bird willdidi', 'helper still updates as expected'); - - run(view, 'set', 'controller.loo', 'soup-de-doo'); - equal(view.$().text(), 'birdloo bird willdidi', 'helper still updates as expected'); - equal(helperCount, 5, 'changing controller property with same name as quoted string doesn\'t re-render helper'); -}); - -QUnit.test('bound helpers can handle nulls in array (with primitives) [DEPRECATED]', function() { - expectDeprecationInHTMLBars(); - - // The problem here is that `undefined` is treated as "use the parent scope" in yieldItem - - helper('reverse', function(val) { - return val ? val.split('').reverse().join('') : 'NOPE'; - }); - - view = EmberView.create({ - controller: EmberObject.create({ - things: A([null, 0, undefined, false, 'OMG']) - }), - template: compile('{{#each things as |thing|}}{{thing}}|{{reverse thing}} {{/each}}{{#each things as |thing|}}{{thing}}|{{reverse thing}} {{/each}}') - }); - - runAppend(view); - - equal(view.$().text(), '|NOPE 0|NOPE |NOPE false|NOPE OMG|GMO |NOPE 0|NOPE |NOPE false|NOPE OMG|GMO ', 'helper output is correct'); - - run(function() { - view.get('controller.things').pushObject('blorg'); - view.get('controller.things').shiftObject(); - }); - - equal(view.$().text(), '0|NOPE |NOPE false|NOPE OMG|GMO blorg|grolb 0|NOPE |NOPE false|NOPE OMG|GMO blorg|grolb ', 'helper output is still correct'); -}); - -QUnit.test('bound helpers can handle nulls in array (with objects)', function() { - expectDeprecationInHTMLBars(); - - helper('print-foo', function(val) { - return val ? get(val, 'foo') : 'NOPE'; - }); - - view = EmberView.create({ - controller: EmberObject.create({ - things: A([null, { foo: 5 }]) - }), - template: compile('{{#each things as |thing|}}{{thing.foo}}|{{print-foo thing}} {{/each}}{{#each things as |thing|}}{{thing.foo}}|{{print-foo thing}} {{/each}}') - }); - - runAppend(view); - - equal(view.$().text(), '|NOPE 5|5 |NOPE 5|5 ', 'helper output is correct'); - - run(view.get('controller.things'), 'pushObject', { foo: 6 }); - - equal(view.$().text(), '|NOPE 5|5 6|6 |NOPE 5|5 6|6 ', 'helper output is correct'); -}); - -QUnit.test('bound helpers can handle `this` keyword when it\'s a non-object', function() { - expectDeprecationInHTMLBars(); - - helper('shout', function(value) { - return value + '!'; - }); - - view = EmberView.create({ - context: 'alex', - template: compile('{{shout this}}') - }); - - runAppend(view); - - equal(view.$().text(), 'alex!', 'helper output is correct first'); - - run(function() { - set(view, 'context', ''); - }); - - equal(view.$().text(), '!', 'helper output is correct after updating to empty'); - - run(function() { - set(view, 'context', 'wallace'); - }); - - equal(view.$().text(), 'wallace!', 'helper output is correct after updating to wallace'); -}); - -QUnit.test('should have correct argument types', function() { - expectDeprecationInHTMLBars(); - - helper('getType', function(value) { - return value === null ? 'null' : typeof value; - }); - - view = EmberView.create({ - controller: EmberObject.create(), - template: compile('{{getType null}}, {{getType undefProp}}, {{getType "string"}}, {{getType 1}}, {{getType}}') - }); - - runAppend(view); - - equal(view.$().text(), 'null, undefined, string, number, object', 'helper output is correct'); -}); diff --git a/packages/ember-htmlbars/tests/compat/precompile_test.js b/packages/ember-htmlbars/tests/compat/precompile_test.js deleted file mode 100644 index 81ac2fac709..00000000000 --- a/packages/ember-htmlbars/tests/compat/precompile_test.js +++ /dev/null @@ -1,22 +0,0 @@ -import EmberHandlebars from 'ember-htmlbars/compat'; - -var precompile = EmberHandlebars.precompile; -var template = 'Hello World'; -var result; - -QUnit.module('ember-htmlbars: compat - Ember.Handlebars.precompile'); - -QUnit.test('precompile creates an object when asObject isn\'t defined', function() { - result = precompile(template); - equal(typeof(result), 'object'); -}); - -QUnit.test('precompile creates an object when asObject is true', function() { - result = precompile(template, true); - equal(typeof(result), 'object'); -}); - -QUnit.test('precompile creates a string when asObject is false', function() { - result = precompile(template, false); - equal(typeof(result), 'string'); -}); diff --git a/packages/ember-htmlbars/tests/helpers/concat-test.js b/packages/ember-htmlbars/tests/helpers/concat-test.js index eceabd4ce2d..658cc873bdb 100644 --- a/packages/ember-htmlbars/tests/helpers/concat-test.js +++ b/packages/ember-htmlbars/tests/helpers/concat-test.js @@ -2,6 +2,7 @@ import run from 'ember-metal/run_loop'; import { Registry } from 'ember-runtime/system/container'; import Component from 'ember-views/views/component'; import compile from 'ember-template-compiler/system/compile'; +import { helper as makeHelper } from 'ember-htmlbars/helper'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; @@ -63,8 +64,7 @@ QUnit.test('can be used as a sub-expression', function() { function eq([ actual, expected ]) { return actual === expected; } - eq.isHTMLBars = true; - registry.register('helper:x-eq', eq); + registry.register('helper:x-eq', makeHelper(eq)); component = Component.create({ container, diff --git a/packages/ember-htmlbars/tests/helpers/custom_helper_test.js b/packages/ember-htmlbars/tests/helpers/custom_helper_test.js index ef3119876a2..43010d6b12b 100644 --- a/packages/ember-htmlbars/tests/helpers/custom_helper_test.js +++ b/packages/ember-htmlbars/tests/helpers/custom_helper_test.js @@ -246,6 +246,19 @@ QUnit.test('dashed helper not usable with a block', function() { }, /Helpers may not be used in the block form/); }); +QUnit.test('dashed helper not usable within element', function() { + var SomeHelper = makeHelper(function() {}); + registry.register('helper:some-helper', SomeHelper); + component = Component.extend({ + container, + layout: compile(`
`) + }).create(); + + expectAssertion(function() { + runAppend(component); + }, /Helpers may not be used in the element form/); +}); + QUnit.test('dashed helper is torn down', function() { var destroyCalled = 0; var SomeHelper = Helper.extend({ diff --git a/packages/ember-htmlbars/tests/helpers/unbound_test.js b/packages/ember-htmlbars/tests/helpers/unbound_test.js index 6fb9781833e..fd3e223317e 100644 --- a/packages/ember-htmlbars/tests/helpers/unbound_test.js +++ b/packages/ember-htmlbars/tests/helpers/unbound_test.js @@ -8,27 +8,22 @@ import { get } from 'ember-metal/property_get'; import { set } from 'ember-metal/property_set'; import run from 'ember-metal/run_loop'; import compile from 'ember-template-compiler/system/compile'; -import helpers from 'ember-htmlbars/helpers'; -import registerBoundHelper from 'ember-htmlbars/compat/register-bound-helper'; -import makeBoundHelper from 'ember-htmlbars/compat/make-bound-helper'; +import Helper, { helper } from 'ember-htmlbars/helper'; import { Registry } from 'ember-runtime/system/container'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; -function expectDeprecationInHTMLBars() { - // leave this as an empty function until we are ready to use it - // to enforce deprecation notice for old Handlebars versions -} - - var view, lookup, registry, container; var originalLookup = Ember.lookup; QUnit.module('ember-htmlbars: {{#unbound}} helper', { setup() { Ember.lookup = lookup = { Ember: Ember }; + registry = new Registry(); + container = registry.container(); view = EmberView.create({ + container, template: compile('{{unbound foo}} {{unbound bar}}'), context: EmberObject.create({ foo: 'BORK', @@ -41,6 +36,8 @@ QUnit.module('ember-htmlbars: {{#unbound}} helper', { teardown() { runDestroy(view); + runDestroy(container); + registry = container = view = null; Ember.lookup = originalLookup; } }); @@ -109,9 +106,11 @@ QUnit.test('should property escape unsafe hrefs', function() { QUnit.module('ember-htmlbars: {{#unbound}} helper with container present', { setup() { Ember.lookup = lookup = { Ember: Ember }; + registry = new Registry(); + container = registry.container(); view = EmberView.create({ - container: new Registry().container, + container, template: compile('{{unbound foo}}'), context: EmberObject.create({ foo: 'bleep' @@ -121,6 +120,8 @@ QUnit.module('ember-htmlbars: {{#unbound}} helper with container present', { teardown() { runDestroy(view); + runDestroy(container); + container = registry = view = null; Ember.lookup = originalLookup; } }); @@ -133,15 +134,16 @@ QUnit.test('it should render the current value of a property path on the context QUnit.module('ember-htmlbars: {{#unbound}} subexpression', { setup() { Ember.lookup = lookup = { Ember: Ember }; + registry = new Registry(); + container = registry.container(); - expectDeprecation('`Ember.Handlebars.registerBoundHelper` is deprecated. Please refactor to use `Ember.Helpers.helper`.'); - - registerBoundHelper('capitalize', function(value) { - return value.toUpperCase(); - }); + registry.register('helper:-capitalize', helper(function(params) { + return params[0].toUpperCase(); + })); view = EmberView.create({ - template: compile('{{capitalize (unbound foo)}}'), + container, + template: compile('{{-capitalize (unbound foo)}}'), context: EmberObject.create({ foo: 'bork' }) @@ -151,9 +153,9 @@ QUnit.module('ember-htmlbars: {{#unbound}} subexpression', { }, teardown() { - delete helpers['capitalize']; - runDestroy(view); + runDestroy(container); + registry = container = view = null; Ember.lookup = originalLookup; } }); @@ -180,20 +182,20 @@ QUnit.test('it should re-render if the parent view rerenders', function() { QUnit.module('ember-htmlbars: {{#unbound}} subexpression - helper form', { setup() { Ember.lookup = lookup = { Ember: Ember }; + registry = new Registry(); + container = registry.container(); + registry.register('helper:-capitalize', helper(function(params) { + return params[0].toUpperCase(); + })); - expectDeprecation('`Ember.Handlebars.registerBoundHelper` is deprecated. Please refactor to use `Ember.Helpers.helper`.'); - - registerBoundHelper('capitalize', function(value) { - return value.toUpperCase(); - }); - - registerBoundHelper('doublize', function(value) { - return `${value} ${value}`; - }); + registry.register('helper:-doublize', helper(function(params) { + return `${params[0]} ${params[0]}`; + })); view = EmberView.create({ - template: compile('{{capitalize (unbound doublize foo)}}'), + container, + template: compile('{{-capitalize (unbound -doublize foo)}}'), context: EmberObject.create({ foo: 'bork' }) @@ -203,10 +205,9 @@ QUnit.module('ember-htmlbars: {{#unbound}} subexpression - helper form', { }, teardown() { - delete helpers['capitalize']; - delete helpers['doublize']; - runDestroy(view); + runDestroy(container); + registry = container = view = null; Ember.lookup = originalLookup; } }); @@ -233,123 +234,138 @@ QUnit.test('it should re-render if the parent view rerenders', function() { QUnit.module('ember-htmlbars: {{#unbound boundHelper arg1 arg2... argN}} form: render unbound helper invocations', { setup() { Ember.lookup = lookup = { Ember: Ember }; - expectDeprecationInHTMLBars(); - - expectDeprecation('`Ember.Handlebars.registerBoundHelper` is deprecated. Please refactor to use `Ember.Helpers.helper`.'); + registry = new Registry(); + container = registry.container(); - registerBoundHelper('surround', function(prefix, value, suffix) { + registry.register('helper:-surround', helper(function([prefix, value, suffix]) { return prefix + '-' + value + '-' + suffix; - }); + })); - registerBoundHelper('capitalize', function(value) { + registry.register('helper:-capitalize', helper(function([value]) { return value.toUpperCase(); - }); + })); - registerBoundHelper('capitalizeName', function(value) { - return get(value, 'firstName').toUpperCase(); - }, 'firstName'); + registry.register('helper:-capitalizeName', Helper.extend({ + destroy() { + this.removeObserver('value.firstName'); + this._super(...arguments); + }, + compute([value]) { + if (this.get('value')) { + this.removeObserver('value.firstName'); + } + this.set('value', value); + this.addObserver('value.firstName', this, this.recompute); + return get(value, 'firstName').toUpperCase(); + } + })); - registerBoundHelper('fauxconcat', function(value) { - return [].slice.call(arguments, 0, -1).join(''); - }); + registry.register('helper:-fauxconcat', helper(function(params) { + return params.slice(0, -1).join(''); + })); - registerBoundHelper('concatNames', function(value) { - return get(value, 'firstName') + get(value, 'lastName'); - }, 'firstName', 'lastName'); + registry.register('helper:-concatNames', Helper.extend({ + destroy() { + this.teardown(); + this._super(...arguments); + }, + teardown() { + this.removeObserver('value.firstName'); + this.removeObserver('value.lastName'); + }, + compute([value]) { + if (this.get('value')) { + this.teardown(); + } + this.set('value', value); + this.addObserver('value.firstName', this, this.recompute); + this.addObserver('value.lastName', this, this.recompute); + return get(value, 'firstName') + get(value, 'lastName'); + } + })); }, teardown() { - delete helpers['surround']; - delete helpers['capitalize']; - delete helpers['capitalizeName']; - delete helpers['fauxconcat']; - delete helpers['concatNames']; - runDestroy(view); + runDestroy(container); + registry = container = view = null; Ember.lookup = originalLookup; } }); QUnit.test('should be able to render an unbound helper invocation', function() { - try { - registerBoundHelper('repeat', function(value, options) { - var count = options.hash.count; - var a = []; - while (a.length < count) { - a.push(value); - } - return a.join(''); - }); + registry.register('helper:-repeat', helper(function([value], {count}) { + var a = []; + while (a.length < count) { + a.push(value); + } + return a.join(''); + })); - view = EmberView.create({ - template: compile('{{unbound repeat foo count=bar}} {{repeat foo count=bar}} {{unbound repeat foo count=2}} {{repeat foo count=4}}'), - context: EmberObject.create({ - foo: 'X', - numRepeatsBinding: 'bar', - bar: 5 - }) - }); - runAppend(view); + view = EmberView.create({ + container, + template: compile('{{unbound -repeat foo count=bar}} {{-repeat foo count=bar}} {{unbound -repeat foo count=2}} {{-repeat foo count=4}}'), + context: EmberObject.create({ + foo: 'X', + numRepeatsBinding: 'bar', + bar: 5 + }) + }); + runAppend(view); - equal(view.$().text(), 'XXXXX XXXXX XX XXXX', 'first render is correct'); + equal(view.$().text(), 'XXXXX XXXXX XX XXXX', 'first render is correct'); - run(function() { - set(view, 'context.bar', 1); - }); + run(function() { + set(view, 'context.bar', 1); + }); - equal(view.$().text(), 'XXXXX X XX XXXX', 'only unbound bound options changed'); - } finally { - delete helpers['repeat']; - } + equal(view.$().text(), 'XXXXX X XX XXXX', 'only unbound bound options changed'); }); QUnit.test('should be able to render an unbound helper invocation with deprecated fooBinding [DEPRECATED]', function() { - try { - registerBoundHelper('repeat', function(value, options) { - var count = options.hash.count; - var a = []; - while (a.length < count) { - a.push(value); - } - return a.join(''); - }); + registry.register('helper:-repeat', helper(function([value], {count}) { + var a = []; + while (a.length < count) { + a.push(value); + } + return a.join(''); + })); - var template; - expectDeprecation(function() { - template = compile('{{unbound repeat foo countBinding="bar"}} {{repeat foo countBinding="bar"}} {{unbound repeat foo count=2}} {{repeat foo count=4}}'); - }, /You're using legacy binding syntax/); + var template; + expectDeprecation(function() { + template = compile('{{unbound -repeat foo countBinding="bar"}} {{-repeat foo countBinding="bar"}} {{unbound -repeat foo count=2}} {{-repeat foo count=4}}'); + }, /You're using legacy binding syntax/); - view = EmberView.create({ - template, - context: EmberObject.create({ - foo: 'X', - numRepeatsBinding: 'bar', - bar: 5 - }) - }); - runAppend(view); + view = EmberView.create({ + container, + template, + context: EmberObject.create({ + foo: 'X', + numRepeatsBinding: 'bar', + bar: 5 + }) + }); + runAppend(view); - equal(view.$().text(), 'XXXXX XXXXX XX XXXX', 'first render is correct'); + equal(view.$().text(), 'XXXXX XXXXX XX XXXX', 'first render is correct'); - run(function() { - set(view, 'context.bar', 1); - }); + run(function() { + set(view, 'context.bar', 1); + }); - equal(view.$().text(), 'XXXXX X XX XXXX', 'only unbound bound options changed'); - } finally { - delete helpers['repeat']; - } + equal(view.$().text(), 'XXXXX X XX XXXX', 'only unbound bound options changed'); }); QUnit.test('should be able to render an bound helper invocation mixed with static values', function() { view = EmberView.create({ - template: compile('{{unbound surround prefix value "bar"}} {{surround prefix value "bar"}} {{unbound surround "bar" value suffix}} {{surround "bar" value suffix}}'), - context: EmberObject.create({ - prefix: 'before', - value: 'core', - suffix: 'after' - }) - }); + container, + template: compile('{{unbound -surround prefix value "bar"}} {{-surround prefix value "bar"}} {{unbound -surround "bar" value suffix}} {{-surround "bar" value suffix}}'), + context: EmberObject.create({ + prefix: 'before', + value: 'core', + suffix: 'after' + }) + }); runAppend(view); equal(view.$().text(), 'before-core-bar before-core-bar bar-core-after bar-core-after', 'first render is correct'); @@ -363,7 +379,8 @@ QUnit.test('should be able to render an bound helper invocation mixed with stati QUnit.test('should be able to render unbound forms of multi-arg helpers', function() { view = EmberView.create({ - template: compile('{{fauxconcat foo bar bing}} {{unbound fauxconcat foo bar bing}}'), + container, + template: compile('{{-capitalizeName person}} {{unbound -capitalizeName person}} {{-concatNames person}} {{unbound -concatNames person}}'), context: EmberObject.create({ foo: 'a', bar: 'b', @@ -383,7 +400,7 @@ QUnit.test('should be able to render unbound forms of multi-arg helpers', functi QUnit.test('should be able to render an unbound helper invocation for helpers with dependent keys', function() { view = EmberView.create({ - template: compile('{{capitalizeName person}} {{unbound capitalizeName person}} {{concatNames person}} {{unbound concatNames person}}'), + template: compile('{{-capitalizeName person}} {{unbound -capitalizeName person}} {{-concatNames person}} {{unbound -concatNames person}}'), context: EmberObject.create({ person: EmberObject.create({ firstName: 'shooby', @@ -404,10 +421,11 @@ QUnit.test('should be able to render an unbound helper invocation for helpers wi QUnit.test('should be able to render an unbound helper invocation in #each helper', function() { view = EmberView.create({ + container, template: compile( ['{{#each people as |person|}}', - '{{capitalize person.firstName}} {{unbound capitalize person.firstName}}', - '{{/each}}'].join('')), + '{{-capitalize person.firstName}} {{unbound -capitalize person.firstName}}', + '{{/each}}'].join('')), context: { people: Ember.A([ { @@ -427,33 +445,29 @@ QUnit.test('should be able to render an unbound helper invocation in #each helpe }); QUnit.test('should be able to render an unbound helper invocation with bound hash options', function() { - try { - Ember.Handlebars.registerBoundHelper('repeat', function(value) { - return [].slice.call(arguments, 0, -1).join(''); - }); - + registry.register('helper:-repeat', helper(function([value]) { + return [].slice.call(arguments, 0, -1).join(''); + })); - view = EmberView.create({ - template: compile('{{capitalizeName person}} {{unbound capitalizeName person}} {{concatNames person}} {{unbound concatNames person}}'), - context: EmberObject.create({ - person: EmberObject.create({ - firstName: 'shooby', - lastName: 'taylor' - }) + view = EmberView.create({ + container, + template: compile('{{-capitalizeName person}} {{unbound -capitalizeName person}} {{-concatNames person}} {{unbound -concatNames person}}'), + context: EmberObject.create({ + person: EmberObject.create({ + firstName: 'shooby', + lastName: 'taylor' }) - }); - runAppend(view); + }) + }); + runAppend(view); - equal(view.$().text(), 'SHOOBY SHOOBY shoobytaylor shoobytaylor', 'first render is correct'); + equal(view.$().text(), 'SHOOBY SHOOBY shoobytaylor shoobytaylor', 'first render is correct'); - run(function() { - set(view, 'context.person.firstName', 'sally'); - }); + run(function() { + set(view, 'context.person.firstName', 'sally'); + }); - equal(view.$().text(), 'SALLY SHOOBY sallytaylor shoobytaylor', 'only bound values change'); - } finally { - delete Ember.Handlebars.registerBoundHelper['repeat']; - } + equal(view.$().text(), 'SALLY SHOOBY sallytaylor shoobytaylor', 'only bound values change'); }); QUnit.test('should be able to render bound form of a helper inside unbound form of same helper', function() { @@ -494,22 +508,19 @@ QUnit.module('ember-htmlbars: {{#unbound}} helper -- Container Lookup', { teardown() { runDestroy(view); runDestroy(container); - Ember.lookup = originalLookup; registry = container = view = null; + Ember.lookup = originalLookup; } }); QUnit.test('should lookup helpers in the container', function() { - expectDeprecationInHTMLBars(); - - expectDeprecation('Using Ember.Handlebars.makeBoundHelper is deprecated. Please refactor to using `Ember.Helper.helper`.'); - registry.register('helper:up-case', makeBoundHelper(function(value) { + registry.register('helper:up-case', helper(function([value]) { return value.toUpperCase(); })); view = EmberView.create({ template: compile('{{unbound up-case displayText}}'), - container: container, + container, context: { displayText: 'such awesome' } diff --git a/packages/ember-htmlbars/tests/integration/block_params_test.js b/packages/ember-htmlbars/tests/integration/block_params_test.js index 300a41dea32..8a3ce1197cd 100644 --- a/packages/ember-htmlbars/tests/integration/block_params_test.js +++ b/packages/ember-htmlbars/tests/integration/block_params_test.js @@ -4,20 +4,12 @@ import ComponentLookup from 'ember-views/component_lookup'; import View from 'ember-views/views/view'; import Component from 'ember-views/views/component'; import compile from 'ember-template-compiler/system/compile'; -import helpers from 'ember-htmlbars/helpers'; -import { registerHelper } from 'ember-htmlbars/helpers'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; var registry, container, view; -function aliasHelper(params, hash, options) { - this.yield(params); -} - QUnit.module('ember-htmlbars: block params', { setup() { - registerHelper('alias', aliasHelper); - registry = new Registry(); container = registry.container(); registry.optionsForType('component', { singleton: false }); @@ -27,11 +19,8 @@ QUnit.module('ember-htmlbars: block params', { }, teardown() { - delete helpers.alias; - - runDestroy(container); runDestroy(view); - + runDestroy(container); registry = container = view = null; } }); @@ -50,7 +39,7 @@ QUnit.test('should raise error if helper not available', function() { QUnit.test('basic block params usage', function() { view = View.create({ committer: { name: 'rwjblue' }, - template: compile('{{#alias view.committer.name as |name|}}name: {{name}}, length: {{name.length}}{{/alias}}') + template: compile('{{#with view.committer.name as |name|}}name: {{name}}, length: {{name.length}}{{/with}}') }); runAppend(view); @@ -71,21 +60,21 @@ QUnit.test('nested block params shadow correctly', function() { committer2: { name: 'machty' }, template: compile( '{{name}}' + - '{{#alias view.committer1.name as |name|}}' + + '{{#with view.committer1.name as |name|}}' + '[{{name}}' + - '{{#alias view.committer2.name as |name|}}' + + '{{#with view.committer2.name as |name|}}' + '[{{name}}]' + - '{{/alias}}' + + '{{/with}}' + '{{name}}]' + - '{{/alias}}' + + '{{/with}}' + '{{name}}' + - '{{#alias view.committer2.name as |name|}}' + + '{{#with view.committer2.name as |name|}}' + '[{{name}}' + - '{{#alias view.committer1.name as |name|}}' + + '{{#with view.committer1.name as |name|}}' + '[{{name}}]' + - '{{/alias}}' + + '{{/with}}' + '{{name}}]' + - '{{/alias}}' + + '{{/with}}' + '{{name}}' ) }); diff --git a/packages/ember-htmlbars/tests/integration/select_in_template_test.js b/packages/ember-htmlbars/tests/integration/select_in_template_test.js index 8e53048f1c0..b2edccb1488 100644 --- a/packages/ember-htmlbars/tests/integration/select_in_template_test.js +++ b/packages/ember-htmlbars/tests/integration/select_in_template_test.js @@ -338,7 +338,7 @@ QUnit.test('select element should correctly initialize and update selectedIndex collection: Ember.A([{ name: 'Wes', val: 'w' }, { name: 'Gordon', val: 'g' }]), selection: { name: 'Gordon', val: 'g' }, selectView: SelectView, - template: Ember.Handlebars.compile(templateString) + template: compile(templateString) }); run(function() { diff --git a/packages/ember-htmlbars/tests/integration/tagless_views_rerender_test.js b/packages/ember-htmlbars/tests/integration/tagless_views_rerender_test.js index fe4e15196d0..dbab320f3bb 100644 --- a/packages/ember-htmlbars/tests/integration/tagless_views_rerender_test.js +++ b/packages/ember-htmlbars/tests/integration/tagless_views_rerender_test.js @@ -1,11 +1,10 @@ import Ember from 'ember-metal/core'; import run from 'ember-metal/run_loop'; import EmberView from 'ember-views/views/view'; -import EmberHandlebars from 'ember-htmlbars/compat'; +import { compile } from 'ember-template-compiler'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; var view; -var compile = EmberHandlebars.compile; QUnit.module('ember-htmlbars: tagless views should be able to add/remove child views', { teardown() { diff --git a/packages/ember-htmlbars/tests/system/lookup-helper_test.js b/packages/ember-htmlbars/tests/system/lookup-helper_test.js index b1b938c4bbb..b432ac5ad0a 100644 --- a/packages/ember-htmlbars/tests/system/lookup-helper_test.js +++ b/packages/ember-htmlbars/tests/system/lookup-helper_test.js @@ -2,7 +2,6 @@ import lookupHelper, { findHelper } from 'ember-htmlbars/system/lookup-helper'; import ComponentLookup from 'ember-views/component_lookup'; import Registry from 'container/registry'; import Helper, { helper as makeHelper } from 'ember-htmlbars/helper'; -import HandlebarsCompatibleHelper from 'ember-htmlbars/compat/helper'; function generateEnv(helpers, container) { return { @@ -113,7 +112,7 @@ QUnit.test('looks up a shorthand helper in the container', function() { }); QUnit.test('fails with a useful error when resolving a function', function() { - expect(2); + expect(1); var container = generateContainer(); var env = generateEnv(null, container); var view = { @@ -124,8 +123,7 @@ QUnit.test('fails with a useful error when resolving a function', function() { view.container.registry.register('helper:some-name', someName); var actual; - expectDeprecation(function() { + expectAssertion(function() { actual = lookupHelper('some-name', view, env); - }, /helper "some-name" is a deprecated bare function helper/); - ok(actual instanceof HandlebarsCompatibleHelper, 'function looks up as compat helper'); + }, 'Expected to find an Ember.Helper with the name helper:some-name, but found an object of type function instead.'); }); diff --git a/packages/ember-htmlbars/tests/system/make_bound_helper_test.js b/packages/ember-htmlbars/tests/system/make_bound_helper_test.js deleted file mode 100644 index 2cbe0eac242..00000000000 --- a/packages/ember-htmlbars/tests/system/make_bound_helper_test.js +++ /dev/null @@ -1,235 +0,0 @@ -import EmberView from 'ember-views/views/view'; -import run from 'ember-metal/run_loop'; -import Registry from 'container/registry'; -import makeBoundHelper from 'ember-htmlbars/system/make_bound_helper'; -import compile from 'ember-template-compiler/system/compile'; -import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; -import { dasherize } from 'ember-runtime/system/string'; - -var view, registry, container; - -function registerRepeatHelper() { - registry.register('helper:x-repeat', makeBoundHelper(function(params, hash, options, env) { - var times = hash.times || 1; - return new Array(times + 1).join(params[0]); - })); -} - -QUnit.module('ember-htmlbars: makeBoundHelper', { - setup() { - expectDeprecation('Using `Ember.HTMLBars.makeBoundHelper` is deprecated. Please refactor to using `Ember.Helper` or `Ember.Helper.helper`.'); - registry = new Registry(); - container = registry.container(); - }, - - teardown() { - runDestroy(view); - runDestroy(container); - registry = container = view = null; - } -}); - -QUnit.test('should update bound helpers in a subexpression when properties change', function() { - registry.register('helper:x-dasherize', makeBoundHelper(function(params, hash, options, env) { - return dasherize(params[0]); - })); - - registry.register('helper:x-reverse', makeBoundHelper(function(params, hash, options, env) { - return params[0].split('').reverse().join(''); - })); - - ignoreDeprecation(function() { - view = EmberView.create({ - container: container, - controller: { prop: 'isThing' }, - template: compile('
{{prop}}
') - }); - }); - - runAppend(view); - - equal(view.$('div[data-foo="gniht-si"]').text(), 'isThing', 'helper output is correct'); - - run(view, 'set', 'controller.prop', 'notThing'); - - equal(view.$('div[data-foo="gniht-ton"]').text(), 'notThing', 'helper output is correct'); -}); - -QUnit.test('should update bound helpers when properties change', function() { - registry.register('helper:x-capitalize', makeBoundHelper(function(params, hash, options, env) { - return params[0].toUpperCase(); - })); - - view = EmberView.create({ - container: container, - controller: { name: 'Brogrammer' }, - template: compile('{{x-capitalize name}}') - }); - - runAppend(view); - - equal(view.$().text(), 'BROGRAMMER', 'helper output is correct'); - - run(view, 'set', 'controller.name', 'wes'); - - equal(view.$().text(), 'WES', 'helper output updated'); -}); - -QUnit.test('should update bound helpers when hash properties change', function() { - registerRepeatHelper(); - - view = EmberView.create({ - container: container, - controller: { - phrase: 'Yo', - repeatCount: 1 - }, - template: compile('{{x-repeat phrase times=repeatCount}}') - }); - - runAppend(view); - - equal(view.$().text(), 'Yo', 'initial helper output is correct'); - - run(view, 'set', 'controller.repeatCount', 5); - - equal(view.$().text(), 'YoYoYoYoYo', 'helper output updated'); -}); - -QUnit.test('bound helpers should support keywords', function() { - registry.register('helper:x-capitalize', makeBoundHelper(function(params, hash, options, env) { - return params[0].toUpperCase(); - })); - - view = EmberView.create({ - container: container, - text: 'ab', - template: compile('{{x-capitalize view.text}}') - }); - - runAppend(view); - - equal(view.$().text(), 'AB', 'helper output is correct'); -}); - -QUnit.test('bound helpers should process `fooBinding` style hash properties [DEPRECATED]', function() { - registry.register('helper:x-repeat', makeBoundHelper(function(params, hash, options, env) { - equal(hash.times, 3); - })); - - var template; - - expectDeprecation(function() { - template = compile('{{x-repeat text timesBinding="numRepeats"}}'); - }, /You're using legacy binding syntax: timesBinding="numRepeats"/); - - view = EmberView.create({ - container: container, - controller: { - text: 'ab', - numRepeats: 3 - }, - template - }); - - runAppend(view); -}); - -QUnit.test('bound helpers should support multiple bound properties', function() { - registry.register('helper:x-combine', makeBoundHelper(function(params, hash, options, env) { - return params.join(''); - })); - - view = EmberView.create({ - container: container, - controller: { - thing1: 'ZOID', - thing2: 'BERG' - }, - template: compile('{{x-combine thing1 thing2}}') - }); - - runAppend(view); - - equal(view.$().text(), 'ZOIDBERG', 'helper output is correct'); - - run(view, 'set', 'controller.thing2', 'NERD'); - - equal(view.$().text(), 'ZOIDNERD', 'helper correctly re-rendered after second bound helper property changed'); - - run(function() { - view.set('controller.thing1', 'WOOT'); - view.set('controller.thing2', 'YEAH'); - }); - - equal(view.$().text(), 'WOOTYEAH', 'helper correctly re-rendered after both bound helper properties changed'); -}); - -QUnit.test('bound helpers can be invoked with zero args', function() { - registry.register('helper:x-troll', makeBoundHelper(function(params, hash) { - return hash.text || 'TROLOLOL'; - })); - - view = EmberView.create({ - container: container, - controller: { - trollText: 'yumad' - }, - template: compile('{{x-troll}} and {{x-troll text="bork"}}') - }); - - runAppend(view); - - equal(view.$().text(), 'TROLOLOL and bork', 'helper output is correct'); -}); - -QUnit.test('bound helpers should not be invoked with blocks', function() { - registerRepeatHelper(); - view = EmberView.create({ - container: container, - controller: {}, - template: compile('{{#x-repeat}}Sorry, Charlie{{/x-repeat}}') - }); - - expectAssertion(function() { - runAppend(view); - }, /Helpers may not be used in the block form/); -}); - -QUnit.test('shouldn\'t treat raw numbers as bound paths', function() { - registry.register('helper:x-sum', makeBoundHelper(function(params) { - return params[0] + params[1]; - })); - - view = EmberView.create({ - container: container, - controller: { aNumber: 1 }, - template: compile('{{x-sum aNumber 1}} {{x-sum 0 aNumber}} {{x-sum 5 6}}') - }); - - runAppend(view); - - equal(view.$().text(), '2 1 11', 'helper output is correct'); - - run(view, 'set', 'controller.aNumber', 5); - - equal(view.$().text(), '6 5 11', 'helper still updates as expected'); -}); - -QUnit.test('should have correct argument types', function() { - registry.register('helper:get-type', makeBoundHelper(function(params) { - var value = params[0]; - - return value === null ? 'null' : typeof value; - })); - - view = EmberView.create({ - container: container, - controller: {}, - template: compile('{{get-type null}}, {{get-type undefProp}}, {{get-type "string"}}, {{get-type 1}}, {{get-type this}}') - }); - - runAppend(view); - - equal(view.$().text(), 'null, undefined, string, number, object', 'helper output is correct'); -}); diff --git a/packages/ember-htmlbars/tests/system/make_view_helper_test.js b/packages/ember-htmlbars/tests/system/make_view_helper_test.js deleted file mode 100644 index 05109e891de..00000000000 --- a/packages/ember-htmlbars/tests/system/make_view_helper_test.js +++ /dev/null @@ -1,68 +0,0 @@ -import makeViewHelper from 'ember-htmlbars/system/make-view-helper'; -import EmberView from 'ember-views/views/view'; -import { compile } from 'ember-template-compiler'; -import Registry from 'container/registry'; -import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; - -import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; -import viewKeyword from 'ember-htmlbars/keywords/view'; - -var registry, container, view, originalViewKeyword; - -QUnit.module('ember-htmlbars: makeViewHelper', { - setup() { - originalViewKeyword = registerKeyword('view', viewKeyword); - registry = new Registry(); - container = registry.container(); - }, - teardown() { - runDestroy(view); - resetKeyword('view', originalViewKeyword); - } -}); - -QUnit.test('makes helpful assertion when called with invalid arguments', function() { - var SomeRandom = EmberView.extend({ - template: compile('Some Random Class') - }); - - SomeRandom.toString = function() { - return 'Some Random Class'; - }; - - var helper; - expectDeprecation(function() { - helper = makeViewHelper(SomeRandom); - }, '`Ember.Handlebars.makeViewHelper` and `Ember.HTMLBars.makeViewHelper` are deprecated. Please refactor to normal component usage.'); - registry.register('helper:some-random', helper); - - view = EmberView.create({ - template: compile('{{some-random \'sending-params-to-view-is-invalid\'}}'), - container - }); - - expectAssertion(function() { - runAppend(view); - }, 'You can only pass attributes (such as name=value) not bare values to a helper for a View found in \'Some Random Class\''); -}); - -QUnit.test('can properly yield', function() { - var SomeRandom = EmberView.extend({ - layout: compile('Some Random Class - {{yield}}') - }); - - var helper; - expectDeprecation(function() { - helper = makeViewHelper(SomeRandom); - }, '`Ember.Handlebars.makeViewHelper` and `Ember.HTMLBars.makeViewHelper` are deprecated. Please refactor to normal component usage.'); - registry.register('helper:some-random', helper); - - view = EmberView.create({ - template: compile('{{#some-random}}Template{{/some-random}}'), - container - }); - - runAppend(view); - - equal(view.$().text(), 'Some Random Class - Template'); -}); diff --git a/packages/ember/tests/component_registration_test.js b/packages/ember/tests/component_registration_test.js index 96e16b8a225..7aa6b87855e 100644 --- a/packages/ember/tests/component_registration_test.js +++ b/packages/ember/tests/component_registration_test.js @@ -24,11 +24,11 @@ function cleanup() { App = null; Ember.TEMPLATES = {}; - cleanupHandlebarsHelpers(); + cleanupHelpers(); }); } -function cleanupHandlebarsHelpers() { +function cleanupHelpers() { var currentHelpers = Ember.A(keys(helpers)); currentHelpers.forEach(function(name) { diff --git a/packages/ember/tests/controller_test.js b/packages/ember/tests/controller_test.js index a7951bd53c0..110dca92257 100644 --- a/packages/ember/tests/controller_test.js +++ b/packages/ember/tests/controller_test.js @@ -1,6 +1,6 @@ import 'ember'; import Ember from 'ember-metal/core'; -import EmberHandlebars from 'ember-htmlbars/compat'; +import { compile } from 'ember-template-compiler'; import EmberView from 'ember-views/views/view'; import plugins, { registerPlugin } from 'ember-template-compiler/plugins'; @@ -14,7 +14,6 @@ import TransformEachIntoCollection from 'ember-template-compiler/plugins/transfo from the runtime up to the templating layer. */ -var compile = EmberHandlebars.compile; var App, $fixture, templates; let originalAstPlugins; diff --git a/packages/ember/tests/helpers/helper_registration_test.js b/packages/ember/tests/helpers/helper_registration_test.js index bdc34cdb990..df9d0027347 100644 --- a/packages/ember/tests/helpers/helper_registration_test.js +++ b/packages/ember/tests/helpers/helper_registration_test.js @@ -1,16 +1,12 @@ import 'ember'; import Ember from 'ember-metal/core'; import isEnabled from 'ember-metal/features'; -import EmberHandlebars from 'ember-htmlbars/compat'; -import HandlebarsCompatibleHelper from 'ember-htmlbars/compat/helper'; +import helpers from 'ember-htmlbars/helpers'; +import { compile } from 'ember-template-compiler'; import Helper, { helper } from 'ember-htmlbars/helper'; import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; -import helpers from 'ember-htmlbars/helpers'; -var compile; -compile = EmberHandlebars.compile; -var makeViewHelper = EmberHandlebars.makeViewHelper; var App, registry, container, originalViewKeyword; @@ -61,12 +57,12 @@ var boot = function(callback) { QUnit.test('Unbound dashed helpers registered on the container can be late-invoked', function() { Ember.TEMPLATES.application = compile('
{{x-borf}} {{x-borf \'YES\'}}
'); - let helper = new HandlebarsCompatibleHelper(function(val) { - return arguments.length > 1 ? val : 'BORF'; + let myHelper = helper(function(params) { + return params.length > 1 ? params[0] : 'BORF'; }); boot(() => { - registry.register('helper:x-borf', helper); + registry.register('helper:x-borf', myHelper); }); equal(Ember.$('#wrapper').text(), 'BORF YES', 'The helper was invoked from the container'); @@ -90,38 +86,18 @@ QUnit.test('Bound helpers registered on the container can be late-invoked', func ok(!helpers['x-reverse'], 'Container-registered helper doesn\'t wind up on global helpers hash'); }); -QUnit.test('Bound `makeViewHelper` helpers registered on the container can be used', function() { - Ember.TEMPLATES.application = compile('
{{x-foo}} {{x-foo name=foo}}
'); - - boot(function() { - registry.register('controller:application', Ember.Controller.extend({ - foo: 'alex' - })); - - expectDeprecation(function() { - registry.register('helper:x-foo', makeViewHelper(Ember.Component.extend({ - layout: compile('woot!!{{attrs.name}}') - }))); - }, '`Ember.Handlebars.makeViewHelper` and `Ember.HTMLBars.makeViewHelper` are deprecated. Please refactor to normal component usage.'); - }); - - equal(Ember.$('#wrapper').text(), 'woot!! woot!!alex', 'The helper was invoked from the container'); -}); - if (isEnabled('ember-htmlbars-dashless-helpers')) { QUnit.test('Undashed helpers registered on the container can be invoked', function() { Ember.TEMPLATES.application = compile('
{{omg}}|{{yorp \'boo\'}}|{{yorp \'ya\'}}
'); - expectDeprecation(function() { - boot(function() { - registry.register('helper:omg', function([value]) { - return 'OMG'; - }); + boot(function() { + registry.register('helper:omg', helper(function() { + return 'OMG'; + })); - registry.register('helper:yorp', helper(function([ value ]) { - return value; - })); - }, /Please use Ember.Helper.build to wrap helper functions./); + registry.register('helper:yorp', helper(function([ value ]) { + return value; + })); }); equal(Ember.$('#wrapper').text(), 'OMG|boo|ya', 'The helper was invoked from the container'); diff --git a/packages/ember/tests/helpers/link_to_test.js b/packages/ember/tests/helpers/link_to_test.js index a33ba0d6d8f..48d902b6c83 100644 --- a/packages/ember/tests/helpers/link_to_test.js +++ b/packages/ember/tests/helpers/link_to_test.js @@ -3,11 +3,9 @@ import Ember from 'ember-metal/core'; import ComponentLookup from 'ember-views/component_lookup'; import isEnabled from 'ember-metal/features'; -import EmberHandlebars from 'ember-htmlbars/compat'; +import { compile } from 'ember-template-compiler'; import EmberView from 'ember-views/views/view'; -var compile = EmberHandlebars.compile; - var Router, App, AppView, router, registry, container; var set = Ember.set; diff --git a/packages/ember/tests/helpers/link_to_test/link_to_transitioning_classes_test.js b/packages/ember/tests/helpers/link_to_test/link_to_transitioning_classes_test.js index c3db7c38c00..c4e4367d15f 100644 --- a/packages/ember/tests/helpers/link_to_test/link_to_transitioning_classes_test.js +++ b/packages/ember/tests/helpers/link_to_test/link_to_transitioning_classes_test.js @@ -1,10 +1,7 @@ import 'ember'; import Ember from 'ember-metal/core'; import isEnabled from 'ember-metal/features'; - -import EmberHandlebars from 'ember-htmlbars/compat'; - -var compile = EmberHandlebars.compile; +import { compile } from 'ember-template-compiler'; var Router, App, router, registry, container; var set = Ember.set; diff --git a/packages/ember/tests/helpers/link_to_test/link_to_with_query_params_test.js b/packages/ember/tests/helpers/link_to_test/link_to_with_query_params_test.js index 91a10ae60d6..74a40cb73da 100644 --- a/packages/ember/tests/helpers/link_to_test/link_to_with_query_params_test.js +++ b/packages/ember/tests/helpers/link_to_test/link_to_with_query_params_test.js @@ -1,10 +1,7 @@ import 'ember'; import Ember from 'ember-metal/core'; import isEnabled from 'ember-metal/features'; - -import EmberHandlebars from 'ember-htmlbars/compat'; - -var compile = EmberHandlebars.compile; +import { compile } from 'ember-template-compiler'; var Router, App, router, registry, container; var set = Ember.set; diff --git a/packages/ember/tests/homepage_example_test.js b/packages/ember/tests/homepage_example_test.js index 953ce2e4f5b..5bc45860bf3 100644 --- a/packages/ember/tests/homepage_example_test.js +++ b/packages/ember/tests/homepage_example_test.js @@ -1,8 +1,6 @@ import 'ember'; import Ember from 'ember-metal/core'; -import EmberHandlebars from 'ember-htmlbars/compat'; - -var compile = EmberHandlebars.compile; +import { compile } from 'ember-template-compiler'; var App, $fixture; diff --git a/packages/ember/tests/routing/basic_test.js b/packages/ember/tests/routing/basic_test.js index 260435f8989..12866efced7 100644 --- a/packages/ember/tests/routing/basic_test.js +++ b/packages/ember/tests/routing/basic_test.js @@ -5,9 +5,8 @@ import { get } from 'ember-metal/property_get'; import { set } from 'ember-metal/property_set'; import ActionManager from 'ember-views/system/action_manager'; import EmberView from 'ember-views/views/view'; -import EmberHandlebars from 'ember-htmlbars/compat'; +import { compile } from 'ember-template-compiler'; -var compile = EmberHandlebars.compile; var trim = Ember.$.trim; var Router, App, router, registry, container, originalLoggerError; diff --git a/packages/ember/tests/routing/query_params_test.js b/packages/ember/tests/routing/query_params_test.js index 02508274021..58ca4419f02 100644 --- a/packages/ember/tests/routing/query_params_test.js +++ b/packages/ember/tests/routing/query_params_test.js @@ -2,10 +2,7 @@ import 'ember'; import Ember from 'ember-metal/core'; import isEnabled from 'ember-metal/features'; import { computed } from 'ember-metal/computed'; - -import EmberHandlebars from 'ember-htmlbars/compat'; - -var compile = EmberHandlebars.compile; +import { compile } from 'ember-template-compiler'; var Router, App, router, container; var get = Ember.get; diff --git a/packages/ember/tests/routing/query_params_test/model_dependent_state_with_query_params_test.js b/packages/ember/tests/routing/query_params_test/model_dependent_state_with_query_params_test.js index 10dccddbb4a..30552f6ba35 100644 --- a/packages/ember/tests/routing/query_params_test/model_dependent_state_with_query_params_test.js +++ b/packages/ember/tests/routing/query_params_test/model_dependent_state_with_query_params_test.js @@ -1,10 +1,7 @@ import 'ember'; import Ember from 'ember-metal/core'; import isEnabled from 'ember-metal/features'; - -import EmberHandlebars from 'ember-htmlbars/compat'; - -var compile = EmberHandlebars.compile; +import { compile } from 'ember-template-compiler'; var Router, App, router, registry, container; diff --git a/packages/ember/tests/routing/query_params_test/overlapping_query_params_test.js b/packages/ember/tests/routing/query_params_test/overlapping_query_params_test.js index be4c9bde1d2..ba7b3a6af51 100644 --- a/packages/ember/tests/routing/query_params_test/overlapping_query_params_test.js +++ b/packages/ember/tests/routing/query_params_test/overlapping_query_params_test.js @@ -1,10 +1,7 @@ import 'ember'; import Ember from 'ember-metal/core'; import isEnabled from 'ember-metal/features'; - -import EmberHandlebars from 'ember-htmlbars/compat'; - -var compile = EmberHandlebars.compile; +import { compile } from 'ember-template-compiler'; var Router, App, router, registry, container; diff --git a/packages/ember/tests/routing/query_params_test/query_params_paramless_link_to_test.js b/packages/ember/tests/routing/query_params_test/query_params_paramless_link_to_test.js index 27b7c5c7852..c9b4e0f724c 100644 --- a/packages/ember/tests/routing/query_params_test/query_params_paramless_link_to_test.js +++ b/packages/ember/tests/routing/query_params_test/query_params_paramless_link_to_test.js @@ -2,10 +2,7 @@ import 'ember'; import Ember from 'ember-metal/core'; import isEnabled from 'ember-metal/features'; import { capitalize } from 'ember-runtime/system/string'; - -import EmberHandlebars from 'ember-htmlbars/compat'; - -var compile = EmberHandlebars.compile; +import { compile } from 'ember-template-compiler'; var App, Router, container, router, registry; var expectedReplaceURL, expectedPushURL; diff --git a/packages/ember/tests/routing/substates_test.js b/packages/ember/tests/routing/substates_test.js index b3c508926dd..77976ba5ec8 100644 --- a/packages/ember/tests/routing/substates_test.js +++ b/packages/ember/tests/routing/substates_test.js @@ -1,12 +1,9 @@ import 'ember'; import Ember from 'ember-metal/core'; import isEnabled from 'ember-metal/features'; - -import EmberHandlebars from 'ember-htmlbars/compat'; +import { compile } from 'ember-template-compiler'; import EmberView from 'ember-views/views/view'; -var compile = EmberHandlebars.compile; - var Router, App, templates, router, container, counter; function step(expectedValue, description) { diff --git a/packages/ember/tests/routing/toplevel_dom_test.js b/packages/ember/tests/routing/toplevel_dom_test.js index c1dba67785a..6ae99281c89 100644 --- a/packages/ember/tests/routing/toplevel_dom_test.js +++ b/packages/ember/tests/routing/toplevel_dom_test.js @@ -1,10 +1,8 @@ import 'ember'; import Ember from 'ember-metal/core'; -import EmberHandlebars from 'ember-htmlbars/compat'; +import { compile } from 'ember-template-compiler'; import EmberView from 'ember-views/views/view'; -var compile = EmberHandlebars.compile; - var Router, App, templates, router, container; function bootApplication() { diff --git a/packages/ember/tests/view_instrumentation_test.js b/packages/ember/tests/view_instrumentation_test.js index f0b1daeac35..01405705039 100644 --- a/packages/ember/tests/view_instrumentation_test.js +++ b/packages/ember/tests/view_instrumentation_test.js @@ -1,10 +1,8 @@ import Ember from 'ember-metal/core'; -import EmberHandlebars from 'ember-htmlbars/compat'; import run from 'ember-metal/run_loop'; import $ from 'ember-views/system/jquery'; import { subscribe, unsubscribe } from 'ember-metal/instrumentation'; - -var compile = EmberHandlebars.compile; +import { compile } from 'ember-template-compiler'; var App, $fixture; From 4d10f6cf490f2ed434e558df0232ec52d714de71 Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Wed, 5 Aug 2015 15:36:42 -0400 Subject: [PATCH 3/3] [CLEANUP beta] Drop _registerHelper, fix unbound tests and usage --- packages/ember-htmlbars/lib/helpers.js | 6 -- packages/ember-htmlbars/lib/keywords/get.js | 2 +- .../ember-htmlbars/lib/keywords/unbound.js | 36 +++---- packages/ember-htmlbars/lib/main.js | 4 +- .../tests/helpers/if_unless_test.js | 16 ++-- .../tests/helpers/unbound_test.js | 96 ++++++++----------- .../tests/views/view/view_lifecycle_test.js | 2 +- .../tests/helpers/helper_registration_test.js | 10 +- 8 files changed, 71 insertions(+), 101 deletions(-) diff --git a/packages/ember-htmlbars/lib/helpers.js b/packages/ember-htmlbars/lib/helpers.js index b89ed29a085..73680bc2324 100644 --- a/packages/ember-htmlbars/lib/helpers.js +++ b/packages/ember-htmlbars/lib/helpers.js @@ -7,7 +7,6 @@ @private @property helpers */ -import Ember from 'ember-metal/core'; import EmptyObject from 'ember-metal/empty_object'; var helpers = new EmptyObject(); @@ -28,9 +27,4 @@ export function registerHelper(name, helperFunc) { helpers[name] = helperFunc; } -export let deprecatedRegisterHelper = Ember.deprecateFunc( - 'Using Ember.HTMLBars._registerHelper is deprecated. Helpers (even dashless ones) are automatically resolved.', - { id: 'ember-htmlbars.register-helper', until: '2.0.0' }, - registerHelper); - export default helpers; diff --git a/packages/ember-htmlbars/lib/keywords/get.js b/packages/ember-htmlbars/lib/keywords/get.js index 918be76b48d..b36423b0fe6 100644 --- a/packages/ember-htmlbars/lib/keywords/get.js +++ b/packages/ember-htmlbars/lib/keywords/get.js @@ -31,7 +31,7 @@ if (isEnabled('ember-htmlbars-get-helper')) { }; var getKeyword = function getKeyword(morph, env, scope, params, hash, template, inverse, visitor) { - if (!morph) { + if (morph === null) { return buildStream(params); } else { let stream; diff --git a/packages/ember-htmlbars/lib/keywords/unbound.js b/packages/ember-htmlbars/lib/keywords/unbound.js index b7a6c880ecf..dc7b454fa2e 100644 --- a/packages/ember-htmlbars/lib/keywords/unbound.js +++ b/packages/ember-htmlbars/lib/keywords/unbound.js @@ -1,32 +1,32 @@ +import Ember from 'ember-metal/core'; // assert + /** @module ember @submodule ember-htmlbars */ -export default function unbound(morph, env, scope, originalParams, hash, template, inverse) { - // Since we already got the params as a set of streams, we need to extract the key from - // the first param instead of (incorrectly) trying to read from it. If this was a call - // to `{{unbound foo.bar}}`, then we pass along the original stream to `hooks.range`. - var params = originalParams.slice(); - var valueStream = params.shift(); +export default function unbound(morph, env, scope, params, hash, template, inverse, visitor) { + Ember.assert( + 'unbound helper cannot be called with multiple params or hash params', + params.length === 1 && Object.keys(hash).length === 0 + ); + Ember.assert( + 'unbound helper cannot be called as a block', + !template + ); - // If `morph` is `null` the keyword is being invoked as a subexpression. if (morph === null) { - if (originalParams.length > 1) { - valueStream = env.hooks.subexpr(env, scope, valueStream.key, params, hash); - } - - return new VolatileStream(valueStream); + return new VolatileStream(params[0]); } - if (params.length === 0) { - env.hooks.range(morph, env, scope, null, valueStream); - } else if (template === null) { - env.hooks.inline(morph, env, scope, valueStream.key, params, hash); + let stream; + if (morph.linkedResult) { + stream = morph.linkedResult; } else { - env.hooks.block(morph, env, scope, valueStream.key, params, hash, template, inverse); + stream = new VolatileStream(params[0]); + morph.linkedResult = stream; } - + env.hooks.range(morph, env, scope, null, stream, visitor); return true; } diff --git a/packages/ember-htmlbars/lib/main.js b/packages/ember-htmlbars/lib/main.js index 3984c331482..4a8ec4cfb58 100644 --- a/packages/ember-htmlbars/lib/main.js +++ b/packages/ember-htmlbars/lib/main.js @@ -35,8 +35,7 @@ import { import makeBoundHelper from 'ember-htmlbars/system/make_bound_helper'; import { - registerHelper, - deprecatedRegisterHelper + registerHelper } from 'ember-htmlbars/helpers'; import { ifHelper, @@ -84,7 +83,6 @@ if (Ember.ENV._ENABLE_LEGACY_VIEW_SUPPORT) { } Ember.HTMLBars = { - _registerHelper: deprecatedRegisterHelper, template: template, compile: compile, precompile: precompile, diff --git a/packages/ember-htmlbars/tests/helpers/if_unless_test.js b/packages/ember-htmlbars/tests/helpers/if_unless_test.js index 26126c31b6c..cc78fdc3216 100644 --- a/packages/ember-htmlbars/tests/helpers/if_unless_test.js +++ b/packages/ember-htmlbars/tests/helpers/if_unless_test.js @@ -60,7 +60,7 @@ QUnit.test('The `if` helper tests for `isTruthy` if available', function() { QUnit.test('The `if` helper does not error on undefined', function() { view = EmberView.create({ undefinedValue: undefined, - template: compile('{{#if view.undefinedValue}}Yep{{/if}}{{#unbound if view.undefinedValue}}Yep{{/unbound}}') + template: compile('{{#if view.undefinedValue}}Yep{{/if}}{{#if (unbound view.undefinedValue)}}Yep{{/if}}') }); runAppend(view); @@ -71,7 +71,7 @@ QUnit.test('The `if` helper does not error on undefined', function() { QUnit.test('The `unless` helper does not error on undefined', function() { view = EmberView.create({ undefinedValue: undefined, - template: compile('{{#unless view.undefinedValue}}YepBound{{/unless}}{{#unbound unless view.undefinedValue}}YepUnbound{{/unbound}}') + template: compile('{{#unless view.undefinedValue}}YepBound{{/unless}}{{#unless (unbound view.undefinedValue)}}YepUnbound{{/unless}}') }); runAppend(view); @@ -185,10 +185,10 @@ QUnit.test('The `if` helper updates when the value changes', function() { equal(view.$().text(), ''); }); -QUnit.test('The `unbound if` helper does not update when the value changes', function() { +QUnit.test('The `if (unbound` helper does not update when the value changes', function() { view = EmberView.create({ conditional: true, - template: compile('{{#unbound if view.conditional}}Yep{{/unbound}}') + template: compile('{{#if (unbound view.conditional)}}Yep{{/if}}') }); runAppend(view); equal(view.$().text(), 'Yep'); @@ -211,10 +211,10 @@ QUnit.test('The `unless` helper updates when the value changes', function() { equal(view.$().text(), ''); }); -QUnit.test('The `unbound if` helper does not update when the value changes', function() { +QUnit.test('The `if (unbound` helper does not update when the value changes', function() { view = EmberView.create({ conditional: false, - template: compile('{{#unbound unless view.conditional}}Nope{{/unbound}}') + template: compile('{{#unless (unbound view.conditional)}}Nope{{/unless}}') }); runAppend(view); equal(view.$().text(), 'Nope'); @@ -224,10 +224,10 @@ QUnit.test('The `unbound if` helper does not update when the value changes', fun equal(view.$().text(), 'Nope'); }); -QUnit.test('The `unbound if` helper should work when its inverse is not present', function() { +QUnit.test('The `if (unbound` helper should work when its inverse is not present', function() { view = EmberView.create({ conditional: false, - template: compile('{{#unbound if view.conditional}}Yep{{/unbound}}') + template: compile('{{#if (unbound view.conditional)}}Yep{{/if}}') }); runAppend(view); equal(view.$().text(), ''); diff --git a/packages/ember-htmlbars/tests/helpers/unbound_test.js b/packages/ember-htmlbars/tests/helpers/unbound_test.js index fd3e223317e..066e38b4e31 100644 --- a/packages/ember-htmlbars/tests/helpers/unbound_test.js +++ b/packages/ember-htmlbars/tests/helpers/unbound_test.js @@ -1,5 +1,6 @@ /*jshint newcap:false*/ import EmberView from 'ember-views/views/view'; +import EmberComponent from 'ember-views/views/component'; import EmberObject from 'ember-runtime/system/object'; import { A } from 'ember-runtime/system/native_array'; @@ -53,7 +54,7 @@ QUnit.test('it should not re-render if the property changes', function() { equal(view.$().text(), 'BORK BORK', 'should not re-render if the property changes'); }); -QUnit.test('it should re-render if the parent view rerenders', function() { +QUnit.test('it should not re-render if the parent view rerenders', function() { run(function() { view.set('context.foo', 'OOF'); view.rerender(); @@ -61,7 +62,7 @@ QUnit.test('it should re-render if the parent view rerenders', function() { equal(view.$().text(), 'OOF OOF', 'should re-render if the parent view rerenders'); }); -QUnit.test('it should throw the helper missing error if multiple properties are provided', function() { +QUnit.test('it should assert unbound cannot be called with multiple arguments', function() { expectAssertion(function() { runAppend(EmberView.create({ template: compile('{{unbound foo bar}}'), @@ -70,7 +71,7 @@ QUnit.test('it should throw the helper missing error if multiple properties are bar: 'foo' }) })); - }, /A helper named 'foo' could not be found/); + }, /unbound helper cannot be called with multiple params or hash params/); }); QUnit.test('should property escape unsafe hrefs', function() { @@ -103,6 +104,24 @@ QUnit.test('should property escape unsafe hrefs', function() { } }); +QUnit.test('should render on attributes', function(assert) { + /* jshint scripturl:true */ + + runDestroy(view); + + view = EmberComponent.create({ + layout: compile(''), + name: 'bob' + }); + + runAppend(view); + + run(function() { + view.set('name', 'rick'); + }); + assert.equal(view.$().html(), ''); +}); + QUnit.module('ember-htmlbars: {{#unbound}} helper with container present', { setup() { Ember.lookup = lookup = { Ember: Ember }; @@ -171,12 +190,12 @@ QUnit.test('it should not re-render if the property changes', function() { equal(view.$().text(), 'BORK', 'should not re-render if the property changes'); }); -QUnit.test('it should re-render if the parent view rerenders', function() { +QUnit.test('it should not re-render if the parent view rerenders', function() { run(function() { view.set('context.foo', 'oof'); view.rerender(); }); - equal(view.$().text(), 'OOF', 'should re-render if the parent view rerenders'); + equal(view.$().text(), 'BORK', 'should not re-render if the parent view rerenders'); }); QUnit.module('ember-htmlbars: {{#unbound}} subexpression - helper form', { @@ -195,7 +214,7 @@ QUnit.module('ember-htmlbars: {{#unbound}} subexpression - helper form', { view = EmberView.create({ container, - template: compile('{{-capitalize (unbound -doublize foo)}}'), + template: compile('{{-capitalize (unbound (-doublize foo))}}'), context: EmberObject.create({ foo: 'bork' }) @@ -228,7 +247,7 @@ QUnit.test('it should re-render if the parent view rerenders', function() { view.set('context.foo', 'oof'); view.rerender(); }); - equal(view.$().text(), 'OOF OOF', 'should re-render if the parent view rerenders'); + equal(view.$().text(), 'BORK BORK', 'should not re-render if the parent view rerenders'); }); QUnit.module('ember-htmlbars: {{#unbound boundHelper arg1 arg2... argN}} form: render unbound helper invocations', { @@ -256,12 +275,12 @@ QUnit.module('ember-htmlbars: {{#unbound boundHelper arg1 arg2... argN}} form: r } this.set('value', value); this.addObserver('value.firstName', this, this.recompute); - return get(value, 'firstName').toUpperCase(); + return (value ? get(value, 'firstName').toUpperCase() : ''); } })); registry.register('helper:-fauxconcat', helper(function(params) { - return params.slice(0, -1).join(''); + return params.join(''); })); registry.register('helper:-concatNames', Helper.extend({ @@ -280,7 +299,7 @@ QUnit.module('ember-htmlbars: {{#unbound boundHelper arg1 arg2... argN}} form: r this.set('value', value); this.addObserver('value.firstName', this, this.recompute); this.addObserver('value.lastName', this, this.recompute); - return get(value, 'firstName') + get(value, 'lastName'); + return (value ? get(value, 'firstName') : '') + (value ? get(value, 'lastName') : ''); } })); }, @@ -304,41 +323,7 @@ QUnit.test('should be able to render an unbound helper invocation', function() { view = EmberView.create({ container, - template: compile('{{unbound -repeat foo count=bar}} {{-repeat foo count=bar}} {{unbound -repeat foo count=2}} {{-repeat foo count=4}}'), - context: EmberObject.create({ - foo: 'X', - numRepeatsBinding: 'bar', - bar: 5 - }) - }); - runAppend(view); - - equal(view.$().text(), 'XXXXX XXXXX XX XXXX', 'first render is correct'); - - run(function() { - set(view, 'context.bar', 1); - }); - - equal(view.$().text(), 'XXXXX X XX XXXX', 'only unbound bound options changed'); -}); - -QUnit.test('should be able to render an unbound helper invocation with deprecated fooBinding [DEPRECATED]', function() { - registry.register('helper:-repeat', helper(function([value], {count}) { - var a = []; - while (a.length < count) { - a.push(value); - } - return a.join(''); - })); - - var template; - expectDeprecation(function() { - template = compile('{{unbound -repeat foo countBinding="bar"}} {{-repeat foo countBinding="bar"}} {{unbound -repeat foo count=2}} {{-repeat foo count=4}}'); - }, /You're using legacy binding syntax/); - - view = EmberView.create({ - container, - template, + template: compile('{{unbound (-repeat foo count=bar)}} {{-repeat foo count=bar}} {{unbound (-repeat foo count=2)}} {{-repeat foo count=4}}'), context: EmberObject.create({ foo: 'X', numRepeatsBinding: 'bar', @@ -359,7 +344,7 @@ QUnit.test('should be able to render an unbound helper invocation with deprecate QUnit.test('should be able to render an bound helper invocation mixed with static values', function() { view = EmberView.create({ container, - template: compile('{{unbound -surround prefix value "bar"}} {{-surround prefix value "bar"}} {{unbound -surround "bar" value suffix}} {{-surround "bar" value suffix}}'), + template: compile('{{unbound (-surround prefix value "bar")}} {{-surround prefix value "bar"}} {{unbound (-surround "bar" value suffix)}} {{-surround "bar" value suffix}}'), context: EmberObject.create({ prefix: 'before', value: 'core', @@ -380,7 +365,7 @@ QUnit.test('should be able to render an bound helper invocation mixed with stati QUnit.test('should be able to render unbound forms of multi-arg helpers', function() { view = EmberView.create({ container, - template: compile('{{-capitalizeName person}} {{unbound -capitalizeName person}} {{-concatNames person}} {{unbound -concatNames person}}'), + template: compile('{{-fauxconcat foo bar bing}} {{unbound (-fauxconcat foo bar bing)}}'), context: EmberObject.create({ foo: 'a', bar: 'b', @@ -400,7 +385,8 @@ QUnit.test('should be able to render unbound forms of multi-arg helpers', functi QUnit.test('should be able to render an unbound helper invocation for helpers with dependent keys', function() { view = EmberView.create({ - template: compile('{{-capitalizeName person}} {{unbound -capitalizeName person}} {{-concatNames person}} {{unbound -concatNames person}}'), + container, + template: compile('{{-capitalizeName person}} {{unbound (-capitalizeName person)}} {{-concatNames person}} {{unbound (-concatNames person)}}'), context: EmberObject.create({ person: EmberObject.create({ firstName: 'shooby', @@ -424,7 +410,7 @@ QUnit.test('should be able to render an unbound helper invocation in #each helpe container, template: compile( ['{{#each people as |person|}}', - '{{-capitalize person.firstName}} {{unbound -capitalize person.firstName}}', + '{{-capitalize person.firstName}} {{unbound (-capitalize person.firstName)}}', '{{/each}}'].join('')), context: { people: Ember.A([ @@ -451,7 +437,7 @@ QUnit.test('should be able to render an unbound helper invocation with bound has view = EmberView.create({ container, - template: compile('{{-capitalizeName person}} {{unbound -capitalizeName person}} {{-concatNames person}} {{unbound -concatNames person}}'), + template: compile('{{-capitalizeName person}} {{unbound (-capitalizeName person)}} {{-concatNames person}} {{unbound (-concatNames person)}}'), context: EmberObject.create({ person: EmberObject.create({ firstName: 'shooby', @@ -473,14 +459,14 @@ QUnit.test('should be able to render an unbound helper invocation with bound has QUnit.test('should be able to render bound form of a helper inside unbound form of same helper', function() { view = EmberView.create({ template: compile( - ['{{#unbound if foo}}', + ['{{#if (unbound foo)}}', '{{#if bar}}true{{/if}}', '{{#unless bar}}false{{/unless}}', - '{{/unbound}}', - '{{#unbound unless notfoo}}', + '{{/if}}', + '{{#unless (unbound notfoo)}}', '{{#if bar}}true{{/if}}', '{{#unless bar}}false{{/unless}}', - '{{/unbound}}'].join('')), + '{{/unless}}'].join('')), context: EmberObject.create({ foo: true, notfoo: false, @@ -519,7 +505,7 @@ QUnit.test('should lookup helpers in the container', function() { })); view = EmberView.create({ - template: compile('{{unbound up-case displayText}}'), + template: compile('{{unbound (up-case displayText)}}'), container, context: { displayText: 'such awesome' diff --git a/packages/ember-views/tests/views/view/view_lifecycle_test.js b/packages/ember-views/tests/views/view/view_lifecycle_test.js index ff99f1c789f..7b6e5c30479 100644 --- a/packages/ember-views/tests/views/view/view_lifecycle_test.js +++ b/packages/ember-views/tests/views/view/view_lifecycle_test.js @@ -215,7 +215,7 @@ QUnit.test('should replace DOM representation if rerender() is called after elem run(function() { view = EmberView.extend({ rerender() { - this._super.apply(this, arguments); + this._super(...arguments); } }).create({ template: compile('Do not taunt happy fun {{unbound view.shape}}'), diff --git a/packages/ember/tests/helpers/helper_registration_test.js b/packages/ember/tests/helpers/helper_registration_test.js index df9d0027347..bfa318c693d 100644 --- a/packages/ember/tests/helpers/helper_registration_test.js +++ b/packages/ember/tests/helpers/helper_registration_test.js @@ -58,7 +58,7 @@ var boot = function(callback) { QUnit.test('Unbound dashed helpers registered on the container can be late-invoked', function() { Ember.TEMPLATES.application = compile('
{{x-borf}} {{x-borf \'YES\'}}
'); let myHelper = helper(function(params) { - return params.length > 1 ? params[0] : 'BORF'; + return params[0] || 'BORF'; }); boot(() => { @@ -143,11 +143,3 @@ QUnit.test('Helpers can receive injections', function() { ok(serviceCalled, 'service was injected, method called'); }); - -QUnit.test('Ember.HTMLBars._registerHelper is deprecated', function() { - expectDeprecation(function() { - Ember.HTMLBars._registerHelper('foo-bar-baz-widget', function() {}); - }); - - ok(helpers['foo-bar-baz-widget'], 'helper was registered'); -});