angular-cn/tools/postinstall-patches.js

98 lines
3.7 KiB
JavaScript

/**
* @license
* Copyright Google LLC 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.info;
// 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');
*/
// 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 =====');