diff options
| author | Igor Minar | 2013-07-01 17:23:24 -0700 | 
|---|---|---|
| committer | Igor Minar | 2013-07-02 11:05:30 -0700 | 
| commit | 4f0f2437712a5ae3e79780e2d6fa32b70abe1a52 (patch) | |
| tree | 7df06087f943728120c66052b23ffd8bb109e5cc | |
| parent | 48eb297c1130fd08b22ba2bae032d3a5339c8615 (diff) | |
| download | angular.js-4f0f2437712a5ae3e79780e2d6fa32b70abe1a52.tar.bz2 | |
fix($injector): refactor module loading code and use minErr
| -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/);      });    });  }); | 
