diff --git a/integration/ts-compat/BUILD.bazel b/integration/ts-compat/BUILD.bazel index ef66318ba103..c10fca62da45 100644 --- a/integration/ts-compat/BUILD.bazel +++ b/integration/ts-compat/BUILD.bazel @@ -13,6 +13,7 @@ write_file( # List of TypeScript packages that we want to run the compatibility test against. # The list contains NPM module names that resolve to the desired TypeScript version. typescript_version_packages = [ + "typescript-3.9", "typescript", ] diff --git a/package.json b/package.json index 5de2d3c36ad9..77849f1c1ff5 100644 --- a/package.json +++ b/package.json @@ -49,13 +49,13 @@ }, "version": "10.2.0-next.0", "dependencies": { - "@angular/animations": "^10.0.8", - "@angular/common": "^10.0.8", - "@angular/compiler": "^10.0.8", - "@angular/core": "^10.0.8", - "@angular/elements": "^10.0.8", - "@angular/forms": "^10.0.8", - "@angular/platform-browser": "^10.0.8", + "@angular/animations": "^10.1.0-next.8", + "@angular/common": "^10.1.0-next.8", + "@angular/compiler": "^10.1.0-next.8", + "@angular/core": "^10.1.0-next.8", + "@angular/elements": "^10.1.0-next.8", + "@angular/forms": "^10.1.0-next.8", + "@angular/platform-browser": "^10.1.0-next.8", "@types/googlemaps": "^3.39.3", "@types/youtube": "^0.0.38", "@webcomponents/custom-elements": "^1.1.0", @@ -71,13 +71,13 @@ "@angular-devkit/build-optimizer": "^0.1000.5", "@angular-devkit/core": "^10.0.5", "@angular-devkit/schematics": "^10.0.5", - "@angular/bazel": "^10.0.8", + "@angular/bazel": "^10.1.0-next.8", "@angular/benchpress": "^0.2.1", - "@angular/compiler-cli": "^10.0.8", + "@angular/compiler-cli": "^10.1.0-next.8", "@angular/dev-infra-private": "https://github.com/angular/dev-infra-private-builds.git#d0855af987db4e426477da1780bcd02941c31271", - "@angular/platform-browser-dynamic": "^10.0.8", - "@angular/platform-server": "^10.0.8", - "@angular/router": "^10.0.8", + "@angular/platform-browser-dynamic": "^10.1.0-next.8", + "@angular/platform-server": "^10.1.0-next.8", + "@angular/router": "^10.1.0-next.8", "@bazel/bazelisk": "^1.4.0", "@bazel/buildifier": "^2.2.1", "@bazel/ibazel": "^0.13.0", @@ -165,14 +165,15 @@ "ts-api-guardian": "^0.5.0", "ts-node": "^8.10.1", "tsickle": "0.38.1", - "tslint": "^6.1.0", + "tslint": "^6.1.3", "tsutils": "^3.17.1", - "typescript": "3.9.7", + "typescript": "4.0.2", + "typescript-3.9": "npm:typescript@~3.9.7", "vrsource-tslint-rules": "5.1.1", "yaml": "^1.10.0" }, "resolutions": { - "dgeni-packages/typescript": "3.9.7", + "dgeni-packages/typescript": "4.0.2", "**/graceful-fs": "4.2.2" } } diff --git a/src/cdk-experimental/selection/row-selection.ts b/src/cdk-experimental/selection/row-selection.ts index 005b1fb2d82e..cacde2ce5a50 100644 --- a/src/cdk-experimental/selection/row-selection.ts +++ b/src/cdk-experimental/selection/row-selection.ts @@ -31,7 +31,7 @@ export class CdkRowSelection { @Input('cdkRowSelectionIndex') get index(): number|undefined { return this._index; } set index(index: number|undefined) { this._index = coerceNumberProperty(index); } - private _index?: number; + protected _index?: number; constructor(readonly _selection: CdkSelection) {} diff --git a/src/cdk-experimental/selection/selection-toggle.ts b/src/cdk-experimental/selection/selection-toggle.ts index 1d399a266f93..be501a69f7ee 100644 --- a/src/cdk-experimental/selection/selection-toggle.ts +++ b/src/cdk-experimental/selection/selection-toggle.ts @@ -44,7 +44,7 @@ export class CdkSelectionToggle implements OnDestroy, OnInit { @Input('cdkSelectionToggleIndex') get index(): number|undefined { return this._index; } set index(index: number|undefined) { this._index = coerceNumberProperty(index); } - private _index?: number; + protected _index?: number; /** The checked state of the selection toggle */ readonly checked: Observable = this._selection.change.pipe( diff --git a/src/cdk-experimental/selection/selection.ts b/src/cdk-experimental/selection/selection.ts index 442e38a0918f..62b7dbd879f4 100644 --- a/src/cdk-experimental/selection/selection.ts +++ b/src/cdk-experimental/selection/selection.ts @@ -57,7 +57,7 @@ export class CdkSelection implements OnInit, AfterContentChecked, CollectionV set multiple(multiple: boolean) { this._multiple = coerceBooleanProperty(multiple); } - private _multiple: boolean; + protected _multiple: boolean; /** Emits when selection changes. */ @Output('cdkSelectionChange') change = new EventEmitter>(); diff --git a/src/cdk/a11y/key-manager/list-key-manager.spec.ts b/src/cdk/a11y/key-manager/list-key-manager.spec.ts index 849db859841b..fdbcd65d4dec 100644 --- a/src/cdk/a11y/key-manager/list-key-manager.spec.ts +++ b/src/cdk/a11y/key-manager/list-key-manager.spec.ts @@ -2,7 +2,6 @@ import {DOWN_ARROW, END, HOME, LEFT_ARROW, RIGHT_ARROW, TAB, UP_ARROW} from '@an import {createKeyboardEvent} from '@angular/cdk/testing/private'; import {QueryList} from '@angular/core'; import {fakeAsync, tick} from '@angular/core/testing'; -import {Subject} from 'rxjs'; import {take} from 'rxjs/operators'; import {FocusOrigin} from '../focus-monitor/focus-monitor'; import {ActiveDescendantKeyManager} from './activedescendant-key-manager'; @@ -25,26 +24,13 @@ class FakeHighlightable { setInactiveStyles() {} } -class FakeQueryList extends QueryList { - changes = new Subject>(); - items: T[]; - get length() { return this.items.length; } - set length(_) { /* Empty setter for base class constructor */ } - get first() { return this.items[0]; } - toArray() { return this.items; } - some(...args: [(value: T, index: number, array: T[]) => unknown, any?]) { - return this.items.some(...args); - } - notifyOnChanges() { this.changes.next(this); } -} - interface KeyEventTestContext { nextKeyEvent: KeyboardEvent; prevKeyEvent: KeyboardEvent; } describe('Key managers', () => { - let itemList: FakeQueryList; + let itemList: QueryList; let fakeKeyEvents: { downArrow: KeyboardEvent, upArrow: KeyboardEvent, @@ -57,7 +43,7 @@ describe('Key managers', () => { }; beforeEach(() => { - itemList = new FakeQueryList(); + itemList = new QueryList(); fakeKeyEvents = { downArrow: createKeyboardEvent('keydown', DOWN_ARROW), upArrow: createKeyboardEvent('keydown', UP_ARROW), @@ -81,11 +67,11 @@ describe('Key managers', () => { }; beforeEach(() => { - itemList.items = [ + itemList.reset([ new FakeFocusable('one'), new FakeFocusable('two'), new FakeFocusable('three') - ]; + ]); keyManager = new ListKeyManager(itemList); // first item is already focused @@ -97,8 +83,10 @@ describe('Key managers', () => { it('should maintain the active item if the amount of items changes', () => { expect(keyManager.activeItemIndex).toBe(0); expect(keyManager.activeItem!.getLabel()).toBe('one'); - - itemList.items.unshift(new FakeFocusable('zero')); + itemList.reset([ + new FakeFocusable('zero'), + ...itemList.toArray(), + ]); itemList.notifyOnChanges(); expect(keyManager.activeItemIndex).toBe(1); @@ -152,7 +140,10 @@ describe('Key managers', () => { const subscription = keyManager.change.subscribe(spy); keyManager.setActiveItem(0); - itemList.items.unshift(new FakeFocusable('zero')); + itemList.reset([ + new FakeFocusable('zero'), + ...itemList.toArray(), + ]); keyManager.setActiveItem(0); expect(spy).toHaveBeenCalledTimes(1); @@ -230,8 +221,8 @@ describe('Key managers', () => { expect(keyManager.activeItemIndex).toBe(0); keyManager.onKeydown(fakeKeyEvents.end); - - expect(keyManager.activeItemIndex).toBe(itemList.items.length - 1); + keyManager.setActiveItem(itemList.toArray()[2]); + expect(keyManager.activeItemIndex).toBe(itemList.length - 1); }); }); @@ -324,7 +315,9 @@ describe('Key managers', () => { }); it('should skip disabled items', () => { - itemList.items[1].disabled = true; + const items = itemList.toArray(); + items[1].disabled = true; + itemList.reset(items); // Next event should skip past disabled item from 0 to 2 keyManager.onKeydown(this.nextKeyEvent); @@ -343,9 +336,11 @@ describe('Key managers', () => { }); it('should work normally when disabled property does not exist', () => { - itemList.items[0].disabled = undefined; - itemList.items[1].disabled = undefined; - itemList.items[2].disabled = undefined; + const items = itemList.toArray(); + items[0].disabled = undefined; + items[1].disabled = undefined; + items[2].disabled = undefined; + itemList.reset(items); keyManager.onKeydown(this.nextKeyEvent); expect(keyManager.activeItemIndex) @@ -384,7 +379,10 @@ describe('Key managers', () => { }); it('should not move active item to end when the last item is disabled', () => { - itemList.items[2].disabled = true; + const items = itemList.toArray(); + items[2].disabled = true; + itemList.reset(items); + keyManager.onKeydown(this.nextKeyEvent); expect(keyManager.activeItemIndex) .toBe(1, `Expected second item of the list to be active.`); @@ -469,7 +467,7 @@ describe('Key managers', () => { expect(keyManager.activeItemIndex) .toBe(0, `Expected first item of the list to be active.`); - keyManager.setActiveItem(itemList.items[2]); + keyManager.setActiveItem(itemList.toArray()[2]); expect(keyManager.activeItemIndex) .toBe(2, `Expected activeItemIndex to be updated.`); }); @@ -493,13 +491,13 @@ describe('Key managers', () => { expect(keyManager.activeItemIndex).toBe(1, 'Expected active item to be the second option.'); expect(keyManager.activeItem) - .toBe(itemList.items[1], 'Expected the active item to match the second option.'); + .toBe(itemList.toArray()[1], 'Expected the active item to match the second option.'); keyManager.onKeydown(fakeKeyEvents.downArrow); expect(keyManager.activeItemIndex).toBe(2, 'Expected active item to be the third option.'); expect(keyManager.activeItem) - .toBe(itemList.items[2], 'Expected the active item ID to match the third option.'); + .toBe(itemList.toArray()[2], 'Expected the active item ID to match the third option.'); }); it('should setFirstItemActive()', () => { @@ -514,7 +512,9 @@ describe('Key managers', () => { }); it('should set the active item to the second item if the first one is disabled', () => { - itemList.items[0].disabled = true; + const items = itemList.toArray(); + items[0].disabled = true; + itemList.reset(items); keyManager.setFirstItemActive(); expect(keyManager.activeItemIndex) @@ -531,7 +531,9 @@ describe('Key managers', () => { }); it('should set the active item to the second to last item if the last is disabled', () => { - itemList.items[2].disabled = true; + const items = itemList.toArray(); + items[2].disabled = true; + itemList.reset(items); keyManager.setLastItemActive(); expect(keyManager.activeItemIndex) @@ -548,7 +550,10 @@ describe('Key managers', () => { }); it('should set the active item to the next enabled item if next is disabled', () => { - itemList.items[1].disabled = true; + const items = itemList.toArray(); + items[1].disabled = true; + itemList.reset(items); + expect(keyManager.activeItemIndex) .toBe(0, `Expected first item of the list to be active.`); @@ -568,7 +573,10 @@ describe('Key managers', () => { }); it('should skip disabled items when setPreviousItemActive() is called', () => { - itemList.items[1].disabled = true; + const items = itemList.toArray(); + items[1].disabled = true; + itemList.reset(items); + keyManager.onKeydown(fakeKeyEvents.downArrow); keyManager.onKeydown(fakeKeyEvents.downArrow); expect(keyManager.activeItemIndex) @@ -637,8 +645,9 @@ describe('Key managers', () => { it('should not get into an infinite loop if all items are disabled', () => { keyManager.withWrap(); keyManager.setActiveItem(0); - - itemList.items.forEach(item => item.disabled = true); + const items = itemList.toArray(); + items.forEach(item => item.disabled = true); + itemList.reset(items); keyManager.onKeydown(fakeKeyEvents.downArrow); }); @@ -648,7 +657,7 @@ describe('Key managers', () => { keyManager.setFirstItemActive(); keyManager.onKeydown(fakeKeyEvents.upArrow); - expect(keyManager.activeItemIndex).toBe(itemList.items.length - 1); + expect(keyManager.activeItemIndex).toBe(itemList.length - 1); keyManager.withWrap(false); keyManager.setFirstItemActive(); @@ -661,7 +670,9 @@ describe('Key managers', () => { describe('skip predicate', () => { it('should skip disabled items by default', () => { - itemList.items[1].disabled = true; + const items = itemList.toArray(); + items[1].disabled = true; + itemList.reset(items); expect(keyManager.activeItemIndex).toBe(0); @@ -673,7 +684,9 @@ describe('Key managers', () => { it('should be able to skip items with a custom predicate', () => { keyManager.skipPredicate(item => item.skipItem); - itemList.items[1].skipItem = true; + const items = itemList.toArray(); + items[1].skipItem = true; + itemList.reset(items); expect(keyManager.activeItemIndex).toBe(0); @@ -692,9 +705,8 @@ describe('Key managers', () => { }); it('should throw if the items do not implement the getLabel method', () => { - const invalidQueryList = new FakeQueryList(); - - invalidQueryList.items = [{ disabled: false }]; + const invalidQueryList = new QueryList(); + invalidQueryList.reset([{ disabled: false }]); const invalidManager = new ListKeyManager(invalidQueryList as QueryList); @@ -707,11 +719,11 @@ describe('Key managers', () => { keyManager.onKeydown(createKeyboardEvent('keydown', 78, 'n')); // types "n" keyManager.onKeydown(createKeyboardEvent('keydown', 69, 'e')); // types "e" - expect(keyManager.activeItem).not.toBe(itemList.items[0]); + expect(keyManager.activeItem).not.toBe(itemList.toArray()[0]); tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[0]); + expect(keyManager.activeItem).toBe(itemList.toArray()[0]); })); it('should focus the first item that starts with a letter', fakeAsync(() => { @@ -719,7 +731,7 @@ describe('Key managers', () => { tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[1]); + expect(keyManager.activeItem).toBe(itemList.toArray()[1]); })); it('should not move focus if a modifier, that is not allowed, is pressed', fakeAsync(() => { @@ -750,7 +762,7 @@ describe('Key managers', () => { tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[2]); + expect(keyManager.activeItem).toBe(itemList.toArray()[2]); })); it('should cancel any pending timers if a navigation key is pressed', fakeAsync(() => { @@ -760,48 +772,51 @@ describe('Key managers', () => { tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[0]); + expect(keyManager.activeItem).toBe(itemList.toArray()[0]); })); it('should handle non-English input', fakeAsync(() => { - itemList.items = [ + itemList.reset([ new FakeFocusable('едно'), new FakeFocusable('две'), new FakeFocusable('три') - ]; + ]); const keyboardEvent = createKeyboardEvent('keydown', 68, 'д'); keyManager.onKeydown(keyboardEvent); // types "д" tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[1]); + expect(keyManager.activeItem).toBe(itemList.toArray()[1]); })); it('should handle non-letter characters', fakeAsync(() => { - itemList.items = [ + itemList.reset([ new FakeFocusable('[]'), new FakeFocusable('321'), new FakeFocusable('`!?') - ]; + ]); keyManager.onKeydown(createKeyboardEvent('keydown', 192, '`')); // types "`" tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[2]); + expect(keyManager.activeItem).toBe(itemList.toArray()[2]); keyManager.onKeydown(createKeyboardEvent('keydown', 51, '3')); // types "3" tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[1]); + expect(keyManager.activeItem).toBe(itemList.toArray()[1]); keyManager.onKeydown(createKeyboardEvent('keydown', 219, '[')); // types "[" tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[0]); + expect(keyManager.activeItem).toBe(itemList.toArray()[0]); })); it('should not focus disabled items', fakeAsync(() => { expect(keyManager.activeItem).toBeFalsy(); - itemList.items[0].disabled = true; + const items = itemList.toArray(); + items[0].disabled = true; + itemList.reset(items); + keyManager.onKeydown(createKeyboardEvent('keydown', 79, 'o')); // types "o" tick(debounceInterval); @@ -809,35 +824,35 @@ describe('Key managers', () => { })); it('should start looking for matches after the active item', fakeAsync(() => { - itemList.items = [ + itemList.reset([ new FakeFocusable('Bilbo'), new FakeFocusable('Frodo'), new FakeFocusable('Pippin'), new FakeFocusable('Boromir'), new FakeFocusable('Aragorn') - ]; + ]); keyManager.setActiveItem(1); keyManager.onKeydown(createKeyboardEvent('keydown', 66, 'b')); tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[3]); + expect(keyManager.activeItem).toBe(itemList.toArray()[3]); })); it('should wrap back around if there were no matches after the active item', fakeAsync(() => { - itemList.items = [ + itemList.reset([ new FakeFocusable('Bilbo'), new FakeFocusable('Frodo'), new FakeFocusable('Pippin'), new FakeFocusable('Boromir'), new FakeFocusable('Aragorn') - ]; + ]); keyManager.setActiveItem(3); keyManager.onKeydown(createKeyboardEvent('keydown', 66, 'b')); tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[0]); + expect(keyManager.activeItem).toBe(itemList.toArray()[0]); })); it('should wrap back around if the last item is active', fakeAsync(() => { @@ -845,7 +860,7 @@ describe('Key managers', () => { keyManager.onKeydown(createKeyboardEvent('keydown', 79, 'o')); tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[0]); + expect(keyManager.activeItem).toBe(itemList.toArray()[0]); })); it('should be able to select the first item', fakeAsync(() => { @@ -853,7 +868,7 @@ describe('Key managers', () => { keyManager.onKeydown(createKeyboardEvent('keydown', 79, 'o')); tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[0]); + expect(keyManager.activeItem).toBe(itemList.toArray()[0]); })); it('should not do anything if there is no match', fakeAsync(() => { @@ -861,7 +876,7 @@ describe('Key managers', () => { keyManager.onKeydown(createKeyboardEvent('keydown', 87, 'w')); tick(debounceInterval); - expect(keyManager.activeItem).toBe(itemList.items[1]); + expect(keyManager.activeItem).toBe(itemList.toArray()[1]); })); it('should expose whether the user is currently typing', fakeAsync(() => { @@ -884,40 +899,40 @@ describe('Key managers', () => { let keyManager: FocusKeyManager; beforeEach(() => { - itemList.items = [new FakeFocusable(), new FakeFocusable(), new FakeFocusable()]; + itemList.reset([new FakeFocusable(), new FakeFocusable(), new FakeFocusable()]); keyManager = new FocusKeyManager(itemList); // first item is already focused keyManager.setFirstItemActive(); - spyOn(itemList.items[0], 'focus'); - spyOn(itemList.items[1], 'focus'); - spyOn(itemList.items[2], 'focus'); + spyOn(itemList.toArray()[0], 'focus'); + spyOn(itemList.toArray()[1], 'focus'); + spyOn(itemList.toArray()[2], 'focus'); }); it('should focus subsequent items when down arrow is pressed', () => { keyManager.onKeydown(fakeKeyEvents.downArrow); - expect(itemList.items[0].focus).not.toHaveBeenCalled(); - expect(itemList.items[1].focus).toHaveBeenCalledTimes(1); - expect(itemList.items[2].focus).not.toHaveBeenCalled(); + expect(itemList.toArray()[0].focus).not.toHaveBeenCalled(); + expect(itemList.toArray()[1].focus).toHaveBeenCalledTimes(1); + expect(itemList.toArray()[2].focus).not.toHaveBeenCalled(); keyManager.onKeydown(fakeKeyEvents.downArrow); - expect(itemList.items[0].focus).not.toHaveBeenCalled(); - expect(itemList.items[1].focus).toHaveBeenCalledTimes(1); - expect(itemList.items[2].focus).toHaveBeenCalledTimes(1); + expect(itemList.toArray()[0].focus).not.toHaveBeenCalled(); + expect(itemList.toArray()[1].focus).toHaveBeenCalledTimes(1); + expect(itemList.toArray()[2].focus).toHaveBeenCalledTimes(1); }); it('should focus previous items when up arrow is pressed', () => { keyManager.onKeydown(fakeKeyEvents.downArrow); - expect(itemList.items[0].focus).not.toHaveBeenCalled(); - expect(itemList.items[1].focus).toHaveBeenCalledTimes(1); + expect(itemList.toArray()[0].focus).not.toHaveBeenCalled(); + expect(itemList.toArray()[1].focus).toHaveBeenCalledTimes(1); keyManager.onKeydown(fakeKeyEvents.upArrow); - expect(itemList.items[0].focus).toHaveBeenCalledTimes(1); - expect(itemList.items[1].focus).toHaveBeenCalledTimes(1); + expect(itemList.toArray()[0].focus).toHaveBeenCalledTimes(1); + expect(itemList.toArray()[1].focus).toHaveBeenCalledTimes(1); }); it('should allow setting the focused item without calling focus', () => { @@ -927,22 +942,22 @@ describe('Key managers', () => { keyManager.updateActiveItem(1); expect(keyManager.activeItemIndex) .toBe(1, `Expected activeItemIndex to update after calling updateActiveItem().`); - expect(itemList.items[1].focus).not.toHaveBeenCalledTimes(1); + expect(itemList.toArray()[1].focus).not.toHaveBeenCalledTimes(1); }); it('should be able to set the focus origin', () => { keyManager.setFocusOrigin('mouse'); keyManager.onKeydown(fakeKeyEvents.downArrow); - expect(itemList.items[1].focus).toHaveBeenCalledWith('mouse'); + expect(itemList.toArray()[1].focus).toHaveBeenCalledWith('mouse'); keyManager.onKeydown(fakeKeyEvents.downArrow); - expect(itemList.items[2].focus).toHaveBeenCalledWith('mouse'); + expect(itemList.toArray()[2].focus).toHaveBeenCalledWith('mouse'); keyManager.setFocusOrigin('keyboard'); keyManager.onKeydown(fakeKeyEvents.upArrow); - expect(itemList.items[1].focus).toHaveBeenCalledWith('keyboard'); + expect(itemList.toArray()[1].focus).toHaveBeenCalledWith('keyboard'); }); }); @@ -951,50 +966,50 @@ describe('Key managers', () => { let keyManager: ActiveDescendantKeyManager; beforeEach(() => { - itemList.items = [new FakeHighlightable(), new FakeHighlightable(), new FakeHighlightable()]; + itemList.reset([new FakeHighlightable(), new FakeHighlightable(), new FakeHighlightable()]); keyManager = new ActiveDescendantKeyManager(itemList); // first item is already focused keyManager.setFirstItemActive(); - spyOn(itemList.items[0], 'setActiveStyles'); - spyOn(itemList.items[1], 'setActiveStyles'); - spyOn(itemList.items[2], 'setActiveStyles'); + spyOn(itemList.toArray()[0], 'setActiveStyles'); + spyOn(itemList.toArray()[1], 'setActiveStyles'); + spyOn(itemList.toArray()[2], 'setActiveStyles'); - spyOn(itemList.items[0], 'setInactiveStyles'); - spyOn(itemList.items[1], 'setInactiveStyles'); - spyOn(itemList.items[2], 'setInactiveStyles'); + spyOn(itemList.toArray()[0], 'setInactiveStyles'); + spyOn(itemList.toArray()[1], 'setInactiveStyles'); + spyOn(itemList.toArray()[2], 'setInactiveStyles'); }); it('should set subsequent items as active with the DOWN arrow', () => { keyManager.onKeydown(fakeKeyEvents.downArrow); - expect(itemList.items[1].setActiveStyles).toHaveBeenCalled(); - expect(itemList.items[2].setActiveStyles).not.toHaveBeenCalled(); + expect(itemList.toArray()[1].setActiveStyles).toHaveBeenCalled(); + expect(itemList.toArray()[2].setActiveStyles).not.toHaveBeenCalled(); keyManager.onKeydown(fakeKeyEvents.downArrow); - expect(itemList.items[2].setActiveStyles).toHaveBeenCalled(); + expect(itemList.toArray()[2].setActiveStyles).toHaveBeenCalled(); }); it('should set previous items as active with the UP arrow', () => { keyManager.setLastItemActive(); keyManager.onKeydown(fakeKeyEvents.upArrow); - expect(itemList.items[1].setActiveStyles).toHaveBeenCalled(); - expect(itemList.items[0].setActiveStyles).not.toHaveBeenCalled(); + expect(itemList.toArray()[1].setActiveStyles).toHaveBeenCalled(); + expect(itemList.toArray()[0].setActiveStyles).not.toHaveBeenCalled(); keyManager.onKeydown(fakeKeyEvents.upArrow); - expect(itemList.items[0].setActiveStyles).toHaveBeenCalled(); + expect(itemList.toArray()[0].setActiveStyles).toHaveBeenCalled(); }); it('should set inactive styles on previously active items', () => { keyManager.onKeydown(fakeKeyEvents.downArrow); - expect(itemList.items[0].setInactiveStyles).toHaveBeenCalled(); + expect(itemList.toArray()[0].setInactiveStyles).toHaveBeenCalled(); keyManager.onKeydown(fakeKeyEvents.upArrow); - expect(itemList.items[1].setInactiveStyles).toHaveBeenCalled(); + expect(itemList.toArray()[1].setInactiveStyles).toHaveBeenCalled(); }); }); diff --git a/src/cdk/table/cell.ts b/src/cdk/table/cell.ts index 3255f58a061a..e2ea1d3dbcec 100644 --- a/src/cdk/table/cell.ts +++ b/src/cdk/table/cell.ts @@ -70,19 +70,9 @@ const _CdkColumnDefBase: CanStickCtor&typeof CdkColumnDefBase = export class CdkColumnDef extends _CdkColumnDefBase implements CanStick { /** Unique name for this column. */ @Input('cdkColumnDef') - get name(): string { - return this._name; - } - set name(name: string) { - // If the directive is set without a name (updated programatically), then this setter will - // trigger with an empty string and should not overwrite the programatically set value. - if (name) { - this._name = name; - this.cssClassFriendlyName = name.replace(/[^a-z0-9_-]/ig, '-'); - this._updateColumnCssClassName(); - } - } - _name: string; + get name(): string { return this._name; } + set name(name: string) { this._setNameInput(name); } + protected _name: string; /** * Whether this column should be sticky positioned on the end of the row. Should make sure @@ -137,6 +127,22 @@ export class CdkColumnDef extends _CdkColumnDefBase implements CanStick { this._columnCssClassName = [`cdk-column-${this.cssClassFriendlyName}`]; } + /** + * This has been extracted to a util because of TS 4 and VE. + * View Engine doesn't support property rename inheritance. + * TS 4.0 doesn't allow properties to override accessors or vice-versa. + * @docs-private + */ + protected _setNameInput(value: string) { + // If the directive is set without a name (updated programatically), then this setter will + // trigger with an empty string and should not overwrite the programatically set value. + if (value) { + this._name = value; + this.cssClassFriendlyName = value.replace(/[^a-z0-9_-]/ig, '-'); + this._updateColumnCssClassName(); + } + } + static ngAcceptInputType_sticky: BooleanInput; static ngAcceptInputType_stickyEnd: BooleanInput; } diff --git a/src/cdk/tree/padding.ts b/src/cdk/tree/padding.ts index 38b9e489a338..5caae0e30ccf 100644 --- a/src/cdk/tree/padding.ts +++ b/src/cdk/tree/padding.ts @@ -36,13 +36,7 @@ export class CdkTreeNodePadding implements OnDestroy { /** The level of depth of the tree node. The padding will be `level * indent` pixels. */ @Input('cdkTreeNodePadding') get level(): number { return this._level; } - set level(value: number) { - // Set to null as the fallback value so that _setPadding can fall back to the node level if the - // consumer set the directive as `cdkTreeNodePadding=""`. We still want to take this value if - // they set 0 explicitly. - this._level = coerceNumberProperty(value, null)!; - this._setPadding(); - } + set level(value: number) { this._setLevelInput(value); } _level: number; /** @@ -51,20 +45,7 @@ export class CdkTreeNodePadding implements OnDestroy { */ @Input('cdkTreeNodePaddingIndent') get indent(): number | string { return this._indent; } - set indent(indent: number | string) { - let value = indent; - let units = 'px'; - - if (typeof indent === 'string') { - const parts = indent.split(cssUnitPattern); - value = parts[0]; - units = parts[1] || units; - } - - this.indentUnits = units; - this._indent = coerceNumberProperty(value); - this._setPadding(); - } + set indent(indent: number | string) { this._setIndentInput(indent); } _indent: number = 40; constructor(private _treeNode: CdkTreeNode, @@ -114,5 +95,40 @@ export class CdkTreeNodePadding implements OnDestroy { } } + /** + * This has been extracted to a util because of TS 4 and VE. + * View Engine doesn't support property rename inheritance. + * TS 4.0 doesn't allow properties to override accessors or vice-versa. + * @docs-private + */ + protected _setLevelInput(value: number) { + // Set to null as the fallback value so that _setPadding can fall back to the node level if the + // consumer set the directive as `cdkTreeNodePadding=""`. We still want to take this value if + // they set 0 explicitly. + this._level = coerceNumberProperty(value, null)!; + this._setPadding(); + } + + /** + * This has been extracted to a util because of TS 4 and VE. + * View Engine doesn't support property rename inheritance. + * TS 4.0 doesn't allow properties to override accessors or vice-versa. + * @docs-private + */ + protected _setIndentInput(indent: number | string) { + let value = indent; + let units = 'px'; + + if (typeof indent === 'string') { + const parts = indent.split(cssUnitPattern); + value = parts[0]; + units = parts[1] || units; + } + + this.indentUnits = units; + this._indent = coerceNumberProperty(value); + this._setPadding(); + } + static ngAcceptInputType_level: NumberInput; } diff --git a/src/google-maps/google-map/google-map.spec.ts b/src/google-maps/google-map/google-map.spec.ts index 0cfd988794f9..b415abf9fa0b 100644 --- a/src/google-maps/google-map/google-map.spec.ts +++ b/src/google-maps/google-map/google-map.spec.ts @@ -38,7 +38,7 @@ describe('GoogleMap', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('throws an error is the Google Maps JavaScript API was not loaded', () => { diff --git a/src/google-maps/map-bicycling-layer/map-bicycling-layer.spec.ts b/src/google-maps/map-bicycling-layer/map-bicycling-layer.spec.ts index eed0044a9bd7..30b97425c089 100644 --- a/src/google-maps/map-bicycling-layer/map-bicycling-layer.spec.ts +++ b/src/google-maps/map-bicycling-layer/map-bicycling-layer.spec.ts @@ -28,7 +28,7 @@ describe('MapBicyclingLayer', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map Bicycling Layer', () => { diff --git a/src/google-maps/map-circle/map-circle.spec.ts b/src/google-maps/map-circle/map-circle.spec.ts index b8db8f32694a..9912e406f1f4 100644 --- a/src/google-maps/map-circle/map-circle.spec.ts +++ b/src/google-maps/map-circle/map-circle.spec.ts @@ -42,7 +42,7 @@ describe('MapCircle', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map Circle', () => { diff --git a/src/google-maps/map-ground-overlay/map-ground-overlay.spec.ts b/src/google-maps/map-ground-overlay/map-ground-overlay.spec.ts index c98f30044c4f..ccf675d8926e 100644 --- a/src/google-maps/map-ground-overlay/map-ground-overlay.spec.ts +++ b/src/google-maps/map-ground-overlay/map-ground-overlay.spec.ts @@ -36,7 +36,7 @@ describe('MapGroundOverlay', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map Ground Overlay', () => { diff --git a/src/google-maps/map-info-window/map-info-window.spec.ts b/src/google-maps/map-info-window/map-info-window.spec.ts index 5c34d03fd51f..08668815db2a 100644 --- a/src/google-maps/map-info-window/map-info-window.spec.ts +++ b/src/google-maps/map-info-window/map-info-window.spec.ts @@ -32,7 +32,7 @@ describe('MapInfoWindow', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map Info Window', () => { diff --git a/src/google-maps/map-kml-layer/map-kml-layer.spec.ts b/src/google-maps/map-kml-layer/map-kml-layer.spec.ts index 5730a8f68f70..a7659af7d6fc 100644 --- a/src/google-maps/map-kml-layer/map-kml-layer.spec.ts +++ b/src/google-maps/map-kml-layer/map-kml-layer.spec.ts @@ -38,7 +38,7 @@ describe('MapKmlLayer', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map Kml Layer', () => { diff --git a/src/google-maps/map-marker/map-marker.spec.ts b/src/google-maps/map-marker/map-marker.spec.ts index 6916b047577d..0187d90553a7 100644 --- a/src/google-maps/map-marker/map-marker.spec.ts +++ b/src/google-maps/map-marker/map-marker.spec.ts @@ -30,7 +30,7 @@ describe('MapMarker', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map marker', () => { diff --git a/src/google-maps/map-polygon/map-polygon.spec.ts b/src/google-maps/map-polygon/map-polygon.spec.ts index 2f376e2291c5..4953e4b1bdba 100644 --- a/src/google-maps/map-polygon/map-polygon.spec.ts +++ b/src/google-maps/map-polygon/map-polygon.spec.ts @@ -35,7 +35,7 @@ describe('MapPolygon', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map Polygon', () => { diff --git a/src/google-maps/map-polyline/map-polyline.spec.ts b/src/google-maps/map-polyline/map-polyline.spec.ts index f7c7240c50cc..61ae017c81f3 100644 --- a/src/google-maps/map-polyline/map-polyline.spec.ts +++ b/src/google-maps/map-polyline/map-polyline.spec.ts @@ -39,7 +39,7 @@ describe('MapPolyline', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map Polyline', () => { diff --git a/src/google-maps/map-rectangle/map-rectangle.spec.ts b/src/google-maps/map-rectangle/map-rectangle.spec.ts index d296caa95d11..9cc9a99bedfe 100644 --- a/src/google-maps/map-rectangle/map-rectangle.spec.ts +++ b/src/google-maps/map-rectangle/map-rectangle.spec.ts @@ -35,7 +35,7 @@ describe('MapRectangle', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map Rectangle', () => { diff --git a/src/google-maps/map-traffic-layer/map-traffic-layer.spec.ts b/src/google-maps/map-traffic-layer/map-traffic-layer.spec.ts index 85e5c350af3a..842db4ecb366 100644 --- a/src/google-maps/map-traffic-layer/map-traffic-layer.spec.ts +++ b/src/google-maps/map-traffic-layer/map-traffic-layer.spec.ts @@ -29,7 +29,7 @@ describe('MapTrafficLayer', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map Traffic Layer', () => { diff --git a/src/google-maps/map-transit-layer/map-transit-layer.spec.ts b/src/google-maps/map-transit-layer/map-transit-layer.spec.ts index 1cbb26825671..36f01cf9d7ee 100644 --- a/src/google-maps/map-transit-layer/map-transit-layer.spec.ts +++ b/src/google-maps/map-transit-layer/map-transit-layer.spec.ts @@ -28,7 +28,7 @@ describe('MapTransitLayer', () => { }); afterEach(() => { - delete window.google; + (window.google as any) = undefined; }); it('initializes a Google Map Transit Layer', () => { diff --git a/src/material-experimental/mdc-chips/chip-set.ts b/src/material-experimental/mdc-chips/chip-set.ts index 0adeaed92b0c..f82e307d0792 100644 --- a/src/material-experimental/mdc-chips/chip-set.ts +++ b/src/material-experimental/mdc-chips/chip-set.ts @@ -36,8 +36,8 @@ let uid = 0; * Boilerplate for applying mixins to MatChipSet. * @docs-private */ -class MatChipSetBase { - disabled!: boolean; +abstract class MatChipSetBase { + abstract disabled: boolean; constructor(_elementRef: ElementRef) {} } const _MatChipSetMixinBase: HasTabIndexCtor & typeof MatChipSetBase = diff --git a/src/material-experimental/mdc-chips/chip.ts b/src/material-experimental/mdc-chips/chip.ts index 5aab136a1073..01cd7c13af3d 100644 --- a/src/material-experimental/mdc-chips/chip.ts +++ b/src/material-experimental/mdc-chips/chip.ts @@ -85,8 +85,8 @@ export class MatChipCssInternalOnly { } * Boilerplate for applying mixins to MatChip. * @docs-private */ -class MatChipBase { - disabled!: boolean; +abstract class MatChipBase { + abstract disabled: boolean; constructor(public _elementRef: ElementRef) {} } diff --git a/src/material-experimental/mdc-table/cell.ts b/src/material-experimental/mdc-table/cell.ts index 3114588891bd..eaae19f9001f 100644 --- a/src/material-experimental/mdc-table/cell.ts +++ b/src/material-experimental/mdc-table/cell.ts @@ -60,7 +60,9 @@ export class MatFooterCellDef extends CdkFooterCellDef {} }) export class MatColumnDef extends CdkColumnDef { /** Unique name for this column. */ - @Input('matColumnDef') name: string; + @Input('matColumnDef') + get name(): string { return this._name; } + set name(name: string) { this._setNameInput(name); } /** * Add "mat-column-" prefix in addition to "cdk-column-" prefix. diff --git a/src/material-experimental/mdc-tabs/tab.ts b/src/material-experimental/mdc-tabs/tab.ts index 6bb2134b8c83..aafab3b64973 100644 --- a/src/material-experimental/mdc-tabs/tab.ts +++ b/src/material-experimental/mdc-tabs/tab.ts @@ -37,5 +37,7 @@ export class MatTab extends BaseMatTab { _explicitContent: TemplateRef; /** Content for the tab label given by ``. */ - @ContentChild(MatTabLabel) templateLabel: MatTabLabel; + @ContentChild(MatTabLabel) + get templateLabel(): MatTabLabel { return this._templateLabel; } + set templateLabel(value: MatTabLabel) { this._setTemplateLabelInput(value); } } diff --git a/src/material-experimental/selection/row-selection.ts b/src/material-experimental/selection/row-selection.ts index 518fb70e899c..9c7504d61cc0 100644 --- a/src/material-experimental/selection/row-selection.ts +++ b/src/material-experimental/selection/row-selection.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {coerceNumberProperty} from '@angular/cdk/coercion'; import {CdkRowSelection} from '@angular/cdk-experimental/selection'; import {Input, Directive} from '@angular/core'; @@ -25,10 +26,17 @@ import {Input, Directive} from '@angular/core'; }, providers: [{provide: CdkRowSelection, useExisting: MatRowSelection}] }) +// tslint:disable-next-line: coercion-types export class MatRowSelection extends CdkRowSelection { /** The value that is associated with the row */ @Input('matRowSelectionValue') value: T; /** The index of the value in the list. Required when used with `trackBy` */ - @Input('matRowSelectionIndex') index: number|undefined; + @Input('matRowSelectionIndex') + get index(): number|undefined { return this._index; } + set index(index: number|undefined) { + // TODO: when we remove support for ViewEngine, change this setter to an input + // alias in the decorator metadata. + this._index = coerceNumberProperty(index); + } } diff --git a/src/material-experimental/selection/selection-toggle.ts b/src/material-experimental/selection/selection-toggle.ts index 32e36dd11d48..266d909b0195 100644 --- a/src/material-experimental/selection/selection-toggle.ts +++ b/src/material-experimental/selection/selection-toggle.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {coerceNumberProperty} from '@angular/cdk/coercion'; import {CdkSelectionToggle} from '@angular/cdk-experimental/selection'; import {Directive, Input} from '@angular/core'; @@ -24,10 +25,17 @@ import {Directive, Input} from '@angular/core'; exportAs: 'matSelectionToggle', providers: [{provide: CdkSelectionToggle, useExisting: MatSelectionToggle}] }) +// tslint:disable-next-line: coercion-types export class MatSelectionToggle extends CdkSelectionToggle { /** The value that is associated with the toggle */ @Input('matSelectionToggleValue') value: T; /** The index of the value in the list. Required when used with `trackBy` */ - @Input('matSelectionToggleIndex') index: number|undefined; + @Input('matSelectionToggleIndex') + get index(): number|undefined { return this._index; } + set index(index: number|undefined) { + // TODO: when we remove support for ViewEngine, change this setter to an input + // alias in the decorator metadata. + this._index = coerceNumberProperty(index); + } } diff --git a/src/material-experimental/selection/selection.ts b/src/material-experimental/selection/selection.ts index 62ab56468ec3..0f8375d901e7 100644 --- a/src/material-experimental/selection/selection.ts +++ b/src/material-experimental/selection/selection.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {coerceBooleanProperty} from '@angular/cdk/coercion'; import {CdkSelection, SelectionChange} from '@angular/cdk-experimental/selection'; import {Directive, Input, Output, EventEmitter} from '@angular/core'; @@ -21,9 +22,12 @@ import {Directive, Input, Output, EventEmitter} from '@angular/core'; exportAs: 'matSelection', providers: [{provide: CdkSelection, useExisting: MatSelection}] }) +// tslint:disable-next-line: coercion-types export class MatSelection extends CdkSelection { /** Whether to support multiple selection */ - @Input('matSelectionMultiple') multiple: boolean; + @Input('matSelectionMultiple') + get multiple(): boolean { return this._multiple; } + set multiple(multiple: boolean) { this._multiple = coerceBooleanProperty(multiple); } /** Emits when selection changes. */ @Output('matSelectionChange') change = new EventEmitter>(); diff --git a/src/material/chips/chip.ts b/src/material/chips/chip.ts index 9d277a313163..6c4bec0087c2 100644 --- a/src/material/chips/chip.ts +++ b/src/material/chips/chip.ts @@ -88,8 +88,8 @@ export const MAT_CHIP_TRAILING_ICON = // Boilerplate for applying mixins to MatChip. /** @docs-private */ -class MatChipBase { - disabled: boolean; +abstract class MatChipBase { + abstract disabled: boolean; constructor(public _elementRef: ElementRef) {} } diff --git a/src/material/core/common-behaviors/constructor.ts b/src/material/core/common-behaviors/constructor.ts index 7e3963f343d1..98563cfc4ad0 100644 --- a/src/material/core/common-behaviors/constructor.ts +++ b/src/material/core/common-behaviors/constructor.ts @@ -8,3 +8,9 @@ /** @docs-private */ export type Constructor = new(...args: any[]) => T; + +/** + * This is a permissive type for abstract class constructors. + * @docs-private + */ +export type AbstractConstructor = Function & { prototype: T }; diff --git a/src/material/core/common-behaviors/disable-ripple.ts b/src/material/core/common-behaviors/disable-ripple.ts index 3ecf5d4f6860..ab0ce1ae43f6 100644 --- a/src/material/core/common-behaviors/disable-ripple.ts +++ b/src/material/core/common-behaviors/disable-ripple.ts @@ -7,7 +7,7 @@ */ import {coerceBooleanProperty} from '@angular/cdk/coercion'; -import {Constructor} from './constructor'; +import {Constructor, AbstractConstructor} from './constructor'; /** @docs-private */ export interface CanDisableRipple { @@ -19,8 +19,9 @@ export interface CanDisableRipple { export type CanDisableRippleCtor = Constructor; /** Mixin to augment a directive with a `disableRipple` property. */ -export function mixinDisableRipple>(base: T): CanDisableRippleCtor & T { - return class extends base { +export function mixinDisableRipple>( + base: T): CanDisableRippleCtor & T { + abstract class Mixin extends (base as unknown as Constructor<{}>) { private _disableRipple: boolean = false; /** Whether the ripple effect is disabled or not. */ @@ -28,5 +29,10 @@ export function mixinDisableRipple>(base: T): CanDisab set disableRipple(value: any) { this._disableRipple = coerceBooleanProperty(value); } constructor(...args: any[]) { super(...args); } - }; + } + + // Since we don't directly extend from `base` with it's original types, and we instruct + // TypeScript that `T` actually is instantiatable through `new`, the types don't overlap. + // This is a limitation in TS as abstract classes cannot be typed properly dynamically. + return Mixin as unknown as T & CanDisableRippleCtor; } diff --git a/src/material/core/common-behaviors/tabindex.ts b/src/material/core/common-behaviors/tabindex.ts index b5788d46c7d5..23df700870a9 100644 --- a/src/material/core/common-behaviors/tabindex.ts +++ b/src/material/core/common-behaviors/tabindex.ts @@ -7,7 +7,7 @@ */ import {coerceNumberProperty} from '@angular/cdk/coercion'; -import {Constructor} from './constructor'; +import {Constructor, AbstractConstructor} from './constructor'; import {CanDisable} from './disabled'; @@ -24,9 +24,11 @@ export interface HasTabIndex { export type HasTabIndexCtor = Constructor; /** Mixin to augment a directive with a `tabIndex` property. */ -export function mixinTabIndex>(base: T, defaultTabIndex = 0) - : HasTabIndexCtor & T { - return class extends base { +export function mixinTabIndex>( + base: T, defaultTabIndex = 0): HasTabIndexCtor & T { + // Note: We cast `base` to `unknown` and then `Constructor`. It could be an abstract class, + // but given we `extend` it from another class, we can assume a constructor being accessible. + abstract class Mixin extends (base as unknown as Constructor) { private _tabIndex: number = defaultTabIndex; defaultTabIndex = defaultTabIndex; @@ -39,5 +41,10 @@ export function mixinTabIndex>(base: T, defaul constructor(...args: any[]) { super(...args); } - }; + } + + // Since we don't directly extend from `base` with it's original types, and we instruct + // TypeScript that `T` actually is instantiatable through `new`, the types don't overlap. + // This is a limitation in TS as abstract classes cannot be typed properly dynamically. + return Mixin as unknown as T & Constructor; } diff --git a/src/material/radio/radio.ts b/src/material/radio/radio.ts index c54097c17128..cb4c9f8c827b 100644 --- a/src/material/radio/radio.ts +++ b/src/material/radio/radio.ts @@ -334,12 +334,11 @@ export class MatRadioGroup extends _MatRadioGroupBase { // Boilerplate for applying mixins to MatRadioButton. /** @docs-private */ -class MatRadioButtonBase { +abstract class MatRadioButtonBase { // Since the disabled property is manually defined for the MatRadioButton and isn't set up in // the mixin base class. To be able to use the tabindex mixin, a disabled property must be // defined to properly work. - disabled: boolean; - + abstract disabled: boolean; constructor(public _elementRef: ElementRef) {} } // As per Material design specifications the selection control radio should use the accent color diff --git a/src/material/table/cell.ts b/src/material/table/cell.ts index 89650b2b96c9..ce1c8cc9c8f6 100644 --- a/src/material/table/cell.ts +++ b/src/material/table/cell.ts @@ -60,7 +60,9 @@ export class MatFooterCellDef extends CdkFooterCellDef {} }) export class MatColumnDef extends CdkColumnDef { /** Unique name for this column. */ - @Input('matColumnDef') name: string; + @Input('matColumnDef') + get name(): string { return this._name; } + set name(name: string) { this._setNameInput(name); } /** * Add "mat-column-" prefix in addition to "cdk-column-" prefix. diff --git a/src/material/tabs/tab.ts b/src/material/tabs/tab.ts index 27581b031579..9bd7584259ef 100644 --- a/src/material/tabs/tab.ts +++ b/src/material/tabs/tab.ts @@ -57,16 +57,8 @@ export class MatTab extends _MatTabMixinBase implements OnInit, CanDisable, OnCh /** Content for the tab label given by ``. */ @ContentChild(MAT_TAB_LABEL as any) get templateLabel(): MatTabLabel { return this._templateLabel; } - set templateLabel(value: MatTabLabel) { - // Only update the templateLabel via query if there is actually - // a MatTabLabel found. This works around an issue where a user may have - // manually set `templateLabel` during creation mode, which would then get clobbered - // by `undefined` when this query resolves. - if (value) { - this._templateLabel = value; - } - } - private _templateLabel: MatTabLabel; + set templateLabel(value: MatTabLabel) { this._setTemplateLabelInput(value); } + protected _templateLabel: MatTabLabel; // TODO: Remove cast once https://github.com/angular/angular/pull/37506 is available. /** @@ -143,5 +135,21 @@ export class MatTab extends _MatTabMixinBase implements OnInit, CanDisable, OnCh this._explicitContent || this._implicitContent, this._viewContainerRef); } + /** + * This has been extracted to a util because of TS 4 and VE. + * View Engine doesn't support property rename inheritance. + * TS 4.0 doesn't allow properties to override accessors or vice-versa. + * @docs-private + */ + protected _setTemplateLabelInput(value: MatTabLabel) { + // Only update the templateLabel via query if there is actually + // a MatTabLabel found. This works around an issue where a user may have + // manually set `templateLabel` during creation mode, which would then get clobbered + // by `undefined` when this query resolves. + if (value) { + this._templateLabel = value; + } + } + static ngAcceptInputType_disabled: BooleanInput; } diff --git a/src/material/tree/padding.ts b/src/material/tree/padding.ts index 9284b2b76a99..ed53c932f7f6 100644 --- a/src/material/tree/padding.ts +++ b/src/material/tree/padding.ts @@ -18,8 +18,12 @@ import {Directive, Input} from '@angular/core'; export class MatTreeNodePadding extends CdkTreeNodePadding { /** The level of depth of the tree node. The padding will be `level * indent` pixels. */ - @Input('matTreeNodePadding') level: number; + @Input('matTreeNodePadding') + get level(): number { return this._level; } + set level(value: number) { this._setLevelInput(value); } /** The indent for each level. Default number 40px from material design menu sub-menu spec. */ - @Input('matTreeNodePaddingIndent') indent: number; + @Input('matTreeNodePaddingIndent') + get indent(): number | string { return this._indent; } + set indent(indent: number | string) { this._setIndentInput(indent); } } diff --git a/src/material/tree/toggle.ts b/src/material/tree/toggle.ts index 5c7b9f9a2479..16cf9afdf85f 100644 --- a/src/material/tree/toggle.ts +++ b/src/material/tree/toggle.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {coerceBooleanProperty} from '@angular/cdk/coercion'; import {CdkTreeNodeToggle} from '@angular/cdk/tree'; import {Directive, Input} from '@angular/core'; @@ -16,6 +17,13 @@ import {Directive, Input} from '@angular/core'; selector: '[matTreeNodeToggle]', providers: [{provide: CdkTreeNodeToggle, useExisting: MatTreeNodeToggle}] }) +// tslint:disable-next-line: coercion-types export class MatTreeNodeToggle extends CdkTreeNodeToggle { - @Input('matTreeNodeToggleRecursive') recursive: boolean = false; + @Input('matTreeNodeToggleRecursive') + get recursive(): boolean { return this._recursive; } + set recursive(value: boolean) { + // TODO: when we remove support for ViewEngine, change this setter to an input + // alias in the decorator metadata. + this._recursive = coerceBooleanProperty(value); + } } diff --git a/src/youtube-player/youtube-player.spec.ts b/src/youtube-player/youtube-player.spec.ts index 50b15b13046e..1b41e68e941f 100644 --- a/src/youtube-player/youtube-player.spec.ts +++ b/src/youtube-player/youtube-player.spec.ts @@ -37,7 +37,7 @@ describe('YoutubePlayer', () => { }); afterEach(() => { - delete window.YT; + (window as any).YT = undefined; window.onYouTubeIframeAPIReady = undefined; }); @@ -368,15 +368,15 @@ describe('YoutubePlayer', () => { }); describe('API loaded asynchronously', () => { - let api: typeof YT | undefined; + let api: typeof YT; beforeEach(() => { api = window.YT; - delete window.YT; + (window as any).YT = undefined; }); afterEach(() => { - delete window.YT; + (window as any).YT = undefined; window.onYouTubeIframeAPIReady = undefined; }); diff --git a/tools/public_api_guard/cdk/table.d.ts b/tools/public_api_guard/cdk/table.d.ts index f4936087c8f9..6b8d577039be 100644 --- a/tools/public_api_guard/cdk/table.d.ts +++ b/tools/public_api_guard/cdk/table.d.ts @@ -90,7 +90,7 @@ export interface CdkCellOutletRowContext { export declare class CdkColumnDef extends _CdkColumnDefBase implements CanStick { _columnCssClassName: string[]; - _name: string; + protected _name: string; _stickyEnd: boolean; _table?: any; cell: CdkCellDef; @@ -102,6 +102,7 @@ export declare class CdkColumnDef extends _CdkColumnDefBase implements CanStick get stickyEnd(): boolean; set stickyEnd(v: boolean); constructor(_table?: any); + protected _setNameInput(value: string): void; protected _updateColumnCssClassName(): void; static ngAcceptInputType_sticky: BooleanInput; static ngAcceptInputType_stickyEnd: BooleanInput; diff --git a/tools/public_api_guard/cdk/tree.d.ts b/tools/public_api_guard/cdk/tree.d.ts index 6c2cfc6082d9..b9e3b38f7867 100644 --- a/tools/public_api_guard/cdk/tree.d.ts +++ b/tools/public_api_guard/cdk/tree.d.ts @@ -117,6 +117,8 @@ export declare class CdkTreeNodePadding implements OnDestroy { constructor(_treeNode: CdkTreeNode, _tree: CdkTree, _renderer: Renderer2, _element: ElementRef, _dir: Directionality); _paddingIndent(): string | null; + protected _setIndentInput(indent: number | string): void; + protected _setLevelInput(value: number): void; _setPadding(forceChange?: boolean): void; ngOnDestroy(): void; static ngAcceptInputType_level: NumberInput; diff --git a/tools/public_api_guard/material/core.d.ts b/tools/public_api_guard/material/core.d.ts index be242120d0c0..b483226d9c91 100644 --- a/tools/public_api_guard/material/core.d.ts +++ b/tools/public_api_guard/material/core.d.ts @@ -311,13 +311,13 @@ export declare function mixinColor>(base: T export declare function mixinDisabled>(base: T): CanDisableCtor & T; -export declare function mixinDisableRipple>(base: T): CanDisableRippleCtor & T; +export declare function mixinDisableRipple>(base: T): CanDisableRippleCtor & T; export declare function mixinErrorState>(base: T): CanUpdateErrorStateCtor & T; export declare function mixinInitialized>(base: T): HasInitializedCtor & T; -export declare function mixinTabIndex>(base: T, defaultTabIndex?: number): HasTabIndexCtor & T; +export declare function mixinTabIndex>(base: T, defaultTabIndex?: number): HasTabIndexCtor & T; export declare class NativeDateAdapter extends DateAdapter { useUtcForDisplay: boolean; diff --git a/tools/public_api_guard/material/table.d.ts b/tools/public_api_guard/material/table.d.ts index d28a4b569b05..fa36506b4dbc 100644 --- a/tools/public_api_guard/material/table.d.ts +++ b/tools/public_api_guard/material/table.d.ts @@ -9,7 +9,8 @@ export declare class MatCellDef extends CdkCellDef { } export declare class MatColumnDef extends CdkColumnDef { - name: string; + get name(): string; + set name(name: string); protected _updateColumnCssClassName(): void; static ngAcceptInputType_sticky: BooleanInput; static ɵdir: i0.ɵɵDirectiveDefWithMeta; diff --git a/tools/public_api_guard/material/tabs.d.ts b/tools/public_api_guard/material/tabs.d.ts index 568b10cd7c28..b4cad06c7611 100644 --- a/tools/public_api_guard/material/tabs.d.ts +++ b/tools/public_api_guard/material/tabs.d.ts @@ -134,6 +134,7 @@ export declare class MatTab extends _MatTabMixinBase implements OnInit, CanDisab _explicitContent: TemplateRef; _implicitContent: TemplateRef; readonly _stateChanges: Subject; + protected _templateLabel: MatTabLabel; ariaLabel: string; ariaLabelledby: string; get content(): TemplatePortal | null; @@ -145,6 +146,7 @@ export declare class MatTab extends _MatTabMixinBase implements OnInit, CanDisab textLabel: string; constructor(_viewContainerRef: ViewContainerRef, _closestTabGroup?: any); + protected _setTemplateLabelInput(value: MatTabLabel): void; ngOnChanges(changes: SimpleChanges): void; ngOnDestroy(): void; ngOnInit(): void; diff --git a/tools/public_api_guard/material/tree.d.ts b/tools/public_api_guard/material/tree.d.ts index c28c29e78336..508445dd9760 100644 --- a/tools/public_api_guard/material/tree.d.ts +++ b/tools/public_api_guard/material/tree.d.ts @@ -83,14 +83,17 @@ export declare class MatTreeNodeOutlet implements CdkTreeNodeOutlet { } export declare class MatTreeNodePadding extends CdkTreeNodePadding { - indent: number; - level: number; + get indent(): number | string; + set indent(indent: number | string); + get level(): number; + set level(value: number); static ɵdir: i0.ɵɵDirectiveDefWithMeta, "[matTreeNodePadding]", never, { "level": "matTreeNodePadding"; "indent": "matTreeNodePaddingIndent"; }, {}, never>; static ɵfac: i0.ɵɵFactoryDef, never>; } export declare class MatTreeNodeToggle extends CdkTreeNodeToggle { - recursive: boolean; + get recursive(): boolean; + set recursive(value: boolean); static ɵdir: i0.ɵɵDirectiveDefWithMeta, "[matTreeNodeToggle]", never, { "recursive": "matTreeNodeToggleRecursive"; }, {}, never>; static ɵfac: i0.ɵɵFactoryDef, never>; } diff --git a/yarn.lock b/yarn.lock index 242e31271b5e..837a6389b56d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,17 +32,17 @@ ora "4.0.4" rxjs "6.5.5" -"@angular/animations@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-10.0.8.tgz#f033a7043f41075fae128ea6e91bcdaec3a4df2f" - integrity sha512-vxJRNz6CbguuoLxZpKbaCRcJRFg+/UeXvrUjRlUxwJpAni5hFYkWZUjjXvHDszI97q8FkDNLpGDPcggGqPfo4w== +"@angular/animations@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-10.1.0-next.8.tgz#f78ff8ba0ffa67dc303d7b7271e2dc2487bc82f9" + integrity sha512-Pk9j4xauDrREnd1fE7Rmac/gsJiQGkPXj258U4BZI/UaqYQXXaD7QVNf/KSD1t1Pkma2cAztY9SYWt/HMVu1qA== dependencies: tslib "^2.0.0" -"@angular/bazel@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/bazel/-/bazel-10.0.8.tgz#5ec9100d639aae3f798a415a53bfc7be61149f8b" - integrity sha512-NwmyqNzgkqxta2pUKY+R5b6DEaffUhfrAknJ5Z9taOg8kugd8royVzF4N3BrecvMeNPEKQP4n3I3DJHjF4id+A== +"@angular/bazel@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/bazel/-/bazel-10.1.0-next.8.tgz#0cccc592c3ac7162dd1479e97374db88cf0aec43" + integrity sha512-atp6Nvi4JRT2XiM/J1BDdzF7ai4orbELfz14OypUB73SxdRyii9hWNy7g+BXQe6malQHJw/+zjJRGTlskKEw8A== dependencies: "@microsoft/api-extractor" "^7.7.13" shelljs "0.8.2" @@ -69,17 +69,17 @@ "@angular/core" "^10.0.0-0 || ^11.0.0" reflect-metadata "^0.1.13" -"@angular/common@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-10.0.8.tgz#591263b42f8d03f3730e927251dae175e0d60669" - integrity sha512-Nzk5ckQ8y/qvTmqRdzpwUQELYD9N6DJC5yPWQw+remlkUTw24KX4KMUnt9Iy/2eFQC65MhZoTwostuKpjffrlQ== +"@angular/common@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-10.1.0-next.8.tgz#04a05c9ca117057b49255844a86a9c4189cfe914" + integrity sha512-mEEEfaMUkLlA1qybTYal4wc9eGlhFsx3T+ckmN2tl8rouvVWL+nXP3EjCJJZAhNG31lqSULOW8dkpPk1+4sHuA== dependencies: tslib "^2.0.0" -"@angular/compiler-cli@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-10.0.8.tgz#94a45667d1b545c763a476c1e1ee32004a47ad01" - integrity sha512-G/hStouc8Zlzsjqka2k+FXP9KKgB5NmzBxMOzdQV+KixPev+AMHhLl+tnzx1iFwn4F5yf3bvLz363yX9k7LHWw== +"@angular/compiler-cli@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-10.1.0-next.8.tgz#c5cdd98de68f783f2a52d66e6cdfd73457a5c1b8" + integrity sha512-bj7SXxcMdqPYHm9MimZgdD0POpcBzF2pig5OwXODe/hX0BS2jYIkZFAtrmSOlOgEl/oQfTSSoT6RbOUQ+zHs9w== dependencies: canonical-path "1.0.0" chokidar "^3.0.0" @@ -95,10 +95,10 @@ tslib "^2.0.0" yargs "15.3.0" -"@angular/compiler@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-10.0.8.tgz#87becc64f1a2ef100c369c182959a0562a759969" - integrity sha512-8zpxmDgDs45Q0rm1D3Gb4NP4CToizdOy7oBhDN7ijukRXAl19oE5vj1mHWvalbtgeC13kfdrdlQ8Ke2z61cd/g== +"@angular/compiler@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-10.1.0-next.8.tgz#bf0ce38ee77c2aa6ec7447c19a3253e18aa9a4e4" + integrity sha512-lvkt/H1s8/bmv9S/CtPQLtg7Pfz9hv21tfXlr9ionIaqta4TBqtlsvxMVj9ex+ZT2riuBUPIVC/OgOwxbWOLAA== dependencies: tslib "^2.0.0" @@ -116,10 +116,10 @@ dependencies: tslib "^2.0.0" -"@angular/core@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-10.0.8.tgz#dd8855e9faa3f2ba37268144d15402d346b1be57" - integrity sha512-52M1krR/TRZsV9WKPd+r7IPVT8c5Nh+Im1z3/ZY7rG0HmxXsV7YzuTuKV7oyHbWPg0WPJAwyH0+qxBK3kpvc8w== +"@angular/core@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-10.1.0-next.8.tgz#60619b3225d6275b37ef2be493ade7cb8e6f24a7" + integrity sha512-Ph8p+qky2IcSoZsDJQ78cMAHcy+UQl9f3+/03jyTZ0jXCqrlSIaRkptUibhj1R9RbIkp0FniO0D0mhZ0A34XIQ== dependencies: tslib "^2.0.0" @@ -158,47 +158,47 @@ yaml "^1.7.2" yargs "15.3.0" -"@angular/elements@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/elements/-/elements-10.0.8.tgz#78bbf2758b0311a4722989b1e07d7fd538d4c2c4" - integrity sha512-LTWqNCqBPzKiTDAgFJMhX5nViYf12ufW4eVyUatvgHa3QpV1TEsou6c+q46sw6y9RoV87aRV3H+DnpaSuuQx8w== +"@angular/elements@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/elements/-/elements-10.1.0-next.8.tgz#c38b36dcfdbe1ddcbf2b94064bd7783f712af7f7" + integrity sha512-YoewXHhJM70SYTCX4esoTes4h7kbgW6MMeo2vbjsKi8+SvDGY0YE+cfa32VBNtCMBX34DeahQcrzKkJq1aKyzQ== dependencies: tslib "^2.0.0" -"@angular/forms@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-10.0.8.tgz#e491010a78be6997d4ac228565de661f5505dc2f" - integrity sha512-7aEF0iO8pwcCtVgY0uNN7njVvdXWzXCTygd0SfqOTJRpCQwZ5IgICmUkpjlo8soTrOUC/8VRUstEKVltNzj9gA== +"@angular/forms@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-10.1.0-next.8.tgz#8eea74676df9faa68c59902cacfa9c6b8f944350" + integrity sha512-mQMKPmCzL9WyBjco84rz+l10ivIoA8/uXMciRiFBS/x25uz7tJEwe+o1y7A8dBGctXlssaS56bQ/Y2KjjmXpzQ== dependencies: tslib "^2.0.0" -"@angular/platform-browser-dynamic@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.8.tgz#dd865d535a324a59a334a6f973bcd2d6333c2191" - integrity sha512-1hIourV0jF8188xwrweQnmP7QmcoRZu8D2wcy4EYyFU+i0mF6JXxJ97rfqVD3ueDr+Sd9VqXGZYFb0mO5G6MNg== +"@angular/platform-browser-dynamic@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.1.0-next.8.tgz#a269d1ed217524ef20fa910adfce5c5eaee48baf" + integrity sha512-vqEkAD2MUsvJKmbQ3CrtZgJVD1w02HrcLeq7qlWFtFNBcnAznhO0Pl5sbS2tW2BcaZ5eO2aDAB9EJDhVzfCfvg== dependencies: tslib "^2.0.0" -"@angular/platform-browser@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-10.0.8.tgz#9d9880f090664fc1908f42e4be0a899d435681c8" - integrity sha512-x6ZJz6K+YvsgZFTTD5Rv/uwJAGVWzCqvYUspq25MjvkYTFAEOc6kQ9cfsqS/dTqhPBDoTTjGu6qhIxgm4ovGjA== +"@angular/platform-browser@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-10.1.0-next.8.tgz#89d77f9dd53380eade7c8bd8538de23fc3fc695c" + integrity sha512-f62t953wxDLykXaJpgwwMD55l0JSwpIl2qC7lotpbpYJlIkIitsNkFqgUXhH0Lzu5dXJMBjM1DcKO+NYvQEVRg== dependencies: tslib "^2.0.0" -"@angular/platform-server@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-10.0.8.tgz#a2283f32576f1a6f88acf93a289ae0e44fa4f0e2" - integrity sha512-XJkEAvdiryFnGzwEq7yL6AQVAsNAsOP9QH4aPTBXpyBdYMJtN51KPzOsd+1cJgarf9UerMMdxzkxQiw1dfg+Lg== +"@angular/platform-server@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-10.1.0-next.8.tgz#381d4dce33c9004d118e877b9b01fcb4709eb141" + integrity sha512-29BoDP1R4KCjPbTo3GMtJOGfWBrRQWbdUSPJW8GuW2XxWBDbAaIpuRSQqsO++Ae4LFzjsIvkRc717VzIupbr5A== dependencies: domino "^2.1.2" tslib "^2.0.0" xhr2 "^0.2.0" -"@angular/router@^10.0.8": - version "10.0.8" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-10.0.8.tgz#8eec22a8c1050be4fb4003d177bee9e566df8aaf" - integrity sha512-Plub5gtfRv0Uk/e1Q66LVXRohzfMPqE9a4OqboFDjlWT5a94XSJaSHMgQHZ0esKoRidxijo3aRJOUSc/LAO9JQ== +"@angular/router@^10.1.0-next.8": + version "10.1.0-next.8" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-10.1.0-next.8.tgz#e7d2936dd86d08dae955c8702fbf913787a1c885" + integrity sha512-IdtMbW+o6wsMvlo5dLbs/hHmLejCevkMMtn4SqBUBWem1jIoN7Bm4xeKUHO9i+nUrEBCO0l4IIXeDJxC2nZSQA== dependencies: tslib "^2.0.0" @@ -8339,6 +8339,13 @@ mkdirp@*, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" +mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -11956,15 +11963,20 @@ tslib@^1.10.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tslib@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== -tslint@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.0.tgz#c6c611b8ba0eed1549bf5a59ba05a7732133d851" - integrity sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ== +tslint@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" + integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== dependencies: "@babel/code-frame" "^7.0.0" builtin-modules "^1.1.1" @@ -11974,10 +11986,10 @@ tslint@^6.1.0: glob "^7.1.1" js-yaml "^3.13.1" minimatch "^3.0.4" - mkdirp "^0.5.1" + mkdirp "^0.5.3" resolve "^1.3.2" semver "^5.3.0" - tslib "^1.10.0" + tslib "^1.13.0" tsutils "^2.29.0" tslint@~5.1.0: @@ -12093,11 +12105,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.9.7, typescript@^3.2.2: +"typescript-3.9@npm:typescript@~3.9.7": version "3.9.7" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== +typescript@4.0.2, typescript@^3.2.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.2.tgz#7ea7c88777c723c681e33bf7988be5d008d05ac2" + integrity sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ== + typescript@^3.0.3, typescript@^3.4.5: version "3.5.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977"