diff --git a/packages/@ember/-internals/glimmer/lib/resolver.ts b/packages/@ember/-internals/glimmer/lib/resolver.ts index 5ad07efc0c4..171760723b1 100644 --- a/packages/@ember/-internals/glimmer/lib/resolver.ts +++ b/packages/@ember/-internals/glimmer/lib/resolver.ts @@ -151,7 +151,7 @@ const BUILTIN_KEYWORD_MODIFIERS: Record = { action: actionModifier, }; -const BUILTIN_MODIFIERS: Record = { +export const BUILTIN_MODIFIERS: Record = { ...BUILTIN_KEYWORD_MODIFIERS, on, }; diff --git a/packages/@ember/-internals/glimmer/lib/setup-registry.ts b/packages/@ember/-internals/glimmer/lib/setup-registry.ts index 19d6053ac96..7c860c06ea6 100644 --- a/packages/@ember/-internals/glimmer/lib/setup-registry.ts +++ b/packages/@ember/-internals/glimmer/lib/setup-registry.ts @@ -12,6 +12,7 @@ import { Renderer } from './renderer'; import OutletTemplate from './templates/outlet'; import RootTemplate from './templates/root'; import OutletView from './views/outlet'; +import { BUILTIN_MODIFIERS } from './resolver'; export function setupApplicationRegistry(registry: Registry): void { // because we are using injections we can't use instantiate false @@ -57,4 +58,8 @@ export function setupEngineRegistry(registry: Registry): void { if (!ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS) { registry.register(P`component:-default`, Component); } + + for (let [name, modifier] of Object.entries(BUILTIN_MODIFIERS)) { + registry.register(`modifier:${name}`, modifier, { instantiate: false }); + } } diff --git a/packages/@ember/-internals/glimmer/tests/integration/custom-modifier-manager-test.js b/packages/@ember/-internals/glimmer/tests/integration/custom-modifier-manager-test.js index acea50be7db..e2a29469a1e 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/custom-modifier-manager-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/custom-modifier-manager-test.js @@ -476,6 +476,28 @@ moduleFor( this.assertStableRerender(); } + '@test can resolve built-in modifiers'(assert) { + let wasCalled = false; + let id = 'wow-what-an-original-id'; + this.render( + `
`, + { + callAction: () => { + wasCalled = true; + }, + } + ); + + let element = document.querySelector(`#${id}`); + element.click(); + + assert.false(wasCalled, 'modifier should not be set up'); + + runTask(() => set(this.context, 'isModifying', true)); + element.click(); + assert.true(wasCalled, 'on modifier can be used'); + } + '@test Cannot dynamically resolve a modifier'(assert) { this.registerModifier( 'replace',