diff --git a/addon/resolvers/classic/index.js b/addon/resolvers/classic/index.js index f87016ba..e80f605a 100644 --- a/addon/resolvers/classic/index.js +++ b/addon/resolvers/classic/index.js @@ -44,7 +44,25 @@ function parseName(fullName) { let prefix, type, name; let fullNameParts = fullName.split('@'); - if (fullNameParts.length === 2) { + if (fullNameParts.length === 3) { + if (fullNameParts[0].length === 0) { + // leading scoped namespace: `@scope/pkg@type:name` + prefix = `@${fullNameParts[1]}`; + let prefixParts = fullNameParts[2].split(':'); + type = prefixParts[0]; + name = prefixParts[1]; + } else { + // interweaved scoped namespace: `type:@scope/pkg@name` + prefix = `@${fullNameParts[1]}`; + type = fullNameParts[0].slice(0, -1); + name = fullNameParts[2]; + } + + if (type === 'template:components') { + name = `components/${name}`; + type = 'template'; + } + } else if (fullNameParts.length === 2) { let prefixParts = fullNameParts[0].split(':'); if (prefixParts.length === 2) { diff --git a/tests/unit/resolvers/classic/basic-test.js b/tests/unit/resolvers/classic/basic-test.js index f7d122a8..c3066974 100644 --- a/tests/unit/resolvers/classic/basic-test.js +++ b/tests/unit/resolvers/classic/basic-test.js @@ -79,6 +79,25 @@ test("can lookup something in another namespace", function(assert){ assert.equal(adapter, expected, 'default export was returned'); }); +test("can lookup something in another namespace with an @ scope", function(assert){ + assert.expect(3); + + let expected = {}; + + define('@scope/other/adapters/post', [], function(){ + assert.ok(true, "adapter was invoked properly"); + + return { + default: expected + }; + }); + + var adapter = resolver.resolve('@scope/other@adapter:post'); + + assert.ok(adapter, 'adapter was returned'); + assert.equal(adapter, expected, 'default export was returned'); +}); + test("can lookup something with an @ sign", function(assert){ assert.expect(3); @@ -111,6 +130,22 @@ test("can lookup something in another namespace with different syntax", function assert.equal(adapter, expected, 'default export was returned'); }); +test("can lookup something in another namespace with an @ scope with different syntax", function(assert){ + assert.expect(3); + + let expected = {}; + define('@scope/other/adapters/post', [], function(){ + assert.ok(true, "adapter was invoked properly"); + + return { default: expected }; + }); + + var adapter = resolver.resolve('adapter:@scope/other@post'); + + assert.ok(adapter, 'adapter was returned'); + assert.equal(adapter, expected, 'default export was returned'); +}); + test("can lookup a view in another namespace", function(assert) { assert.expect(3); @@ -127,6 +162,22 @@ test("can lookup a view in another namespace", function(assert) { assert.equal(view, expected, 'default export was returned'); }); +test("can lookup a view in another namespace with an @ scope", function(assert) { + assert.expect(3); + + let expected = { isViewFactory: true }; + define('@scope/other/views/post', [], function(){ + assert.ok(true, "view was invoked properly"); + + return { default: expected }; + }); + + var view = resolver.resolve('@scope/other@view:post'); + + assert.ok(view, 'view was returned'); + assert.equal(view, expected, 'default export was returned'); +}); + test("can lookup a view in another namespace with different syntax", function(assert) { assert.expect(3); @@ -143,6 +194,22 @@ test("can lookup a view in another namespace with different syntax", function(as assert.equal(view, expected, 'default export was returned'); }); +test("can lookup a view in another namespace with an @ scope with different syntax", function(assert) { + assert.expect(3); + + let expected = { isViewFactory: true }; + define('@scope/other/views/post', [], function(){ + assert.ok(true, "view was invoked properly"); + + return { default: expected }; + }); + + var view = resolver.resolve('view:@scope/other@post'); + + assert.ok(view, 'view was returned'); + assert.equal(view, expected, 'default export was returned'); +}); + test("can lookup a component template in another namespace with different syntax", function(assert) { assert.expect(2); @@ -158,6 +225,21 @@ test("can lookup a component template in another namespace with different syntax assert.equal(template, expected, 'default export was returned'); }); +test("can lookup a component template in another namespace with an @ scope with different syntax", function(assert) { + assert.expect(2); + + let expected = { isTemplate: true }; + define('@scope/other/templates/components/foo-bar', [], function(){ + assert.ok(true, "template was looked up properly"); + + return { default: expected }; + }); + + var template = resolver.resolve('template:components/@scope/other@foo-bar'); + + assert.equal(template, expected, 'default export was returned'); +}); + test("can lookup a view", function(assert) { assert.expect(3);