@@ -9,6 +9,27 @@ import { RushConfigurationProject } from '../api/RushConfigurationProject';
9
9
import { DependencySpecifier } from './DependencySpecifier' ;
10
10
11
11
export class ApprovedPackagesChecker {
12
+ private readonly _rushConfiguration : RushConfiguration ;
13
+ private _approvedPackagesPolicy : ApprovedPackagesPolicy ;
14
+ private _filesAreOutOfDate : boolean ;
15
+
16
+ public constructor ( rushConfiguration : RushConfiguration ) {
17
+ this . _rushConfiguration = rushConfiguration ;
18
+ this . _approvedPackagesPolicy = this . _rushConfiguration . approvedPackagesPolicy ;
19
+ this . _filesAreOutOfDate = false ;
20
+
21
+ if ( this . _approvedPackagesPolicy . enabled ) {
22
+ this . _updateApprovedPackagesPolicy ( ) ;
23
+ }
24
+ }
25
+
26
+ /**
27
+ * If true, the files on disk are out of date.
28
+ */
29
+ public get approvedPackagesFilesAreOutOfDate ( ) : boolean {
30
+ return this . _filesAreOutOfDate ;
31
+ }
32
+
12
33
/**
13
34
* Examines the current dependencies for the projects specified in RushConfiguration,
14
35
* and then adds them to the 'browser-approved-packages.json' and
@@ -17,30 +38,46 @@ export class ApprovedPackagesChecker {
17
38
*
18
39
* If the "approvedPackagesPolicy" feature is not enabled, then no action is taken.
19
40
*/
20
- public static rewriteConfigFiles ( rushConfiguration : RushConfiguration ) : void {
21
- const approvedPackagesPolicy : ApprovedPackagesPolicy = rushConfiguration . approvedPackagesPolicy ;
22
- if ( ! approvedPackagesPolicy . enabled ) {
23
- return ;
41
+ public rewriteConfigFiles ( ) : void {
42
+ const approvedPackagesPolicy : ApprovedPackagesPolicy = this . _rushConfiguration . approvedPackagesPolicy ;
43
+ if ( approvedPackagesPolicy . enabled ) {
44
+ approvedPackagesPolicy . browserApprovedPackages . saveToFile ( ) ;
45
+ approvedPackagesPolicy . nonbrowserApprovedPackages . saveToFile ( ) ;
24
46
}
47
+ }
25
48
26
- for ( const rushProject of rushConfiguration . projects ) {
49
+ private _updateApprovedPackagesPolicy ( ) : void {
50
+ for ( const rushProject of this . _rushConfiguration . projects ) {
27
51
const packageJson : IPackageJson = rushProject . packageJson ;
28
52
29
- ApprovedPackagesChecker . _collectDependencies ( packageJson . dependencies ,
30
- approvedPackagesPolicy , rushProject ) ;
31
- ApprovedPackagesChecker . _collectDependencies ( packageJson . optionalDependencies ,
32
- approvedPackagesPolicy , rushProject ) ;
33
- ApprovedPackagesChecker . _collectDependencies ( packageJson . devDependencies ,
34
- approvedPackagesPolicy , rushProject ) ;
53
+ this . _collectDependencies (
54
+ packageJson . dependencies ,
55
+ this . _approvedPackagesPolicy ,
56
+ rushProject
57
+ ) ;
58
+ this . _collectDependencies (
59
+ packageJson . devDependencies ,
60
+ this . _approvedPackagesPolicy ,
61
+ rushProject
62
+ ) ;
63
+ this . _collectDependencies (
64
+ packageJson . peerDependencies ,
65
+ this . _approvedPackagesPolicy ,
66
+ rushProject
67
+ ) ;
68
+ this . _collectDependencies (
69
+ packageJson . optionalDependencies ,
70
+ this . _approvedPackagesPolicy ,
71
+ rushProject
72
+ ) ;
35
73
}
36
-
37
- approvedPackagesPolicy . browserApprovedPackages . saveToFile ( ) ;
38
- approvedPackagesPolicy . nonbrowserApprovedPackages . saveToFile ( ) ;
39
74
}
40
75
41
- private static _collectDependencies ( dependencies : { [ key : string ] : string } | undefined ,
42
- approvedPackagesPolicy : ApprovedPackagesPolicy , rushProject : RushConfigurationProject ) : void {
43
-
76
+ private _collectDependencies (
77
+ dependencies : { [ key : string ] : string } | undefined ,
78
+ approvedPackagesPolicy : ApprovedPackagesPolicy ,
79
+ rushProject : RushConfigurationProject
80
+ ) : void {
44
81
if ( dependencies ) {
45
82
for ( const packageName of Object . keys ( dependencies ) ) {
46
83
@@ -51,8 +88,10 @@ export class ApprovedPackagesChecker {
51
88
// "dependencies": {
52
89
// "alias-name": "npm:target-name@^1.2.3"
53
90
// }
54
- const dependencySpecifier : DependencySpecifier
55
- = new DependencySpecifier ( packageName , dependencies [ packageName ] ) ;
91
+ const dependencySpecifier : DependencySpecifier = new DependencySpecifier (
92
+ packageName ,
93
+ dependencies [ packageName ]
94
+ ) ;
56
95
if ( dependencySpecifier . aliasTarget ) {
57
96
// Use "target-name" instead of "alias-name"
58
97
referencedPackageName = dependencySpecifier . aliasTarget . packageName ;
@@ -64,15 +103,23 @@ export class ApprovedPackagesChecker {
64
103
if ( ! approvedPackagesPolicy . ignoredNpmScopes . has ( scope ) ) {
65
104
// Yes, add it to the list if it's not already there
66
105
106
+ let updated : boolean = false ;
107
+
67
108
// By default we put everything in the browser file. But if it already appears in the
68
109
// non-browser file, then use that instead.
69
110
if ( approvedPackagesPolicy . nonbrowserApprovedPackages . getItemByName ( referencedPackageName ) ) {
70
- approvedPackagesPolicy . nonbrowserApprovedPackages
71
- . addOrUpdatePackage ( referencedPackageName , rushProject . reviewCategory ) ;
111
+ updated = approvedPackagesPolicy . nonbrowserApprovedPackages . addOrUpdatePackage (
112
+ referencedPackageName ,
113
+ rushProject . reviewCategory
114
+ ) ;
72
115
} else {
73
- approvedPackagesPolicy . browserApprovedPackages
74
- . addOrUpdatePackage ( referencedPackageName , rushProject . reviewCategory ) ;
116
+ updated = approvedPackagesPolicy . browserApprovedPackages . addOrUpdatePackage (
117
+ referencedPackageName ,
118
+ rushProject . reviewCategory
119
+ ) ;
75
120
}
121
+
122
+ this . _filesAreOutOfDate = this . _filesAreOutOfDate || updated ;
76
123
}
77
124
}
78
125
}
0 commit comments