Change the old public api spec to check only the exported top-level symbols. This will make sure that Dart and JS do not diverge. The new public api spec verifies the TS api. Closes #7447
		
			
				
	
	
		
			362 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			362 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {
 | |
|   AsyncTestCompleter,
 | |
|   beforeEach,
 | |
|   ddescribe,
 | |
|   describe,
 | |
|   expect,
 | |
|   iit,
 | |
|   inject,
 | |
|   it,
 | |
|   xdescribe,
 | |
|   xit
 | |
| } from 'angular2/testing_internal';
 | |
| import {IS_DART, RegExpWrapper, StringWrapper} from 'angular2/src/facade/lang';
 | |
| import {getSymbolsFromLibrary} from './symbol_inspector/symbol_inspector';
 | |
| import {ListWrapper} from 'angular2/src/facade/collection';
 | |
| 
 | |
| // =================================================================================================
 | |
| // =================================================================================================
 | |
| // =========== S T O P   -  S T O P   -  S T O P   -  S T O P   -  S T O P   -  S T O P  ===========
 | |
| // =================================================================================================
 | |
| // =================================================================================================
 | |
| //
 | |
| // DO NOT EDIT THIS LIST OF PUBLIC APIS UNLESS YOU GET IT CLEARED BY: mhevery, vsavkin, or tbosch!
 | |
| //
 | |
| // =================================================================================================
 | |
| // =================================================================================================
 | |
| 
 | |
| var NG_COMMON = [
 | |
|   'AbstractControl',
 | |
|   'AbstractControlDirective',
 | |
|   'AsyncPipe',
 | |
|   'COMMON_DIRECTIVES',
 | |
|   'COMMON_PIPES',
 | |
|   'CORE_DIRECTIVES',
 | |
|   'CheckboxControlValueAccessor',
 | |
|   'Control',
 | |
|   'ControlArray',
 | |
|   'ControlContainer',
 | |
|   'ControlGroup',
 | |
|   'ControlValueAccessor:dart',
 | |
|   'CurrencyPipe',
 | |
|   'DatePipe',
 | |
|   'DecimalPipe',
 | |
|   'DefaultValueAccessor',
 | |
|   'FORM_BINDINGS',
 | |
|   'FORM_DIRECTIVES',
 | |
|   'FORM_PROVIDERS',
 | |
|   'Form:dart',
 | |
|   'FormBuilder',
 | |
|   'I18nPluralPipe',
 | |
|   'I18nSelectPipe',
 | |
|   'JsonPipe',
 | |
|   'LowerCasePipe',
 | |
|   'MaxLengthValidator',
 | |
|   'MinLengthValidator',
 | |
|   'NG_ASYNC_VALIDATORS',
 | |
|   'NG_VALIDATORS',
 | |
|   'NG_VALUE_ACCESSOR',
 | |
|   'NgClass',
 | |
|   'NgControl',
 | |
|   'NgControlGroup',
 | |
|   'NgControlName',
 | |
|   'NgControlStatus',
 | |
|   'NgFor',
 | |
|   'NgForm',
 | |
|   'NgFormControl',
 | |
|   'NgFormModel',
 | |
|   'NgIf',
 | |
|   'NgModel',
 | |
|   'NgSelectOption',
 | |
|   'NgStyle',
 | |
|   'NgSwitch',
 | |
|   'NgSwitchWhen',
 | |
|   'NgSwitchDefault',
 | |
|   'NumberPipe',
 | |
|   'ObservableListDiff:dart',
 | |
|   'ObservableListDiffFactory:dart',
 | |
|   'PatternValidator',
 | |
|   'PercentPipe',
 | |
|   'ReplacePipe',
 | |
|   'RequiredValidator',
 | |
|   'SelectControlValueAccessor',
 | |
|   'SlicePipe',
 | |
|   'UpperCasePipe',
 | |
|   'Validator:dart',
 | |
|   'Validators',
 | |
|   'RadioButtonState',
 | |
|   'NgLocalization',
 | |
|   'NgPlural',
 | |
|   'NgPluralCase'
 | |
| ];
 | |
