Skip to content

Commit

Permalink
Merge pull request #16757 from emberjs/core-object-extend
Browse files Browse the repository at this point in the history
Make CoreObject rely more on ES2015 class features and interop better.

(cherry picked from commit d424af0)
  • Loading branch information
krisselden committed Jun 25, 2018
1 parent cd8cf57 commit 0e34d44
Show file tree
Hide file tree
Showing 13 changed files with 778 additions and 498 deletions.
2 changes: 1 addition & 1 deletion packages/ember-application/lib/system/engine.js
Expand Up @@ -455,7 +455,7 @@ Engine.reopenClass({
@return {*} the resolved value for a given lookup
*/
function resolverFor(namespace) {
let ResolverClass = namespace.get('Resolver') || DefaultResolver;
let ResolverClass = get(namespace, 'Resolver') || DefaultResolver;

return ResolverClass.create({
namespace
Expand Down
98 changes: 43 additions & 55 deletions packages/ember-application/lib/system/resolver.js
Expand Up @@ -14,23 +14,6 @@ import validateType from '../utils/validate-type';
import { getTemplate } from 'ember-glimmer';
import { DEBUG } from 'ember-env-flags';

export const Resolver = EmberObject.extend({
/*
This will be set to the Application instance when it is
created.
@property namespace
*/
namespace: null,
normalize: null, // required
resolve: null, // required
parseName: null, // required
lookupDescription: null, // required
makeToString: null, // required
resolveOther: null, // required
_logLookup: null // required
});

/**
The DefaultResolver defines the default lookup rules to resolve
container lookups before consulting the container for registered
Expand Down Expand Up @@ -100,19 +83,26 @@ export const Resolver = EmberObject.extend({
@public
*/

const DefaultResolver = EmberObject.extend({
class DefaultResolver extends EmberObject {
// Workaround for weird JIT bug with FireFox and our test suite.
static create(props) {
return super.create(props);
}

/**
This will be set to the Application instance when it is
created.
@property namespace
@public
*/
namespace: null,

init() {
if (this.namespace == null) {
throw new Error('missing namespace');
}
this._parseNameCache = dictionary(null);
},
}

normalize(fullName) {
let [ type, name ] = fullName.split(':');
Expand All @@ -132,7 +122,7 @@ const DefaultResolver = EmberObject.extend({
} else {
return fullName;
}
},
}

/**
This method is called via the container's resolver method.
Expand Down Expand Up @@ -166,7 +156,7 @@ const DefaultResolver = EmberObject.extend({
}

return resolved;
},
}

/**
Convert the string name of the form 'type:name' to
Expand All @@ -182,7 +172,7 @@ const DefaultResolver = EmberObject.extend({
return this._parseNameCache[fullName] || (
(this._parseNameCache[fullName] = this._parseName(fullName))
);
},
}

_parseName(fullName) {
let [ type, fullNameWithoutType ] = fullName.split(':');
Expand Down Expand Up @@ -220,7 +210,7 @@ const DefaultResolver = EmberObject.extend({
root,
resolveMethodName: `resolve${resolveMethodName}`
};
},
}

/**
Returns a human-readable description for a fullName. Used by the
Expand All @@ -247,11 +237,11 @@ const DefaultResolver = EmberObject.extend({
}

return description;
},
}

makeToString(factory) {
return factory.toString();
},
}

/**
Given a parseName object (output from `parseName`), apply
Expand All @@ -268,7 +258,7 @@ const DefaultResolver = EmberObject.extend({
} else {
parsedName.name = parsedName.name.replace(/\./g, '_');
}
},
}
/**
Look up the template in Ember.TEMPLATES
Expand All @@ -281,7 +271,7 @@ const DefaultResolver = EmberObject.extend({
let templateName = parsedName.fullNameWithoutType.replace(/\./g, '/');

return getTemplate(templateName) || getTemplate(StringUtils.decamelize(templateName));
},
}

/**
Lookup the view using `resolveOther`
Expand All @@ -294,7 +284,7 @@ const DefaultResolver = EmberObject.extend({
resolveView(parsedName) {
this.useRouterNaming(parsedName);
return this.resolveOther(parsedName);
},
}

/**
Lookup the controller using `resolveOther`
Expand All @@ -307,7 +297,7 @@ const DefaultResolver = EmberObject.extend({
resolveController(parsedName) {
this.useRouterNaming(parsedName);
return this.resolveOther(parsedName);
},
}
/**
Lookup the route using `resolveOther`
Expand All @@ -319,7 +309,7 @@ const DefaultResolver = EmberObject.extend({
resolveRoute(parsedName) {
this.useRouterNaming(parsedName);
return this.resolveOther(parsedName);
},
}

/**
Lookup the model on the Application namespace
Expand All @@ -334,7 +324,7 @@ const DefaultResolver = EmberObject.extend({
let factory = get(parsedName.root, className);

return factory;
},
}
/**
Look up the specified object (from parsedName) on the appropriate
namespace (usually on the Application)
Expand All @@ -346,7 +336,7 @@ const DefaultResolver = EmberObject.extend({
*/
resolveHelper(parsedName) {
return this.resolveOther(parsedName);
},
}
/**
Look up the specified object (from parsedName) on the appropriate
namespace (usually on the Application)
Expand All @@ -360,12 +350,12 @@ const DefaultResolver = EmberObject.extend({
let className = StringUtils.classify(parsedName.name) + StringUtils.classify(parsedName.type);
let factory = get(parsedName.root, className);
return factory;
},
}

resolveMain(parsedName) {
let className = StringUtils.classify(parsedName.type);
return get(parsedName.root, className);
},
}

/**
Used to iterate all items of a given type.
Expand All @@ -392,7 +382,7 @@ const DefaultResolver = EmberObject.extend({
}

return known;
},
}

/**
Converts provided name from the backing namespace into a container lookup name.
Expand All @@ -414,29 +404,27 @@ const DefaultResolver = EmberObject.extend({

return `${type}:${dasherizedName}`;
}
});
}

export default DefaultResolver;

if (DEBUG) {
DefaultResolver.reopen({
/**
@method _logLookup
@param {Boolean} found
@param {Object} parsedName
@private
*/
_logLookup(found, parsedName) {
let symbol = found ? '[✓]' : '[ ]';

let padding;
if (parsedName.fullName.length > 60) {
padding = '.';
} else {
padding = new Array(60 - parsedName.fullName.length).join('.');
}
/**
@method _logLookup
@param {Boolean} found
@param {Object} parsedName
@private
*/
DefaultResolver.prototype._logLookup = function(found, parsedName) {
let symbol = found ? '[✓]' : '[ ]';

info(symbol, parsedName.fullName, padding, this.lookupDescription(parsedName.fullName));
let padding;
if (parsedName.fullName.length > 60) {
padding = '.';
} else {
padding = new Array(60 - parsedName.fullName.length).join('.');
}
});

info(symbol, parsedName.fullName, padding, this.lookupDescription(parsedName.fullName));
};
}
Expand Up @@ -242,7 +242,7 @@ moduleFor('Components test: curly components', class extends RenderingTest {

expectAssertion(() => {
this.render('{{foo-bar}}');
}, /You cannot use a computed property for the component's `tagName` \(<\(.+>\)\./);
}, /You cannot use a computed property for the component's `tagName` \(<.+>\)\./);
}

['@test class is applied before didInsertElement'](assert) {
Expand Down Expand Up @@ -2280,7 +2280,7 @@ moduleFor('Components test: curly components', class extends RenderingTest {
assert.equal(this.$('#inner-value').text(), '1', 'initial render of inner');
assert.equal(this.$('#middle-value').text(), '', 'initial render of middle (observers do not run during init)');

let expectedBacktrackingMessage = /modified "value" twice on <\(.+> in a single render\. It was rendered in "component:x-middle" and modified in "component:x-inner"/;
let expectedBacktrackingMessage = /modified "value" twice on <[^>]+> in a single render\. It was rendered in "component:x-middle" and modified in "component:x-inner"/;

expectAssertion(() => {
this.runTask(() => outer.set('value', 2));
Expand Down

0 comments on commit 0e34d44

Please sign in to comment.