From c9681bf014f873095b1b0800d3e648ede49e9006 Mon Sep 17 00:00:00 2001 From: Jeremy Elbourn Date: Tue, 2 Oct 2018 10:38:58 -0700 Subject: [PATCH] chore: update to TypeScript 3.1 (#13384) With TypeScript 3.1, several native DOM types have been updated. Notably, `document.documentElement` and `document.activeElement` are now nullable. APIs relating to `matchMedia` were also updated. --- package-lock.json | 154 +++++++----------- package.json | 40 ++--- src/cdk-experimental/dialog/dialog.spec.ts | 14 +- src/cdk/a11y/focus-trap/focus-trap.spec.ts | 12 +- .../interactivity-checker.ts | 3 +- src/cdk/drag-drop/drag.ts | 4 +- src/cdk/layout/breakpoints-observer.spec.ts | 12 +- src/cdk/layout/breakpoints-observer.ts | 11 +- src/cdk/layout/media-matcher.spec.ts | 2 +- src/cdk/layout/media-matcher.ts | 6 +- .../flexible-connected-position-strategy.ts | 8 +- .../scroll/block-scroll-strategy.spec.ts | 25 +-- .../overlay/scroll/block-scroll-strategy.ts | 8 +- src/cdk/platform/features/scrolling.ts | 2 +- src/cdk/scrolling/viewport-ruler.ts | 7 +- src/e2e-app/fullscreen/fullscreen-e2e.ts | 4 +- src/lib/bottom-sheet/bottom-sheet.spec.ts | 10 +- src/lib/core/ripple/ripple.spec.ts | 8 +- src/lib/datepicker/calendar-header.spec.ts | 16 +- src/lib/datepicker/calendar.spec.ts | 5 +- src/lib/dialog/dialog.spec.ts | 20 +-- src/lib/form-field/form-field.ts | 2 +- src/lib/select/select.spec.ts | 2 +- 23 files changed, 177 insertions(+), 198 deletions(-) diff --git a/package-lock.json b/package-lock.json index 498d02fdd56..7f399274538 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,15 +5,15 @@ "requires": true, "dependencies": { "@angular-devkit/core": { - "version": "7.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.0.0-beta.4.tgz", - "integrity": "sha512-Yk4+u1G3qQBTaYDR6yXkCAc1Woe+h1tWCbzXPWPmzvg53Ox/47cMwMl61lCMqEShVAS/x+Ss/9mVFlPci5YSNQ==", + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.0.0-rc.1.tgz", + "integrity": "sha512-x5Y7MNHMgnnU9iRqyx+WD7iIXVPylLwQlI/tjNDNVCpFthWejxlyFQg4+SXzewpZRaUE1l3I2pya9KCLakj7vQ==", "dev": true, "requires": { "ajv": "6.5.3", "chokidar": "2.0.4", "fast-json-stable-stringify": "2.0.0", - "rxjs": "6.2.2", + "rxjs": "6.3.3", "source-map": "0.7.3" }, "dependencies": { @@ -41,15 +41,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -68,38 +59,27 @@ } }, "@angular-devkit/schematics": { - "version": "7.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.0.0-beta.4.tgz", - "integrity": "sha512-zLUWeaZ9R/vbNjUbwyLU9QWsHpVojliT2+QeSstnXaCNDvdQ82rJF0munosqzQP5nx9uTLdB6Q7gnM6Ijox3Vw==", + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.0.0-rc.1.tgz", + "integrity": "sha512-pDZlosln6pUHmho5+m9sLphJN/uqr8CBgPOjTKWFAg+Hnvi4apXt8jbgSkhaxwWh2JROIYzb5uQWe6lHJS6L5w==", "dev": true, "requires": { - "@angular-devkit/core": "7.0.0-beta.4", - "rxjs": "6.2.2" - }, - "dependencies": { - "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } + "@angular-devkit/core": "7.0.0-rc.1", + "rxjs": "6.3.3" } }, "@angular/animations": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.0.0-beta.7.tgz", - "integrity": "sha512-rVNk6DixFEO8NzJXzBHCHQONXv8xEVn+u08AR/l4i/NIMNH8YSFPkfR3hrbbsrUjCCveyr9//MzLk5TrEmROTA==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.0.0-rc.0.tgz", + "integrity": "sha512-NpFcuCfM11O/YIGl1piH3VufOlfnJSK6iyw19ElXjw4mr/jvK4vcg9fEXbqBvmQ6uregoeadRSVCp8tdRJHOyw==", "requires": { "tslib": "^1.9.0" } }, "@angular/bazel": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/bazel/-/bazel-7.0.0-beta.7.tgz", - "integrity": "sha512-Y8quaC6hCX3eTqMprU97KCODBQMaIWEcIVjgDPNsEQ8G/txntnAu47Ff/AyfBQC5avlou4Sp/QjV11xEJ3PFrg==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/bazel/-/bazel-7.0.0-rc.0.tgz", + "integrity": "sha512-yO9y1Fvveenlp3MYQglfAwFJObA0RZTO1JQEYzh4OVDifw67pGMR0c9tED5U1Gh0HxTjzxn5zVlqLwQbCgTJAw==", "dev": true, "requires": { "@bazel/typescript": "^0.15.0", @@ -163,25 +143,25 @@ } }, "@angular/common": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.0.0-beta.7.tgz", - "integrity": "sha512-/NbJEygr9mObD9hBKVa/AIZ2iwgMGur9XgBYfbEeHzigKf1L4cWrZYCLSPyHgfpD0TpMXmcXngeWXABRry+X8A==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.0.0-rc.0.tgz", + "integrity": "sha512-YghYg9lFKF0cxaCiWfgByFbQ69dq521QDG93KX1mP+Tvc0jXXlbolDPYHGXx/VMUaoHq18VNzi7ZInpgc/pRBw==", "requires": { "tslib": "^1.9.0" } }, "@angular/compiler": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.0.0-beta.7.tgz", - "integrity": "sha512-J1jRqpA9ShI9CNMs/Zi4NSAgGm4AOhal5M+P4w+YKX6HWpwpuD/0ximIA2mRQDAGD/FEAYoOul3lEDbqjUUKfQ==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.0.0-rc.0.tgz", + "integrity": "sha512-ifVqB/xJtSzOlk8B39Ld2wMbYni6Ey7s5jc+u/0NMtdut+2Q61Ar+TKjJZ3vmta3df7QqHX5JcP0W6qICRHJ+w==", "requires": { "tslib": "^1.9.0" } }, "@angular/compiler-cli": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.0.0-beta.7.tgz", - "integrity": "sha512-xh2a55G82I7mFQPHYMAxFQ9MZgrJX3Ht6Lr45DHI4pVUjWMwtVoeWQtY7Fo30nIFhhqAzE8DhqcZMleNU4wPvw==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.0.0-rc.0.tgz", + "integrity": "sha512-Nkd5UgSt0NHVLE/U3FIUmSJxGW47+9B4hfR5oDhC7gkUNaRQzi+PzzVYj7jOdDJjgHV+Y0KS3msiXWhUSY4gpw==", "dev": true, "requires": { "canonical-path": "0.0.2", @@ -470,59 +450,59 @@ } }, "@angular/core": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.0.0-beta.7.tgz", - "integrity": "sha512-KFI2DMTwTmWZ342+WU7aPaLHOOlIzdVbljzdKzSETfxnUqu/aeWRoRuFV/sulct2eH4CRx5Nk3h6mApcaIAKnQ==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.0.0-rc.0.tgz", + "integrity": "sha512-DXTUjk1tUdgxj0AHQR6wAKLF+i/vSsRCBxFEzcBa944UJoYBDd1n2PIREzDMW0tkGMtxfHy3Ti+trSpPBLiDTA==", "requires": { "tslib": "^1.9.0" } }, "@angular/elements": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-7.0.0-beta.7.tgz", - "integrity": "sha512-bDeb5r3wqvdTVcgzZBTXe3yYEM8cM0oFkIQPAtzRzk6ESYT6hxP4a3fVsXtmdMbYwbHUPyJW99sA/KpwXbC+2w==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-7.0.0-rc.0.tgz", + "integrity": "sha512-j6c3wB12Uu+VOSrxtXRnPO9DPQyOh8WP7GJBwa7ibfIZpGi5QvZNNdyJjEhSvYlJknRvR51juXBp5Jysn6EgGA==", "requires": { "tslib": "^1.9.0" } }, "@angular/forms": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.0.0-beta.7.tgz", - "integrity": "sha512-Fc5QOt8qY8jv5TB6KRUnSLr5iO9lghbnXfEo8V3aNvtqtDP8cqFbDuFlmy6w8lqjQgDbxowiB+Bi+vmwA6Zs/w==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.0.0-rc.0.tgz", + "integrity": "sha512-ZfD2n+DojwreeP0sF4GuFrihActssogDUGGeDHge5qmyCqE/5hsOUFnNkg1pk4mO9xeIggdYygH0nRHqvifmFQ==", "requires": { "tslib": "^1.9.0" } }, "@angular/http": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.0.0-beta.7.tgz", - "integrity": "sha512-pP2TPiEblq+5Opxb0upK5OUEzrNTkKeZWct+E5Aw2RvZM2mHz0AUKWZg3WxcK5Zd7xccgWeE7RS0rFCiWr+jSw==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.0.0-rc.0.tgz", + "integrity": "sha512-f7IaVuen/WuHIKcP9mO3Jz4oy8Qxdwo3PS750Bk5VVVNBF4TILRr+96j37C7965ZBxeJQzfcGfXew7d5nObJ/A==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "@angular/platform-browser": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.0.0-beta.7.tgz", - "integrity": "sha512-ZA99RAqteilQl/vUCAm/RNbC11sn0BykKYDKOmZnQbI6NkfkfFAnCrolza3vifOLuTpjSzH9bs3nLWwzeIF0dg==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.0.0-rc.0.tgz", + "integrity": "sha512-N52E4TjX3AwMT0EMZTikxQz+4rkdx1C9WnBSIuBR5rYwZi391mxexvES8PqE4UqEarm08eHvfxUwtMZU/FwC+w==", "requires": { "tslib": "^1.9.0" } }, "@angular/platform-browser-dynamic": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.0.0-beta.7.tgz", - "integrity": "sha512-VyPzKj77CQQ/FELgzbW99bANhohh57FNBiSN87wOkPfR5Mw7Q/l3K6dNXRVB9HQM7qMscu88jROw7akwnbnsEQ==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.0.0-rc.0.tgz", + "integrity": "sha512-+SbuLnedoZNY6kfY5dV5p/+Rm4oj/DVwLhOWVFMtrqiaKRSrrEThH12FPKfQCqak51RjF4wDpJbqyWCGFDIbJA==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "@angular/platform-server": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-7.0.0-beta.7.tgz", - "integrity": "sha512-zcAGN5KDTmIndByDM49CS/wfpoNYVKZ5Adm1lOa8zbiFZ33VJn0ibTvGKms68+6j5Qk/98IPtEuV3Ohp8ihkIA==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-7.0.0-rc.0.tgz", + "integrity": "sha512-OxvXlr4DQiT57vJf9wsKxO8fMnC3MBLCPK93HjWTDLgCRzH93FXbbp2+e7knqMAhELUCrC3e1MzNzzEulwkxPg==", "dev": true, "requires": { "domino": "^2.1.0", @@ -531,18 +511,18 @@ } }, "@angular/router": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.0.0-beta.7.tgz", - "integrity": "sha512-dZgPWfygKYqA0JHBB0L8NXnKdC28UpAx2xi/YkKMzBTzdfhUuXm2n5RH9Kd4vm3iF3feanVShu5/dykoCP6H2g==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.0.0-rc.0.tgz", + "integrity": "sha512-rT58TKCelP6BLw8Gzu6ZPeO86xzVFpDxVCLGmwEAmkWw8xG0gACkPYeVny4hsCkfx4nbz2w8upQksOKrudZt4w==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "@angular/upgrade": { - "version": "7.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-7.0.0-beta.7.tgz", - "integrity": "sha512-Oh8DVM9DNvYVu01QJbZCGi3Cv7DN3kzGqZI5W5VQRC++b8+85+xXwnqTDIO12vRlFswYGmptyTDzeTic/gPZGQ==", + "version": "7.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-7.0.0-rc.0.tgz", + "integrity": "sha512-Ymg+ftMjaRmQThX0cumfmWg5ojxIFyHxKOeScg2H8D5Yel24kKuZB+RxmcgJ7gVoraTtROyKpSigeyJOLhI2Vw==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -1472,22 +1452,14 @@ "dev": true }, "@schematics/angular": { - "version": "7.0.0-beta.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.0.0-beta.4.tgz", - "integrity": "sha512-YJvTvAn3Dw0XFWCJhaMKk003cunkI6jLOcqU+BmEcdOTL/REs6ZSgiZueZdD7lmpq3DB44dUm8UXy3I4k7nZ6g==", + "version": "7.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.0.0-rc.1.tgz", + "integrity": "sha512-FTsCZGeumsUhZRU9wn9LFcUP3l3DjlVXK9DVriEE0wYTRPGo7AzamYkY7D7gY52I239WOtsJQQz0VdSi7cS42A==", "dev": true, "requires": { - "@angular-devkit/core": "7.0.0-beta.4", - "@angular-devkit/schematics": "7.0.0-beta.4", - "typescript": "3.0.1" - }, - "dependencies": { - "typescript": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.1.tgz", - "integrity": "sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg==", - "dev": true - } + "@angular-devkit/core": "7.0.0-rc.1", + "@angular-devkit/schematics": "7.0.0-rc.1", + "typescript": "3.1.1" } }, "@sindresorhus/is": { @@ -15700,9 +15672,9 @@ "dev": true }, "rxjs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.2.tgz", - "integrity": "sha512-hV7criqbR0pe7EeL3O66UYVg92IR0XsA97+9y+BWTePK9SKmEI5Qd3Zj6uPnGkNzXsBywBQWTvujPl+1Kn9Zjw==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "requires": { "tslib": "^1.9.0" } @@ -18167,9 +18139,9 @@ "dev": true }, "typescript": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.3.tgz", - "integrity": "sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.1.tgz", + "integrity": "sha512-Veu0w4dTc/9wlWNf2jeRInNodKlcdLgemvPsrNpfu5Pq39sgfFjvIIgTsvUHCoLBnMhPoUA+tFxsXjU6VexVRQ==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index 604b5954465..22cad2f70c9 100644 --- a/package.json +++ b/package.json @@ -25,38 +25,38 @@ "breaking-changes": "gulp breaking-changes" }, "version": "7.0.0-beta.2", - "requiredAngularVersion": ">=7.0.0-beta.7", + "requiredAngularVersion": ">=7.0.0-rc.0", "dependencies": { - "@angular/animations": "7.0.0-beta.7", - "@angular/common": "7.0.0-beta.7", - "@angular/compiler": "7.0.0-beta.7", - "@angular/core": "7.0.0-beta.7", - "@angular/elements": "7.0.0-beta.7", - "@angular/forms": "7.0.0-beta.7", - "@angular/platform-browser": "7.0.0-beta.7", + "@angular/animations": "7.0.0-rc.0", + "@angular/common": "7.0.0-rc.0", + "@angular/compiler": "7.0.0-rc.0", + "@angular/core": "7.0.0-rc.0", + "@angular/elements": "7.0.0-rc.0", + "@angular/forms": "7.0.0-rc.0", + "@angular/platform-browser": "7.0.0-rc.0", "@webcomponents/custom-elements": "^1.1.0", "core-js": "^2.4.1", - "rxjs": "^6.3.2", + "rxjs": "^6.3.3", "systemjs": "0.19.43", "tsickle": "^0.32.0", "tslib": "^1.9.3", "zone.js": "^0.8.26" }, "devDependencies": { - "@angular-devkit/core": "7.0.0-beta.4", - "@angular-devkit/schematics": "7.0.0-beta.4", - "@angular/bazel": "7.0.0-beta.7", - "@angular/compiler-cli": "7.0.0-beta.7", - "@angular/http": "7.0.0-beta.7", - "@angular/platform-browser-dynamic": "7.0.0-beta.7", - "@angular/platform-server": "7.0.0-beta.7", - "@angular/router": "7.0.0-beta.7", - "@angular/upgrade": "7.0.0-beta.7", + "@angular-devkit/core": "7.0.0-rc.1", + "@angular-devkit/schematics": "7.0.0-rc.1", + "@angular/bazel": "7.0.0-rc.0", + "@angular/compiler-cli": "7.0.0-rc.0", + "@angular/http": "7.0.0-rc.0", + "@angular/platform-browser-dynamic": "7.0.0-rc.0", + "@angular/platform-server": "7.0.0-rc.0", + "@angular/router": "7.0.0-rc.0", + "@angular/upgrade": "7.0.0-rc.0", "@bazel/ibazel": "0.3.1", "@bazel/typescript": "^0.18.0", "@google-cloud/storage": "^1.1.1", "@octokit/rest": "^15.9.4", - "@schematics/angular": "7.0.0-beta.4", + "@schematics/angular": "7.0.0-rc.1", "@types/chalk": "^0.4.31", "@types/fs-extra": "^4.0.3", "@types/glob": "^5.0.33", @@ -132,7 +132,7 @@ "tsconfig-paths": "^2.3.0", "tslint": "^5.11.0", "tsutils": "^3.0.0", - "typescript": "3.0.3", + "typescript": "^3.1.1", "uglify-js": "^2.8.14" } } diff --git a/src/cdk-experimental/dialog/dialog.spec.ts b/src/cdk-experimental/dialog/dialog.spec.ts index 9c8762fb245..470c8ea00d7 100644 --- a/src/cdk-experimental/dialog/dialog.spec.ts +++ b/src/cdk-experimental/dialog/dialog.spec.ts @@ -804,7 +804,7 @@ describe('Dialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.tagName) + expect(document.activeElement!.tagName) .toBe('INPUT', 'Expected first tabbable element (input) in the dialog to be focused.'); })); @@ -817,7 +817,7 @@ describe('Dialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.tagName).not.toBe('INPUT'); + expect(document.activeElement!.tagName).not.toBe('INPUT'); })); it('should re-focus trigger element when dialog closes', fakeAsync(() => { @@ -834,18 +834,18 @@ describe('Dialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.id) + expect(document.activeElement!.id) .not.toBe('dialog-trigger', 'Expected the focus to change when dialog was opened.'); dialogRef.close(); - expect(document.activeElement.id).not.toBe('dialog-trigger', + expect(document.activeElement!.id).not.toBe('dialog-trigger', 'Expcted the focus not to have changed before the animation finishes.'); flushMicrotasks(); viewContainerFixture.detectChanges(); flush(); - expect(document.activeElement.id).toBe('dialog-trigger', + expect(document.activeElement!.id).toBe('dialog-trigger', 'Expected that the trigger was refocused after the dialog is closed.'); document.body.removeChild(button); @@ -876,7 +876,7 @@ describe('Dialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.id).toBe('input-to-be-focused', + expect(document.activeElement!.id).toBe('input-to-be-focused', 'Expected that the trigger was refocused after the dialog is closed.'); document.body.removeChild(button); @@ -891,7 +891,7 @@ describe('Dialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.tagName.toLowerCase()) + expect(document.activeElement!.tagName.toLowerCase()) .toBe('cdk-dialog-container', 'Expected dialog container to be focused.'); })); diff --git a/src/cdk/a11y/focus-trap/focus-trap.spec.ts b/src/cdk/a11y/focus-trap/focus-trap.spec.ts index 20fa655523d..4064e127658 100644 --- a/src/cdk/a11y/focus-trap/focus-trap.spec.ts +++ b/src/cdk/a11y/focus-trap/focus-trap.spec.ts @@ -37,7 +37,7 @@ describe('FocusTrap', () => { // focus event handler directly. const result = focusTrapInstance.focusFirstTabbableElement(); - expect(document.activeElement.nodeName.toLowerCase()) + expect(document.activeElement!.nodeName.toLowerCase()) .toBe('input', 'Expected input element to be focused'); expect(result).toBe(true, 'Expected return value to be true if focus was shifted.'); }); @@ -51,7 +51,7 @@ describe('FocusTrap', () => { // In iOS button elements are never tabbable, so the last element will be the input. const lastElement = new Platform(platformId).IOS ? 'input' : 'button'; - expect(document.activeElement.nodeName.toLowerCase()) + expect(document.activeElement!.nodeName.toLowerCase()) .toBe(lastElement, `Expected ${lastElement} element to be focused`); expect(result).toBe(true, 'Expected return value to be true if focus was shifted.'); @@ -122,21 +122,21 @@ describe('FocusTrap', () => { // Because we can't mimic a real tab press focus change in a unit test, just call the // focus event handler directly. focusTrapInstance.focusInitialElement(); - expect(document.activeElement.id).toBe('middle'); + expect(document.activeElement!.id).toBe('middle'); }); it('should be able to prioritize the first focus target', () => { // Because we can't mimic a real tab press focus change in a unit test, just call the // focus event handler directly. focusTrapInstance.focusFirstTabbableElement(); - expect(document.activeElement.id).toBe('first'); + expect(document.activeElement!.id).toBe('first'); }); it('should be able to prioritize the last focus target', () => { // Because we can't mimic a real tab press focus change in a unit test, just call the // focus event handler directly. focusTrapInstance.focusLastTabbableElement(); - expect(document.activeElement.id).toBe('last'); + expect(document.activeElement!.id).toBe('last'); }); }); @@ -166,7 +166,7 @@ describe('FocusTrap', () => { fixture.detectChanges(); fixture.whenStable().then(() => { - expect(document.activeElement.id).toBe('auto-capture-target'); + expect(document.activeElement!.id).toBe('auto-capture-target'); fixture.destroy(); expect(document.activeElement).toBe(buttonOutsideTrappedRegion); diff --git a/src/cdk/a11y/interactivity-checker/interactivity-checker.ts b/src/cdk/a11y/interactivity-checker/interactivity-checker.ts index c66f48f304f..8d94ab1416f 100644 --- a/src/cdk/a11y/interactivity-checker/interactivity-checker.ts +++ b/src/cdk/a11y/interactivity-checker/interactivity-checker.ts @@ -252,5 +252,6 @@ function isPotentiallyFocusable(element: HTMLElement): boolean { /** Gets the parent window of a DOM node with regards of being inside of an iframe. */ function getWindow(node: HTMLElement): Window { - return node.ownerDocument.defaultView || window; + // ownerDocument is null if `node` itself *is* a document. + return node.ownerDocument && node.ownerDocument.defaultView || window; } diff --git a/src/cdk/drag-drop/drag.ts b/src/cdk/drag-drop/drag.ts index ee4fed6013b..73148ae8bc2 100644 --- a/src/cdk/drag-drop/drag.ts +++ b/src/cdk/drag-drop/drag.ts @@ -568,7 +568,7 @@ export class CdkDrag implements AfterViewInit, OnDestroy { // If a transition is short enough, the browser might not fire the `transitionend` event. // Since we know how long it's supposed to take, add a timeout with a 50% buffer that'll // fire if the transition hasn't completed when it was supposed to. - const timeout = setTimeout(handler, duration * 1.5); + const timeout = setTimeout(handler as Function, duration * 1.5); this._preview.addEventListener('transitionend', handler); }); }); @@ -685,7 +685,7 @@ export class CdkDrag implements AfterViewInit, OnDestroy { while (currentElement) { // IE doesn't support `matches` so we have to fall back to `msMatchesSelector`. if (currentElement.matches ? currentElement.matches(selector) : - currentElement.msMatchesSelector(selector)) { + (currentElement as any).msMatchesSelector(selector)) { return currentElement; } diff --git a/src/cdk/layout/breakpoints-observer.spec.ts b/src/cdk/layout/breakpoints-observer.spec.ts index e78e2dc2472..4f67427602f 100644 --- a/src/cdk/layout/breakpoints-observer.spec.ts +++ b/src/cdk/layout/breakpoints-observer.spec.ts @@ -133,25 +133,25 @@ describe('BreakpointObserver', () => { })); }); -export class FakeMediaQueryList implements MediaQueryList { +export class FakeMediaQueryList { /** The callback for change events. */ - addListenerCallback?: (mql: MediaQueryList) => void; + addListenerCallback?: (mql: MediaQueryListEvent) => void; constructor(public matches, public media) {} /** Toggles the matches state and "emits" a change event. */ setMatches(matches: boolean) { this.matches = matches; - this.addListenerCallback!(this); + this.addListenerCallback!(this as any); } /** Registers the callback method for change events. */ - addListener(callback: (mql: MediaQueryList) => void) { + addListener(callback: (mql: MediaQueryListEvent) => void) { this.addListenerCallback = callback; } - /** Noop, but required for implementing MediaQueryList. */ - removeListener() {} + // Noop removal method for testing. + removeListener() { } } @Injectable() diff --git a/src/cdk/layout/breakpoints-observer.ts b/src/cdk/layout/breakpoints-observer.ts index 90bdc96e364..13dfe1c7cf0 100644 --- a/src/cdk/layout/breakpoints-observer.ts +++ b/src/cdk/layout/breakpoints-observer.ts @@ -98,6 +98,8 @@ export class BreakpointObserver implements OnDestroy { } const mql: MediaQueryList = this.mediaMatcher.matchMedia(query); + let queryListener; + // Create callback for match changes and add it is as a listener. const queryObservable = fromEventPattern( // Listener callback methods are wrapped to be placed back in ngZone. Callbacks must be placed @@ -106,11 +108,12 @@ export class BreakpointObserver implements OnDestroy { // have MediaQueryList inherit from EventTarget, which causes inconsistencies in how Zone.js // patches it. (listener: Function) => { - mql.addListener((e: MediaQueryList) => this.zone.run(() => listener(e))); + // TODO(jelbourn): change this `any` to `MediaQueryListEvent` once Google has upgraded to + // TypeScript 3.1 (the type is unavailable before then). + queryListener = (e: any) => this.zone.run(() => listener(e)); + mql.addListener(queryListener); }, - (listener: Function) => { - mql.removeListener((e: MediaQueryList) => this.zone.run(() => listener(e))); - }) + () => mql.removeListener(queryListener)) .pipe( takeUntil(this._destroySubject), startWith(mql), diff --git a/src/cdk/layout/media-matcher.spec.ts b/src/cdk/layout/media-matcher.spec.ts index 94b1ee26835..d637486de48 100644 --- a/src/cdk/layout/media-matcher.spec.ts +++ b/src/cdk/layout/media-matcher.spec.ts @@ -42,7 +42,7 @@ describe('MediaMatcher', () => { } function getStyleTagByString(str: string): HTMLStyleElement | undefined { - return Array.from(document.head.querySelectorAll('style')).find(tag => { + return Array.from(document.head!.querySelectorAll('style')).find(tag => { const rules = tag.sheet ? Array.from((tag.sheet as CSSStyleSheet).cssRules) : []; return !!rules.find(rule => rule.cssText.includes(str)); }); diff --git a/src/cdk/layout/media-matcher.ts b/src/cdk/layout/media-matcher.ts index 8a5b73777f5..aaeb1bade75 100644 --- a/src/cdk/layout/media-matcher.ts +++ b/src/cdk/layout/media-matcher.ts @@ -55,7 +55,7 @@ function createEmptyStyleRule(query: string) { if (!mediaQueryStyleNode) { mediaQueryStyleNode = document.createElement('style'); mediaQueryStyleNode.setAttribute('type', 'text/css'); - document.head.appendChild(mediaQueryStyleNode); + document.head!.appendChild(mediaQueryStyleNode); } if (mediaQueryStyleNode.sheet) { @@ -70,10 +70,12 @@ function createEmptyStyleRule(query: string) { /** No-op matchMedia replacement for non-browser platforms. */ function noopMatchMedia(query: string): MediaQueryList { + // Use `as any` here to avoid adding additional necessary properties for + // the noop matcher. return { matches: query === 'all' || query === '', media: query, addListener: () => {}, removeListener: () => {} - }; + } as any; } diff --git a/src/cdk/overlay/position/flexible-connected-position-strategy.ts b/src/cdk/overlay/position/flexible-connected-position-strategy.ts index d8c38365ef8..045e8b91a4c 100644 --- a/src/cdk/overlay/position/flexible-connected-position-strategy.ts +++ b/src/cdk/overlay/position/flexible-connected-position-strategy.ts @@ -929,7 +929,7 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy { if (position.overlayY === 'bottom') { // When using `bottom`, we adjust the y position such that it is the distance // from the bottom of the viewport rather than the top. - const documentHeight = this._document.documentElement.clientHeight; + const documentHeight = this._document.documentElement!.clientHeight; styles.bottom = `${documentHeight - (overlayPoint.y + this._overlayRect.height)}px`; } else { styles.top = coerceCssPixelValue(overlayPoint.y); @@ -966,7 +966,7 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy { // When we're setting `right`, we adjust the x position such that it is the distance // from the right edge of the viewport rather than the left edge. if (horizontalStyleProperty === 'right') { - const documentWidth = this._document.documentElement.clientWidth; + const documentWidth = this._document.documentElement!.clientWidth; styles.right = `${documentWidth - (overlayPoint.x + this._overlayRect.width)}px`; } else { styles.left = coerceCssPixelValue(overlayPoint.x); @@ -1013,8 +1013,8 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy { // being that the client properties don't include the scrollbar, as opposed to `innerWidth` // and `innerHeight` that do. This is necessary, because the overlay container uses // 100% `width` and `height` which don't include the scrollbar either. - const width = this._document.documentElement.clientWidth; - const height = this._document.documentElement.clientHeight; + const width = this._document.documentElement!.clientWidth; + const height = this._document.documentElement!.clientHeight; const scrollPosition = this._viewportRuler.getViewportScrollPosition(); return { diff --git a/src/cdk/overlay/scroll/block-scroll-strategy.spec.ts b/src/cdk/overlay/scroll/block-scroll-strategy.spec.ts index 158d2cc31d0..b21dac77df5 100644 --- a/src/cdk/overlay/scroll/block-scroll-strategy.spec.ts +++ b/src/cdk/overlay/scroll/block-scroll-strategy.spec.ts @@ -9,13 +9,16 @@ import {Overlay, OverlayContainer, OverlayModule, OverlayRef, OverlayConfig} fro describe('BlockScrollStrategy', () => { let platform: Platform; let viewport: ViewportRuler; + let documentElement: HTMLElement; let overlayRef: OverlayRef; let componentPortal: ComponentPortal; let forceScrollElement: HTMLElement; beforeEach(async(() => { + documentElement = document.documentElement!; + // Ensure a clean state for every test. - document.documentElement.classList.remove('cdk-global-scrollblock'); + documentElement.classList.remove('cdk-global-scrollblock'); TestBed.configureTestingModule({ imports: [OverlayModule, PortalModule, OverlayTestModule] @@ -51,7 +54,7 @@ describe('BlockScrollStrategy', () => { .toBe(100, 'Expected viewport to be scrollable initially.'); overlayRef.attach(componentPortal); - expect(document.documentElement.style.top) + expect(documentElement.style.top) .toBe('-100px', 'Expected element to be offset by the previous scroll amount.'); window.scroll(0, 300); @@ -77,7 +80,7 @@ describe('BlockScrollStrategy', () => { .toBe(100, 'Expected viewport to be scrollable initially.'); overlayRef.attach(componentPortal); - expect(document.documentElement.style.left) + expect(documentElement.style.left) .toBe('-100px', 'Expected element to be offset by the previous scroll amount.'); window.scroll(300, 0); @@ -95,17 +98,17 @@ describe('BlockScrollStrategy', () => { it('should toggle the `cdk-global-scrollblock` class', skipIOS(() => { - expect(document.documentElement.classList).not.toContain('cdk-global-scrollblock'); + expect(documentElement.classList).not.toContain('cdk-global-scrollblock'); overlayRef.attach(componentPortal); - expect(document.documentElement.classList).toContain('cdk-global-scrollblock'); + expect(documentElement.classList).toContain('cdk-global-scrollblock'); overlayRef.detach(); - expect(document.documentElement.classList).not.toContain('cdk-global-scrollblock'); + expect(documentElement.classList).not.toContain('cdk-global-scrollblock'); })); it('should restore any previously-set inline styles', skipIOS(() => { - const root = document.documentElement; + const root = documentElement; root.style.top = '13px'; root.style.left = '37px'; @@ -124,22 +127,22 @@ describe('BlockScrollStrategy', () => { it(`should't do anything if the page isn't scrollable`, skipIOS(() => { forceScrollElement.style.display = 'none'; overlayRef.attach(componentPortal); - expect(document.documentElement.classList).not.toContain('cdk-global-scrollblock'); + expect(documentElement.classList).not.toContain('cdk-global-scrollblock'); })); it('should keep the content width', () => { forceScrollElement.style.width = '100px'; - const previousContentWidth = document.documentElement.getBoundingClientRect().width; + const previousContentWidth = documentElement.getBoundingClientRect().width; overlayRef.attach(componentPortal); - expect(document.documentElement.getBoundingClientRect().width).toBe(previousContentWidth); + expect(documentElement.getBoundingClientRect().width).toBe(previousContentWidth); }); it('should not clobber user-defined scroll-behavior', skipIOS(() => { - const root = document.documentElement; + const root = documentElement; const body = document.body; root.style['scrollBehavior'] = body.style['scrollBehavior'] = 'smooth'; diff --git a/src/cdk/overlay/scroll/block-scroll-strategy.ts b/src/cdk/overlay/scroll/block-scroll-strategy.ts index 5ad36ea2a3e..28ba5169163 100644 --- a/src/cdk/overlay/scroll/block-scroll-strategy.ts +++ b/src/cdk/overlay/scroll/block-scroll-strategy.ts @@ -29,7 +29,7 @@ export class BlockScrollStrategy implements ScrollStrategy { /** Blocks page-level scroll while the attached overlay is open. */ enable() { if (this._canBeEnabled()) { - const root = this._document.documentElement; + const root = this._document.documentElement!; this._previousScrollPosition = this._viewportRuler.getViewportScrollPosition(); @@ -49,8 +49,8 @@ export class BlockScrollStrategy implements ScrollStrategy { /** Unblocks page-level scroll while the attached overlay is open. */ disable() { if (this._isEnabled) { - const html = this._document.documentElement; - const body = this._document.body; + const html = this._document.documentElement!; + const body = this._document.body!; const previousHtmlScrollBehavior = html.style['scrollBehavior'] || ''; const previousBodyScrollBehavior = body.style['scrollBehavior'] || ''; @@ -75,7 +75,7 @@ export class BlockScrollStrategy implements ScrollStrategy { // Since the scroll strategies can't be singletons, we have to use a global CSS class // (`cdk-global-scrollblock`) to make sure that we don't try to disable global // scrolling multiple times. - const html = this._document.documentElement; + const html = this._document.documentElement!; if (html.classList.contains('cdk-global-scrollblock') || this._isEnabled) { return false; diff --git a/src/cdk/platform/features/scrolling.ts b/src/cdk/platform/features/scrolling.ts index 34f3a397ca6..3f482bc027f 100644 --- a/src/cdk/platform/features/scrolling.ts +++ b/src/cdk/platform/features/scrolling.ts @@ -30,7 +30,7 @@ let rtlScrollAxisType: RtlScrollAxisType; /** Check whether the browser supports scroll behaviors. */ export function supportsScrollBehavior(): boolean { - return !!(typeof document == 'object' && 'scrollBehavior' in document.documentElement.style); + return !!(typeof document == 'object' && 'scrollBehavior' in document.documentElement!.style); } /** diff --git a/src/cdk/scrolling/viewport-ruler.ts b/src/cdk/scrolling/viewport-ruler.ts index cb69d1200d9..4035f0948ce 100644 --- a/src/cdk/scrolling/viewport-ruler.ts +++ b/src/cdk/scrolling/viewport-ruler.ts @@ -101,13 +101,14 @@ export class ViewportRuler implements OnDestroy { // `scrollTop` and `scrollLeft` is inconsistent. However, using the bounding rect of // `document.documentElement` works consistently, where the `top` and `left` values will // equal negative the scroll position. - const documentRect = document.documentElement.getBoundingClientRect(); + const documentElement = document.documentElement!; + const documentRect = documentElement.getBoundingClientRect(); const top = -documentRect.top || document.body.scrollTop || window.scrollY || - document.documentElement.scrollTop || 0; + documentElement.scrollTop || 0; const left = -documentRect.left || document.body.scrollLeft || window.scrollX || - document.documentElement.scrollLeft || 0; + documentElement.scrollLeft || 0; return {top, left}; } diff --git a/src/e2e-app/fullscreen/fullscreen-e2e.ts b/src/e2e-app/fullscreen/fullscreen-e2e.ts index 900460e410e..3eea5a9baf2 100644 --- a/src/e2e-app/fullscreen/fullscreen-e2e.ts +++ b/src/e2e-app/fullscreen/fullscreen-e2e.ts @@ -37,8 +37,8 @@ export class FullscreenE2E { exitFullscreen() { if (document.exitFullscreen) { document.exitFullscreen(); - } else if (document.webkitExitFullscreen) { - document.webkitExitFullscreen(); + } else if ((document as any).webkitExitFullscreen) { + (document as any).webkitExitFullscreen(); } else if ((document as any).mozExitFullScreen) { (document as any).mozExitFullScreen(); } else if ((document as any).msExitFullScreen) { diff --git a/src/lib/bottom-sheet/bottom-sheet.spec.ts b/src/lib/bottom-sheet/bottom-sheet.spec.ts index 9c773d3df36..faa4e5b833c 100644 --- a/src/lib/bottom-sheet/bottom-sheet.spec.ts +++ b/src/lib/bottom-sheet/bottom-sheet.spec.ts @@ -506,7 +506,7 @@ describe('MatBottomSheet', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.tagName) + expect(document.activeElement!.tagName) .toBe('INPUT', 'Expected first tabbable element (input) in the sheet to be focused.'); })); @@ -519,7 +519,7 @@ describe('MatBottomSheet', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.tagName).not.toBe('INPUT'); + expect(document.activeElement!.tagName).not.toBe('INPUT'); })); it('should re-focus trigger element when bottom sheet closes', fakeAsync(() => { @@ -534,18 +534,18 @@ describe('MatBottomSheet', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.id) + expect(document.activeElement!.id) .not.toBe('bottom-sheet-trigger', 'Expected the focus to change when sheet was opened.'); bottomSheetRef.dismiss(); - expect(document.activeElement.id).not.toBe('bottom-sheet-trigger', + expect(document.activeElement!.id).not.toBe('bottom-sheet-trigger', 'Expcted the focus not to have changed before the animation finishes.'); flushMicrotasks(); viewContainerFixture.detectChanges(); tick(500); - expect(document.activeElement.id).toBe('bottom-sheet-trigger', + expect(document.activeElement!.id).toBe('bottom-sheet-trigger', 'Expected that the trigger was refocused after the sheet is closed.'); document.body.removeChild(button); diff --git a/src/lib/core/ripple/ripple.spec.ts b/src/lib/core/ripple/ripple.spec.ts index 04a661395b2..a0e72ec1992 100644 --- a/src/lib/core/ripple/ripple.spec.ts +++ b/src/lib/core/ripple/ripple.spec.ts @@ -311,8 +311,8 @@ describe('MatRipple', () => { document.body.scrollLeft = pageScrollLeft; // Firefox - document.documentElement.scrollLeft = pageScrollLeft; - document.documentElement.scrollTop = pageScrollTop; + document.documentElement!.scrollLeft = pageScrollLeft; + document.documentElement!.scrollTop = pageScrollTop; // Mobile safari window.scrollTo(pageScrollLeft, pageScrollTop); @@ -324,8 +324,8 @@ describe('MatRipple', () => { document.body.scrollLeft = 0; // Firefox - document.documentElement.scrollLeft = 0; - document.documentElement.scrollTop = 0; + document.documentElement!.scrollLeft = 0; + document.documentElement!.scrollTop = 0; // Mobile safari window.scrollTo(0, 0); diff --git a/src/lib/datepicker/calendar-header.spec.ts b/src/lib/datepicker/calendar-header.spec.ts index a143b10f586..167caf83f55 100644 --- a/src/lib/datepicker/calendar-header.spec.ts +++ b/src/lib/datepicker/calendar-header.spec.ts @@ -1,16 +1,14 @@ -import {Direction, Directionality} from '@angular/cdk/bidi'; -import {MatDatepickerModule} from './datepicker-module'; -import {async, ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatDatepickerIntl} from './datepicker-intl'; -import {DEC, FEB, JAN, MatNativeDateModule} from '@angular/material/core'; +import {Directionality} from '@angular/cdk/bidi'; import {Component} from '@angular/core'; -import {MatCalendar} from './calendar'; +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; +import {DEC, FEB, JAN, MatNativeDateModule} from '@angular/material/core'; import {By} from '@angular/platform-browser'; +import {MatCalendar} from './calendar'; +import {MatDatepickerIntl} from './datepicker-intl'; +import {MatDatepickerModule} from './datepicker-module'; import {yearsPerPage} from './multi-year-view'; describe('MatCalendarHeader', () => { - let dir: { value: Direction }; - beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ @@ -23,7 +21,7 @@ describe('MatCalendarHeader', () => { ], providers: [ MatDatepickerIntl, - {provide: Directionality, useFactory: () => dir = {value: 'ltr'}} + {provide: Directionality, useFactory: () => ({value: 'ltr'})}, ], }); diff --git a/src/lib/datepicker/calendar.spec.ts b/src/lib/datepicker/calendar.spec.ts index e208fa547d9..b014fa74b62 100644 --- a/src/lib/datepicker/calendar.spec.ts +++ b/src/lib/datepicker/calendar.spec.ts @@ -1,4 +1,4 @@ -import {Direction, Directionality} from '@angular/cdk/bidi'; +import {Directionality} from '@angular/cdk/bidi'; import {ENTER, RIGHT_ARROW, SPACE} from '@angular/cdk/keycodes'; import { dispatchFakeEvent, @@ -15,7 +15,6 @@ import {MatDatepickerIntl} from './datepicker-intl'; import {MatDatepickerModule} from './datepicker-module'; describe('MatCalendar', () => { - let dir: {value: Direction}; let zone: MockNgZone; beforeEach(async(() => { @@ -34,7 +33,7 @@ describe('MatCalendar', () => { providers: [ MatDatepickerIntl, {provide: NgZone, useFactory: () => zone = new MockNgZone()}, - {provide: Directionality, useFactory: () => dir = {value: 'ltr'}} + {provide: Directionality, useFactory: () => ({value: 'ltr'})}, ], }); diff --git a/src/lib/dialog/dialog.spec.ts b/src/lib/dialog/dialog.spec.ts index 83a8a919a9a..385469bbd07 100644 --- a/src/lib/dialog/dialog.spec.ts +++ b/src/lib/dialog/dialog.spec.ts @@ -936,7 +936,7 @@ describe('MatDialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.tagName) + expect(document.activeElement!.tagName) .toBe('INPUT', 'Expected first tabbable element (input) in the dialog to be focused.'); })); @@ -949,7 +949,7 @@ describe('MatDialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.tagName).not.toBe('INPUT'); + expect(document.activeElement!.tagName).not.toBe('INPUT'); })); it('should re-focus trigger element when dialog closes', fakeAsync(() => { @@ -965,18 +965,18 @@ describe('MatDialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.id) + expect(document.activeElement!.id) .not.toBe('dialog-trigger', 'Expected the focus to change when dialog was opened.'); dialogRef.close(); - expect(document.activeElement.id).not.toBe('dialog-trigger', + expect(document.activeElement!.id).not.toBe('dialog-trigger', 'Expcted the focus not to have changed before the animation finishes.'); flushMicrotasks(); viewContainerFixture.detectChanges(); tick(500); - expect(document.activeElement.id).toBe('dialog-trigger', + expect(document.activeElement!.id).toBe('dialog-trigger', 'Expected that the trigger was refocused after the dialog is closed.'); document.body.removeChild(button); @@ -1006,7 +1006,7 @@ describe('MatDialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.id).toBe('input-to-be-focused', + expect(document.activeElement!.id).toBe('input-to-be-focused', 'Expected that the trigger was refocused after the dialog is closed.'); document.body.removeChild(button); @@ -1020,7 +1020,7 @@ describe('MatDialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.tagName) + expect(document.activeElement!.tagName) .toBe('MAT-DIALOG-CONTAINER', 'Expected dialog container to be focused.'); })); @@ -1040,7 +1040,7 @@ describe('MatDialog', () => { viewContainerFixture.detectChanges(); flushMicrotasks(); - expect(document.activeElement.id) + expect(document.activeElement!.id) .not.toBe('dialog-trigger', 'Expected the focus to change when dialog was opened.'); dialogRef.close(); @@ -1048,7 +1048,7 @@ describe('MatDialog', () => { viewContainerFixture.detectChanges(); tick(500); - expect(document.activeElement.id).not.toBe('dialog-trigger', + expect(document.activeElement!.id).not.toBe('dialog-trigger', 'Expected focus not to have been restored.'); document.body.removeChild(button); @@ -1323,7 +1323,7 @@ describe('MatDialog with default options', () => { dispatchKeyboardEvent(document.body, 'keydown', ESCAPE); expect(overlayContainerElement.querySelector('mat-dialog-container')).toBeTruthy(); - expect(document.activeElement.tagName).not.toBe('INPUT'); + expect(document.activeElement!.tagName).not.toBe('INPUT'); let overlayPane = overlayContainerElement.querySelector('.cdk-overlay-pane') as HTMLElement; expect(overlayPane.style.width).toBe('100px'); diff --git a/src/lib/form-field/form-field.ts b/src/lib/form-field/form-field.ts index b301990153e..f5278c035a4 100644 --- a/src/lib/form-field/form-field.ts +++ b/src/lib/form-field/form-field.ts @@ -465,7 +465,7 @@ export class MatFormField extends _MatFormFieldMixinBase } // If the element is not present in the DOM, the outline gap will need to be calculated // the next time it is checked and in the DOM. - if (!document.documentElement.contains(this._elementRef.nativeElement)) { + if (!document.documentElement!.contains(this._elementRef.nativeElement)) { this._outlineGapCalculationNeeded = true; return; } diff --git a/src/lib/select/select.spec.ts b/src/lib/select/select.spec.ts index d2badc3099e..e8325c988fa 100644 --- a/src/lib/select/select.spec.ts +++ b/src/lib/select/select.spec.ts @@ -3338,7 +3338,7 @@ describe('MatSelect', () => { // both Chrome and Firefox. function setScrollTop(num: number) { document.body.scrollTop = num; - document.documentElement.scrollTop = num; + document.documentElement!.scrollTop = num; } beforeEach(fakeAsync(() => {