diff options
| -rw-r--r-- | src/auto/injector.js | 41 | ||||
| -rw-r--r-- | src/minErr.js | 6 | ||||
| -rw-r--r-- | test/AngularSpec.js | 7 | ||||
| -rw-r--r-- | test/auto/injectorSpec.js | 25 |
4 files changed, 44 insertions, 35 deletions
diff --git a/src/auto/injector.js b/src/auto/injector.js index e43f2df7..6399dca8 100644 --- a/src/auto/injector.js +++ b/src/auto/injector.js @@ -494,37 +494,36 @@ function createInjector(modulesToLoad) { forEach(modulesToLoad, function(module) { if (loadedModules.get(module)) return; loadedModules.put(module, true); - if (isString(module)) { - var moduleFn = angularModule(module); - runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); - try { + try { + if (isString(module)) { + var moduleFn = angularModule(module); + runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); + for(var invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) { var invokeArgs = invokeQueue[i], provider = providerInjector.get(invokeArgs[0]); provider[invokeArgs[1]].apply(provider, invokeArgs[2]); } - } catch (e) { - if (e.message) e.message += ' from ' + module; - throw e; + } else if (isFunction(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else if (isArray(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else { + assertArgFn(module, 'module'); } - } else if (isFunction(module)) { - try { - runBlocks.push(providerInjector.invoke(module)); - } catch (e) { - if (e.message) e.message += ' from ' + module; - throw e; + } catch (e) { + if (isArray(module)) { + module = module[module.length - 1]; } - } else if (isArray(module)) { - try { - runBlocks.push(providerInjector.invoke(module)); - } catch (e) { - if (e.message) e.message += ' from ' + String(module[module.length - 1]); - throw e; + if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { + // Safari & FF's stack traces don't contain error.message content unlike those of Chrome and IE + // So if stack doesn't contain message, we create a new string that contains both. + // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. + e = e.message + '\n' + e.stack; } - } else { - assertArgFn(module, 'module'); + throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", module, e.stack || e.message || e); } }); return runBlocks; diff --git a/src/minErr.js b/src/minErr.js index b6c447ca..89be9b1b 100644 --- a/src/minErr.js +++ b/src/minErr.js @@ -3,7 +3,7 @@ /** * @description * - * This object provides a utility for producing rich Error messages within + * This object provides a utility for producing rich Error messages within * Angular. It can be called as follows: * * var exampleMinErr = minErr('example'); @@ -34,14 +34,14 @@ function minErr(module) { template = arguments[1], templateArgs = arguments, message; - + message = prefix + template.replace(/\{\d+\}/g, function (match) { var index = +match.slice(1, -1), arg; if (index + 2 < templateArgs.length) { arg = templateArgs[index + 2]; if (isFunction(arg)) { - return arg.toString().replace(/ \{[\s\S]*$/, ''); + return arg.toString().replace(/ ?\{[\s\S]*$/, ''); } else if (isUndefined(arg)) { return 'undefined'; } else if (!isString(arg)) { diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 9686ffd6..8fda7a65 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -605,7 +605,9 @@ describe('angular', function() { expect(function() { angularInit(appElement, bootstrap); - }).toThrow("[$injector:nomod] Module 'doesntexist' is not available! You either misspelled the module name or forgot to load it."); + }).toThrowMatching( + /\[\$injector:modulerr] Failed to instantiate module doesntexist due to:\n.*\[\$injector:nomod] Module 'doesntexist' is not available! You either misspelled the module name or forgot to load it\./ + ); }); }); @@ -749,7 +751,8 @@ describe('angular', function() { expect(function() { angular.bootstrap(element, ['doesntexist']); - }).toThrow("[$injector:nomod] Module 'doesntexist' is not available! You either misspelled the module name or forgot to load it."); + }).toThrowMatching( + /\[\$injector:modulerr\] Failed to instantiate module doesntexist due to:\n.*\[\$injector:nomod\] Module 'doesntexist' is not available! You either misspelled the module name or forgot to load it\./); expect(element.html()).toBe('{{1+2}}'); dealoc(element); diff --git a/test/auto/injectorSpec.js b/test/auto/injectorSpec.js index 4f70fb27..2c485655 100644 --- a/test/auto/injectorSpec.js +++ b/test/auto/injectorSpec.js @@ -268,8 +268,9 @@ describe('injector', function() { it('should error on invalid module name', function() { expect(function() { createInjector(['IDontExist'], {}); - }).toThrow("[$injector:nomod] Module 'IDontExist' is not available! You either misspelled the module name or forgot to load it."); - + }).toThrowMatching( + /\[\$injector:modulerr\].+\n.*\[\$injector:nomod] Module 'IDontExist' is not available! You either misspelled the module name or forgot to load it/ + ); }); @@ -552,7 +553,7 @@ describe('injector', function() { createInjector([ {} ], {}); - }).toThrow("[ng:areq] Argument 'module' is not a function, got Object"); + }).toThrowMatching(/\[\$injector:modulerr\] Failed to instantiate module {} due to:\n.*\[ng\:areq] Argument 'module' is not a function, got Object/); }); @@ -561,15 +562,17 @@ describe('injector', function() { createInjector([function() { throw 'MyError'; }], {}); - }).toThrow('MyError'); + }).toThrowMatching(/\[\$injector:modulerr\] Failed to instantiate module .+ due to:\n.*MyError/); }); it('should decorate the missing service error with module name', function() { angular.module('TestModule', [], function(xyzzy) {}); expect(function() { - createInjector(['TestModule']); - }).toThrow('[$injector:unpr] Unknown provider: xyzzy from TestModule'); + createInjector(['TestModule' ]); + }).toThrowMatching( + /\[\$injector:modulerr\] Failed to instantiate module TestModule due to:\n.*\[\$injector:unpr] Unknown provider: xyzzy/ + ); }); @@ -577,7 +580,9 @@ describe('injector', function() { function myModule(xyzzy){} expect(function() { createInjector([myModule]); - }).toThrow('[$injector:unpr] Unknown provider: xyzzy from ' + myModule); + }).toThrowMatching( + /\[\$injector:modulerr\] Failed to instantiate module function myModule\(xyzzy\) due to:\n.*\[\$injector:unpr] Unknown provider: xyzzy/ + ); }); @@ -585,7 +590,9 @@ describe('injector', function() { function myModule(xyzzy){} expect(function() { createInjector([['xyzzy', myModule]]); - }).toThrow('[$injector:unpr] Unknown provider: xyzzy from ' + myModule); + }).toThrowMatching( + /\[\$injector:modulerr\] Failed to instantiate module function myModule\(xyzzy\) due to:\n.*\[\$injector:unpr] Unknown provider: xyzzy/ + ); }); @@ -801,7 +808,7 @@ describe('injector', function() { createInjector([function($provide) { $provide.value('name', 'angular') }, instanceLookupInModule]); - }).toThrow('[$injector:unpr] Unknown provider: name from ' + String(instanceLookupInModule)); + }).toThrowMatching(/\[\$injector:unpr] Unknown provider: name/); }); }); }); |
