7df7e340ce
In order to speed up bazel build performance delete all rxjs d.ts files that reference rxjs-compat. For all ts_library and ng_module rules Bazel generates tsconfig.json file that explicitly lists all d.ts files found in required npm package. In case of rxjs, this means that tsconfig contains all d.ts files that reference rxjs-compat package, which is an interop/backwards compatibility package not installed in angular/angular repo. But because tsconfig contains these d.ts files, tsc will try to resolve them and silently fail. All these lookups are quite expensive and not cached. This causes significant slowdown of the build under bazel. This change removes all of these problematic rxjs d.ts files via an npm postinstall hook. This is not ideal because it solves the problem only for our repo, but it's a good start. Build perf improvements per target: //packages/core/src/reflect:reflect 5sec => 3 sec //packages/core:core 17sec => 12 sec //packages/router:router 30sec => 8 sec PR Close #33786
105 lines
4.1 KiB
JavaScript
105 lines
4.1 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
try {
|
|
require.resolve('shelljs');
|
|
} catch (e) {
|
|
// We are in an bazel managed external node_modules repository
|
|
// and the resolve has failed because node did not preserve the symlink
|
|
// when loading the script.
|
|
// This can be fixed using the --preserve-symlinks-main flag which
|
|
// is introduced in node 10.2.0
|
|
console.warn(
|
|
`Running postinstall-patches.js script in an external repository requires --preserve-symlinks-main node flag introduced in node 10.2.0. ` +
|
|
`Current node version is ${process.version}. Node called with '${process.argv.join(" ")}'.`);
|
|
process.exit(0);
|
|
}
|
|
|
|
const {set, cd, sed, echo, ls, rm} = require('shelljs');
|
|
const {readFileSync} = require('fs');
|
|
const path = require('path');
|
|
const log = console.log;
|
|
|
|
// COMMENTED OUT BECAUSE WE CURRENTLY REQUIRE NO PATCHES
|
|
// UNCOMMENT TO REENABLE PATCHING AND LOG OUTPUT
|
|
//
|
|
log('===== about to run the postinstall-patches.js script =====');
|
|
// fail on first error
|
|
set('-e');
|
|
// print commands as being executed
|
|
set('-v');
|
|
// jump to project root
|
|
cd(path.join(__dirname, '../'));
|
|
|
|
/* EXAMPLE PATCH:
|
|
// https://github.com/ReactiveX/rxjs/pull/3302
|
|
// make node_modules/rxjs compilable with Typescript 2.7
|
|
// remove when we update to rxjs v6
|
|
log('\n# patch: reactivex/rxjs#3302 make node_modules/rxjs compilable with Typescript 2.7');
|
|
sed('-i', '(\'response\' in xhr)', '(\'response\' in (xhr as any))',
|
|
'node_modules/rxjs/src/observable/dom/AjaxObservable.ts');
|
|
*/
|
|
|
|
// make chrome 74 work on OSX with karma under bazel
|
|
// remove when we update to the next @bazel/karma release
|
|
log('\n# patch: @bazel/karma 0.29.0 to disable chrome sandbox for OSX');
|
|
sed('-i', 'process.platform !== \'linux\'',
|
|
'process.platform !== \'linux\' && process.platform !== \'darwin\'',
|
|
'node_modules/@bazel/karma/karma.conf.js');
|
|
|
|
// Workaround https://github.com/bazelbuild/rules_nodejs/issues/1033
|
|
// TypeScript doesn't understand typings without "declare module" unless
|
|
// they are actually resolved by the @types default mechanism
|
|
log('\n# patch: @types/babel__* adding declare module wrappers');
|
|
ls('node_modules/@types').filter(f => f.startsWith('babel__')).forEach(pkg => {
|
|
const modName = '@' + pkg.replace('__', '/');
|
|
const typingsFile = `node_modules/@types/${pkg}/index.d.ts`;
|
|
// Only add the patch if it is not already there.
|
|
if (readFileSync(typingsFile, 'utf8').indexOf('/*added by tools/postinstall_patches.js*/') ===
|
|
-1) {
|
|
const insertPrefix = `/*added by tools/postinstall_patches.js*/ declare module "${modName}" { `;
|
|
sed('-i', `(// Type definitions for ${modName})`, insertPrefix + '$1', typingsFile);
|
|
echo('}').toEnd(typingsFile);
|
|
}
|
|
});
|
|
|
|
log('\n# patch: delete d.ts files refering to rxjs-compat');
|
|
// more info in https://github.com/angular/angular/pull/33786
|
|
rm('-rf', [
|
|
'node_modules/rxjs/add/',
|
|
'node_modules/rxjs/observable/',
|
|
'node_modules/rxjs/operator/',
|
|
// rxjs/operators is a public entry point that also contains files to support legacy deep import
|
|
// paths, so we need to preserve index.* and package.json files that are required for module
|
|
// resolution.
|
|
'node_modules/rxjs/operators/!(index.*|package.json)',
|
|
'node_modules/rxjs/scheduler/',
|
|
'node_modules/rxjs/symbol/',
|
|
'node_modules/rxjs/util/',
|
|
'node_modules/rxjs/internal/Rx.d.ts',
|
|
'node_modules/rxjs/AsyncSubject.*',
|
|
'node_modules/rxjs/BehaviorSubject.*',
|
|
'node_modules/rxjs/InnerSubscriber.*',
|
|
'node_modules/rxjs/interfaces.*',
|
|
'node_modules/rxjs/Notification.*',
|
|
'node_modules/rxjs/Observable.*',
|
|
'node_modules/rxjs/Observer.*',
|
|
'node_modules/rxjs/Operator.*',
|
|
'node_modules/rxjs/OuterSubscriber.*',
|
|
'node_modules/rxjs/ReplaySubject.*',
|
|
'node_modules/rxjs/Rx.*',
|
|
'node_modules/rxjs/Scheduler.*',
|
|
'node_modules/rxjs/Subject.*',
|
|
'node_modules/rxjs/SubjectSubscription.*',
|
|
'node_modules/rxjs/Subscriber.*',
|
|
'node_modules/rxjs/Subscription.*',
|
|
]);
|
|
|
|
|
|
log('===== finished running the postinstall-patches.js script =====');
|