| 
 | |
| var NG_COMPILER = [
 | |
|   "TemplateAst:dart",
 | |
|   "TemplateAstVisitor:dart",
 | |
|   "DEFAULT_PACKAGE_URL_PROVIDER",
 | |
|   "UrlResolver",
 | |
|   "getUrlScheme",
 | |
|   "AttrAst",
 | |
|   "BoundDirectivePropertyAst",
 | |
|   "BoundElementPropertyAst",
 | |
|   "BoundEventAst",
 | |
|   "BoundTextAst",
 | |
|   "COMPILER_PROVIDERS",
 | |
|   "CompileDirectiveMetadata",
 | |
|   "CompileTemplateMetadata",
 | |
|   "CompileTypeMetadata",
 | |
|   "DirectiveAst",
 | |
|   "ElementAst",
 | |
|   "EmbeddedTemplateAst",
 | |
|   "NgContentAst",
 | |
|   "PLATFORM_DIRECTIVES",
 | |
|   "PLATFORM_PIPES",
 | |
|   "PropertyBindingType",
 | |
|   "SourceModule",
 | |
|   "SourceWithImports",
 | |
|   "TEMPLATE_TRANSFORMS",
 | |
|   "TemplateCompiler",
 | |
|   "TextAst",
 | |
|   "VariableAst",
 | |
|   "XHR",
 | |
|   "createWithoutPackagePrefix",
 | |
|   "templateVisitAll"
 | |
| ];
 | |
| 
 | |
