diff --git a/packages/@ember/-internals/glimmer/tests/integration/syntax/deprecated-in-element-test.js b/packages/@ember/-internals/glimmer/tests/integration/syntax/deprecated-in-element-test.js deleted file mode 100644 index 84a6a5de9bb..00000000000 --- a/packages/@ember/-internals/glimmer/tests/integration/syntax/deprecated-in-element-test.js +++ /dev/null @@ -1,263 +0,0 @@ -import { moduleFor, RenderingTestCase, strip, equalTokens, runTask } from 'internal-test-helpers'; -import { Component } from '@ember/-internals/glimmer'; -import { set } from '@ember/-internals/metal'; - -const deprecationMessage = /The use of the private `{{-in-element}}` is deprecated, please refactor to the public `{{in-element}}`/; - -moduleFor( - '{{-in-element}}', - class extends RenderingTestCase { - ['@test allows rendering into an external element']() { - expectDeprecation(deprecationMessage); - - let someElement = document.createElement('div'); - - this.render( - strip` - {{#-in-element this.someElement}} - {{this.text}} - {{/-in-element}} - `, - { - someElement, - text: 'Whoop!', - } - ); - - equalTokens(this.element, ''); - equalTokens(someElement, 'Whoop!'); - - this.assertStableRerender(); - - runTask(() => set(this.context, 'text', 'Huzzah!!')); - - equalTokens(this.element, ''); - equalTokens(someElement, 'Huzzah!!'); - - runTask(() => set(this.context, 'text', 'Whoop!')); - - equalTokens(this.element, ''); - equalTokens(someElement, 'Whoop!'); - } - - ['@test it appends to the external element by default']() { - expectDeprecation(deprecationMessage); - - let someElement = document.createElement('div'); - someElement.appendChild(document.createTextNode('foo ')); - - this.render( - strip` - {{#-in-element this.someElement}} - {{this.text}} - {{/-in-element}} - `, - { - someElement, - text: 'bar', - } - ); - - equalTokens(this.element, ''); - equalTokens(someElement, 'foo bar'); - - this.assertStableRerender(); - - runTask(() => set(this.context, 'text', 'bar!!')); - - equalTokens(this.element, ''); - equalTokens(someElement, 'foo bar!!'); - - runTask(() => set(this.context, 'text', 'bar')); - - equalTokens(this.element, ''); - equalTokens(someElement, 'foo bar'); - } - - ['@test allows appending to the external element with insertBefore=null']() { - expectDeprecation(deprecationMessage); - - let someElement = document.createElement('div'); - someElement.appendChild(document.createTextNode('foo ')); - - this.render( - strip` - {{#-in-element this.someElement insertBefore=null}} - {{this.text}} - {{/-in-element}} - `, - { - someElement, - text: 'bar', - } - ); - - equalTokens(this.element, ''); - equalTokens(someElement, 'foo bar'); - - this.assertStableRerender(); - - runTask(() => set(this.context, 'text', 'bar!!')); - - equalTokens(this.element, ''); - equalTokens(someElement, 'foo bar!!'); - - runTask(() => set(this.context, 'text', 'bar')); - - equalTokens(this.element, ''); - equalTokens(someElement, 'foo bar'); - } - - ['@test allows clearing the external element with insertBefore=undefined']() { - expectDeprecation(deprecationMessage); - - let someElement = document.createElement('div'); - someElement.appendChild(document.createTextNode('foo ')); - - this.render( - strip` - {{#-in-element this.someElement insertBefore=undefined}} - {{this.text}} - {{/-in-element}} - `, - { - someElement, - text: 'bar', - } - ); - - equalTokens(this.element, ''); - equalTokens(someElement, 'bar'); - - this.assertStableRerender(); - - runTask(() => set(this.context, 'text', 'bar!!')); - - equalTokens(this.element, ''); - equalTokens(someElement, 'bar!!'); - - runTask(() => set(this.context, 'text', 'bar')); - - equalTokens(this.element, ''); - equalTokens(someElement, 'bar'); - } - - ['@test does not allow insertBefore=non-null-value']() { - expectDeprecation(deprecationMessage); - - let someElement = document.createElement('div'); - - expectAssertion(() => { - this.render( - strip` - {{#-in-element this.someElement insertBefore=".foo"}} - {{this.text}} - {{/-in-element}} - `, - { - someElement, - text: 'Whoop!', - } - ); - }, /Can only pass a null or undefined literals to insertBefore in -in-element, received:/); - } - - ['@test components are cleaned up properly'](assert) { - expectDeprecation(deprecationMessage); - - let hooks = []; - - let someElement = document.createElement('div'); - - this.registerComponent('modal-display', { - ComponentClass: Component.extend({ - didInsertElement() { - hooks.push('didInsertElement'); - }, - - willDestroyElement() { - hooks.push('willDestroyElement'); - }, - }), - - template: `{{this.text}}`, - }); - - this.render( - strip` - {{#if this.showModal}} - {{#-in-element this.someElement}} - {{modal-display text=this.text}} - {{/-in-element}} - {{/if}} - `, - { - someElement, - text: 'Whoop!', - showModal: false, - } - ); - - equalTokens(this.element, ''); - equalTokens(someElement, ''); - - this.assertStableRerender(); - - runTask(() => set(this.context, 'showModal', true)); - - equalTokens(this.element, ''); - this.assertComponentElement(someElement.firstChild, { - content: 'Whoop!', - }); - - runTask(() => set(this.context, 'text', 'Huzzah!')); - - equalTokens(this.element, ''); - this.assertComponentElement(someElement.firstChild, { - content: 'Huzzah!', - }); - - runTask(() => set(this.context, 'text', 'Whoop!')); - - equalTokens(this.element, ''); - this.assertComponentElement(someElement.firstChild, { - content: 'Whoop!', - }); - - runTask(() => set(this.context, 'showModal', false)); - - equalTokens(this.element, ''); - equalTokens(someElement, ''); - - assert.deepEqual(hooks, ['didInsertElement', 'willDestroyElement']); - } - - ['@test appending to the root element should not cause double clearing']() { - expectDeprecation(deprecationMessage); - - this.render( - strip` - Before - {{#-in-element this.rootElement insertBefore=null}} - {{this.text}} - {{/-in-element}} - After - `, - { - rootElement: this.element, - text: 'Whoop!', - } - ); - - equalTokens(this.element, 'BeforeWhoop!After'); - - this.assertStableRerender(); - - runTask(() => set(this.context, 'text', 'Huzzah!')); - - equalTokens(this.element, 'BeforeHuzzah!After'); - - // teardown happens in afterEach and should not cause double-clearing error - } - } -); diff --git a/packages/ember-template-compiler/lib/plugins/transform-in-element.ts b/packages/ember-template-compiler/lib/plugins/transform-in-element.ts index 6ef1ba31c94..43b135c2ba9 100644 --- a/packages/ember-template-compiler/lib/plugins/transform-in-element.ts +++ b/packages/ember-template-compiler/lib/plugins/transform-in-element.ts @@ -1,6 +1,5 @@ -import { assert, deprecate } from '@ember/debug'; +import { assert } from '@ember/debug'; import { AST, ASTPlugin } from '@glimmer/syntax'; -import calculateLocationDisplay from '../system/calculate-location-display'; import { EmberASTPluginEnvironment } from '../types'; import { isPath } from './utils'; @@ -9,26 +8,7 @@ import { isPath } from './utils'; */ /** - A Glimmer2 AST transformation that handles the public `{{in-element}}` as per RFC287, and deprecates but still - continues support for the private `{{-in-element}}`. - - Transforms: - - ```handlebars - {{#-in-element someElement}} - {{modal-display text=text}} - {{/-in-element}} - ``` - - into: - - ```handlebars - {{#in-element someElement}} - {{modal-display text=text}} - {{/in-element}} - ``` - - And issues a deprecation message. + A Glimmer2 AST transformation that handles the public `{{in-element}}` as per RFC287. Issues a build time assertion for: @@ -42,7 +22,6 @@ import { isPath } from './utils'; @class TransformInElement */ export default function transformInElement(env: EmberASTPluginEnvironment): ASTPlugin { - let moduleName = env.meta?.moduleName; let { builders: b } = env.syntax; return { @@ -72,47 +51,6 @@ export default function transformInElement(env: EmberASTPluginEnvironment): ASTP ); } }); - } else if (node.path.original === '-in-element') { - let sourceInformation = calculateLocationDisplay(moduleName, node.loc); - deprecate( - `The use of the private \`{{-in-element}}\` is deprecated, please refactor to the public \`{{in-element}}\`. ${sourceInformation}`, - false, - { - id: 'glimmer.private-in-element', - until: '3.25.0', - for: 'ember-source', - since: { - enabled: '3.20.0', - }, - } - ); - - node.path.original = 'in-element'; - node.path.parts = ['in-element']; - - // replicate special hash arguments added here: - // https://github.com/glimmerjs/glimmer-vm/blob/ba9b37d44b85fa1385eeeea71910ff5798198c8e/packages/%40glimmer/syntax/lib/parser/handlebars-node-visitors.ts#L340-L363 - let needsInsertBefore = true; - let hash = node.hash; - hash.pairs.forEach((pair) => { - if (pair.key === 'insertBefore') { - assert( - `Can only pass a null or undefined literals to insertBefore in -in-element, received: ${JSON.stringify( - pair.value - )}`, - pair.value.type === 'NullLiteral' || pair.value.type === 'UndefinedLiteral' - ); - - needsInsertBefore = false; - } - }); - - // Maintain compatibility with previous -in-element behavior (defaults to append, not clear) - if (needsInsertBefore) { - let nullLiteral = b.literal('NullLiteral', null); - let nextSibling = b.pair('insertBefore', nullLiteral); - hash.pairs.push(nextSibling); - } } }, },