From 39dba816a5ef9ae5ded489ec4c984e8b999655be Mon Sep 17 00:00:00 2001 From: Isaac Ezer Date: Mon, 11 Dec 2017 22:21:30 -0500 Subject: [PATCH] =?UTF-8?q?Allow=20=E2=80=9Cnamespace::=E2=80=9D=20in=20co?= =?UTF-8?q?ntainer=20&=20registry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/container/lib/registry.js | 7 +++- packages/container/tests/container_test.js | 37 ++++++++++++++++++++++ packages/container/tests/registry_test.js | 22 +++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/packages/container/lib/registry.js b/packages/container/lib/registry.js index 820d0554710..2688861cf79 100644 --- a/packages/container/lib/registry.js +++ b/packages/container/lib/registry.js @@ -6,6 +6,7 @@ import { DEBUG } from 'ember-env-flags'; import { ENV } from 'ember-environment'; const VALID_FULL_NAME_REGEXP = /^[^:]+:[^:]+$/; +const MODULE_UNIFICATION_VALID_FULL_NAME_REGEXP = /^[^:]+:[^:]+(::[^:]+)?$/; const missingResolverFunctionsDeprecation = 'Passing a `resolver` function into a Registry is deprecated. Please pass in a Resolver object with a `resolve` method.'; /** @@ -547,7 +548,11 @@ export default class Registry { } isValidFullName(fullName) { - return VALID_FULL_NAME_REGEXP.test(fullName); + if(!EMBER_MODULE_UNIFICATION) { + return VALID_FULL_NAME_REGEXP.test(fullName); + } + + return MODULE_UNIFICATION_VALID_FULL_NAME_REGEXP.test(fullName); } getInjections(fullName) { diff --git a/packages/container/tests/container_test.js b/packages/container/tests/container_test.js index a87a244dc66..51b12eed574 100644 --- a/packages/container/tests/container_test.js +++ b/packages/container/tests/container_test.js @@ -680,4 +680,41 @@ if (EMBER_MODULE_UNIFICATION) { 'The correct factory was stored in the cache with the correct key which includes the source.'); } }); + + QUnit.test('The container can pass a namespaced path to factoryFor', function(assert) { + let PrivateComponent = factory(); + let lookup = 'template:components/my-addon::my-input'; + let registry = new Registry(); + let resolveCount = 0; + registry.resolve = function(fullName) { + resolveCount++; + if (fullName === lookup) { + return PrivateComponent; + } + }; + + let container = registry.container(); + + assert.strictEqual(container.factoryFor(lookup).class, PrivateComponent, 'The correct factory was provided'); + assert.strictEqual(container.factoryFor(lookup).class, PrivateComponent, 'The correct factory was provided again'); + assert.equal(resolveCount, 1, 'resolve called only once and a cached factory was returned the second time'); + }); + + QUnit.test('The container can pass a namespaced to lookup', function(assert) { + let PrivateComponent = factory(); + let lookup = 'template:components/my-addon::my-input'; + let registry = new Registry(); + registry.resolve = function(fullName) { + if (fullName === lookup) { + return PrivateComponent; + } + }; + + let container = registry.container(); + + let result = container.lookup(lookup); + assert.ok(result instanceof PrivateComponent, 'The correct factory was provided'); + assert.ok(container.cache[`template:components/my-addon::my-input`] instanceof PrivateComponent, + 'The correct factory was stored in the cache with the correct key which includes the source.'); + }); } diff --git a/packages/container/tests/registry_test.js b/packages/container/tests/registry_test.js index 30fba1eb3c9..c1e3b322c3e 100644 --- a/packages/container/tests/registry_test.js +++ b/packages/container/tests/registry_test.js @@ -767,4 +767,26 @@ if (EMBER_MODULE_UNIFICATION) { assert.equal(resolveCount, 1, 'resolve called only once and a cached factory was returned the second time'); } }); + + QUnit.test('The registry can pass a namespaced lookup to the resolver', function(assert) { + let PrivateComponent = factory(); + let lookup = 'template:components/my-addon::my-input'; + let resolveCount = 0; + let resolver = { + resolve(fullName) { + resolveCount++; + if (fullName === lookup) { + return PrivateComponent; + } + } + }; + let registry = new Registry({ resolver }); + registry.normalize = function(name) { + return name; + }; + + assert.strictEqual(registry.resolve(lookup), PrivateComponent, 'The correct factory was provided'); + assert.strictEqual(registry.resolve(lookup), PrivateComponent, 'The correct factory was provided again'); + assert.equal(resolveCount, 1, 'resolve called only once and a cached factory was returned the second time'); + }); }