| var NG_CORE = [
 | |
|   'APP_COMPONENT',
 | |
|   'APP_INITIALIZER',
 | |
|   'APP_ID',
 | |
|   'AngularEntrypoint:dart',
 | |
|   'AbstractProviderError',
 | |
|   'AppViewManager',
 | |
|   'ApplicationRef',
 | |
|   'APPLICATION_COMMON_PROVIDERS',
 | |
|   'Attribute',
 | |
|   'AttributeMetadata',
 | |
|   'Binding',
 | |
|   'Provider',
 | |
|   'ProviderBuilder',
 | |
|   'PLATFORM_DIRECTIVES',
 | |
|   "CollectionChangeRecord",
 | |
|   'ChangeDetectionError',
 | |
|   'ChangeDetectionStrategy',
 | |
|   'ChangeDetectorRef',
 | |
|   'Class:js',
 | |
|   'Compiler',
 | |
|   'Component',
 | |
|   'ComponentMetadata',
 | |
|   'ComponentRef',
 | |
|   'ContentChild',
 | |
|   'ContentChildMetadata',
 | |
|   'ContentChildren',
 | |
|   'ContentChildrenMetadata',
 | |
|   'CyclicDependencyError',
 | |
|   'PLATFORM_PIPES',
 | |
|   'DebugNode',
 | |
|   'DebugElement',
 | |
|   'Dependency',
 | |
|   'DependencyMetadata',
 | |
|   'Directive',
 | |
|   'DirectiveMetadata',
 | |
|   'DirectiveResolver',
 | |
|   'DynamicComponentLoader',
 | |
|   'ElementRef',
 | |
|   'ErrorHandlingFn:dart',
 | |
|   'Output',
 | |
|   'EmbeddedViewRef',
 | |
|   'EventEmitter',
 | |
|   'ExceptionHandler',
 | |
|   'OutputMetadata',
 | |
|   'enableProdMode',
 | |
|   'ExpressionChangedAfterItHasBeenCheckedException',
 | |
|   'Host',
 | |
|   'HostBinding',
 | |
|   'HostBindingMetadata',
 | |
|   'HostListener',
 | |
|   'HostListenerMetadata',
 | |
|   'HostMetadata',
 | |
|   'HostViewFactoryRef',
 | |
|   'Inject',
 | |
|   'InjectMetadata',
 | |
|   'Injectable',
 | |
|   'InjectableMetadata',
 | |
|   'Injector',
 | |
|   'InstantiationError',
 | |
|   'InvalidProviderError',
 | |
|   'IterableDiffers',
 | |
|   'Key',
 | |
|   'KeyValueChangeRecord',
 | |
|   'KeyValueDiffers',
 | |
|   'NgZone',
 | |
|   'NgZoneError',
 | |
|   'NoAnnotationError',
 | |
|   'NoProviderError',
 | |
|   'OpaqueToken',
 | |
|   'Optional',
 | |
|   'OptionalMetadata',
 | |
|   'OutOfBoundsError',
 | |
|   'Pipe',
 | |
|   'PipeMetadata',
 | |
|   'PlatformRef',
 | |
|   'Input',
 | |
|   'InputMetadata',
 | |
|   'Query',
 | |
|   'QueryList',
 | |
|   'QueryMetadata',
 | |
|   'Renderer',
 | |
|   'RootRenderer',
 | |
|   'RenderComponentType',
 | |
|   'ResolvedBinding:dart',
 | |
|   'ResolvedProvider:dart',
 | |
|   'ResolvedFactory',
 | |
|   'Self',
 | |
|   'SelfMetadata',
 | |
|   'SkipSelf',
 | |
|   'SkipSelfMetadata',
 | |
|   'SimpleChange',
 | |
|   'TemplateRef',
 | |
|   'Testability',
 | |
|   'TestabilityRegistry',
 | |
|   'GetTestability:dart',
 | |
|   'setTestabilityGetter',
 | |
|   'Type',
 | |
|   'PACKAGE_ROOT_URL',
 | |
|   'View',
 | |
|   'ViewChild',
 | |
|   'ViewChildMetadata',
 | |
|   'ViewChildren',
 | |
|   'ViewChildrenMetadata',
 | |
|   'ViewContainerRef',
 | |
|   'ViewEncapsulation',
 | |
|   'ViewMetadata',
 | |
|   'ViewQuery',
 | |
|   'ViewQueryMetadata',
 | |
|   'ViewResolver',
 | |
|   'WrappedException',
 | |
|   'WrappedValue',
 | |
|   'ZeroArgFunction:dart',
 | |
|   'asNativeElements',
 | |
|   'bind',
 | |
|   'provide',
 | |
|   'createNgZone',
 | |
|   'forwardRef:js',
 | |
|   'platform',
 | |
|   'resolveForwardRef:js',
 | |
|   'PLATFORM_COMMON_PROVIDERS',
 | |
|   'PLATFORM_INITIALIZER',
 | |
|   'AfterContentChecked:dart',
 | |
|   'AfterContentInit:dart',
 | |
|   'AfterViewChecked:dart',
 | |
|   'AfterViewInit:dart',
 | |
|   'DoCheck:dart',
 | |
|   'HostViewRef',
 | |
|   'IterableDifferFactory:dart',
 | |
|   'IterableDiffer:dart',
 | |
|   'KeyValueDifferFactory:dart',
 | |
|   'KeyValueDiffer:dart',
 | |
|   'OnChanges:dart',
 | |
|   'OnDestroy:dart',
 | |
|   'OnInit:dart',
 | |
|   'PipeTransform:dart',
 | |
|   'reflector',
 | |
|   'Stream:dart',
 | |
|   'GetterFn:dart',
 | |
|   'MethodFn:dart',
 | |
|   'NoReflectionCapabilities:dart',
 | |
|   'PlatformReflectionCapabilities:dart',
 | |
|   'ReflectionInfo',
 | |
|   'Reflector',
 | |
|   'SetterFn:dart',
 | |
|   'ViewRef',
 | |
|   'TrackByFn:dart'
 | |
| ];
 | |
| 
 | |
| var NG_INSTRUMENTATION =
 | |
|     ['wtfCreateScope', 'wtfEndTimeRange', 'wtfLeave', 'WtfScopeFn:dart', 'wtfStartTimeRange'];
 | |
| 
 | |
