diff --git a/packages/util/addon/index.js b/packages/util/addon/index.js index 6b6becc85..960b28380 100644 --- a/packages/util/addon/index.js +++ b/packages/util/addon/index.js @@ -1,4 +1,4 @@ -import { deprecate } from '@ember/debug'; +import { assert, deprecate } from '@ember/debug'; import { getOwner } from '@ember/application'; import { isCurriedComponentDefinition, lookupCurriedComponentDefinition } from './ember-private-api'; import Helper from '@ember/component/helper'; @@ -39,22 +39,11 @@ function handleString(name, thingWithOwner) { return lookupCurriedComponentDefinition(name, owner); } -const classNoncesForOwner = new WeakMap(); -let nonceCounter = 0; - function ensureRegistered(klass, owner) { - let classNonces = classNoncesForOwner.get(owner); - if (!classNonces) { - classNonces = new WeakMap(); - classNoncesForOwner.set(owner, classNonces); - } - let nonce = classNonces.get(klass); - if (nonce == null) { - nonce = `-ensure${nonceCounter++}`; - classNonces.set(klass, nonce); - owner.register(`component:${nonce}`, klass); - } - return nonce; + let service = owner.lookup('service:-ensure-registered'); + assert('Could not lookup private -ensure-registered service', service); + + return service.register(klass, owner); } function handleClass(klass, thingWithOwner) { diff --git a/packages/util/addon/services/ensure-registered.js b/packages/util/addon/services/ensure-registered.js new file mode 100644 index 000000000..2e6558c17 --- /dev/null +++ b/packages/util/addon/services/ensure-registered.js @@ -0,0 +1,17 @@ +import Service from '@ember/service'; +import { getOwner } from '@ember/application'; + +export default class EnsureRegisteredService extends Service { + classNonces = new WeakMap(); + nonceCounter = 0; + + register(klass, owner = getOwner(this)) { + let nonce = this.classNonces.get(klass); + if (nonce == null) { + nonce = `-ensure${this.nonceCounter++}`; + this.classNonces.set(klass, nonce); + owner.register(`component:${nonce}`, klass); + } + return nonce; + } +} diff --git a/packages/util/app/services/-ensure-registered.js b/packages/util/app/services/-ensure-registered.js new file mode 100644 index 000000000..3959d9e11 --- /dev/null +++ b/packages/util/app/services/-ensure-registered.js @@ -0,0 +1 @@ +export { default } from '@embroider/util/services/ensure-registered'; diff --git a/packages/util/tests/unit/services/ensure-registered-test.js b/packages/util/tests/unit/services/ensure-registered-test.js new file mode 100644 index 000000000..83aaca6a8 --- /dev/null +++ b/packages/util/tests/unit/services/ensure-registered-test.js @@ -0,0 +1,33 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import EmberComponent from '@ember/component'; + +module('Unit | Service | ensure-registered', function (hooks) { + setupTest(hooks); + + const Klass1 = EmberComponent.extend(); + const Klass2 = EmberComponent.extend(); + + test('it returns nonce for class', function (assert) { + let service = this.owner.lookup('service:-ensure-registered'); + assert.equal(service.register(Klass1), '-ensure0'); + }); + + test('it returns different nonce for different class', function (assert) { + let service = this.owner.lookup('service:-ensure-registered'); + assert.equal(service.register(Klass1), '-ensure0'); + assert.equal(service.register(Klass2), '-ensure1'); + }); + + test('it returns same nonce for same class', function (assert) { + let service = this.owner.lookup('service:-ensure-registered'); + assert.equal(service.register(Klass1), '-ensure0'); + assert.equal(service.register(Klass1), '-ensure0'); + }); + + test('it registers component', function (assert) { + let service = this.owner.lookup('service:-ensure-registered'); + assert.equal(service.register(Klass1), '-ensure0'); + assert.ok(this.owner.hasRegistration('component:-ensure0')); + }); +});