diff --git a/mu-trees/addon/resolvers/glimmer-wrapper/index.js b/mu-trees/addon/resolvers/glimmer-wrapper/index.js index b68c62ff..7bf79d17 100644 --- a/mu-trees/addon/resolvers/glimmer-wrapper/index.js +++ b/mu-trees/addon/resolvers/glimmer-wrapper/index.js @@ -10,6 +10,8 @@ function slasherize(dotted) { const TEMPLATE_TO_PARTIAL = /^template:(.*\/)?_([\w-]+)/; +const LOOKUP_REGEX = /^([^:]+):(components\/)?([^:]+::)?([^:]+)$/; + /* * Wrap the @glimmer/resolver in Ember's resolver API. Although * this code extends from the DefaultResolver, it should never @@ -31,6 +33,18 @@ const Resolver = DefaultResolver.extend({ normalize: null, resolve(lookupString, referrer) { + let type, name, rootName, fullMatch, componentPrefix; + + let lookupMatch = LOOKUP_REGEX.exec(lookupString); + if (lookupMatch) { + [ fullMatch, type, componentPrefix, rootName, name ] = lookupMatch; + rootName = (rootName && rootName.replace(/::/, '')) || this._configRootName; + + if (componentPrefix) { + name = `${componentPrefix}${name}`; + } + } + /* * Ember components require their lookupString to be massaged. Make this * as "pay-go" as possible. @@ -38,11 +52,14 @@ const Resolver = DefaultResolver.extend({ if (referrer) { // make absolute let parts = referrer.split(':src/ui/'); - referrer = `${parts[0]}:/${this._configRootName}/${parts[1]}`; + referrer = `${parts[0]}:/${rootName}/${parts[1]}`; referrer = referrer.split('/template.hbs')[0]; + } else if (rootName !== this._configRootName) { + // This is only required because: + // https://github.com/glimmerjs/glimmer-di/issues/45 + referrer = `${type}:/${rootName}/`; } - let [type, name] = lookupString.split(':'); if (name) { if (type === 'service') { /* Services may be camelCased */ @@ -77,9 +94,11 @@ const Resolver = DefaultResolver.extend({ * have dots.in.paths */ lookupString = `template`; - referrer = `route:/${this._configRootName}/routes/${slasherize(name)}`; + referrer = `route:/${rootName}/routes/${slasherize(name)}`; } } + } else { + lookupString = `${type}:${name}`; } } diff --git a/mu-trees/tests/unit/resolvers/glimmer-wrapper/basic-test.js b/mu-trees/tests/unit/resolvers/glimmer-wrapper/basic-test.js index 8f79ba88..75f30477 100644 --- a/mu-trees/tests/unit/resolvers/glimmer-wrapper/basic-test.js +++ b/mu-trees/tests/unit/resolvers/glimmer-wrapper/basic-test.js @@ -723,3 +723,82 @@ test('Can resolve a local helper for another component', function(assert) { 'helper not resolved at global levelt' ); }); + +// Namespaces + +test('Can resolve a namespaced service lookup', function(assert) { + let service = {}; + let resolver = this.resolverForEntries({ + app: { + name: 'example-app' + }, + types: { + service: { definitiveCollection: 'services' } + }, + collections: { + services: { + types: [ 'service' ] + } + } + }, { + 'service:/other-namespace/services/i18n': service + }); + + assert.equal( + resolver.resolve('service:other-namespace::i18n'), + service, + 'namespaced resolution resolved' + ); +}); + +test('Can resolve a namespaced component template', function(assert) { + let template = {}; + let resolver = this.resolverForEntries({ + app: { + name: 'example-app' + }, + types: { + template: { definitiveCollection: 'components' } + }, + collections: { + components: { + group: 'ui', + types: [ 'template' ] + } + } + }, { + 'template:/other-namespace/components/my-component': template + }); + + assert.equal( + resolver.resolve('template:components/other-namespace::my-component'), + template, + 'namespaced resolution resolved' + ); +}); + +test('Can resolve a namespaced component', function(assert) { + let component = {}; + let resolver = this.resolverForEntries({ + app: { + name: 'example-app' + }, + types: { + component: { definitiveCollection: 'components' } + }, + collections: { + components: { + group: 'ui', + types: [ 'component' ] + } + } + }, { + 'component:/other-namespace/components/my-component': component + }); + + assert.equal( + resolver.resolve('component:other-namespace::my-component'), + component, + 'namespaced resolution resolved' + ); +}); diff --git a/package.json b/package.json index 972a648f..52cdbd07 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "test": "ember try:each" }, "dependencies": { - "@glimmer/resolver": "^0.4.1", + "@glimmer/resolver": "^0.4.2", "babel-plugin-debug-macros": "^0.1.10", "broccoli-funnel": "^1.1.0", "broccoli-merge-trees": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 8b76c5f2..bc9298c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -48,9 +48,9 @@ dependencies: "@glimmer/util" "^0.22.3" -"@glimmer/resolver@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.1.tgz#cd9644572c556e7e799de1cf8eff2b999cf5b878" +"@glimmer/resolver@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.2.tgz#60c9b492e90bc3956ac82b3134649bd337e1651c" dependencies: "@glimmer/di" "^0.2.0" @@ -248,10 +248,6 @@ ast-types@0.8.12: version "0.8.12" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" -ast-types@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" - ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" @@ -528,12 +524,6 @@ babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-1.5.0.tgz#5ab880597d44118ee56c21d143f75f245efd4e95" - dependencies: - ember-rfc176-data "^0.2.0" - babel-plugin-ember-modules-api-polyfill@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-1.6.0.tgz#abd1afa4237b3121cb51222f9bf3283cad8990aa" @@ -1836,24 +1826,7 @@ ember-cli-babel@^5.1.6: ember-cli-version-checker "^1.0.2" resolve "^1.1.2" -ember-cli-babel@^6.0.0-beta.7: - version "6.8.0" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.8.0.tgz#8f8d65e38439e4d343b701bcc0ac6ebd785a0e98" - dependencies: - amd-name-resolver "0.0.7" - babel-plugin-debug-macros "^0.1.11" - babel-plugin-ember-modules-api-polyfill "^1.5.0" - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-polyfill "^6.16.0" - babel-preset-env "^1.5.1" - broccoli-babel-transpiler "^6.1.2" - broccoli-debug "^0.6.2" - broccoli-funnel "^1.0.0" - broccoli-source "^1.1.0" - clone "^2.0.0" - ember-cli-version-checker "^2.0.0" - -ember-cli-babel@^6.8.1: +ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.8.1: version "6.8.1" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.8.1.tgz#695f94c57a9375c2a0e219306a41105d6b937991" dependencies: @@ -2725,7 +2698,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@7.1.1: +glob@7.1.1, glob@^7.0.4, glob@^7.0.5: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -2746,17 +2719,6 @@ glob@^5.0.10, glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.4, glob@^7.0.5: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" @@ -3768,7 +3730,7 @@ minimatch@^2.0.3: dependencies: brace-expansion "^1.0.0" -minimist@0.0.8: +minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -3776,10 +3738,6 @@ minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -4250,7 +4208,7 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -recast@0.10.33: +recast@0.10.33, recast@^0.10.10: version "0.10.33" resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" dependencies: @@ -4259,15 +4217,6 @@ recast@0.10.33: private "~0.1.5" source-map "~0.5.0" -recast@^0.10.10: - version "0.10.43" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" - dependencies: - ast-types "0.8.15" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - recast@^0.11.17, recast@^0.11.3: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" @@ -4697,11 +4646,7 @@ spawn-sync@^1.0.15: concat-stream "^1.4.7" os-shim "^0.1.2" -sprintf-js@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" - -sprintf-js@~1.0.2: +sprintf-js@^1.0.3, sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"