2016-04-12 12:40:37 -04:00
|
|
|
import {
|
|
|
|
AsyncTestCompleter,
|
|
|
|
beforeEach,
|
|
|
|
ddescribe,
|
|
|
|
describe,
|
|
|
|
expect,
|
|
|
|
iit,
|
|
|
|
inject,
|
|
|
|
it,
|
|
|
|
xdescribe,
|
|
|
|
xit
|
|
|
|
} from 'angular2/testing_internal';
|
2016-03-11 12:00:18 -05:00
|
|
|
import {IS_DART, RegExpWrapper, StringWrapper} from 'angular2/src/facade/lang';
|
2015-09-21 19:48:16 -04:00
|
|
|
import {getSymbolsFromLibrary} from './symbol_inspector/symbol_inspector';
|
2016-03-11 12:00:18 -05:00
|
|
|
import {ListWrapper} from 'angular2/src/facade/collection';
|
2015-09-14 23:49:29 -04:00
|
|
|
|
|
|
|
// =================================================================================================
|
|
|
|
// =================================================================================================
|
|
|
|
// =========== 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!
|
|
|
|
//
|
|
|
|
// =================================================================================================
|
|
|
|
// =================================================================================================
|
|
|
|
|
2015-12-10 20:21:51 -05:00
|
|
|
var NG_COMMON = [
|
2015-09-14 23:49:29 -04:00
|
|
|
'AbstractControl',
|
|
|
|
'AbstractControlDirective',
|
|
|
|
'AsyncPipe',
|
2015-11-02 19:03:42 -05:00
|
|
|
'COMMON_DIRECTIVES',
|
2015-12-10 20:21:51 -05:00
|
|
|
'COMMON_PIPES',
|
|
|
|
'CORE_DIRECTIVES',
|
2015-09-14 23:49:29 -04:00
|
|
|
'CheckboxControlValueAccessor',
|
|
|
|
'Control',
|
|
|
|
'ControlArray',
|
|
|
|
'ControlContainer',
|
|
|
|
'ControlGroup',
|
2015-12-10 20:21:51 -05:00
|
|
|
'ControlValueAccessor:dart',
|
2015-09-14 23:49:29 -04:00
|
|
|
'CurrencyPipe',
|
|
|
|
'DatePipe',
|
|
|
|
'DecimalPipe',
|
|
|
|
'DefaultValueAccessor',
|
|
|
|
'FORM_BINDINGS',
|
|
|
|
'FORM_DIRECTIVES',
|
2015-12-10 20:21:51 -05:00
|
|
|
'FORM_PROVIDERS',
|
|
|
|
'Form:dart',
|
2015-09-14 23:49:29 -04:00
|
|
|
'FormBuilder',
|
2016-02-26 13:02:52 -05:00
|
|
|
'I18nPluralPipe',
|
|
|
|
'I18nSelectPipe',
|
2015-09-14 23:49:29 -04:00
|
|
|
'JsonPipe',
|
|
|
|
'LowerCasePipe',
|
2015-12-10 20:21:51 -05:00
|
|
|
'MaxLengthValidator',
|
|
|
|
'MinLengthValidator',
|
|
|
|
'NG_ASYNC_VALIDATORS',
|
2015-09-14 23:49:29 -04:00
|
|
|
'NG_VALIDATORS',
|
2015-11-02 14:35:47 -05:00
|
|
|
'NG_VALUE_ACCESSOR',
|
2015-09-14 23:49:29 -04:00
|
|
|
'NgClass',
|
|
|
|
'NgControl',
|
|
|
|
'NgControlGroup',
|
|
|
|
'NgControlName',
|
2015-12-10 20:21:51 -05:00
|
|
|
'NgControlStatus',
|
2015-09-14 23:49:29 -04:00
|
|
|
'NgFor',
|
|
|
|
'NgForm',
|
|
|
|
'NgFormControl',
|
|
|
|
'NgFormModel',
|
|
|
|
'NgIf',
|
2016-04-11 11:47:28 -04:00
|
|
|
'NgTemplateOutlet',
|
2015-09-14 23:49:29 -04:00
|
|
|
'NgModel',
|
|
|
|
'NgSelectOption',
|
|
|
|
'NgStyle',
|
|
|
|
'NgSwitch',
|
|
|
|
'NgSwitchWhen',
|
2016-03-11 12:00:18 -05:00
|
|
|
'NgSwitchDefault',
|
2015-12-10 20:21:51 -05:00
|
|
|
'NumberPipe',
|
|
|
|
'ObservableListDiff:dart',
|
|
|
|
'ObservableListDiffFactory:dart',
|
2015-11-20 01:36:28 -05:00
|
|
|
'PatternValidator',
|
2015-12-10 20:21:51 -05:00
|
|
|
'PercentPipe',
|
2015-12-27 01:05:25 -05:00
|
|
|
'ReplacePipe',
|
2015-12-10 20:21:51 -05:00
|
|
|
'RequiredValidator',
|
|
|
|
'SelectControlValueAccessor',
|
|
|
|
'SlicePipe',
|
|
|
|
'UpperCasePipe',
|
|
|
|
'Validator:dart',
|
|
|
|
'Validators',
|
2016-02-05 19:08:53 -05:00
|
|
|
'RadioButtonState',
|
2016-03-11 12:00:18 -05:00
|
|
|
'NgLocalization',
|
|
|
|
'NgPlural',
|
|
|
|
'NgPluralCase'
|
2015-12-10 20:21:51 -05:00
|
|
|
];
|
|
|
|
|
|
|
|
var NG_COMPILER = [
|
2016-04-12 12:40:37 -04:00
|
|
|
"TemplateAst:dart",
|
|
|
|
"TemplateAstVisitor:dart",
|
|
|
|
"DEFAULT_PACKAGE_URL_PROVIDER",
|
|
|
|
"UrlResolver",
|
|
|
|
"AttrAst",
|
|
|
|
"BoundDirectivePropertyAst",
|
|
|
|
"BoundElementPropertyAst",
|
|
|
|
"BoundEventAst",
|
|
|
|
"BoundTextAst",
|
|
|
|
"COMPILER_PROVIDERS",
|
|
|
|
"CompileDirectiveMetadata",
|
|
|
|
"CompileTemplateMetadata",
|
|
|
|
"CompileTypeMetadata",
|
|
|
|
"DirectiveAst",
|
|
|
|
"ElementAst",
|
|
|
|
"EmbeddedTemplateAst",
|
|
|
|
"NgContentAst",
|
|
|
|
"PLATFORM_DIRECTIVES",
|
|
|
|
"PLATFORM_PIPES",
|
|
|
|
"PropertyBindingType",
|
|
|
|
"SourceModule",
|
|
|
|
"TEMPLATE_TRANSFORMS",
|
|
|
|
"TextAst",
|
|
|
|
"VariableAst",
|
|
|
|
"XHR",
|
2016-01-06 17:13:44 -05:00
|
|
|
"templateVisitAll",
|
|
|
|
"CompileDiDependencyMetadata",
|
|
|
|
"CompileFactoryMetadata",
|
|
|
|
"CompileIdentifierMetadata",
|
|
|
|
"CompileMetadataWithIdentifier",
|
|
|
|
"CompileMetadataWithType",
|
|
|
|
"CompilePipeMetadata",
|
|
|
|
"CompileProviderMetadata",
|
|
|
|
"CompileQueryMetadata",
|
|
|
|
"CompileTokenMetadata",
|
|
|
|
"CompilerConfig",
|
|
|
|
"RenderTypes",
|
|
|
|
"DirectiveResolver",
|
|
|
|
"NormalizedComponentWithViewDirectives",
|
|
|
|
"OfflineCompiler",
|
|
|
|
"PipeResolver",
|
|
|
|
"ProviderAst",
|
|
|
|
"ProviderAstType",
|
|
|
|
"ViewResolver",
|
|
|
|
"createOfflineCompileUrlResolver"
|
2015-12-10 20:21:51 -05:00
|
|
|
];
|
|
|
|
|
|
|
|
var NG_CORE = [
|
2016-04-12 12:40:37 -04:00
|
|
|
'APP_COMPONENT',
|
|
|
|
'APP_INITIALIZER',
|
|
|
|
'APP_ID',
|
|
|
|
'AngularEntrypoint:dart',
|
|
|
|
'AbstractProviderError',
|
|
|
|
'ApplicationRef',
|
|
|
|
'APPLICATION_COMMON_PROVIDERS',
|
|
|
|
'Attribute',
|
|
|
|
'AttributeMetadata',
|
|
|
|
'Binding',
|
|
|
|
'Provider',
|
|
|
|
'ProviderBuilder',
|
|
|
|
'PLATFORM_DIRECTIVES',
|
|
|
|
"CollectionChangeRecord",
|
|
|
|
'ChangeDetectionStrategy',
|
|
|
|
'ChangeDetectorRef',
|
|
|
|
'Class:js',
|
2016-04-13 20:05:17 -04:00
|
|
|
'ComponentResolver',
|
2016-04-12 12:40:37 -04:00
|
|
|
'Component',
|
|
|
|
'ComponentMetadata',
|
|
|
|
'ComponentRef',
|
|
|
|
'ContentChild',
|
|
|
|
'ContentChildMetadata',
|
|
|
|
'ContentChildren',
|
|
|
|
'ContentChildrenMetadata',
|
|
|
|
'CyclicDependencyError',
|
|
|
|
'PLATFORM_PIPES',
|
|
|
|
'DebugNode',
|
|
|
|
'DebugElement',
|
2016-04-14 15:35:24 -04:00
|
|
|
'ReflectiveDependency',
|
2016-04-12 12:40:37 -04:00
|
|
|
'DependencyMetadata',
|
|
|
|
'Directive',
|
|
|
|
'DirectiveMetadata',
|
|
|
|
'DynamicComponentLoader',
|
|
|
|
'ElementRef',
|
|
|
|
'Output',
|
|
|
|
'EmbeddedViewRef',
|
|
|
|
'EventEmitter',
|
|
|
|
'ExceptionHandler',
|
|
|
|
'OutputMetadata',
|
|
|
|
'enableProdMode',
|
|
|
|
'ExpressionChangedAfterItHasBeenCheckedException',
|
|
|
|
'Host',
|
|
|
|
'HostBinding',
|
|
|
|
'HostBindingMetadata',
|
|
|
|
'HostListener',
|
|
|
|
'HostListenerMetadata',
|
|
|
|
'HostMetadata',
|
2016-04-13 20:05:17 -04:00
|
|
|
'ComponentFactory',
|
2016-04-12 12:40:37 -04:00
|
|
|
'Inject',
|
|
|
|
'InjectMetadata',
|
|
|
|
'Injectable',
|
|
|
|
'InjectableMetadata',
|
|
|
|
'Injector',
|
2016-04-14 15:35:24 -04:00
|
|
|
'ReflectiveInjector',
|
2016-04-12 12:40:37 -04:00
|
|
|
'InstantiationError',
|
|
|
|
'InvalidProviderError',
|
|
|
|
'IterableDiffers',
|
2016-04-14 15:35:24 -04:00
|
|
|
'ReflectiveKey',
|
2016-04-12 12:40:37 -04:00
|
|
|
'KeyValueChangeRecord',
|
|
|
|
'KeyValueDiffers',
|
|
|
|
'NgZone',
|
|
|
|
'NgZoneError',
|
|
|
|
'NoAnnotationError',
|
|
|
|
'NoProviderError',
|
|
|
|
'OpaqueToken',
|
|
|
|
'Optional',
|
|
|
|
'OptionalMetadata',
|
|
|
|
'OutOfBoundsError',
|
|
|
|
'Pipe',
|
|
|
|
'PipeMetadata',
|
|
|
|
'PlatformRef',
|
|
|
|
'Input',
|
|
|
|
'InputMetadata',
|
|
|
|
'Query',
|
|
|
|
'QueryList',
|
|
|
|
'QueryMetadata',
|
|
|
|
'Renderer',
|
|
|
|
'RootRenderer',
|
|
|
|
'RenderComponentType',
|
2016-04-14 15:35:24 -04:00
|
|
|
'ResolvedReflectiveBinding:dart',
|
|
|
|
'ResolvedReflectiveProvider:dart',
|
|
|
|
'ResolvedReflectiveFactory',
|
2016-04-12 12:40:37 -04:00
|
|
|
'Self',
|
|
|
|
'SelfMetadata',
|
|
|
|
'SkipSelf',
|
|
|
|
'SkipSelfMetadata',
|
|
|
|
'SimpleChange',
|
|
|
|
'TemplateRef',
|
|
|
|
'Testability',
|
|
|
|
'TestabilityRegistry',
|
|
|
|
'GetTestability:dart',
|
|
|
|
'setTestabilityGetter',
|
|
|
|
'Type',
|
|
|
|
'PACKAGE_ROOT_URL',
|
2016-03-08 16:36:48 -05:00
|
|
|
'View:dart',
|
|
|
|
/*
|
|
|
|
'View.directives:dart',
|
|
|
|
'View.encapsulation:dart',
|
|
|
|
'View.pipes:dart',
|
|
|
|
'View.styleUrls:dart',
|
|
|
|
'View.styles:dart',
|
|
|
|
'View.template:dart',
|
|
|
|
'View.templateUrl:dart',
|
|
|
|
*/
|
2016-04-12 12:40:37 -04:00
|
|
|
'ViewChild',
|
|
|
|
'ViewChildMetadata',
|
|
|
|
'ViewChildren',
|
|
|
|
'ViewChildrenMetadata',
|
|
|
|
'ViewContainerRef',
|
|
|
|
'ViewEncapsulation',
|
|
|
|
'ViewMetadata',
|
|
|
|
'ViewQuery',
|
|
|
|
'ViewQueryMetadata',
|
|
|
|
'WrappedException',
|
|
|
|
'WrappedValue',
|
|
|
|
'asNativeElements',
|
|
|
|
'bind',
|
|
|
|
'provide',
|
|
|
|
'createNgZone',
|
|
|
|
'forwardRef:js',
|
|
|
|
'platform',
|
|
|
|
'resolveForwardRef:js',
|
|
|
|
'PLATFORM_COMMON_PROVIDERS',
|
|
|
|
'PLATFORM_INITIALIZER',
|
|
|
|
'AfterContentChecked:dart',
|
|
|
|
'AfterContentInit:dart',
|
|
|
|
'AfterViewChecked:dart',
|
|
|
|
'AfterViewInit:dart',
|
|
|
|
'DoCheck:dart',
|
|
|
|
'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',
|
2016-03-11 12:00:18 -05:00
|
|
|
'TrackByFn:dart'
|
2015-12-10 20:21:51 -05:00
|
|
|
];
|
|
|
|
|
2016-03-11 12:00:18 -05:00
|
|
|
var NG_INSTRUMENTATION =
|
|
|
|
['wtfCreateScope', 'wtfEndTimeRange', 'wtfLeave', 'WtfScopeFn:dart', 'wtfStartTimeRange'];
|
2015-11-13 14:21:16 -05:00
|
|
|
|
2015-12-10 20:21:51 -05:00
|
|
|
var NG_PLATFORM_BROWSER = [
|
2016-04-12 12:40:37 -04:00
|
|
|
'AngularEntrypoint',
|
|
|
|
'BROWSER_APP_PROVIDERS',
|
|
|
|
'BROWSER_PROVIDERS',
|
|
|
|
'BrowserDomAdapter',
|
|
|
|
'By',
|
|
|
|
'CACHED_TEMPLATE_PROVIDER',
|
|
|
|
'DOCUMENT',
|
|
|
|
'ELEMENT_PROBE_PROVIDERS',
|
|
|
|
'ELEMENT_PROBE_PROVIDERS_PROD_MODE',
|
|
|
|
'Title',
|
|
|
|
'bootstrap',
|
|
|
|
'disableDebugTools',
|
|
|
|
'enableDebugTools',
|
|
|
|
'inspectNativeElement'
|
2015-09-21 19:48:16 -04:00
|
|
|
];
|
2015-09-14 23:49:29 -04:00
|
|
|
|
refactor(Location): out of router and into platform/common
closes https://github.com/angular/angular/issues/4943
BREAKING CHANGE:
`Location` and other related providers have been moved out of `router` and into `platform/common`. `BrowserPlatformLocation` is not meant to be used directly however advanced configurations may use it via the following import change.
Before:
```
import {
PlatformLocation,
Location,
LocationStrategy,
HashLocationStrategy,
PathLocationStrategy,
APP_BASE_HREF}
from 'angular2/router';
import {BrowserPlatformLocation} from 'angular2/src/router/location/browser_platform_location';
```
After:
```
import {
PlatformLocation,
Location,
LocationStrategy,
HashLocationStrategy,
PathLocationStrategy,
APP_BASE_HREF}
from 'angular2/platform/common';
import {BrowserPlatformLocation} from 'angular2/src/platform/browser/location/browser_platform_location';
```
Closes #7962
2016-04-08 03:31:20 -04:00
|
|
|
var NG_PLATFORM_COMMON = [
|
|
|
|
'APP_BASE_HREF',
|
|
|
|
'HashLocationStrategy',
|
|
|
|
'Location',
|
|
|
|
'LocationStrategy',
|
|
|
|
'PathLocationStrategy',
|
|
|
|
'PlatformLocation',
|
|
|
|
'UrlChangeEvent:dart',
|
|
|
|
'UrlChangeListener:dart'
|
|
|
|
];
|
|
|
|
|
2015-10-26 23:17:46 -04:00
|
|
|
var NG_UPGRADE = [
|
2016-03-11 12:00:18 -05:00
|
|
|
'UpgradeAdapter',
|
|
|
|
'UpgradeAdapterRef',
|
2015-10-26 23:17:46 -04:00
|
|
|
];
|
|
|
|
|
2015-12-10 20:21:51 -05:00
|
|
|
var NG_API = {
|
|
|
|
ngCommon: NG_COMMON,
|
|
|
|
ngCompiler: NG_COMPILER,
|
|
|
|
ngCore: NG_CORE,
|
|
|
|
ngInstrumentation: NG_INSTRUMENTATION,
|
|
|
|
ngPlatformBrowser: NG_PLATFORM_BROWSER,
|
refactor(Location): out of router and into platform/common
closes https://github.com/angular/angular/issues/4943
BREAKING CHANGE:
`Location` and other related providers have been moved out of `router` and into `platform/common`. `BrowserPlatformLocation` is not meant to be used directly however advanced configurations may use it via the following import change.
Before:
```
import {
PlatformLocation,
Location,
LocationStrategy,
HashLocationStrategy,
PathLocationStrategy,
APP_BASE_HREF}
from 'angular2/router';
import {BrowserPlatformLocation} from 'angular2/src/router/location/browser_platform_location';
```
After:
```
import {
PlatformLocation,
Location,
LocationStrategy,
HashLocationStrategy,
PathLocationStrategy,
APP_BASE_HREF}
from 'angular2/platform/common';
import {BrowserPlatformLocation} from 'angular2/src/platform/browser/location/browser_platform_location';
```
Closes #7962
2016-04-08 03:31:20 -04:00
|
|
|
ngPlatformCommon: NG_PLATFORM_COMMON,
|
2015-12-10 20:21:51 -05:00
|
|
|
ngUpgrade: NG_UPGRADE
|
|
|
|
};
|
2015-10-26 23:17:46 -04:00
|
|
|
|
2015-09-14 23:49:29 -04:00
|
|
|
export function main() {
|
2015-09-21 19:48:16 -04:00
|
|
|
/**
|
2016-03-11 12:00:18 -05:00
|
|
|
var x = getSymbolsFromLibrary('ng');
|
|
|
|
x.sort();
|
|
|
|
var parts = [];
|
|
|
|
x.forEach((i) => parts.push(`'${i'`));
|
2015-09-21 19:48:16 -04:00
|
|
|
print(`[ ${parts.join(',
|
|
|
|
')} ]`);
|
|
|
|
*/
|
|
|
|
|
2015-09-14 23:49:29 -04:00
|
|
|
describe('public API', () => {
|
refactor(Location): out of router and into platform/common
closes https://github.com/angular/angular/issues/4943
BREAKING CHANGE:
`Location` and other related providers have been moved out of `router` and into `platform/common`. `BrowserPlatformLocation` is not meant to be used directly however advanced configurations may use it via the following import change.
Before:
```
import {
PlatformLocation,
Location,
LocationStrategy,
HashLocationStrategy,
PathLocationStrategy,
APP_BASE_HREF}
from 'angular2/router';
import {BrowserPlatformLocation} from 'angular2/src/router/location/browser_platform_location';
```
After:
```
import {
PlatformLocation,
Location,
LocationStrategy,
HashLocationStrategy,
PathLocationStrategy,
APP_BASE_HREF}
from 'angular2/platform/common';
import {BrowserPlatformLocation} from 'angular2/src/platform/browser/location/browser_platform_location';
```
Closes #7962
2016-04-08 03:31:20 -04:00
|
|
|
var barrelList = [
|
|
|
|
'ngCommon',
|
|
|
|
'ngCompiler',
|
|
|
|
'ngCore',
|
|
|
|
'ngInstrumentation',
|
|
|
|
'ngPlatformBrowser',
|
|
|
|
'ngPlatformCommon',
|
|
|
|
'ngUpgrade'
|
|
|
|
];
|
2016-03-11 12:00:18 -05:00
|
|
|
|
2015-12-10 20:21:51 -05:00
|
|
|
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`, () => {
|
2016-03-11 12:00:18 -05:00
|
|
|
var symbols = getSymbolsFromLibrary(mod);
|
|
|
|
expect(diff(symbols, NG_API[mod])).toEqual([]);
|
2015-12-10 20:21:51 -05:00
|
|
|
})
|
|
|
|
});
|
2016-03-11 12:00:18 -05:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function diff(actual: string[], expected: string[]): string[] {
|
|
|
|
ListWrapper.sort(actual, compareIgnoreLang);
|
|
|
|
ListWrapper.sort(expected, compareIgnoreLang);
|
2016-04-12 12:40:37 -04:00
|
|
|
let mode = IS_DART ? "dart" : "js";
|
2016-03-11 12:00:18 -05:00
|
|
|
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);
|
|
|
|
}
|
2015-12-10 20:21:51 -05:00
|
|
|
|
2016-03-11 12:00:18 -05:00
|
|
|
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);
|
|
|
|
}
|
2015-12-10 20:21:51 -05:00
|
|
|
|
2016-03-11 12:00:18 -05:00
|
|
|
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;
|
2015-09-14 23:49:29 -04:00
|
|
|
}
|