From 6de68e2f1f2b8403266e94f13f1986dfd09e5969 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Wed, 9 Mar 2016 14:55:27 -0800 Subject: [PATCH] feat(compiler): assert that Component.style is an array Part of #7481 (effort to improve error messages) Closes #7559 --- modules/angular2/src/compiler/assertions.dart | 3 +++ modules/angular2/src/compiler/assertions.ts | 16 ++++++++++++++++ .../angular2/src/compiler/runtime_metadata.ts | 3 +++ .../test/compiler/runtime_metadata_fixture.dart | 9 +++++++++ .../test/compiler/runtime_metadata_fixture.ts | 5 +++++ .../test/compiler/runtime_metadata_spec.ts | 9 +++++++++ 6 files changed, 45 insertions(+) create mode 100644 modules/angular2/src/compiler/assertions.dart create mode 100644 modules/angular2/src/compiler/assertions.ts create mode 100644 modules/angular2/test/compiler/runtime_metadata_fixture.dart create mode 100644 modules/angular2/test/compiler/runtime_metadata_fixture.ts diff --git a/modules/angular2/src/compiler/assertions.dart b/modules/angular2/src/compiler/assertions.dart new file mode 100644 index 0000000000..243292ea57 --- /dev/null +++ b/modules/angular2/src/compiler/assertions.dart @@ -0,0 +1,3 @@ +library angular2.core.util.asserions; + +void assertArrayOfStrings(String identifier, Object value) {} diff --git a/modules/angular2/src/compiler/assertions.ts b/modules/angular2/src/compiler/assertions.ts new file mode 100644 index 0000000000..b402485d03 --- /dev/null +++ b/modules/angular2/src/compiler/assertions.ts @@ -0,0 +1,16 @@ +import {isArray, isString, isBlank, assertionsEnabled} from '../facade/lang'; +import {BaseException} from '../facade/exceptions'; + +export function assertArrayOfStrings(identifier: string, value: any) { + if (!assertionsEnabled() || isBlank(value)) { + return; + } + if (!isArray(value)) { + throw new BaseException(`Expected '${identifier}' to be an array of strings.`); + } + for (var i = 0; i < value.length; i += 1) { + if (!isString(value[i])) { + throw new BaseException(`Expected '${identifier}' to be an array of strings.`); + } + } +} diff --git a/modules/angular2/src/compiler/runtime_metadata.ts b/modules/angular2/src/compiler/runtime_metadata.ts index 51b3494b4e..d15d2a9229 100644 --- a/modules/angular2/src/compiler/runtime_metadata.ts +++ b/modules/angular2/src/compiler/runtime_metadata.ts @@ -20,6 +20,7 @@ import {reflector} from 'angular2/src/core/reflection/reflection'; import {Injectable, Inject, Optional} from 'angular2/src/core/di'; import {PLATFORM_DIRECTIVES, PLATFORM_PIPES} from 'angular2/src/core/platform_directives_and_pipes'; import {MODULE_SUFFIX} from './util'; +import {assertArrayOfStrings} from './assertions'; import {getUrlScheme} from 'angular2/src/compiler/url_resolver'; @Injectable() @@ -41,9 +42,11 @@ export class RuntimeMetadataResolver { var changeDetectionStrategy = null; if (dirMeta instanceof md.ComponentMetadata) { + assertArrayOfStrings('styles', dirMeta.styles); var cmpMeta = dirMeta; moduleUrl = calcModuleUrl(directiveType, cmpMeta); var viewMeta = this._viewResolver.resolve(directiveType); + assertArrayOfStrings('styles', viewMeta.styles); templateMeta = new cpl.CompileTemplateMetadata({ encapsulation: viewMeta.encapsulation, template: viewMeta.template, diff --git a/modules/angular2/test/compiler/runtime_metadata_fixture.dart b/modules/angular2/test/compiler/runtime_metadata_fixture.dart new file mode 100644 index 0000000000..b26f0f259a --- /dev/null +++ b/modules/angular2/test/compiler/runtime_metadata_fixture.dart @@ -0,0 +1,9 @@ +library angular2.test.compiler.runtime_metadata_fixture; + +import "package:angular2/core.dart" show Component; + +// This component is not actually malformed; this fixture is here to +// make Dart not complain about a missing import for a test case that only +// matters in an JavaScript app. +@Component(template: "") +class MalformedStylesComponent {} diff --git a/modules/angular2/test/compiler/runtime_metadata_fixture.ts b/modules/angular2/test/compiler/runtime_metadata_fixture.ts new file mode 100644 index 0000000000..74a0a650f3 --- /dev/null +++ b/modules/angular2/test/compiler/runtime_metadata_fixture.ts @@ -0,0 +1,5 @@ +import {Component} from 'angular2/core'; + +@Component({styles:('foo'), template: ''}) +export class MalformedStylesComponent { +} diff --git a/modules/angular2/test/compiler/runtime_metadata_spec.ts b/modules/angular2/test/compiler/runtime_metadata_spec.ts index e74a8cae8c..231d022720 100644 --- a/modules/angular2/test/compiler/runtime_metadata_spec.ts +++ b/modules/angular2/test/compiler/runtime_metadata_spec.ts @@ -37,6 +37,7 @@ import {TEST_PROVIDERS} from './test_bindings'; import {MODULE_SUFFIX} from 'angular2/src/compiler/util'; import {IS_DART} from 'angular2/src/facade/lang'; import {PLATFORM_DIRECTIVES} from 'angular2/src/core/platform_directives_and_pipes'; +import {MalformedStylesComponent} from './runtime_metadata_fixture'; export function main() { describe('RuntimeMetadataResolver', () => { @@ -74,6 +75,14 @@ export function main() { var expectedEndValue = IS_DART ? 'test/compiler/runtime_metadata_spec.dart' : './'; expect(value.endsWith(expectedEndValue)).toBe(true); })); + + it('should throw when metadata is incorrectly typed', + inject([RuntimeMetadataResolver], (resolver: RuntimeMetadataResolver) => { + if (!IS_DART) { + expect(() => resolver.getDirectiveMetadata(MalformedStylesComponent)) + .toThrowError(`Expected 'styles' to be an array of strings.`); + } + })); }); describe('getViewDirectivesMetadata', () => {