From cd6366e47262f0f8f94fb06a179db6c6e2cd830f Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Fri, 24 Nov 2017 09:07:42 -0800 Subject: [PATCH 1/3] Add support to glimmer-wrapper for MU namespaces resolver.resolve now takes a third argument `rawString` which is the string used at the invocation site of the lookup. For example for: ``` {{ember-power-select::option}} ``` The lookup should be: ``` resolver.resolve('template:component/', null, 'ember-power-select::option') `` And for a service example: ``` Ember.service.inject('auth-addon::main-service') ``` The lookup would be: ``` resolver.resolve('service', null, 'auth-addon::main-service') ``` Refs: https://github.com/ember-cli/ember-resolver/issues/214 Refs: https://github.com/emberjs/ember.js/issues/15350#issuecomment-328118310 --- .../addon/resolvers/glimmer-wrapper/index.js | 35 +++++++++--- .../resolvers/glimmer-wrapper/basic-test.js | 53 +++++++++++++++++++ 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/mu-trees/addon/resolvers/glimmer-wrapper/index.js b/mu-trees/addon/resolvers/glimmer-wrapper/index.js index b68c62ff..06a9340b 100644 --- a/mu-trees/addon/resolvers/glimmer-wrapper/index.js +++ b/mu-trees/addon/resolvers/glimmer-wrapper/index.js @@ -30,7 +30,22 @@ const Resolver = DefaultResolver.extend({ normalize: null, - resolve(lookupString, referrer) { + resolve(lookupString, referrer, rawString) { + /* + * Ember namespaces are part of the raw invocation passed as a third + * argument, for example other-addon::some-service + */ + let rootName = this._configRootName; + let rawStringName = null; + if (rawString) { + let [namespace, name] = rawString.split('::'); + rootName = namespace; + rawStringName = name; + } + + let [type, lookupStringName] = lookupString.split(':'); + let name = lookupStringName; + /* * Ember components require their lookupString to be massaged. Make this * as "pay-go" as possible. @@ -38,11 +53,18 @@ 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 (rawString) { + // This is only required because: + // https://github.com/glimmerjs/glimmer-di/issues/45 + referrer = `${type}:/${rootName}/`; } - let [type, name] = lookupString.split(':'); + /* If there is no name, fallback to the name passed in the rawString */ + if (!name) { + name = rawStringName; + } if (name) { if (type === 'service') { /* Services may be camelCased */ @@ -54,8 +76,9 @@ const Resolver = DefaultResolver.extend({ /* Controllers may have.dot.paths */ lookupString = `controller:${slasherize(name)}`; } else if (type === 'template') { - if (name.indexOf('components/') === 0) { - lookupString = `template:${name.slice(11)}`; + if (lookupStringName && lookupStringName.indexOf('components/') === 0) { + let sliced = lookupStringName.slice(11); + lookupString = `template:${sliced.length ? sliced : rawStringName}`; } else { /* * Ember partials are looked up as templates. Here we replace the template @@ -77,7 +100,7 @@ const Resolver = DefaultResolver.extend({ * have dots.in.paths */ lookupString = `template`; - referrer = `route:/${this._configRootName}/routes/${slasherize(name)}`; + referrer = `route:/${rootName}/routes/${slasherize(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..b326fc33 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,56 @@ 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', null, '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/', null, 'other-namespace::my-component'), + template, + 'namespaced resolution resolved' + ); +}); From 871065f764758a8867c22206ca5ab0053cd9b6ea Mon Sep 17 00:00:00 2001 From: Isaac Ezer Date: Wed, 13 Dec 2017 21:22:45 -0500 Subject: [PATCH 2/3] Add support to glimmer-wrapper for MU namespaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resolver.resolve can accept a namespace denoted by a double colon in the first argument, for example: - `service:other-namespace::i18n` - `template:components/other-namespace::my-component` For example for: ``` {{ember-power-select::option}} ``` The lookup should be: ``` resolver.resolve('template:component/ember-power-select::option’) `` And for a service example: ``` Ember.service.inject('auth-addon::main-service') ``` The lookup would be: ``` resolver.resolve('service:auth-addon::main-service’) ``` Refs: https://github.com/ember-cli/ember-resolver/issues/214 Refs: https://github.com/emberjs/ember.js/issues/15350#issuecomment-328118310 --- .../addon/resolvers/glimmer-wrapper/index.js | 40 +++++++++---------- .../resolvers/glimmer-wrapper/basic-test.js | 30 +++++++++++++- 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/mu-trees/addon/resolvers/glimmer-wrapper/index.js b/mu-trees/addon/resolvers/glimmer-wrapper/index.js index 06a9340b..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 @@ -30,21 +32,18 @@ const Resolver = DefaultResolver.extend({ normalize: null, - resolve(lookupString, referrer, rawString) { - /* - * Ember namespaces are part of the raw invocation passed as a third - * argument, for example other-addon::some-service - */ - let rootName = this._configRootName; - let rawStringName = null; - if (rawString) { - let [namespace, name] = rawString.split('::'); - rootName = namespace; - rawStringName = name; - } + resolve(lookupString, referrer) { + let type, name, rootName, fullMatch, componentPrefix; - let [type, lookupStringName] = lookupString.split(':'); - let name = lookupStringName; + 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 @@ -55,16 +54,12 @@ const Resolver = DefaultResolver.extend({ let parts = referrer.split(':src/ui/'); referrer = `${parts[0]}:/${rootName}/${parts[1]}`; referrer = referrer.split('/template.hbs')[0]; - } else if (rawString) { + } else if (rootName !== this._configRootName) { // This is only required because: // https://github.com/glimmerjs/glimmer-di/issues/45 referrer = `${type}:/${rootName}/`; } - /* If there is no name, fallback to the name passed in the rawString */ - if (!name) { - name = rawStringName; - } if (name) { if (type === 'service') { /* Services may be camelCased */ @@ -76,9 +71,8 @@ const Resolver = DefaultResolver.extend({ /* Controllers may have.dot.paths */ lookupString = `controller:${slasherize(name)}`; } else if (type === 'template') { - if (lookupStringName && lookupStringName.indexOf('components/') === 0) { - let sliced = lookupStringName.slice(11); - lookupString = `template:${sliced.length ? sliced : rawStringName}`; + if (name.indexOf('components/') === 0) { + lookupString = `template:${name.slice(11)}`; } else { /* * Ember partials are looked up as templates. Here we replace the template @@ -103,6 +97,8 @@ const Resolver = DefaultResolver.extend({ 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 b326fc33..75f30477 100644 --- a/mu-trees/tests/unit/resolvers/glimmer-wrapper/basic-test.js +++ b/mu-trees/tests/unit/resolvers/glimmer-wrapper/basic-test.js @@ -745,7 +745,7 @@ test('Can resolve a namespaced service lookup', function(assert) { }); assert.equal( - resolver.resolve('service', null, 'other-namespace::i18n'), + resolver.resolve('service:other-namespace::i18n'), service, 'namespaced resolution resolved' ); @@ -771,8 +771,34 @@ test('Can resolve a namespaced component template', function(assert) { }); assert.equal( - resolver.resolve('template:components/', null, 'other-namespace::my-component'), + 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' + ); +}); From 308df95687ca77e1e44e466e44065729915978d8 Mon Sep 17 00:00:00 2001 From: Isaac Ezer Date: Sat, 16 Dec 2017 16:41:28 -0500 Subject: [PATCH 3/3] @glimmer/resolver 0.4.2 --- package.json | 2 +- yarn.lock | 71 ++++++---------------------------------------------- 2 files changed, 9 insertions(+), 64 deletions(-) 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"