forked from dynatrace-oss/barista
-
Notifications
You must be signed in to change notification settings - Fork 0
/
postinstall.js
124 lines (115 loc) · 4.91 KB
/
postinstall.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// This script will be executed on npm postinstall and is a
// migration script for the phase where we support building with bazel
// and without.
const { exec } = require('child_process');
const { resolve } = require('path');
const { sync } = require('glob');
const { writeFileSync, readFileSync } = require('fs');
const MAIN_FIELD_NAME = 'main';
const NGCC_MAIN_FIELD_NAME = 'main_ivy_ngcc';
const NGCC_BINARY = resolve(
'./node_modules/@angular/compiler-cli/ngcc/main-ngcc.js',
);
const NGC_BINARY = resolve('./node_modules/@angular/compiler-cli/src/main.js');
async function main() {
// Apply the husky configuration
await execCommand(`npm run prepare-husky`);
// Applying all the patches to the packages
await execCommand(`node ${require.resolve('patch-package')}`);
// when running with bazel we need to perform a ngcc to compile
// all dependencies for ivy. If we are not run by bazel just build
// the workspace library. With bazel this is already in the build cache.
// Generate Angular ngfactory.js, ngsummary.js files for the dependencies,
// that are needed for ViewEngine
await execCommand(`node ${NGC_BINARY} -p view-engine-tsconfig.json`);
// Generate Ivy entry points
await execCommand(
`node ${NGCC_BINARY} --properties es2015 browser module main --first-only --create-ivy-entry-points`,
);
// link the ivy entry points
updateNgccMainFields();
// remove man page path to get rid of bazel cache error while running tests
removeManPagePath();
if (!process.env.BAZEL_NPM_INSTALL) {
await execCommand(`npm run ng build workspace`);
}
}
/**
* Executes a shell command and return it as a Promise.
* @param cmd {string}
* @return {Promise<string>}
*/
function execCommand(cmd) {
return new Promise((resolve, reject) => {
exec(cmd, (error, stdout, stderr) => {
if (error) {
return reject(error);
}
const output = stdout ? stdout : stderr;
console.log(output);
resolve(output);
});
});
}
/**
* Script that runs after node modules have been installed, and Ngcc processed all packages.
* This script updates the `package.json` files of Angular framework packages to point to the
* Ngcc processed UMD bundles. This is needed because we run Angular in a `nodejs_binary`, but
* want to make sure that Ivy is being used. By default, the NodeJS module resolution will load
* the unprocessed UMD bundle because the `main` field of the `package.json` files point to the
* View Engine UMD bundles. This script updates the `main` field in `package.json` files to point
* to the previously generated Ivy UMD bundles.
*
* Ngcc does not by edit the `main` field because we ran it with the `--create-ivy-entry-points`
* flag. It instructs Ngcc to not modify existing package bundles, but rather create separate
* copies with the needed Ivy modifications. This is necessary because the original bundles
* are needed for View Engine, and we want to preserve them in order to be able to switch
* between Ivy and View Engine (for testing). Since the goal of this flag is to not modify
* any original package files/bundles, Ngcc will not edit the `main` field to point to
* the processed Ivy bundles.
*/
function updateNgccMainFields() {
sync('node_modules/@angular/**/package.json').forEach((filePath) => {
// Do not update `package.json` files for deeply nested node modules (e.g. dependencies of
// the `@angular/compiler-cli` package).
if (filePath.lastIndexOf('node_modules/') !== 0) {
return;
}
const parsedJson = JSON.parse(readFileSync(filePath, 'utf8'));
if (
parsedJson[NGCC_MAIN_FIELD_NAME] &&
parsedJson[MAIN_FIELD_NAME] !== parsedJson[NGCC_MAIN_FIELD_NAME]
) {
// Update the main field to point to the ngcc main script.
parsedJson[MAIN_FIELD_NAME] = parsedJson[NGCC_MAIN_FIELD_NAME];
writeFileSync(filePath, JSON.stringify(parsedJson, null, 2));
}
});
}
/**
* Remove man package json entry to get rid of insufficient use of bazel cache because
* man page path are used in package.json (sshpk)
* e.g.
* "man": [
* "/var/lib/buildkite-agent/builds/designops-buildkite-i-0e57b7da3745f484a-1/dynatrace/bazel/node_modules/sshpk/man/man1/sshpk-conv.1",
* "/var/lib/buildkite-agent/builds/designops-buildkite-i-0e57b7da3745f484a-1/dynatrace/bazel/node_modules/sshpk/man/man1/sshpk-sign.1",
* "/var/lib/buildkite-agent/builds/designops-buildkite-i-0e57b7da3745f484a-1/dynatrace/bazel/node_modules/sshpk/man/man1/sshpk-verify.1"
* ],
*/
function removeManPagePath() {
sync('node_modules/sshpk/package.json').forEach((filePath) => {
const parsedJson = JSON.parse(readFileSync(filePath, 'utf8'));
if (parsedJson['man']) {
delete parsedJson['man'];
writeFileSync(filePath, JSON.stringify(parsedJson, null, 2));
}
});
}
main()
.then(() => {
console.log('✅ Successfully run postinstall script!');
})
.catch((error) => {
console.error(error);
process.exit(1);
});