Skip to content

Commit 4b46561

Browse files
committed
Merge pull request #16757 from emberjs/core-object-extend
Make CoreObject rely more on ES2015 class features and interop better. (cherry picked from commit d424af0)
1 parent b409658 commit 4b46561

File tree

13 files changed

+778
-498
lines changed

13 files changed

+778
-498
lines changed

packages/ember-application/lib/system/engine.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ Engine.reopenClass({
455455
@return {*} the resolved value for a given lookup
456456
*/
457457
function resolverFor(namespace) {
458-
let ResolverClass = namespace.get('Resolver') || DefaultResolver;
458+
let ResolverClass = get(namespace, 'Resolver') || DefaultResolver;
459459

460460
return ResolverClass.create({
461461
namespace

packages/ember-application/lib/system/resolver.js

+43-55
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,6 @@ import validateType from '../utils/validate-type';
1414
import { getTemplate } from 'ember-glimmer';
1515
import { DEBUG } from 'ember-env-flags';
1616

17-
export const Resolver = EmberObject.extend({
18-
/*
19-
This will be set to the Application instance when it is
20-
created.
21-
22-
@property namespace
23-
*/
24-
namespace: null,
25-
normalize: null, // required
26-
resolve: null, // required
27-
parseName: null, // required
28-
lookupDescription: null, // required
29-
makeToString: null, // required
30-
resolveOther: null, // required
31-
_logLookup: null // required
32-
});
33-
3417
/**
3518
The DefaultResolver defines the default lookup rules to resolve
3619
container lookups before consulting the container for registered
@@ -100,19 +83,26 @@ export const Resolver = EmberObject.extend({
10083
@public
10184
*/
10285

103-
const DefaultResolver = EmberObject.extend({
86+
class DefaultResolver extends EmberObject {
87+
// Workaround for weird JIT bug with FireFox and our test suite.
88+
static create(props) {
89+
return super.create(props);
90+
}
91+
10492
/**
10593
This will be set to the Application instance when it is
10694
created.
10795
10896
@property namespace
10997
@public
11098
*/
111-
namespace: null,
11299

113100
init() {
101+
if (this.namespace == null) {
102+
throw new Error('missing namespace');
103+
}
114104
this._parseNameCache = dictionary(null);
115-
},
105+
}
116106

117107
normalize(fullName) {
118108
let [ type, name ] = fullName.split(':');
@@ -132,7 +122,7 @@ const DefaultResolver = EmberObject.extend({
132122
} else {
133123
return fullName;
134124
}
135-
},
125+
}
136126

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

168158
return resolved;
169-
},
159+
}
170160

171161
/**
172162
Convert the string name of the form 'type:name' to
@@ -182,7 +172,7 @@ const DefaultResolver = EmberObject.extend({
182172
return this._parseNameCache[fullName] || (
183173
(this._parseNameCache[fullName] = this._parseName(fullName))
184174
);
185-
},
175+
}
186176

187177
_parseName(fullName) {
188178
let [ type, fullNameWithoutType ] = fullName.split(':');
@@ -220,7 +210,7 @@ const DefaultResolver = EmberObject.extend({
220210
root,
221211
resolveMethodName: `resolve${resolveMethodName}`
222212
};
223-
},
213+
}
224214

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

249239
return description;
250-
},
240+
}
251241

252242
makeToString(factory) {
253243
return factory.toString();
254-
},
244+
}
255245

256246
/**
257247
Given a parseName object (output from `parseName`), apply
@@ -268,7 +258,7 @@ const DefaultResolver = EmberObject.extend({
268258
} else {
269259
parsedName.name = parsedName.name.replace(/\./g, '_');
270260
}
271-
},
261+
}
272262
/**
273263
Look up the template in Ember.TEMPLATES
274264
@@ -281,7 +271,7 @@ const DefaultResolver = EmberObject.extend({
281271
let templateName = parsedName.fullNameWithoutType.replace(/\./g, '/');
282272

283273
return getTemplate(templateName) || getTemplate(StringUtils.decamelize(templateName));
284-
},
274+
}
285275

286276
/**
287277
Lookup the view using `resolveOther`
@@ -294,7 +284,7 @@ const DefaultResolver = EmberObject.extend({
294284
resolveView(parsedName) {
295285
this.useRouterNaming(parsedName);
296286
return this.resolveOther(parsedName);
297-
},
287+
}
298288

299289
/**
300290
Lookup the controller using `resolveOther`
@@ -307,7 +297,7 @@ const DefaultResolver = EmberObject.extend({
307297
resolveController(parsedName) {
308298
this.useRouterNaming(parsedName);
309299
return this.resolveOther(parsedName);
310-
},
300+
}
311301
/**
312302
Lookup the route using `resolveOther`
313303
@@ -319,7 +309,7 @@ const DefaultResolver = EmberObject.extend({
319309
resolveRoute(parsedName) {
320310
this.useRouterNaming(parsedName);
321311
return this.resolveOther(parsedName);
322-
},
312+
}
323313

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

336326
return factory;
337-
},
327+
}
338328
/**
339329
Look up the specified object (from parsedName) on the appropriate
340330
namespace (usually on the Application)
@@ -346,7 +336,7 @@ const DefaultResolver = EmberObject.extend({
346336
*/
347337
resolveHelper(parsedName) {
348338
return this.resolveOther(parsedName);
349-
},
339+
}
350340
/**
351341
Look up the specified object (from parsedName) on the appropriate
352342
namespace (usually on the Application)
@@ -360,12 +350,12 @@ const DefaultResolver = EmberObject.extend({
360350
let className = StringUtils.classify(parsedName.name) + StringUtils.classify(parsedName.type);
361351
let factory = get(parsedName.root, className);
362352
return factory;
363-
},
353+
}
364354

365355
resolveMain(parsedName) {
366356
let className = StringUtils.classify(parsedName.type);
367357
return get(parsedName.root, className);
368-
},
358+
}
369359

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

394384
return known;
395-
},
385+
}
396386

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

415405
return `${type}:${dasherizedName}`;
416406
}
417-
});
407+
}
418408

419409
export default DefaultResolver;
420410

421411
if (DEBUG) {
422-
DefaultResolver.reopen({
423-
/**
424-
@method _logLookup
425-
@param {Boolean} found
426-
@param {Object} parsedName
427-
@private
428-
*/
429-
_logLookup(found, parsedName) {
430-
let symbol = found ? '[✓]' : '[ ]';
431-
432-
let padding;
433-
if (parsedName.fullName.length > 60) {
434-
padding = '.';
435-
} else {
436-
padding = new Array(60 - parsedName.fullName.length).join('.');
437-
}
412+
/**
413+
@method _logLookup
414+
@param {Boolean} found
415+
@param {Object} parsedName
416+
@private
417+
*/
418+
DefaultResolver.prototype._logLookup = function(found, parsedName) {
419+
let symbol = found ? '[✓]' : '[ ]';
438420

439-
info(symbol, parsedName.fullName, padding, this.lookupDescription(parsedName.fullName));
421+
let padding;
422+
if (parsedName.fullName.length > 60) {
423+
padding = '.';
424+
} else {
425+
padding = new Array(60 - parsedName.fullName.length).join('.');
440426
}
441-
});
427+
428+
info(symbol, parsedName.fullName, padding, this.lookupDescription(parsedName.fullName));
429+
};
442430
}

packages/ember-glimmer/tests/integration/components/curly-components-test.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ moduleFor('Components test: curly components', class extends RenderingTest {
242242

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

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

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

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

0 commit comments

Comments
 (0)