Skip to content

Commit 5c046de

Browse files
committed
build: add tslint rule to verify rollup globals config
Adds a custom tslint rule that ensures that we've added all of the necessary external modules to the Rollup config. This is helpful, because forgetting to add a module will log a warning, but it won't break the build necessarily, which is why we occasionally need PRs like #5930.
1 parent 3bfe7f0 commit 5c046de

File tree

6 files changed

+118
-72
lines changed

6 files changed

+118
-72
lines changed

src/lib/table/cell.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
CdkCellDef,
1313
CdkColumnDef,
1414
CdkHeaderCell,
15-
CdkHeaderCellDef
15+
CdkHeaderCellDef,
1616
} from '@angular/cdk/table';
1717

1818
/** Workaround for https://github.com/angular/angular/issues/17849 */

src/lib/table/row.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
CdkRow,
1313
CDK_ROW_TEMPLATE,
1414
CdkRowDef,
15-
CdkHeaderRowDef
15+
CdkHeaderRowDef,
1616
} from '@angular/cdk/table';
1717

1818
/** Workaround for https://github.com/angular/angular/issues/17849 */
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{
2+
"tslib": "tslib",
3+
4+
"@angular/animations": "ng.animations",
5+
"@angular/core": "ng.core",
6+
"@angular/common": "ng.common",
7+
"@angular/forms": "ng.forms",
8+
"@angular/http": "ng.http",
9+
"@angular/router": "ng.router",
10+
"@angular/platform-browser": "ng.platformBrowser",
11+
"@angular/platform-server": "ng.platformServer",
12+
"@angular/platform-browser-dynamic": "ng.platformBrowserDynamic",
13+
"@angular/platform-browser/animations": "ng.platformBrowser.animations",
14+
"@angular/core/testing": "ng.core.testing",
15+
"@angular/common/testing": "ng.common.testing",
16+
"@angular/http/testing": "ng.http.testing",
17+
18+
"@angular/material": "ng.material",
19+
"@angular/cdk/a11y": "ng.cdk.a11y",
20+
"@angular/cdk/bidi": "ng.cdk.bidi",
21+
"@angular/cdk/coercion": "ng.cdk.coercion",
22+
"@angular/cdk/keyboard": "ng.cdk.keyboard",
23+
"@angular/cdk/observe-content": "ng.cdk.observeContent",
24+
"@angular/cdk/platform": "ng.cdk.platform",
25+
"@angular/cdk/portal": "ng.cdk.portal",
26+
"@angular/cdk/rxjs": "ng.cdk.rxjs",
27+
"@angular/cdk/table": "ng.cdk.table",
28+
"@angular/cdk": "ng.cdk",
29+
"@angular/cdk/testing": "ng.cdk.testing",
30+
31+
"@angular/material-examples": "ng.materialExamples",
32+
33+
"rxjs/BehaviorSubject": "Rx",
34+
"rxjs/Observable": "Rx",
35+
"rxjs/Subject": "Rx",
36+
"rxjs/Subscription": "Rx",
37+
"rxjs/Observer": "Rx",
38+
"rxjs/Scheduler": "Rx",
39+
"rxjs/observable/combineLatest": "Rx.Observable",
40+
"rxjs/observable/forkJoin": "Rx.Observable",
41+
"rxjs/observable/fromEvent": "Rx.Observable",
42+
"rxjs/observable/merge": "Rx.Observable",
43+
"rxjs/observable/of": "Rx.Observable",
44+
"rxjs/observable/throw": "Rx.Observable",
45+
"rxjs/operator/auditTime": "Rx.Observable.prototype",
46+
"rxjs/operator/catch": "Rx.Observable.prototype",
47+
"rxjs/operator/debounceTime": "Rx.Observable.prototype",
48+
"rxjs/operator/do": "Rx.Observable.prototype",
49+
"rxjs/operator/filter": "Rx.Observable.prototype",
50+
"rxjs/operator/finally": "Rx.Observable.prototype",
51+
"rxjs/operator/first": "Rx.Observable.prototype",
52+
"rxjs/operator/let": "Rx.Observable.prototype",
53+
"rxjs/operator/map": "Rx.Observable.prototype",
54+
"rxjs/operator/share": "Rx.Observable.prototype",
55+
"rxjs/operator/startWith": "Rx.Observable.prototype",
56+
"rxjs/operator/switchMap": "Rx.Observable.prototype",
57+
"rxjs/operator/takeUntil": "Rx.Observable.prototype",
58+
"rxjs/operator/toPromise": "Rx.Observable.prototype",
59+
60+
"rxjs/add/observable/merge": "Rx.Observable",
61+
"rxjs/add/observable/fromEvent": "Rx.Observable",
62+
"rxjs/add/observable/of": "Rx.Observable",
63+
"rxjs/add/observable/interval": "Rx.Observable",
64+
"rxjs/add/operator/startWith": "Rx.Observable.prototype",
65+
"rxjs/add/operator/map": "Rx.Observable.prototype",
66+
"rxjs/add/operator/debounceTime": "Rx.Observable.prototype",
67+
"rxjs/add/operator/distinctUntilChanged": "Rx.Observable.prototype",
68+
"rxjs/add/operator/first": "Rx.Observable.prototype",
69+
"rxjs/add/operator/catch": "Rx.Observable.prototype",
70+
"rxjs/add/operator/switchMap": "Rx.Observable.prototype"
71+
}

