| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Build the dist/packages-dist directory in the same fashion as the legacy
 | 
					
						
							|  |  |  | // /build.sh script, by building the npm packages with Bazel and copying files.
 | 
					
						
							|  |  |  | // This is needed for scripts and tests which are not updated to the Bazel output
 | 
					
						
							|  |  |  | // layout (which always matches the input layout).
 | 
					
						
							|  |  |  | // Do not add new dependencies on this script, instead adapt scripts to use the
 | 
					
						
							|  |  |  | // new layout, and write new tests as Bazel targets.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Ideally integration tests should run under bazel, and just consume the npm
 | 
					
						
							|  |  |  | // packages via `deps`. Until that works, we manually build the npm packages and then
 | 
					
						
							|  |  |  | // copy the results to the appropriate `dist` location.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-18 20:54:54 +00:00
										 |  |  | // NOTE: this script may be run from any directory. The actions should be written to be independent
 | 
					
						
							|  |  |  | // of the current working directory. For example, use absolute paths wherever possible, and pass a
 | 
					
						
							|  |  |  | // working directory to tools like `yarn`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  | const {execSync} = require('child_process'); | 
					
						
							|  |  |  | const {resolve, relative} = require('path'); | 
					
						
							| 
									
										
										
										
											2019-11-18 16:33:24 +02:00
										 |  |  | const {chmod, cp, mkdir, rm, set, test} = require('shelljs'); | 
					
						
							| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | set('-e'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @type {string} The absolute path to the project root directory. */ | 
					
						
							|  |  |  | const baseDir = resolve(`${__dirname}/..`); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @type {string} The command to use for running bazel. */ | 
					
						
							| 
									
										
										
										
											2019-11-18 20:54:54 +00:00
										 |  |  | const bazelCmd = `yarn --cwd "${baseDir}" --silent bazel`; | 
					
						
							| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** @type {string} The absolute path to the bazel-bin directory. */ | 
					
						
							|  |  |  | const bazelBin = exec(`${bazelCmd} info bazel-bin`, true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @type {string} | 
					
						
							|  |  |  |  * The relative path to the entry script (i.e. the one loaded when the Node.js process launched). | 
					
						
							|  |  |  |  * It is relative to `baseDir`. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const scriptPath = relative(baseDir, require.main.filename); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							| 
									
										
										
										
											2019-11-18 20:54:54 +00:00
										 |  |  |     baseDir, bazelBin, bazelCmd, buildTargetPackages, exec, scriptPath, | 
					
						
							| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Build the packages. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param {string} destPath Path to the output directory into which we copy the npm packages. | 
					
						
							| 
									
										
										
										
											2019-11-18 20:54:54 +00:00
										 |  |  |  * This path should either be absolute or relative to the project root. | 
					
						
							| 
									
										
										
										
											2019-11-22 12:11:48 -08:00
										 |  |  |  * @param {boolean} enableIvy True, if Ivy should be used. | 
					
						
							| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  |  * @param {string} description Human-readable description of the build. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-11-22 12:11:48 -08:00
										 |  |  | function buildTargetPackages(destPath, enableIvy, description) { | 
					
						
							| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  |   console.log('##################################'); | 
					
						
							|  |  |  |   console.log(`${scriptPath}:`); | 
					
						
							|  |  |  |   console.log('  Building @angular/* npm packages'); | 
					
						
							|  |  |  |   console.log(`  Mode: ${description}`); | 
					
						
							|  |  |  |   console.log('##################################'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // List of targets to build, e.g. core, common, compiler, etc. Note that we want to also remove
 | 
					
						
							|  |  |  |   // all carriage return (`\r`) characters form the query output, because otherwise the carriage
 | 
					
						
							|  |  |  |   // return is part of the bazel target name and bazel will complain.
 | 
					
						
							| 
									
										
										
										
											2019-11-18 20:54:54 +00:00
										 |  |  |   const getTargetsCmd = | 
					
						
							| 
									
										
										
										
											2019-12-29 10:51:44 -08:00
										 |  |  |       `${bazelCmd} query --output=label "attr('tags', '\\[.*release-with-framework.*\\]', //packages/...) intersect kind('ng_package|pkg_npm', //packages/...)"`; | 
					
						
							| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  |   const targets = exec(getTargetsCmd, true).split(/\r?\n/); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Use `--config=release` so that snapshot builds get published with embedded version info.
 | 
					
						
							| 
									
										
										
										
											2019-11-22 12:11:48 -08:00
										 |  |  |   exec(`${bazelCmd} build --config=release --config=${enableIvy ? 'ivy' : 'view-engine'} ${targets.join(' ')}`); | 
					
						
							| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Create the output directory.
 | 
					
						
							| 
									
										
										
										
											2019-11-18 20:54:54 +00:00
										 |  |  |   const absDestPath = resolve(baseDir, destPath); | 
					
						
							| 
									
										
										
										
											2019-11-18 16:33:24 +02:00
										 |  |  |   if (!test('-d', absDestPath)) mkdir('-p', absDestPath); | 
					
						
							| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   targets.forEach(target => { | 
					
						
							|  |  |  |     const pkg = target.replace(/\/\/packages\/(.*):npm_package/, '$1'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Skip any that don't have an "npm_package" target.
 | 
					
						
							|  |  |  |     const srcDir = `${bazelBin}/packages/${pkg}/npm_package`; | 
					
						
							|  |  |  |     const destDir = `${absDestPath}/${pkg}`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-18 16:33:24 +02:00
										 |  |  |     if (test('-d', srcDir)) { | 
					
						
							| 
									
										
										
										
											2019-11-15 02:56:55 +02:00
										 |  |  |       console.log(`# Copy artifacts to ${destDir}`); | 
					
						
							|  |  |  |       rm('-rf', destDir); | 
					
						
							|  |  |  |       cp('-R', srcDir, destDir); | 
					
						
							|  |  |  |       chmod('-R', 'u+w', destDir); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Execute a command synchronously. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * By default, the current process' stdout is used (and thus the output is not captured and returned | 
					
						
							|  |  |  |  * to the caller). This is necessary for showing colors and modifying already printed output, for | 
					
						
							|  |  |  |  * example to show progress. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * If the caller requests the output (via `captureStdout: true`), the command is run without | 
					
						
							|  |  |  |  * printing anything to stdout and then (once the command has completed) the whole output is printed | 
					
						
							|  |  |  |  * to stdout and returned to the caller. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param {string} cmd The command to run. | 
					
						
							|  |  |  |  * @param {boolean} [captureStdout=false] Whether to return the output of the command. | 
					
						
							|  |  |  |  * @return {string | undefined} The captured stdout output if `captureStdout: true` or `undefined`. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function exec(cmd, captureStdout) { | 
					
						
							|  |  |  |   const output = execSync(cmd, { | 
					
						
							|  |  |  |     stdio: [ | 
					
						
							|  |  |  |       /* stdin  */ 'inherit', | 
					
						
							|  |  |  |       /* stdout */ captureStdout ? 'pipe' : 'inherit', | 
					
						
							|  |  |  |       /* stderr */ 'inherit', | 
					
						
							|  |  |  |     ], | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (captureStdout) { | 
					
						
							|  |  |  |     process.stdout.write(output); | 
					
						
							|  |  |  |     return output.toString().trim(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |