master
chore(*): switch from JSHint/JSCS to ESLint
feat($sce): handle URL sanitization through the `$sce` service
feat(form.FormController): add $getControls()
test(input): fix tests on Firefox v93+
fix(Angular): remove `angular.lowercase` and `angular.uppercase`
chore(*): Upgrade to Jasmine 2.4
fix(ngClass): do not break on invalid values
chore(tests): rename all directive names to the normalized form
feat($controller): throw when requested controller is not registered
fix(ngEventDirs): pass error in handler to $exceptionHandler when event was triggered in a digest
test(ngHref): only run Edge-specific test on relevant Edge versions
perf(*): don't trigger digests after enter/leave of structural directives
chore(eslint): enable `quotes: ["error", "single"]`
fix(ngEventDirs): execute `blur` and `focus` expression using `scope.$evalAsync`
fix(ngModelController): allow $overrideModelOptions to set updateOn
perf(input): prevent multiple validations on initialization
chore(travis): update iOs test browsers
feat(ngRef): add directive to publish controller, or element into scope
fix(ngRepeat): fix trackBy function being invoked with incorrect scope
fix(interpolate): do not create directives for constant media URL attributes
fix(ngStyle): correctly remove old style when new style value is invalid
style(*): add rule requireSpacesInFunction beforeOpeningCurlyBrace
docs(*): fix spelling errors
test(IE8): remove workarounds for IE8
fix(required): correctly validate required on non-input element surrounded by ngIf