tools/package-tools/rollup-helpers.ts

Lines changed: 1 addition & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -4,76 +4,7 @@ import {rollupRemoveLicensesPlugin} from './rollup-remove-licenses';
44
// There are no type definitions available for these imports.
55
const rollup = require('rollup');
66
const rollupNodeResolutionPlugin = require('rollup-plugin-node-resolve');
7-
8-
const ROLLUP_GLOBALS = {
9-
// Import tslib rather than having TypeScript output its helpers multiple times.
10-
// See https://github.com/Microsoft/tslib
11-
'tslib': 'tslib',
12-
13-
// Angular dependencies
14-
'@angular/animations': 'ng.animations',
15-
'@angular/core': 'ng.core',
16-
'@angular/common': 'ng.common',
17-
'@angular/forms': 'ng.forms',
18-
'@angular/http': 'ng.http',
19-
'@angular/platform-browser': 'ng.platformBrowser',
20-
'@angular/platform-browser-dynamic': 'ng.platformBrowserDynamic',
21-
'@angular/platform-browser/animations': 'ng.platformBrowser.animations',
22-
23-
// Local Angular packages inside of Material.
24-
'@angular/material': 'ng.material',
25-
26-
// TODO(jelbourn): don't hard-code these
27-
'@angular/cdk/a11y': 'ng.cdk.a11y',
28-
'@angular/cdk/bidi': 'ng.cdk.bidi',
29-
'@angular/cdk/coercion': 'ng.cdk.coercion',
30-
'@angular/cdk/keyboard': 'ng.cdk.keyboard',
31-
'@angular/cdk/observe-content': 'ng.cdk.observeContent',
32-
'@angular/cdk/platform': 'ng.cdk.platform',
33-
'@angular/cdk/portal': 'ng.cdk.portal',
34-
'@angular/cdk/rxjs': 'ng.cdk.rxjs',
35-
'@angular/cdk/table': 'ng.cdk.table',
36-
'@angular/cdk': 'ng.cdk',
37-
38-
// RxJS dependencies
39-
'rxjs/BehaviorSubject': 'Rx',
40-
'rxjs/Observable': 'Rx',
41-
'rxjs/Subject': 'Rx',
42-
'rxjs/Subscription': 'Rx',
43-
'rxjs/observable/combineLatest': 'Rx.Observable',
44-
'rxjs/observable/forkJoin': 'Rx.Observable',
45-
'rxjs/observable/fromEvent': 'Rx.Observable',
46-
'rxjs/observable/merge': 'Rx.Observable',
47-
'rxjs/observable/of': 'Rx.Observable',
48-
'rxjs/observable/throw': 'Rx.Observable',
49-
'rxjs/operator/auditTime': 'Rx.Observable.prototype',
50-
'rxjs/operator/catch': 'Rx.Observable.prototype',
51-
'rxjs/operator/debounceTime': 'Rx.Observable.prototype',
52-
'rxjs/operator/do': 'Rx.Observable.prototype',
53-
'rxjs/operator/filter': 'Rx.Observable.prototype',
54-
'rxjs/operator/finally': 'Rx.Observable.prototype',
55-
'rxjs/operator/first': 'Rx.Observable.prototype',
56-
'rxjs/operator/let': 'Rx.Observable.prototype',
57-
'rxjs/operator/map': 'Rx.Observable.prototype',
58-
'rxjs/operator/share': 'Rx.Observable.prototype',
59-
'rxjs/operator/startWith': 'Rx.Observable.prototype',
60-
'rxjs/operator/switchMap': 'Rx.Observable.prototype',
61-
'rxjs/operator/takeUntil': 'Rx.Observable.prototype',
62-
'rxjs/operator/toPromise': 'Rx.Observable.prototype',
63-
64-
// RxJS imports for the examples package
65-
'rxjs/add/observable/merge': 'Rx.Observable',
66-
'rxjs/add/observable/fromEvent': 'Rx.Observable',
67-
'rxjs/add/observable/of': 'Rx.Observable',
68-
'rxjs/add/observable/interval': 'Rx.Observable',
69-
'rxjs/add/operator/startWith': 'Rx.Observable.prototype',
70-
'rxjs/add/operator/map': 'Rx.Observable.prototype',
71-
'rxjs/add/operator/debounceTime': 'Rx.Observable.prototype',
72-
'rxjs/add/operator/distinctUntilChanged': 'Rx.Observable.prototype',
73-
'rxjs/add/operator/first': 'Rx.Observable.prototype',
74-
'rxjs/add/operator/catch': 'Rx.Observable.prototype',
75-
'rxjs/add/operator/switchMap': 'Rx.Observable.prototype',
76-
};
7+
const ROLLUP_GLOBALS = require('./rollup-globals.json');
778

