Skip to content

Commit

Permalink
use correct logic for looking up component pairs
Browse files Browse the repository at this point in the history
  • Loading branch information
iezer committed Jul 1, 2017
1 parent 5200c22 commit e7cdb3f
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 33 deletions.
135 changes: 105 additions & 30 deletions packages/ember-glimmer/tests/integration/components/local-lookup-test.js
@@ -1,36 +1,10 @@
import { moduleFor, RenderingTest } from '../../utils/test-case';
import { ModuleBasedTestResolver } from 'internal-test-helpers';
import { Component } from '../../utils/helpers';
import { EMBER_MODULE_UNIFICATION } from 'ember/features';
import { helper, Helper } from 'ember-glimmer';

function buildResolver() {
let resolver = {
resolve() { },
expandLocalLookup(fullName, sourceFullName) {
let [sourceType, sourceName ] = sourceFullName.split(':');
let [type, name ] = fullName.split(':');

if (type !== 'template' && sourceType === 'template' && sourceName.slice(0, 11) === 'components/') {
sourceName = sourceName.slice(11);
}

if (type === 'template' && sourceType === 'template' && name.slice(0, 11) === 'components/') {
name = name.slice(11);
}


let result = `${type}:${sourceName}/${name}`;

return result;
}
};

return resolver;
}

moduleFor('Components test: local lookup', class extends RenderingTest {
getResolver() {
return buildResolver();
}

class LocalLookupTest extends RenderingTest {
['@test it can lookup a local template']() {
this.registerComponent('x-outer/x-inner', { template: 'Nested template says: {{yield}}' });
this.registerComponent('x-outer', { template: '{{#x-inner}}Hi!{{/x-inner}}' });
Expand Down Expand Up @@ -217,4 +191,105 @@ moduleFor('Components test: local lookup', class extends RenderingTest {

this.assertText('Nested template says (from global): Hi! Nested template says (from local): Hi! Nested template says (from local): Hi!');
}
}

// first run these tests with expandLocalLookup

function buildResolver() {
let resolver = {
resolve() { },
expandLocalLookup(fullName, sourceFullName) {
let [sourceType, sourceName ] = sourceFullName.split(':');
let [type, name ] = fullName.split(':');

if (type !== 'template' && sourceType === 'template' && sourceName.slice(0, 11) === 'components/') {
sourceName = sourceName.slice(11);
}

if (type === 'template' && sourceType === 'template' && name.slice(0, 11) === 'components/') {
name = name.slice(11);
}


let result = `${type}:${sourceName}/${name}`;

return result;
}
};

return resolver;
}

moduleFor('Components test: local lookup with expandLocalLookup feature', class extends LocalLookupTest {
getResolver() {
return buildResolver();
}
});

if (EMBER_MODULE_UNIFICATION) {
class LocalLookupTestResolver extends ModuleBasedTestResolver {
resolve(specifier, referrer) {
let fullSpecifier = specifier;

if (referrer) {
let namespace = referrer.split('template:components/')[1];
if (specifier.includes('template:components/')) {
let name = specifier.split('template:components/')[1];
fullSpecifier = `template:components/${namespace}/${name}`;
} else if (specifier.includes(':')) {
let [type, name] = specifier.split(':');
fullSpecifier = `${type}:${namespace}/${name}`;
}
}

return super.resolve(fullSpecifier);
}
}
moduleFor('Components test: local lookup with module unification', class extends LocalLookupTest {
get resolver() {
return this.owner.__registry__.fallback.resolver;
}

getResolver() {
return new LocalLookupTestResolver();
}

registerComponent(name, { ComponentClass = null, template = null }) {
let { resolver } = this;

if (ComponentClass) {
resolver.add(`component:${name}`, ComponentClass);
}

if (typeof template === 'string') {
resolver.add(`template:components/${name}`, this.compile(template, {
moduleName: `components/${name}`
}));
}
}

registerTemplate(name, template) {
let { resolver } = this;
if (typeof template === 'string') {
resolver.add(`template:${name}`, this.compile(template, {
moduleName: name
}));
} else {
throw new Error(`Registered template "${name}" must be a string`);
}
}

registerHelper(name, funcOrClassBody) {
let { resolver } = this;
let type = typeof funcOrClassBody;

if (type === 'function') {
resolver.add(`helper:${name}`, helper(funcOrClassBody));
} else if (type === 'object' && type !== null) {
resolver.add(`helper:${name}`, Helper.extend(funcOrClassBody));
} else {
throw new Error(`Cannot register ${funcOrClassBody} as a helper`);
}
}
});
}
33 changes: 33 additions & 0 deletions packages/ember-views/lib/utils/lookup-component.js
@@ -1,6 +1,39 @@
import { privatize as P } from 'container';
import { EMBER_MODULE_UNIFICATION } from 'ember/features';

function lookupModuleUnificationComponentPair(componentLookup, owner, name, options) {
let localComponent = componentLookup.componentFor(name, owner, options);
let localLayout = componentLookup.layoutFor(name, owner, options);

let globalComponent = componentLookup.componentFor(name, owner);
let globalLayout = componentLookup.layoutFor(name, owner);

let localAndUniqueComponent = !!localComponent && (!globalComponent || localComponent.class !== globalComponent.class);
let localAndUniqueLayout = !!localLayout && (!globalLayout || localLayout.meta.moduleName !== globalLayout.meta.moduleName);

if (localAndUniqueComponent && localAndUniqueLayout) {
return { layout: localLayout, component: localComponent };
}

if (localAndUniqueComponent && !localAndUniqueLayout) {
return { layout: null, component: localComponent };
}

let defaultComponentFactory = owner.factoryFor(P`component:-default`);

if (!localAndUniqueComponent && localAndUniqueLayout) {
return { layout: localLayout, component: defaultComponentFactory };
}

let component = globalComponent || (globalLayout && defaultComponentFactory);
return { layout: globalLayout, component };
}

function lookupComponentPair(componentLookup, owner, name, options) {
if (EMBER_MODULE_UNIFICATION) {
return lookupModuleUnificationComponentPair(componentLookup, owner, name, options);
}

let component = componentLookup.componentFor(name, owner, options);
let layout = componentLookup.layoutFor(name, owner, options);

Expand Down
6 changes: 3 additions & 3 deletions yarn.lock
Expand Up @@ -838,9 +838,9 @@ backbone@^1.1.2:
dependencies:
underscore ">=1.8.3"

backburner.js@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/backburner.js/-/backburner.js-1.0.0.tgz#fffae139998f20a161ac2140d85639b152dfc226"
backburner.js@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/backburner.js/-/backburner.js-1.1.0.tgz#16ef021891bc330a2d021c63d8d68cb8611eb3e4"

backo2@1.0.2:
version "1.0.2"
Expand Down

0 comments on commit e7cdb3f

Please sign in to comment.