| var NG_PLATFORM_BROWSER = [
 | |
|   'AngularEntrypoint',
 | |
|   'BROWSER_APP_PROVIDERS',
 | |
|   'BROWSER_PROVIDERS',
 | |
|   'BrowserDomAdapter',
 | |
|   'By',
 | |
|   'DOCUMENT',
 | |
|   'ELEMENT_PROBE_PROVIDERS',
 | |
|   'ELEMENT_PROBE_PROVIDERS_PROD_MODE',
 | |
|   'Title',
 | |
|   'bootstrap',
 | |
|   'disableDebugTools',
 | |
|   'enableDebugTools',
 | |
|   'inspectNativeElement'
 | |
| ];
 | |
| 
 | |
| var NG_UPGRADE = [
 | |
|   'UpgradeAdapter',
 | |
|   'UpgradeAdapterRef',
 | |
| ];
 | |
| 
 | |
| var NG_API = {
 | |
|   ngCommon: NG_COMMON,
 | |
|   ngCompiler: NG_COMPILER,
 | |
|   ngCore: NG_CORE,
 | |
|   ngInstrumentation: NG_INSTRUMENTATION,
 | |
|   ngPlatformBrowser: NG_PLATFORM_BROWSER,
 | |
|   ngUpgrade: NG_UPGRADE
 | |
| };
 | |
| 
 | |
| export function main() {
 | |
|   /**
 | |
|    var x = getSymbolsFromLibrary('ng');
 | |
|    x.sort();
 | |
|    var parts = [];
 | |
|    x.forEach((i) => parts.push(`'${i'`));
 | |
|   print(`[ ${parts.join(',
 | |
|   ')} ]`);
 | |
|    */
 | |
| 
 | |
|   describe('public API', () => {
 | |
|     var barrelList =
 | |
|         ['ngCommon', 'ngCompiler', 'ngCore', 'ngInstrumentation', 'ngPlatformBrowser', 'ngUpgrade'];
 | |
| 
 | |
|     if (IS_DART) {
 | |
|       barrelList = barrelList.filter(b => b !== 'ngUpgrade');
 | |
|     }
 | |
| 
 | |
|     barrelList.forEach(mod => {
 | |
|       // Dom Events are merged into DomAdapter in Dart
 | |
|       if (IS_DART && mod === 'ngPlatformDomEvent') return;
 | |
|       it(`should fail if public API for ${mod} has changed`, () => {
 | |
|         var symbols = getSymbolsFromLibrary(mod);
 | |
|         expect(diff(symbols, NG_API[mod])).toEqual([]);
 | |
|       })
 | |
|     });
 | |
|   });
 | |
| }
 | |
| 
 | |
| function diff(actual: string[], expected: string[]): string[] {
 | |
|   ListWrapper.sort(actual, compareIgnoreLang);
 | |
|   ListWrapper.sort(expected, compareIgnoreLang);
 | |
|   let mode = IS_DART ? "dart" : "js";
 | |
|   let missing = actual.filter(i => expected.indexOf(i) < 0 && expected.indexOf(`${i}:${mode}`) < 0)
 | |
|                     .map(s => `+${s}`);
 | |
|   let extra = expected.filter(i => shouldIgnore(i) ? false : (actual.indexOf(stripLang(i)) < 0))
 | |
|                   .map(s => `-${s}`);
 | |
|   return ListWrapper.concat(missing, extra);
 | |
| }
 | |
| 
 | |
| function shouldIgnore(expected: string): boolean {
 | |
|   let isDart = RegExpWrapper.create('\\:dart$');
 | |
|   let isJs = RegExpWrapper.create('\\:js$');
 | |
|   return IS_DART ? RegExpWrapper.test(isJs, expected) : RegExpWrapper.test(isDart, expected);
 | |
| }
 | |
| 
 | |
| function compareIgnoreLang(a: string, b: string): number {
 | |
|   return StringWrapper.compare(stripLang(a), stripLang(b));
 | |
| }
 | |
| 
 | |
| function stripLang(text: string): string {
 | |
|   let index = text.indexOf(':');
 | |
|   return (index >= 0) ? text.substring(0, index) : text;
 | |
| }
 |