789
export type BundleConfig = {
7910
entry: string;
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const path = require('path');
2+
const Lint = require('tslint');
3+
4+
/**
5+
* Rule that enforces that the specified external packages have been included in our Rollup config.
6+
* Usage: [true, './path/to/rollup/config.json']
7+
*/
8+
class Rule extends Lint.Rules.AbstractRule {
9+
apply(file) {
10+
return this.applyWithWalker(new Walker(file, this.getOptions()));
11+
}
12+
}
13+
14+
class Walker extends Lint.RuleWalker {
15+
constructor(file, options) {
16+
super(...arguments);
17+
18+
if (!options.ruleArguments.length) {
19+
throw Error('missing-rollup-globals: The Rollup config path has to be specified.');
20+
}
21+
22+
this._configPath = path.resolve(process.cwd(), options.ruleArguments[0]);
23+
this._config = require(this._configPath);
24+
}
25+
26+
visitImportDeclaration(node) {
27+
// Parse out the module name. The first and last characters are the quote marks.
28+
const module = node.moduleSpecifier.getText().slice(1, -1);
29+
const isExternal = !module.startsWith('.') && !module.startsWith('/');
30+
31+
// Check whether the module is external and whether it's in our config.
32+
if (isExternal && !this._config[module]) {
33+
this.addFailureAtNode(node, `Module "${module}" is missing from file ${this._configPath}.`);
34+
}
35+
36+
super.visitImportDeclaration(node);
37+
}
38+
}
39+
40+
exports.Rule = Rule;

tslint.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535
"src/lib",
3636
"src/cdk"
3737
],
38+
"missing-rollup-globals": [
39+
true,
40+
"./tools/package-tools/rollup-globals.json"
41+
],
3842
"one-line": [
3943
true,
4044
"check-catch",

0 commit comments

Comments
 (0)