diff --git a/src/ng/compile.js b/src/ng/compile.js index 3de0d53f0388..4ee6e04cfe85 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -779,6 +779,14 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { return bindings; } + function assertValidDirectiveName(name) { + var letter = name.charAt(0); + if (!letter || letter !== lowercase(letter)) { + throw ngMinErr('badname', "Directive name '{0}' is invalid. The first letter of a directive must be a lowercase letter"); + } + return name; + } + /** * @ngdoc method * @name $compileProvider#directive @@ -797,6 +805,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { this.directive = function registerDirective(name, directiveFactory) { assertNotHasOwnProperty(name, 'directive'); if (isString(name)) { + assertValidDirectiveName(name); assertArg(directiveFactory, 'directiveFactory'); if (!hasDirectives.hasOwnProperty(name)) { hasDirectives[name] = []; diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 908739c447a0..16abc19889f4 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -147,6 +147,15 @@ describe('$compile', function() { describe('configuration', function() { + + it('should fail to register a directive that does not start with a lowercase letter', function() { + module(function($compileProvider) { + expect($compileProvider.directive('BadDirectiveName', function() { + return {}; + })).toThrowMinErr('badname', "Directive name 'BadDirectiveName' is invalid. The first letter of a directive must be a lowercase letter"); + }); + }); + it('should register a directive', function() { module(function() { directive('div', function(log) { @@ -7429,4 +7438,4 @@ describe('$compile', function() { expect(element.hasClass('fire')).toBe(true); })); }); -}); +}); \ No newline at end of file