@@ -18,16 +18,30 @@ import {VERSION as CDK_VERSION} from '@angular/cdk';
18
18
const VERSION = new Version ( '0.0.0-PLACEHOLDER' ) ;
19
19
20
20
/** @docs -private */
21
- export function MATERIAL_SANITY_CHECKS_FACTORY ( ) : boolean {
21
+ export function MATERIAL_SANITY_CHECKS_FACTORY ( ) : SanityChecks {
22
22
return true ;
23
23
}
24
24
25
25
/** Injection token that configures whether the Material sanity checks are enabled. */
26
- export const MATERIAL_SANITY_CHECKS = new InjectionToken < boolean > ( 'mat-sanity-checks' , {
26
+ export const MATERIAL_SANITY_CHECKS = new InjectionToken < SanityChecks > ( 'mat-sanity-checks' , {
27
27
providedIn : 'root' ,
28
28
factory : MATERIAL_SANITY_CHECKS_FACTORY ,
29
29
} ) ;
30
30
31
+ /**
32
+ * Possible sanity checks that can be enabled. If set to
33
+ * true/false, all checks will be enabled/disabled.
34
+ */
35
+ export type SanityChecks = boolean | GranularSanityChecks ;
36
+
37
+ /** Object that can be used to configure the sanity checks granularly. */
38
+ export interface GranularSanityChecks {
39
+ doctype : boolean ;
40
+ theme : boolean ;
41
+ version : boolean ;
42
+ hammer : boolean ;
43
+ }
44
+
31
45
/**
32
46
* Module that captures anything that should be loaded and/or run for *all* Angular Material
33
47
* components. This includes Bidi, etc.
@@ -51,21 +65,28 @@ export class MatCommonModule {
51
65
/** Reference to the global 'window' object. */
52
66
private _window = typeof window === 'object' && window ? window : null ;
53
67
68
+ /** Configured sanity checks. */
69
+ private _sanityChecks : SanityChecks ;
70
+
54
71
constructor (
55
- @Optional ( ) @Inject ( MATERIAL_SANITY_CHECKS ) private _sanityChecksEnabled : boolean ,
72
+ @Optional ( ) @Inject ( MATERIAL_SANITY_CHECKS ) sanityChecks : any ,
56
73
@Optional ( ) @Inject ( HAMMER_LOADER ) private _hammerLoader ?: HammerLoader ) {
57
74
58
- if ( this . _areChecksEnabled ( ) && ! this . _hasDoneGlobalChecks ) {
75
+ // Note that `_sanityChecks` is typed to `any`, because AoT
76
+ // throws an error if we use the `SanityChecks` type directly.
77
+ this . _sanityChecks = sanityChecks ;
78
+
79
+ if ( ! this . _hasDoneGlobalChecks ) {
59
80
this . _checkDoctypeIsDefined ( ) ;
60
81
this . _checkThemeIsPresent ( ) ;
61
82
this . _checkCdkVersionMatch ( ) ;
62
83
this . _hasDoneGlobalChecks = true ;
63
84
}
64
85
}
65
86
66
- /** Whether any sanity checks are enabled */
67
- private _areChecksEnabled ( ) : boolean {
68
- return this . _sanityChecksEnabled && isDevMode ( ) && ! this . _isTestEnv ( ) ;
87
+ /** Whether any sanity checks are enabled. */
88
+ private _checksAreEnabled ( ) : boolean {
89
+ return isDevMode ( ) && ! this . _isTestEnv ( ) ;
69
90
}
70
91
71
92
/** Whether the code is running in tests. */
@@ -75,7 +96,10 @@ export class MatCommonModule {
75
96
}
76
97
77
98
private _checkDoctypeIsDefined ( ) : void {
78
- if ( this . _document && ! this . _document . doctype ) {
99
+ const isEnabled = this . _checksAreEnabled ( ) &&
100
+ ( this . _sanityChecks === true || ( this . _sanityChecks as GranularSanityChecks ) . doctype ) ;
101
+
102
+ if ( isEnabled && this . _document && ! this . _document . doctype ) {
79
103
console . warn (
80
104
'Current document does not have a doctype. This may cause ' +
81
105
'some Angular Material components not to behave as expected.'
@@ -86,7 +110,11 @@ export class MatCommonModule {
86
110
private _checkThemeIsPresent ( ) : void {
87
111
// We need to assert that the `body` is defined, because these checks run very early
88
112
// and the `body` won't be defined if the consumer put their scripts in the `head`.
89
- if ( ! this . _document || ! this . _document . body || typeof getComputedStyle !== 'function' ) {
113
+ const isDisabled = ! this . _checksAreEnabled ( ) ||
114
+ ( this . _sanityChecks === false || ! ( this . _sanityChecks as GranularSanityChecks ) . theme ) ;
115
+
116
+ if ( isDisabled || ! this . _document || ! this . _document . body ||
117
+ typeof getComputedStyle !== 'function' ) {
90
118
return ;
91
119
}
92
120
@@ -113,7 +141,10 @@ export class MatCommonModule {
113
141
114
142
/** Checks whether the material version matches the cdk version */
115
143
private _checkCdkVersionMatch ( ) : void {
116
- if ( VERSION . full !== CDK_VERSION . full ) {
144
+ const isEnabled = this . _checksAreEnabled ( ) &&
145
+ ( this . _sanityChecks === true || ( this . _sanityChecks as GranularSanityChecks ) . version ) ;
146
+
147
+ if ( isEnabled && VERSION . full !== CDK_VERSION . full ) {
117
148
console . warn (
118
149
'The Angular Material version (' + VERSION . full + ') does not match ' +
119
150
'the Angular CDK version (' + CDK_VERSION . full + ').\n' +
@@ -128,7 +159,10 @@ export class MatCommonModule {
128
159
return ;
129
160
}
130
161
131
- if ( this . _areChecksEnabled ( ) && ! ( this . _window as any ) [ 'Hammer' ] && ! this . _hammerLoader ) {
162
+ const isEnabled = this . _checksAreEnabled ( ) &&
163
+ ( this . _sanityChecks === true || ( this . _sanityChecks as GranularSanityChecks ) . hammer ) ;
164
+
165
+ if ( isEnabled && ! ( this . _window as any ) [ 'Hammer' ] && ! this . _hammerLoader ) {
132
166
console . warn (
133
167
'Could not find HammerJS. Certain Angular Material components may not work correctly.' ) ;
134
168
}
0 commit comments