The legacy nodejs rules rollup_bundle is now deprecated and will be removed in the nodejs rules 1.0 release due in mid-November. This PR brings in the rules_nodejs internal API deps that ng_rollup_bundle, ng_package and ls_rollup_bundle depend on into this repo to break the dependency. In the future these rules should switch to use the new rollup_bundle via a macro as done in https://github.com/angular/angular/pull/33329 but this is not possible right now due to the complication of having esm5 re-rooted ts_library dependencies. The es6 sources now have .mjs extensions so they no longer need to be re-rooted to `{package}.es6`. This eliminates the need for the collect_es6_sources() function. Note: repo has been updated to the newest working version of rollup which is 1.25.2. There is some regression in 1.26.0 which causes the following bundling failure: ``` ERROR: /Users/greg/google/angular/packages/localize/BUILD.bazel:20:1: Optimizing JavaScript packages/localize/localize.umd.min.js [terser] failed (Exit 1) terser.sh failed: error executing command bazel-out/host/bin/external/npm/terser/bin/terser.sh bazel-out/darwin-fastbuild/bin/packages/localize/localize.umd.js --output bazel-out/darwin-fastbuild/bin/packages/localize/localize.umd.min.js ... (remaining 5 argument(s) skipped) Use --sandbox_debug to see verbose messages from the sandbox Parse error at packages/localize/localize.umd.js:491,4 export * from './src/constants'; ^ ERROR: Export statement may only appear at top level at js_error (/private/var/tmp/_bazel_greg/5e8f8a9cd1c6fbc1afd11e37ee1fe2e5/sandbox/darwin-sandbox/79/execroot/angular/bazel-out/host/bin/external/npm/terser/bin/terser.sh.runfiles/npm/node_modules/terser/lib/parse.js:357:11) at Dn.visit (/private/var/tmp/_bazel_greg/5e8f8a9cd1c6fbc1afd11e37ee1fe2e5/sandbox/darwin-sandbox/79/execroot/angular/bazel-out/host/bin/external/npm/terser/bin/terser.sh.runfiles/npm/node_modules/terser/lib/scope.js:347:13) at Dn._visit (/private/var/tmp/_bazel_greg/5e8f8a9cd1c6fbc1afd11e37ee1fe2e5/sandbox/darwin-sandbox/79/execroot/angular/bazel-out/host/bin/external/npm/terser/bin/terser.sh.runfiles/npm/node_modules/terser/lib/ast.js:1207:24) at AST_Export._walk (/private/var/tmp/_bazel_greg/5e8f8a9cd1c6fbc1afd11e37ee1fe2e5/sandbox/darwin-sandbox/79/execroot/angular/bazel-out/host/bin/external/npm/terser/bin/terser.sh.runfiles/npm/node_modules/terser/lib/ast.js:718:17) at walk_body (/private/var/tmp/_bazel_greg/5e8f8a9cd1c6fbc1afd11e37ee1fe2e5/sandbox/darwin-sandbox/79/execroot/angular/bazel-out/host/bin/external/npm/terser/bin/terser.sh.runfiles/npm/node_modules/terser/lib/ast.js:168:17) at AST_Function.call (/private/var/tmp/_bazel_greg/5e8f8a9cd1c6fbc1afd11e37ee1fe2e5/sandbox/darwin-sandbox/79/execroot/angular/bazel-out/host/bin/external/npm/terser/bin/terser.sh.runfiles/npm/node_modules/terser/lib/ast.js:430:13) at descend (/private/var/tmp/_bazel_greg/5e8f8a9cd1c6fbc1afd11e37ee1fe2e5/sandbox/darwin-sandbox/79/execroot/angular/bazel-out/host/bin/external/npm/terser/bin/terser.sh.runfiles/npm/node_modules/terser/lib/ast.js:1208:21) at Dn.visit (/private/var/tmp/_bazel_greg/5e8f8a9cd1c6fbc1afd11e37ee1fe2e5/sandbox/darwin-sandbox/79/execroot/angular/bazel-out/host/bin/external/npm/terser/bin/terser.sh.runfiles/npm/node_modules/terser/lib/scope.js:256:13) at Dn._visit (/private/var/tmp/_bazel_greg/5e8f8a9cd1c6fbc1afd11e37ee1fe2e5/sandbox/darwin-sandbox/79/execroot/angular/bazel-out/host/bin/external/npm/terser/bin/terser.sh.runfiles/npm/node_modules/terser/lib/ast.js:1207:24) at AST_Function._walk (/private/var/tmp/_bazel_greg/5e8f8a9cd1c6fbc1afd11e37ee1fe2e5/sandbox/darwin-sandbox/79/execroot/angular/bazel-out/host/bin/external/npm/terser/bin/terser.sh.runfiles/npm/node_modules/terser/lib/ast.js:424:24) [Function] Target //packages/localize:npm_package failed to build Use --verbose_failures to see the command lines of failed build steps. ERROR: /Users/greg/google/angular/packages/localize/BUILD.bazel:20:1 Optimizing JavaScript packages/localize/localize.umd.min.js [terser] failed (Exit 1) terser.sh failed: error executing command bazel-out/host/bin/external/npm/terser/bin/terser.sh bazel-out/darwin-fastbuild/bin/packages/localize/localize.umd.js --output bazel-out/darwin-fastbuild/bin/packages/localize/localize.umd.min.js ... (remaining 5 argument(s) skipped) ``` Will leave that for another day. Terser also updated to 4.3.3. Updating to 4.3.4 (https://github.com/terser/terser/blob/master/CHANGELOG.md) turns comments preservation on by default which increases the size of the //packages/core/test/bundling/todo:bundle.min.js in CI. After bazelbuild/rules_nodejs#1317 terser can be updated to the latest as passing —comments /a^/ to args can turn off all comments for the //packages/core/test/bundling/todo:bundle.min.js size test. PR Close #33201
183 lines
5.9 KiB
JavaScript
183 lines
5.9 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
|
|
*/
|
|
// Rollup configuration
|
|
// GENERATED BY Bazel
|
|
|
|
const buildOptimizer = require(
|
|
'npm/node_modules/@angular-devkit/build-optimizer/src/build-optimizer/rollup-plugin.js');
|
|
const nodeResolve = require('rollup-plugin-node-resolve');
|
|
const sourcemaps = require('rollup-plugin-sourcemaps');
|
|
const commonjs = require('rollup-plugin-commonjs');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
|
|
function log_verbose(...m) {
|
|
// This is a template file so we use __filename to output the actual filename
|
|
if (!!process.env['VERBOSE_LOGS']) console.error(`[${path.basename(__filename)}]`, ...m);
|
|
}
|
|
|
|
const workspaceName = 'TMPL_workspace_name';
|
|
const useBuildOptimzier = TMPL_build_optimizer;
|
|
const rootDir = 'TMPL_root_dir';
|
|
const bannerFile = TMPL_banner_file;
|
|
const stampData = TMPL_stamp_data;
|
|
const moduleMappings = TMPL_module_mappings;
|
|
const nodeModulesRoot = 'TMPL_node_modules_root';
|
|
|
|
log_verbose(`running with
|
|
cwd: ${process.cwd()}
|
|
workspaceName: ${workspaceName}
|
|
useBuildOptimzier: ${useBuildOptimzier}
|
|
rootDir: ${rootDir}
|
|
bannerFile: ${bannerFile}
|
|
stampData: ${stampData}
|
|
moduleMappings: ${JSON.stringify(moduleMappings)}
|
|
nodeModulesRoot: ${nodeModulesRoot}
|
|
`);
|
|
|
|
function fileExists(filePath) {
|
|
try {
|
|
return fs.statSync(filePath).isFile();
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// This resolver mimics the TypeScript Path Mapping feature, which lets us resolve
|
|
// modules based on a mapping of short names to paths.
|
|
function resolveBazel(
|
|
importee, importer, baseDir = process.cwd(), resolve = require.resolve, root = rootDir) {
|
|
log_verbose(`resolving '${importee}' from ${importer}`);
|
|
|
|
function resolveInRootDir(importee) {
|
|
var candidate = path.join(baseDir, root, importee);
|
|
log_verbose(`try to resolve '${importee}' at '${candidate}'`);
|
|
try {
|
|
var result = resolve(candidate);
|
|
return result;
|
|
} catch (e) {
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
// Since mappings are always in POSIX paths, when comparing the importee to mappings
|
|
// we should normalize the importee.
|
|
// Having it normalized is also useful to determine relative paths.
|
|
const normalizedImportee = importee.replace(/\\/g, '/');
|
|
|
|
// If import is fully qualified then resolve it directly
|
|
if (fileExists(importee)) {
|
|
log_verbose(`resolved fully qualified '${importee}'`);
|
|
return importee;
|
|
}
|
|
|
|
var resolved;
|
|
if (normalizedImportee.startsWith('./') || normalizedImportee.startsWith('../')) {
|
|
// relative import
|
|
if (importer) {
|
|
let importerRootRelative = path.dirname(importer);
|
|
const relative = path.relative(path.join(baseDir, root), importerRootRelative);
|
|
if (!relative.startsWith('.')) {
|
|
importerRootRelative = relative;
|
|
}
|
|
resolved = path.join(importerRootRelative, importee);
|
|
} else {
|
|
throw new Error('cannot resolve relative paths without an importer');
|
|
}
|
|
if (resolved) resolved = resolveInRootDir(resolved);
|
|
}
|
|
|
|
if (!resolved) {
|
|
// possible workspace import or external import if importee matches a module
|
|
// mapping
|
|
for (const k in moduleMappings) {
|
|
if (normalizedImportee == k || normalizedImportee.startsWith(k + '/')) {
|
|
// replace the root module name on a mappings match
|
|
// note that the module_root attribute is intended to be used for type-checking
|
|
// so it uses eg. "index.d.ts". At runtime, we have only index.js, so we strip the
|
|
// .d.ts suffix and let node require.resolve do its thing.
|
|
var v = moduleMappings[k].replace(/\.d\.ts$/, '');
|
|
const mappedImportee = path.join(v, normalizedImportee.slice(k.length + 1));
|
|
log_verbose(`module mapped '${importee}' to '${mappedImportee}'`);
|
|
resolved = resolveInRootDir(mappedImportee);
|
|
if (resolved) break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!resolved) {
|
|
// workspace import
|
|
const userWorkspacePath = path.relative(workspaceName, importee);
|
|
resolved = resolveInRootDir(userWorkspacePath.startsWith('..') ? importee : userWorkspacePath);
|
|
}
|
|
|
|
if (resolved) {
|
|
log_verbose(`resolved to ${resolved}`);
|
|
} else {
|
|
log_verbose(`allowing rollup to resolve '${importee}' with node module resolution`);
|
|
}
|
|
|
|
return resolved;
|
|
}
|
|
|
|
let plugins = [
|
|
{
|
|
name: 'resolveBazel',
|
|
resolveId: resolveBazel,
|
|
},
|
|
nodeResolve({
|
|
// We make mainFields match what was the default for plugin-node-resolve <4.2.0
|
|
// when mainFields was introduced. Resolving to 'browser' or 'es2015' first breaks
|
|
// some of the benchmarks such as `//modules/benchmarks/src/expanding_rows:perf_chromium-local`.
|
|
// See https://app.circleci.com/jobs/github/angular/angular/507444 &&
|
|
// https://app.circleci.com/jobs/github/angular/angular/507442 for affected tests.
|
|
mainFields: ['module', 'main'],
|
|
jail: process.cwd(),
|
|
customResolveOptions: {moduleDirectory: nodeModulesRoot}
|
|
}),
|
|
commonjs({ignoreGlobal: true}),
|
|
sourcemaps(),
|
|
];
|
|
|
|
if (useBuildOptimzier) {
|
|
plugins = [
|
|
buildOptimizer.default({
|
|
sideEffectFreeModules: [
|
|
'.esm5/packages/core/src',
|
|
'.esm5/packages/common/src',
|
|
'.esm5/packages/compiler/src',
|
|
'.esm5/packages/platform-browser/src',
|
|
]
|
|
}),
|
|
].concat(plugins);
|
|
}
|
|
|
|
let banner = '';
|
|
if (bannerFile) {
|
|
banner = fs.readFileSync(bannerFile, {encoding: 'utf-8'});
|
|
if (stampData) {
|
|
const versionTag = fs.readFileSync(stampData, {encoding: 'utf-8'})
|
|
.split('\n')
|
|
.find(s => s.startsWith('BUILD_SCM_VERSION'));
|
|
// Don't assume BUILD_SCM_VERSION exists
|
|
if (versionTag) {
|
|
const version = versionTag.split(' ')[1].trim();
|
|
banner = banner.replace(/0.0.0-PLACEHOLDER/, version);
|
|
}
|
|
}
|
|
}
|
|
|
|
const config = {
|
|
plugins,
|
|
output: {
|
|
banner,
|
|
}
|
|
};
|
|
|
|
module.exports = config;
|