diff --git a/packages/@ember/-internals/glimmer/tests/integration/application/debug-render-tree-test.ts b/packages/@ember/-internals/glimmer/tests/integration/application/debug-render-tree-test.ts index 26c9f6ae46c..a76b364b554 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/application/debug-render-tree-test.ts +++ b/packages/@ember/-internals/glimmer/tests/integration/application/debug-render-tree-test.ts @@ -1,4 +1,9 @@ -import { ApplicationTestCase, moduleFor, strip } from 'internal-test-helpers'; +import { + ApplicationTestCase, + ModuleBasedTestResolver, + moduleFor, + strip, +} from 'internal-test-helpers'; import { ENV } from '@ember/-internals/environment'; import { @@ -292,6 +297,7 @@ if (ENV._DEBUG_RENDER_TREE) { 'engine:foo', class extends Engine { isFooEngine = true; + Resolver = ModuleBasedTestResolver; init() { super.init(...arguments); @@ -327,6 +333,8 @@ if (ENV._DEBUG_RENDER_TREE) { this.add( 'engine:bar', class extends Engine { + Resolver = ModuleBasedTestResolver; + init() { super.init(...arguments); this.register( @@ -670,6 +678,7 @@ if (ENV._DEBUG_RENDER_TREE) { 'engine:foo', class extends Engine { isFooEngine = true; + Resolver = ModuleBasedTestResolver; init() { super.init(...arguments); diff --git a/packages/@ember/-internals/glimmer/tests/integration/application/engine-test.js b/packages/@ember/-internals/glimmer/tests/integration/application/engine-test.js index b9e95a4c745..9185b32f3d1 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/application/engine-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/application/engine-test.js @@ -1,4 +1,10 @@ -import { moduleFor, ApplicationTestCase, strip, runTaskNext } from 'internal-test-helpers'; +import { + moduleFor, + ApplicationTestCase, + ModuleBasedTestResolver, + strip, + runTaskNext, +} from 'internal-test-helpers'; import { Component } from '@ember/-internals/glimmer'; import { Route } from '@ember/-internals/routing'; @@ -80,6 +86,8 @@ moduleFor( this.add( 'engine:blog', Engine.extend({ + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register( @@ -131,6 +139,8 @@ moduleFor( this.add( 'engine:chat-engine', Engine.extend({ + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register('template:application', compile('Engine')); @@ -167,6 +177,8 @@ moduleFor( this.add( 'engine:blog', Engine.extend({ + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register('template:foo', compile('foo partial')); @@ -202,6 +214,8 @@ moduleFor( this.add( 'engine:chat-engine', Engine.extend({ + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register('template:foo', compile('foo partial')); @@ -230,6 +244,8 @@ moduleFor( this.add( 'engine:chat-engine', Engine.extend({ + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register('template:components/foo-bar', compile(`{{partial "troll"}}`)); @@ -289,6 +305,8 @@ moduleFor( this.add( 'engine:blog', Engine.extend({ + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); @@ -344,6 +362,8 @@ moduleFor( this.add( 'engine:blog', Engine.extend({ + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register( @@ -486,6 +506,8 @@ moduleFor( this.add( 'engine:blog', Engine.extend({ + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register('template:application', compile('Engine{{outlet}}')); diff --git a/packages/@ember/-internals/glimmer/tests/integration/mount-test.js b/packages/@ember/-internals/glimmer/tests/integration/mount-test.js index f76fe425763..0cbbfffea96 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/mount-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/mount-test.js @@ -1,4 +1,10 @@ -import { moduleFor, ApplicationTestCase, RenderingTestCase, runTask } from 'internal-test-helpers'; +import { + moduleFor, + ApplicationTestCase, + ModuleBasedTestResolver, + RenderingTestCase, + runTask, +} from 'internal-test-helpers'; import { set } from '@ember/-internals/metal'; import { getOwner } from '@ember/-internals/owner'; @@ -48,6 +54,7 @@ moduleFor( 'engine:chat', Engine.extend({ router: null, + Resolver: ModuleBasedTestResolver, init() { this._super(...arguments); @@ -165,6 +172,8 @@ moduleFor( 'engine:foo', Engine.extend({ router: null, + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register( @@ -180,6 +189,8 @@ moduleFor( 'engine:bar', Engine.extend({ router: null, + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register( @@ -244,6 +255,8 @@ moduleFor( 'engine:foo', Engine.extend({ router: null, + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register( @@ -299,6 +312,8 @@ moduleFor( 'engine:paramEngine', Engine.extend({ router: null, + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register( @@ -393,6 +408,8 @@ moduleFor( 'engine:componentParamEngine', Engine.extend({ router: null, + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register( @@ -429,6 +446,8 @@ if (!EMBER_ROUTING_MODEL_ARG) { 'engine:paramEngine', Engine.extend({ router: null, + Resolver: ModuleBasedTestResolver, + init() { this._super(...arguments); this.register( diff --git a/packages/@ember/application/globals-resolver.js b/packages/@ember/application/globals-resolver.js index 7b3aa536221..c75174a5a97 100644 --- a/packages/@ember/application/globals-resolver.js +++ b/packages/@ember/application/globals-resolver.js @@ -4,11 +4,12 @@ import { dictionary } from '@ember/-internals/utils'; import { get, findNamespace } from '@ember/-internals/metal'; -import { assert, info } from '@ember/debug'; +import { assert, info, deprecate } from '@ember/debug'; import { capitalize, classify, dasherize, decamelize } from '@ember/string'; import { Object as EmberObject } from '@ember/-internals/runtime'; import { getTemplate } from '@ember/-internals/glimmer'; import { DEBUG } from '@glimmer/env'; +import { GLOBALS_RESOLVER } from '@ember/deprecated-features'; /** The DefaultResolver defines the default lookup rules to resolve @@ -77,365 +78,384 @@ import { DEBUG } from '@glimmer/env'; @class GlobalsResolver @extends EmberObject @public + @deprecated */ -class DefaultResolver extends EmberObject { - static create(props) { - // DO NOT REMOVE even though this doesn't do anything - // This is required for a FireFox 60+ JIT bug with our tests. - // without it, create(props) in our tests would lose props on a deopt. - return super.create(props); - } +let DefaultResolver; - /** - This will be set to the Application instance when it is - created. +if (GLOBALS_RESOLVER) { + DefaultResolver = class DefaultResolver extends EmberObject { + static create(props) { + // DO NOT REMOVE even though this doesn't do anything + // This is required for a FireFox 60+ JIT bug with our tests. + // without it, create(props) in our tests would lose props on a deopt. + return super.create(props); + } - @property namespace - @public - */ + /** + This will be set to the Application instance when it is + created. - init() { - this._parseNameCache = dictionary(null); - } + @property namespace + @public + @deprecated + */ - normalize(fullName) { - let [type, name] = fullName.split(':'); + init() { + deprecate( + 'Using the globals resolver is deprecated. Use the ember-resolver package instead. See https://deprecations.emberjs.com/v3.x#toc_ember-deprecate-globals-resolver', + false, + { + until: '4.0.0', + id: 'globals-resolver', + url: 'https://deprecations.emberjs.com/v3.x#toc_ember-deprecate-globals-resolver', + } + ); - assert( - 'Tried to normalize a container name without a colon (:) in it. ' + - 'You probably tried to lookup a name that did not contain a type, ' + - 'a colon, and a name. A proper lookup name would be `view:post`.', - fullName.split(':').length === 2 - ); + this._parseNameCache = dictionary(null); + } - if (type !== 'template') { - let result = name.replace(/(\.|_|-)./g, m => m.charAt(1).toUpperCase()); + normalize(fullName) { + let [type, name] = fullName.split(':'); - return `${type}:${result}`; - } else { - return fullName; - } - } + assert( + 'Tried to normalize a container name without a colon (:) in it. ' + + 'You probably tried to lookup a name that did not contain a type, ' + + 'a colon, and a name. A proper lookup name would be `view:post`.', + fullName.split(':').length === 2 + ); - /** - This method is called via the container's resolver method. - It parses the provided `fullName` and then looks up and - returns the appropriate template or class. - - @method resolve - @param {String} fullName the lookup string - @return {Object} the resolved factory - @public - */ - resolve(fullName) { - let parsedName = this.parseName(fullName); - let resolveMethodName = parsedName.resolveMethodName; - let resolved; - - if (this[resolveMethodName]) { - resolved = this[resolveMethodName](parsedName); + if (type !== 'template') { + let result = name.replace(/(\.|_|-)./g, m => m.charAt(1).toUpperCase()); + + return `${type}:${result}`; + } else { + return fullName; + } } - resolved = resolved || this.resolveOther(parsedName); + /** + This method is called via the container's resolver method. + It parses the provided `fullName` and then looks up and + returns the appropriate template or class. - if (DEBUG) { - if (parsedName.root && parsedName.root.LOG_RESOLVER) { - this._logLookup(resolved, parsedName); - } + @method resolve + @param {String} fullName the lookup string + @return {Object} the resolved factory + @public + */ + resolve(fullName) { + let parsedName = this.parseName(fullName); + let resolveMethodName = parsedName.resolveMethodName; + let resolved; - if (resolved) { - let VALIDATED_TYPES = { - route: ['isRouteFactory', 'Ember.Route'], - component: ['isComponentFactory', 'Ember.Component'], - view: ['isViewFactory', 'Ember.View'], - service: ['isServiceFactory', 'Ember.Service'], - }; + if (this[resolveMethodName]) { + resolved = this[resolveMethodName](parsedName); + } - let validationAttributes = VALIDATED_TYPES[parsedName.type]; + resolved = resolved || this.resolveOther(parsedName); - if (validationAttributes) { - let [factoryFlag, expectedType] = validationAttributes; + if (DEBUG) { + if (parsedName.root && parsedName.root.LOG_RESOLVER) { + this._logLookup(resolved, parsedName); + } - assert( - `Expected ${parsedName.fullName} to resolve to an ${expectedType} but ` + - `instead it was ${resolved}.`, - Boolean(resolved[factoryFlag]) - ); + if (resolved) { + let VALIDATED_TYPES = { + route: ['isRouteFactory', 'Ember.Route'], + component: ['isComponentFactory', 'Ember.Component'], + view: ['isViewFactory', 'Ember.View'], + service: ['isServiceFactory', 'Ember.Service'], + }; + + let validationAttributes = VALIDATED_TYPES[parsedName.type]; + + if (validationAttributes) { + let [factoryFlag, expectedType] = validationAttributes; + + assert( + `Expected ${parsedName.fullName} to resolve to an ${expectedType} but ` + + `instead it was ${resolved}.`, + Boolean(resolved[factoryFlag]) + ); + } } } - } - return resolved; - } + return resolved; + } - /** - Convert the string name of the form 'type:name' to - a Javascript object with the parsed aspects of the name - broken out. + /** + Convert the string name of the form 'type:name' to + a Javascript object with the parsed aspects of the name + broken out. - @param {String} fullName the lookup string - @method parseName - @protected - */ + @param {String} fullName the lookup string + @method parseName + @protected + */ - parseName(fullName) { - return ( - this._parseNameCache[fullName] || (this._parseNameCache[fullName] = this._parseName(fullName)) - ); - } + parseName(fullName) { + return ( + this._parseNameCache[fullName] || + (this._parseNameCache[fullName] = this._parseName(fullName)) + ); + } - _parseName(fullName) { - let [type, fullNameWithoutType] = fullName.split(':'); + _parseName(fullName) { + let [type, fullNameWithoutType] = fullName.split(':'); + + let name = fullNameWithoutType; + let namespace = get(this, 'namespace'); + let root = namespace; + let lastSlashIndex = name.lastIndexOf('/'); + let dirname = lastSlashIndex !== -1 ? name.slice(0, lastSlashIndex) : null; + + if (type !== 'template' && lastSlashIndex !== -1) { + let parts = name.split('/'); + name = parts[parts.length - 1]; + let namespaceName = capitalize(parts.slice(0, -1).join('.')); + root = findNamespace(namespaceName); + + assert( + `You are looking for a ${name} ${type} in the ${namespaceName} namespace, but the namespace could not be found`, + root + ); + } - let name = fullNameWithoutType; - let namespace = get(this, 'namespace'); - let root = namespace; - let lastSlashIndex = name.lastIndexOf('/'); - let dirname = lastSlashIndex !== -1 ? name.slice(0, lastSlashIndex) : null; + let resolveMethodName = fullNameWithoutType === 'main' ? 'Main' : classify(type); - if (type !== 'template' && lastSlashIndex !== -1) { - let parts = name.split('/'); - name = parts[parts.length - 1]; - let namespaceName = capitalize(parts.slice(0, -1).join('.')); - root = findNamespace(namespaceName); + if (!(name && type)) { + throw new TypeError( + `Invalid fullName: \`${fullName}\`, must be of the form \`type:name\` ` + ); + } - assert( - `You are looking for a ${name} ${type} in the ${namespaceName} namespace, but the namespace could not be found`, - root - ); + return { + fullName, + type, + fullNameWithoutType, + dirname, + name, + root, + resolveMethodName: `resolve${resolveMethodName}`, + }; } - let resolveMethodName = fullNameWithoutType === 'main' ? 'Main' : classify(type); + /** + Returns a human-readable description for a fullName. Used by the + Application namespace in assertions to describe the + precise name of the class that Ember is looking for, rather than + container keys. - if (!(name && type)) { - throw new TypeError(`Invalid fullName: \`${fullName}\`, must be of the form \`type:name\` `); - } + @param {String} fullName the lookup string + @method lookupDescription + @protected + */ + lookupDescription(fullName) { + let parsedName = this.parseName(fullName); + let description; - return { - fullName, - type, - fullNameWithoutType, - dirname, - name, - root, - resolveMethodName: `resolve${resolveMethodName}`, - }; - } + if (parsedName.type === 'template') { + return `template at ${parsedName.fullNameWithoutType.replace(/\./g, '/')}`; + } - /** - Returns a human-readable description for a fullName. Used by the - Application namespace in assertions to describe the - precise name of the class that Ember is looking for, rather than - container keys. - - @param {String} fullName the lookup string - @method lookupDescription - @protected - */ - lookupDescription(fullName) { - let parsedName = this.parseName(fullName); - let description; - - if (parsedName.type === 'template') { - return `template at ${parsedName.fullNameWithoutType.replace(/\./g, '/')}`; - } + description = `${parsedName.root}.${classify(parsedName.name).replace(/\./g, '')}`; - description = `${parsedName.root}.${classify(parsedName.name).replace(/\./g, '')}`; + if (parsedName.type !== 'model') { + description += classify(parsedName.type); + } - if (parsedName.type !== 'model') { - description += classify(parsedName.type); + return description; } - return description; - } + makeToString(factory) { + return factory.toString(); + } - makeToString(factory) { - return factory.toString(); - } + /** + Given a parseName object (output from `parseName`), apply + the conventions expected by `Router` - /** - Given a parseName object (output from `parseName`), apply - the conventions expected by `Router` - - @param {Object} parsedName a parseName object with the parsed - fullName lookup string - @method useRouterNaming - @protected - */ - useRouterNaming(parsedName) { - if (parsedName.name === 'basic') { - parsedName.name = ''; - } else { - parsedName.name = parsedName.name.replace(/\./g, '_'); + @param {Object} parsedName a parseName object with the parsed + fullName lookup string + @method useRouterNaming + @protected + */ + useRouterNaming(parsedName) { + if (parsedName.name === 'basic') { + parsedName.name = ''; + } else { + parsedName.name = parsedName.name.replace(/\./g, '_'); + } } - } - /** - Look up the template in Ember.TEMPLATES - - @param {Object} parsedName a parseName object with the parsed - fullName lookup string - @method resolveTemplate - @protected - */ - resolveTemplate(parsedName) { - let templateName = parsedName.fullNameWithoutType.replace(/\./g, '/'); - - return getTemplate(templateName) || getTemplate(decamelize(templateName)); - } + /** + Look up the template in Ember.TEMPLATES - /** - Lookup the view using `resolveOther` - - @param {Object} parsedName a parseName object with the parsed - fullName lookup string - @method resolveView - @protected - */ - resolveView(parsedName) { - this.useRouterNaming(parsedName); - return this.resolveOther(parsedName); - } + @param {Object} parsedName a parseName object with the parsed + fullName lookup string + @method resolveTemplate + @protected + */ + resolveTemplate(parsedName) { + let templateName = parsedName.fullNameWithoutType.replace(/\./g, '/'); - /** - Lookup the controller using `resolveOther` - - @param {Object} parsedName a parseName object with the parsed - fullName lookup string - @method resolveController - @protected - */ - resolveController(parsedName) { - this.useRouterNaming(parsedName); - return this.resolveOther(parsedName); - } - /** - Lookup the route using `resolveOther` - - @param {Object} parsedName a parseName object with the parsed - fullName lookup string - @method resolveRoute - @protected - */ - resolveRoute(parsedName) { - this.useRouterNaming(parsedName); - return this.resolveOther(parsedName); - } + return getTemplate(templateName) || getTemplate(decamelize(templateName)); + } - /** - Lookup the model on the Application namespace + /** + Lookup the view using `resolveOther` - @param {Object} parsedName a parseName object with the parsed - fullName lookup string - @method resolveModel - @protected - */ - resolveModel(parsedName) { - let className = classify(parsedName.name); - let factory = get(parsedName.root, className); + @param {Object} parsedName a parseName object with the parsed + fullName lookup string + @method resolveView + @protected + */ + resolveView(parsedName) { + this.useRouterNaming(parsedName); + return this.resolveOther(parsedName); + } - return factory; - } - /** - Look up the specified object (from parsedName) on the appropriate - namespace (usually on the Application) - - @param {Object} parsedName a parseName object with the parsed - fullName lookup string - @method resolveHelper - @protected - */ - resolveHelper(parsedName) { - return this.resolveOther(parsedName); - } - /** - Look up the specified object (from parsedName) on the appropriate - namespace (usually on the Application) - - @param {Object} parsedName a parseName object with the parsed - fullName lookup string - @method resolveOther - @protected - */ - resolveOther(parsedName) { - let className = classify(parsedName.name) + classify(parsedName.type); - let factory = get(parsedName.root, className); - return factory; - } + /** + Lookup the controller using `resolveOther` - resolveMain(parsedName) { - let className = classify(parsedName.type); - return get(parsedName.root, className); - } + @param {Object} parsedName a parseName object with the parsed + fullName lookup string + @method resolveController + @protected + */ + resolveController(parsedName) { + this.useRouterNaming(parsedName); + return this.resolveOther(parsedName); + } + /** + Lookup the route using `resolveOther` - /** - Used to iterate all items of a given type. + @param {Object} parsedName a parseName object with the parsed + fullName lookup string + @method resolveRoute + @protected + */ + resolveRoute(parsedName) { + this.useRouterNaming(parsedName); + return this.resolveOther(parsedName); + } - @method knownForType - @param {String} type the type to search for - @private - */ - knownForType(type) { - let namespace = get(this, 'namespace'); - let suffix = classify(type); - let typeRegexp = new RegExp(`${suffix}$`); + /** + Lookup the model on the Application namespace - let known = dictionary(null); - let knownKeys = Object.keys(namespace); - for (let index = 0; index < knownKeys.length; index++) { - let name = knownKeys[index]; + @param {Object} parsedName a parseName object with the parsed + fullName lookup string + @method resolveModel + @protected + */ + resolveModel(parsedName) { + let className = classify(parsedName.name); + let factory = get(parsedName.root, className); - if (typeRegexp.test(name)) { - let containerName = this.translateToContainerFullname(type, name); + return factory; + } + /** + Look up the specified object (from parsedName) on the appropriate + namespace (usually on the Application) + + @param {Object} parsedName a parseName object with the parsed + fullName lookup string + @method resolveHelper + @protected + */ + resolveHelper(parsedName) { + return this.resolveOther(parsedName); + } + /** + Look up the specified object (from parsedName) on the appropriate + namespace (usually on the Application) + + @param {Object} parsedName a parseName object with the parsed + fullName lookup string + @method resolveOther + @protected + */ + resolveOther(parsedName) { + let className = classify(parsedName.name) + classify(parsedName.type); + let factory = get(parsedName.root, className); + return factory; + } - known[containerName] = true; - } + resolveMain(parsedName) { + let className = classify(parsedName.type); + return get(parsedName.root, className); } - return known; - } + /** + Used to iterate all items of a given type. - /** - Converts provided name from the backing namespace into a container lookup name. + @method knownForType + @param {String} type the type to search for + @private + */ + knownForType(type) { + let namespace = get(this, 'namespace'); + let suffix = classify(type); + let typeRegexp = new RegExp(`${suffix}$`); - Examples: + let known = dictionary(null); + let knownKeys = Object.keys(namespace); + for (let index = 0; index < knownKeys.length; index++) { + let name = knownKeys[index]; - * App.FooBarHelper -> helper:foo-bar - * App.THelper -> helper:t + if (typeRegexp.test(name)) { + let containerName = this.translateToContainerFullname(type, name); - @method translateToContainerFullname - @param {String} type - @param {String} name - @private - */ - translateToContainerFullname(type, name) { - let suffix = classify(type); - let namePrefix = name.slice(0, suffix.length * -1); - let dasherizedName = dasherize(namePrefix); + known[containerName] = true; + } + } - return `${type}:${dasherizedName}`; - } -} + return known; + } -export default DefaultResolver; + /** + Converts provided name from the backing namespace into a container lookup name. + + Examples: -if (DEBUG) { - /** - @method _logLookup - @param {Boolean} found - @param {Object} parsedName + * App.FooBarHelper -> helper:foo-bar + * App.THelper -> helper:t + + @method translateToContainerFullname + @param {String} type + @param {String} name @private */ - DefaultResolver.prototype._logLookup = function(found, parsedName) { - let symbol = found ? '[✓]' : '[ ]'; - - let padding; - if (parsedName.fullName.length > 60) { - padding = '.'; - } else { - padding = new Array(60 - parsedName.fullName.length).join('.'); - } + translateToContainerFullname(type, name) { + let suffix = classify(type); + let namePrefix = name.slice(0, suffix.length * -1); + let dasherizedName = dasherize(namePrefix); - info(symbol, parsedName.fullName, padding, this.lookupDescription(parsedName.fullName)); + return `${type}:${dasherizedName}`; + } }; + + if (DEBUG) { + /** + @method _logLookup + @param {Boolean} found + @param {Object} parsedName + @private + */ + DefaultResolver.prototype._logLookup = function(found, parsedName) { + let symbol = found ? '[✓]' : '[ ]'; + + 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)); + }; + } } + +export default DefaultResolver; diff --git a/packages/@ember/application/tests/application_instance_test.js b/packages/@ember/application/tests/application_instance_test.js index 8000d48b668..128b13217e4 100644 --- a/packages/@ember/application/tests/application_instance_test.js +++ b/packages/@ember/application/tests/application_instance_test.js @@ -5,7 +5,11 @@ import { run } from '@ember/runloop'; import { privatize as P } from '@ember/-internals/container'; import { factory } from 'internal-test-helpers'; import { Object as EmberObject } from '@ember/-internals/runtime'; -import { moduleFor, AbstractTestCase as TestCase } from 'internal-test-helpers'; +import { + moduleFor, + ModuleBasedTestResolver, + AbstractTestCase as TestCase, +} from 'internal-test-helpers'; import { getDebugFunction, setDebugFunction } from '@ember/debug'; const originalDebug = getDebugFunction('debug'); @@ -23,7 +27,13 @@ moduleFor( document.getElementById('qunit-fixture').innerHTML = `
HI
HI
`; - application = run(() => Application.create({ rootElement: '#one', router: null })); + application = run(() => + Application.create({ + rootElement: '#one', + router: null, + Resolver: ModuleBasedTestResolver, + }) + ); } teardown() { @@ -167,7 +177,9 @@ moduleFor( ['@test can build and boot a registered engine'](assert) { assert.expect(11); - let ChatEngine = Engine.extend(); + let ChatEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); let chatEngineInstance; application.register('engine:chat', ChatEngine); diff --git a/packages/@ember/application/tests/dependency_injection/default_resolver_test.js b/packages/@ember/application/tests/dependency_injection/default_resolver_test.js index 9a93484658c..d55b6e5fb38 100644 --- a/packages/@ember/application/tests/dependency_injection/default_resolver_test.js +++ b/packages/@ember/application/tests/dependency_injection/default_resolver_test.js @@ -11,7 +11,7 @@ import { Component, Helper, helper as makeHelper } from '@ember/-internals/glimm import { getDebugFunction, setDebugFunction } from '@ember/debug'; moduleFor( - 'Application Dependency Injection - Integration - default resolver', + 'Application Dependency Injection - Integration - globals resolver [DEPRECATED]', class extends DefaultResolverApplicationTestCase { beforeEach() { runTask(() => this.createApplication()); @@ -161,6 +161,22 @@ moduleFor( }, /fullName must be a proper full name/); } + ['@test the default resolver normalizes lookups'](assert) { + let locator = this.applicationInstance.__container__; + this.application.PostIndexController = EmberObject.extend({}); + this.application.register('controller:postIndex', this.application.PostIndexController, { + singleton: true, + }); + + let dotNotationController = locator.lookup('controller:post.index'); + let camelCaseController = locator.lookup('controller:postIndex'); + + assert.ok(dotNotationController instanceof this.application.PostIndexController); + assert.ok(camelCaseController instanceof this.application.PostIndexController); + + assert.equal(dotNotationController, camelCaseController); + } + /* * The following are integration tests against the private registry API. */ @@ -198,6 +214,7 @@ moduleFor( } [`@test no assertion for routes that extend from Route`](assert) { + assert.test.assertions = []; // clear assertions that occurred in beforeEach so they don't affect count assert.expect(0); this.application.FooRoute = Route.extend(); this.privateRegistry.resolve(`route:foo`); @@ -211,6 +228,7 @@ moduleFor( } [`@test no assertion for service factories that extend from Service`](assert) { + assert.test.assertions = []; // clear assertions that occurred in beforeEach so they don't affect count assert.expect(0); this.application.FooService = Service.extend(); this.privateRegistry.resolve('service:foo'); @@ -309,6 +327,7 @@ moduleFor( return; } + assert.test.assertions = []; // clear assertions that occurred in beforeEach so they don't affect count assert.expect(3); this.application.LOG_RESOLVER = true; @@ -330,6 +349,7 @@ moduleFor( return; } + assert.test.assertions = []; // clear assertions that occurred in beforeEach so they don't affect count assert.expect(3); this.application.LOG_RESOLVER = true; diff --git a/packages/@ember/application/tests/dependency_injection/normalization_test.js b/packages/@ember/application/tests/dependency_injection/normalization_test.js index 5cb30c63719..93dd728588d 100644 --- a/packages/@ember/application/tests/dependency_injection/normalization_test.js +++ b/packages/@ember/application/tests/dependency_injection/normalization_test.js @@ -5,12 +5,17 @@ import { moduleFor, AbstractTestCase as TestCase } from 'internal-test-helpers'; let application, registry; moduleFor( - 'Application Dependency Injection - normalize', + 'Application Dependency Injection - Globals Resolver - normalize [DEPRECATED]', class extends TestCase { constructor() { super(); - application = run(Application, 'create'); + // Must use default resolver because test resolver does not normalize + run(() => { + expectDeprecation(() => { + application = Application.create(); + }); + }); registry = application.__registry__; } diff --git a/packages/@ember/application/tests/dependency_injection_test.js b/packages/@ember/application/tests/dependency_injection_test.js index 1aac565f728..e146032512d 100644 --- a/packages/@ember/application/tests/dependency_injection_test.js +++ b/packages/@ember/application/tests/dependency_injection_test.js @@ -2,7 +2,11 @@ import { context } from '@ember/-internals/environment'; import { run } from '@ember/runloop'; import { Object as EmberObject } from '@ember/-internals/runtime'; import EmberApplication from '@ember/application'; -import { moduleFor, AbstractTestCase as TestCase } from 'internal-test-helpers'; +import { + moduleFor, + ModuleBasedTestResolver, + AbstractTestCase as TestCase, +} from 'internal-test-helpers'; let originalLookup = context.lookup; let registry, locator, application; @@ -13,7 +17,9 @@ moduleFor( constructor() { super(); - application = run(EmberApplication, 'create'); + application = run(EmberApplication, 'create', { + Resolver: ModuleBasedTestResolver, + }); application.Person = EmberObject.extend({}); application.Orange = EmberObject.extend({}); @@ -48,16 +54,6 @@ moduleFor( context.lookup = originalLookup; } - ['@test container lookup is normalized'](assert) { - let dotNotationController = locator.lookup('controller:post.index'); - let camelCaseController = locator.lookup('controller:postIndex'); - - assert.ok(dotNotationController instanceof application.PostIndexController); - assert.ok(camelCaseController instanceof application.PostIndexController); - - assert.equal(dotNotationController, camelCaseController); - } - ['@test registered entities can be looked up later'](assert) { assert.equal(registry.resolve('model:person'), application.Person); assert.equal(registry.resolve('model:user'), application.User); diff --git a/packages/@ember/application/tests/readiness_test.js b/packages/@ember/application/tests/readiness_test.js index 3173b889ff3..ebe9e6cf0d3 100644 --- a/packages/@ember/application/tests/readiness_test.js +++ b/packages/@ember/application/tests/readiness_test.js @@ -1,4 +1,4 @@ -import { moduleFor, ApplicationTestCase } from 'internal-test-helpers'; +import { moduleFor, ModuleBasedTestResolver, ApplicationTestCase } from 'internal-test-helpers'; import { run } from '@ember/runloop'; import EmberApplication from '..'; @@ -45,6 +45,7 @@ moduleFor( Application = EmberApplication.extend({ $: jQuery, + Resolver: ModuleBasedTestResolver, ready() { readyWasCalled++; diff --git a/packages/@ember/application/tests/visit_test.js b/packages/@ember/application/tests/visit_test.js index 785de3119f3..c5e9ff314e3 100644 --- a/packages/@ember/application/tests/visit_test.js +++ b/packages/@ember/application/tests/visit_test.js @@ -1,4 +1,9 @@ -import { moduleFor, ApplicationTestCase, runTask } from 'internal-test-helpers'; +import { + moduleFor, + ModuleBasedTestResolver, + ApplicationTestCase, + runTask, +} from 'internal-test-helpers'; import { inject as injectService } from '@ember/service'; import { Object as EmberObject, RSVP, onerrorDefault } from '@ember/-internals/runtime'; import { later } from '@ember/runloop'; @@ -465,7 +470,9 @@ moduleFor( this.addTemplate('application', '

Hello world

'); // Register engine - let BlogEngine = Engine.extend(); + let BlogEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); this.add('engine:blog', BlogEngine); // Register engine route map @@ -502,6 +509,8 @@ moduleFor( // Register engine let BlogEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + init(...args) { this._super.apply(this, args); this.register('template:application', compile('{{cache-money}}')); @@ -544,6 +553,8 @@ moduleFor( // Register engine let BlogEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + init(...args) { this._super.apply(this, args); this.register('template:application', compile('{{cache-money}}')); @@ -582,6 +593,8 @@ moduleFor( // Register engine let BlogEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + init(...args) { this._super.apply(this, args); this.register('template:application', compile('{{swag}}')); diff --git a/packages/@ember/deprecated-features/index.ts b/packages/@ember/deprecated-features/index.ts index 5f5e9cff49f..d38c8bf6697 100644 --- a/packages/@ember/deprecated-features/index.ts +++ b/packages/@ember/deprecated-features/index.ts @@ -16,3 +16,4 @@ export const FUNCTION_PROTOTYPE_EXTENSIONS = !!'3.11.0-beta.1'; export const MOUSE_ENTER_LEAVE_MOVE_EVENTS = !!'3.13.0-beta.1'; export const EMBER_COMPONENT_IS_VISIBLE = !!'3.15.0-beta.1'; export const PARTIALS = !!'3.15.0-beta.1'; +export const GLOBALS_RESOLVER = !!'3.16.0-beta.1'; diff --git a/packages/@ember/engine/tests/engine_initializers_test.js b/packages/@ember/engine/tests/engine_initializers_test.js index 5e76b5b5696..5ac0795b61b 100644 --- a/packages/@ember/engine/tests/engine_initializers_test.js +++ b/packages/@ember/engine/tests/engine_initializers_test.js @@ -1,6 +1,10 @@ import { run } from '@ember/runloop'; import Engine from '@ember/engine'; -import { moduleFor, AbstractTestCase as TestCase } from 'internal-test-helpers'; +import { + moduleFor, + ModuleBasedTestResolver, + AbstractTestCase as TestCase, +} from 'internal-test-helpers'; let MyEngine, myEngine, myEngineInstance; @@ -22,7 +26,9 @@ moduleFor( } ["@test initializers require proper 'name' and 'initialize' properties"]() { - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); expectAssertion(() => { run(() => { @@ -38,7 +44,9 @@ moduleFor( } ['@test initializers are passed an Engine'](assert) { - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); MyEngine.initializer({ name: 'initializer', @@ -54,7 +62,9 @@ moduleFor( ['@test initializers can be registered in a specified order'](assert) { let order = []; - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); MyEngine.initializer({ name: 'fourth', after: 'third', @@ -112,7 +122,9 @@ moduleFor( ['@test initializers can be registered in a specified order as an array'](assert) { let order = []; - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); MyEngine.initializer({ name: 'third', @@ -171,7 +183,9 @@ moduleFor( ['@test initializers can have multiple dependencies'](assert) { let order = []; - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); let a = { name: 'a', @@ -226,7 +240,9 @@ moduleFor( ['@test initializers set on Engine subclasses are not shared between engines'](assert) { let firstInitializerRunCount = 0; let secondInitializerRunCount = 0; - let FirstEngine = Engine.extend(); + let FirstEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); FirstEngine.initializer({ name: 'first', @@ -235,7 +251,9 @@ moduleFor( }, }); - let SecondEngine = Engine.extend(); + let SecondEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); SecondEngine.initializer({ name: 'second', @@ -268,7 +286,9 @@ moduleFor( ['@test initializers are concatenated'](assert) { let firstInitializerRunCount = 0; let secondInitializerRunCount = 0; - let FirstEngine = Engine.extend(); + let FirstEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); FirstEngine.initializer({ name: 'first', @@ -323,7 +343,9 @@ moduleFor( ['@test initializers are per-engine'](assert) { assert.expect(2); - let FirstEngine = Engine.extend(); + let FirstEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); FirstEngine.initializer({ name: 'abc', @@ -337,7 +359,9 @@ moduleFor( }); }); - let SecondEngine = Engine.extend(); + let SecondEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); SecondEngine.instanceInitializer({ name: 'abc', initialize() {}, @@ -349,7 +373,9 @@ moduleFor( ['@test initializers are executed in their own context'](assert) { assert.expect(1); - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); MyEngine.initializer({ name: 'coolInitializer', diff --git a/packages/@ember/engine/tests/engine_instance_initializers_test.js b/packages/@ember/engine/tests/engine_instance_initializers_test.js index 9088aa097ac..0decb91e44a 100644 --- a/packages/@ember/engine/tests/engine_instance_initializers_test.js +++ b/packages/@ember/engine/tests/engine_instance_initializers_test.js @@ -1,7 +1,11 @@ import { run } from '@ember/runloop'; import Engine, { setEngineParent } from '@ember/engine'; import EngineInstance from '@ember/engine/instance'; -import { moduleFor, AbstractTestCase as TestCase } from 'internal-test-helpers'; +import { + moduleFor, + ModuleBasedTestResolver, + AbstractTestCase as TestCase, +} from 'internal-test-helpers'; let MyEngine, myEngine, myEngineInstance; @@ -36,7 +40,9 @@ moduleFor( } ["@test initializers require proper 'name' and 'initialize' properties"]() { - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); expectAssertion(() => { run(() => { @@ -52,7 +58,9 @@ moduleFor( } ['@test initializers are passed an engine instance'](assert) { - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); MyEngine.instanceInitializer({ name: 'initializer', @@ -69,7 +77,9 @@ moduleFor( ['@test initializers can be registered in a specified order'](assert) { let order = []; - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); MyEngine.instanceInitializer({ name: 'fourth', @@ -129,7 +139,9 @@ moduleFor( ['@test initializers can be registered in a specified order as an array'](assert) { let order = []; - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); MyEngine.instanceInitializer({ name: 'third', @@ -190,7 +202,9 @@ moduleFor( ['@test initializers can have multiple dependencies'](assert) { let order = []; - MyEngine = Engine.extend(); + MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); let a = { name: 'a', @@ -247,7 +261,9 @@ moduleFor( ['@test initializers set on Engine subclasses should not be shared between engines'](assert) { let firstInitializerRunCount = 0; let secondInitializerRunCount = 0; - let FirstEngine = Engine.extend(); + let FirstEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); let firstEngine, firstEngineInstance; FirstEngine.instanceInitializer({ @@ -257,7 +273,9 @@ moduleFor( }, }); - let SecondEngine = Engine.extend(); + let SecondEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); let secondEngine, secondEngineInstance; SecondEngine.instanceInitializer({ @@ -297,7 +315,9 @@ moduleFor( ['@test initializers are concatenated'](assert) { let firstInitializerRunCount = 0; let secondInitializerRunCount = 0; - let FirstEngine = Engine.extend(); + let FirstEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); FirstEngine.instanceInitializer({ name: 'first', @@ -364,7 +384,9 @@ moduleFor( ['@test initializers are per-engine'](assert) { assert.expect(2); - let FirstEngine = Engine.extend(); + let FirstEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); FirstEngine.instanceInitializer({ name: 'abc', @@ -378,7 +400,9 @@ moduleFor( }); }); - let SecondEngine = Engine.extend(); + let SecondEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); SecondEngine.instanceInitializer({ name: 'abc', initialize() {}, @@ -390,7 +414,9 @@ moduleFor( ['@test initializers are executed in their own context'](assert) { assert.expect(1); - let MyEngine = Engine.extend(); + let MyEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); MyEngine.instanceInitializer({ name: 'coolInitializer', diff --git a/packages/@ember/engine/tests/engine_instance_test.js b/packages/@ember/engine/tests/engine_instance_test.js index 221fb83b1a9..c47348a1ba6 100644 --- a/packages/@ember/engine/tests/engine_instance_test.js +++ b/packages/@ember/engine/tests/engine_instance_test.js @@ -2,7 +2,11 @@ import Engine, { getEngineParent, setEngineParent } from '@ember/engine'; import EngineInstance from '@ember/engine/instance'; import { run } from '@ember/runloop'; import { factory } from 'internal-test-helpers'; -import { moduleFor, AbstractTestCase as TestCase } from 'internal-test-helpers'; +import { + moduleFor, + ModuleBasedTestResolver, + AbstractTestCase as TestCase, +} from 'internal-test-helpers'; let engine, engineInstance; @@ -13,7 +17,10 @@ moduleFor( super(); run(() => { - engine = Engine.create({ router: null }); + engine = Engine.create({ + router: null, + Resolver: ModuleBasedTestResolver, + }); }); } @@ -86,7 +93,9 @@ moduleFor( } ['@test can build a child instance of a registered engine'](assert) { - let ChatEngine = Engine.extend(); + let ChatEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); let chatEngineInstance; engine.register('engine:chat', ChatEngine); diff --git a/packages/@ember/engine/tests/engine_test.js b/packages/@ember/engine/tests/engine_test.js index b87e24ffd66..3ee5a4f2466 100644 --- a/packages/@ember/engine/tests/engine_test.js +++ b/packages/@ember/engine/tests/engine_test.js @@ -6,6 +6,7 @@ import { privatize as P } from '@ember/-internals/container'; import { moduleFor, AbstractTestCase as TestCase, + ModuleBasedTestResolver, verifyInjection, verifyRegistration, } from 'internal-test-helpers'; @@ -20,7 +21,9 @@ moduleFor( super(); run(() => { - engine = Engine.create(); + engine = Engine.create({ + Resolver: ModuleBasedTestResolver, + }); context.lookup = { TestEngine: engine }; }); } diff --git a/packages/ember-testing/tests/adapters_test.js b/packages/ember-testing/tests/adapters_test.js index 2dcab571bd8..55cf16eb5fe 100644 --- a/packages/ember-testing/tests/adapters_test.js +++ b/packages/ember-testing/tests/adapters_test.js @@ -4,7 +4,7 @@ import Test from '../lib/test'; import Adapter from '../lib/adapters/adapter'; import QUnitAdapter from '../lib/adapters/qunit'; import EmberApplication from '@ember/application'; -import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; +import { moduleFor, ModuleBasedTestResolver, AbstractTestCase } from 'internal-test-helpers'; import { RSVP } from '@ember/-internals/runtime'; import { getDebugFunction, setDebugFunction } from '@ember/debug'; @@ -72,7 +72,9 @@ moduleFor( }); run(function() { - App = EmberApplication.create(); + App = EmberApplication.create({ + Resolver: ModuleBasedTestResolver, + }); Test.adapter = CustomAdapter.create(); App.setupForTesting(); }); @@ -86,7 +88,9 @@ moduleFor( Test.adapter = null; run(function() { - App = EmberApplication.create(); + App = EmberApplication.create({ + Resolver: ModuleBasedTestResolver, + }); App.setupForTesting(); }); @@ -101,7 +105,9 @@ moduleFor( Test.adapter = null; run(function() { - App = EmberApplication.create(); + App = EmberApplication.create({ + Resolver: ModuleBasedTestResolver, + }); App.setupForTesting(); }); diff --git a/packages/ember-testing/tests/helper_registration_test.js b/packages/ember-testing/tests/helper_registration_test.js index 1bb74634af5..e557678266d 100644 --- a/packages/ember-testing/tests/helper_registration_test.js +++ b/packages/ember-testing/tests/helper_registration_test.js @@ -1,7 +1,7 @@ import { run } from '@ember/runloop'; import Test from '../lib/test'; import EmberApplication from '@ember/application'; -import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; +import { moduleFor, ModuleBasedTestResolver, AbstractTestCase } from 'internal-test-helpers'; let App, appBooted, helperContainer; @@ -24,7 +24,9 @@ function setupApp() { helperContainer = {}; run(function() { - App = EmberApplication.create(); + App = EmberApplication.create({ + Resolver: ModuleBasedTestResolver, + }); App.setupForTesting(); App.injectTestHelpers(helperContainer); }); diff --git a/packages/ember/index.js b/packages/ember/index.js index 492cbefca88..02778593355 100644 --- a/packages/ember/index.js +++ b/packages/ember/index.js @@ -133,6 +133,7 @@ import EngineInstance from '@ember/engine/instance'; import { assign, merge } from '@ember/polyfills'; import { LOGGER, EMBER_EXTEND_PROTOTYPES, JQUERY_INTEGRATION } from '@ember/deprecated-features'; import templateOnlyComponent from '@ember/component/template-only'; + // ****@ember/-internals/environment**** const Ember = (typeof context.imports.Ember === 'object' && context.imports.Ember) || {}; @@ -175,9 +176,30 @@ if (EMBER_EXTEND_PROTOTYPES) { Ember.getOwner = getOwner; Ember.setOwner = setOwner; Ember.Application = Application; -Ember.DefaultResolver = Ember.Resolver = Resolver; Ember.ApplicationInstance = ApplicationInstance; +Object.defineProperty(Ember, 'Resolver', { + get() { + deprecate( + 'Using the globals resolver is deprecated. Use the ember-resolver package instead. See https://deprecations.emberjs.com/v3.x#toc_ember-deprecate-globals-resolver', + false, + { + id: 'ember.globals-resolver', + until: '4.0.0', + url: 'https://deprecations.emberjs.com/v3.x#toc_ember-deprecate-globals-resolver', + } + ); + + return Resolver; + }, +}); + +Object.defineProperty(Ember, 'DefaultResolver', { + get() { + return Ember.Resolver; + }, +}); + // ****@ember/engine**** Ember.Engine = Engine; Ember.EngineInstance = EngineInstance; diff --git a/packages/ember/tests/ember-test-helpers-test.js b/packages/ember/tests/ember-test-helpers-test.js index a3b35c1f29a..300de65bbcc 100644 --- a/packages/ember/tests/ember-test-helpers-test.js +++ b/packages/ember/tests/ember-test-helpers-test.js @@ -2,6 +2,7 @@ import { Promise } from 'rsvp'; import Application from '@ember/application'; import { run, hasScheduledTimers, getCurrentRunLoop } from '@ember/runloop'; import { compile } from 'ember-template-compiler'; +import { ModuleBasedTestResolver } from 'internal-test-helpers'; const { module, test } = QUnit; @@ -110,6 +111,7 @@ module('@ember/test-helpers emulation test', function() { this.application = Application.create({ rootElement: '#qunit-fixture', autoboot: false, + Resolver: ModuleBasedTestResolver, }); await setupContext(this); diff --git a/packages/ember/tests/reexports_test.js b/packages/ember/tests/reexports_test.js index aa7f0a7aa69..1b036834e41 100644 --- a/packages/ember/tests/reexports_test.js +++ b/packages/ember/tests/reexports_test.js @@ -7,6 +7,7 @@ import { import { confirmExport } from 'internal-test-helpers'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; import { jQueryDisabled, jQuery } from '@ember/-internals/views'; +import Resolver from '@ember/application/globals-resolver'; moduleFor( 'ember reexports', @@ -53,6 +54,18 @@ moduleFor( Ember._setComputedDecorator; }, 'Please migrate from Ember._setComputedDecorator to Ember._setClassicDecorator'); } + + ['@test Ember.Resolver is present (but deprecated)'](assert) { + expectDeprecation(() => { + assert.strictEqual(Ember.Resolver, Resolver, 'Ember.Resolver exists'); + }, /Using the globals resolver is deprecated/); + } + + ['@test Ember.DefaultResolver is present (but deprecated)'](assert) { + expectDeprecation(() => { + assert.strictEqual(Ember.DefaultResolver, Resolver, 'Ember.DefaultResolver exists'); + }, /Using the globals resolver is deprecated/); + } } ); @@ -340,8 +353,6 @@ let allExports = [ ['ApplicationInstance', '@ember/application/instance', 'default'], ['Engine', '@ember/engine', 'default'], ['EngineInstance', '@ember/engine/instance', 'default'], - ['Resolver', '@ember/application/globals-resolver', 'default'], - ['DefaultResolver', '@ember/application/globals-resolver', 'default'], // @ember/-internals/extension-support ['DataAdapter', '@ember/-internals/extension-support'], diff --git a/packages/ember/tests/routing/decoupled_basic_test.js b/packages/ember/tests/routing/decoupled_basic_test.js index 5b7be85a6a8..996f714eb7e 100644 --- a/packages/ember/tests/routing/decoupled_basic_test.js +++ b/packages/ember/tests/routing/decoupled_basic_test.js @@ -5,10 +5,16 @@ import { compile } from 'ember-template-compiler'; import { Route, NoneLocation, HistoryLocation } from '@ember/-internals/routing'; import Controller from '@ember/controller'; import { Object as EmberObject, A as emberA } from '@ember/-internals/runtime'; -import { moduleFor, ApplicationTestCase, runDestroy, runTask } from 'internal-test-helpers'; +import { + moduleFor, + ApplicationTestCase, + getTextOf, + ModuleBasedTestResolver, + runDestroy, + runTask, +} from 'internal-test-helpers'; import { run } from '@ember/runloop'; import { Mixin, computed, set, addObserver } from '@ember/-internals/metal'; -import { getTextOf } from 'internal-test-helpers'; import { Component } from '@ember/-internals/glimmer'; import Engine from '@ember/engine'; import { InternalTransition as Transition } from 'router_js'; @@ -4618,7 +4624,9 @@ moduleFor( assert.expect(2); // Register engine - let BlogEngine = Engine.extend(); + let BlogEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); this.add('engine:blog', BlogEngine); // Register engine route map @@ -4654,7 +4662,9 @@ moduleFor( assert.expect(1); // Register engine - let BlogEngine = Engine.extend(); + let BlogEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); this.add('engine:blog', BlogEngine); // Register engine route map @@ -4688,7 +4698,9 @@ moduleFor( let engineInstance; // Register engine - let BlogEngine = Engine.extend(); + let BlogEngine = Engine.extend({ + Resolver: ModuleBasedTestResolver, + }); this.add('engine:blog', BlogEngine); let EngineIndexRoute = Route.extend({ init() { diff --git a/packages/internal-test-helpers/lib/test-cases/default-resolver-application.js b/packages/internal-test-helpers/lib/test-cases/default-resolver-application.js index 64cb6b9a853..e67cc76d7c5 100644 --- a/packages/internal-test-helpers/lib/test-cases/default-resolver-application.js +++ b/packages/internal-test-helpers/lib/test-cases/default-resolver-application.js @@ -9,7 +9,18 @@ import { runTask } from '../run'; export default class DefaultResolverApplicationTestCase extends AbstractApplicationTestCase { createApplication() { - let application = (this.application = Application.create(this.applicationOptions)); + let application; + expectDeprecation(() => { + application = this.application = Application.create(this.applicationOptions); + }, /Using the globals resolver is deprecated/); + + // If the test expects a certain number of assertions, increment that number + let { assert } = QUnit.config.current; + if (typeof assert.test.expected === 'number') { + assert.test.expected += 1; + QUnit.config.current.expected += 1; + } + application.Router = Router.extend(this.routerOptions); return application; }