Skip to content

Commit

Permalink
Extract owner-scoped WeakMap into service
Browse files Browse the repository at this point in the history
  • Loading branch information
simonihmig committed Nov 23, 2020
1 parent 84ee36c commit df53b75
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 16 deletions.
21 changes: 5 additions & 16 deletions packages/util/addon/index.js
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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) {
Expand Down
17 changes: 17 additions & 0 deletions packages/util/addon/services/ensure-registered.js
Original file line number Diff line number Diff line change
@@ -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;
}
}
1 change: 1 addition & 0 deletions packages/util/app/services/-ensure-registered.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '@embroider/util/services/ensure-registered';
33 changes: 33 additions & 0 deletions packages/util/tests/unit/services/ensure-registered-test.js
Original file line number Diff line number Diff line change
@@ -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'));
});
});

0 comments on commit df53b75

Please sign in to comment.