Files
gerrit/polygerrit-ui/app/rules.bzl
Dmitrii Filippov d97c843ccf Cleanup unused bower components and rules
All unused bower components and rules are removed. Some rules
are not removed because they are used by plugins. We should keep them
until all core plugins get rid of bower components.

Change-Id: I6e6b5a3805fd68e7e438135c9b60e9d732cb8092
2020-02-12 15:42:46 +00:00

173 lines
7.6 KiB
Python

load("//tools/bzl:genrule2.bzl", "genrule2")
load("//tools/node_tools/polygerrit_app_preprocessor:index.bzl", "prepare_for_bundling", "update_links")
load("//tools/node_tools/legacy:index.bzl", "polymer_bundler_tool")
load("@npm_bazel_rollup//:index.bzl", "rollup_bundle")
def polygerrit_bundle(name, srcs, outs, entry_point, redirects):
"""Build .zip bundle from source code
Args:
name: rule name
srcs: source files
outs: array with a single item - the output file name
entry_point: application entry-point
redirects: .json file with redirects
"""
app_name = entry_point.split(".html")[0].split("/").pop() # eg: gr-app
# Update links in all .html files according to rules in redirects.json file. All other files
# remain unchanged. After the update, all references to bower_components have been replaced with
# correct references to node_modules.
# The output of this rule is a directory, which mirrors the directory layout of srcs files.
update_links(
name = app_name + "-updated-links",
srcs = srcs,
redirects = redirects,
)
# Note: prepare_for_bundling and polymer_bundler_tool will be removed after switch to
# ES6 modules.
# Polymer 3 uses ES modules; gerrit still use HTML imports and polymer-bridges. In such
# conditions, polymer-bundler/crisper and polymer-cli tools crash without an error or complains
# about non-existing syntax error in .js code. But even if they works with some config, the
# output result is not correct. At the same time, polymer-bundler/crisper work well if input
# files are HTML and js without javascript modules.
#
# Polygerrit's code follows simple rules, so it is quite easy to preprocess code in a way, that
# it can be consumed by polymer-bundler/crisper tool. Rules do the following:
# 1) prepare_for_bundling - update srcs by moving all scripts out of HTML files.
# For each HTML file it creates file.html_gen.js file in the same directory and put all
# scripts there in the same order, as script tags appear in HTML file.
# - Inline javascript is copied as is;
# - <script src = "path/to/file.js" > adds to .js file as
# import 'path/to/file.js'
# statement. Such import statement run all side-effects in file.js (i.e. it run all global
# code).
# - <link rel="import" href = "path/to/file.html"> adds to .js file as
# import 'path/to/file.html.js' - i.e. instead of html, the .js script imports another
# generated js file ('path/to/file.html_gen.js').
# Because output JS keeps the order of imports, all global variables are initialized in a
# correct order (this is important for gerrit; it is impossible to use AMD modules here).
# Then, all scripts are removed from HTML file.
# Output of this rule - directory with updated HTML and JS files; all other files are copied
# to the output directory without changes.
# 2) rollup_bundle - combines all .js files from the previous step into one bundle.
# 3) polymer_bundler_tool -
# a) run polymer-bundle tool on HTML files (i.e. on output from the first step). Because
# these files don't contain scripts anymore, it just combine all HTML/CSS files in one file
# (by following HTML imports).
# b) run crisper to add script tag at the end of generated HTML
#
# Output of the rule is 2 file: HTML bundle and JS bundle and HTML file loads JS file with
# <script src="..."> tag.
prepare_for_bundling(
name = app_name + "-prebundling-srcs",
srcs = [
app_name + "-updated-links",
],
additional_node_modules_to_preprocess = [
"@ui_npm//polymer-bridges",
],
entry_point = entry_point,
node_modules = [
"@ui_npm//:node_modules",
],
root_path = "polygerrit-ui/app/" + app_name + "-updated-links/polygerrit-ui/app",
)
native.filegroup(
name = app_name + "-prebundling-srcs-js",
srcs = [app_name + "-prebundling-srcs"],
output_group = "js",
)
native.filegroup(
name = app_name + "-prebundling-srcs-html",
srcs = [app_name + "-prebundling-srcs"],
output_group = "html",
)
rollup_bundle(
name = app_name + "-bundle-js",
srcs = [app_name + "-prebundling-srcs-js"],
config_file = ":rollup.config.js",
entry_point = app_name + "-prebundling-srcs/entry.js",
rollup_bin = "//tools/node_tools:rollup-bin",
sourcemap = "hidden",
deps = [
"@tools_npm//rollup-plugin-node-resolve",
],
)
polymer_bundler_tool(
name = app_name + "-bundle-html",
srcs = [app_name + "-prebundling-srcs-html"],
entry_point = app_name + "-prebundling-srcs/entry.html",
script_src_value = app_name + ".js",
)
native.filegroup(
name = name + "_app_sources",
srcs = [
app_name + "-bundle-js.js",
app_name + "-bundle-html.html",
],
)
native.filegroup(
name = name + "_css_sources",
srcs = native.glob(["styles/**/*.css"]),
)
native.filegroup(
name = name + "_theme_sources",
srcs = native.glob(
["styles/themes/*.html"],
# app-theme.html already included via an import in gr-app.html.
exclude = ["styles/themes/app-theme.html"],
),
)
native.filegroup(
name = name + "_top_sources",
srcs = [
"favicon.ico",
],
)
# Preserve bower_components directory in the final directory layout to
# avoid plugins break
genrule2(
name = name,
srcs = [
name + "_app_sources",
name + "_css_sources",
name + "_theme_sources",
name + "_top_sources",
"//lib/fonts:robotofonts",
"//lib/js:highlightjs__files",
"@ui_npm//:node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js",
"@ui_npm//@polymer/font-roboto-local",
"@ui_npm//:node_modules/@polymer/font-roboto-local/package.json",
],
outs = outs,
cmd = " && ".join([
"FONT_DIR=$$(dirname $(location @ui_npm//:node_modules/@polymer/font-roboto-local/package.json))/fonts",
"mkdir -p $$TMP/polygerrit_ui/{styles/themes,fonts/{roboto,robotomono},bower_components/{highlightjs,webcomponentsjs},elements}",
"for f in $(locations " + name + "_app_sources); do ext=$${f##*.}; cp -p $$f $$TMP/polygerrit_ui/elements/" + app_name + ".$$ext; done",
"cp $(locations //lib/fonts:robotofonts) $$TMP/polygerrit_ui/fonts/",
"for f in $(locations " + name + "_top_sources); do cp $$f $$TMP/polygerrit_ui/; done",
"for f in $(locations " + name + "_css_sources); do cp $$f $$TMP/polygerrit_ui/styles; done",
"for f in $(locations " + name + "_theme_sources); do cp $$f $$TMP/polygerrit_ui/styles/themes; done",
"for f in $(locations //lib/js:highlightjs__files); do cp $$f $$TMP/polygerrit_ui/bower_components/highlightjs/ ; done",
"cp $(location @ui_npm//:node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js) $$TMP/polygerrit_ui/bower_components/webcomponentsjs/webcomponents-lite.js",
"cp $$FONT_DIR/roboto/*.ttf $$TMP/polygerrit_ui/fonts/roboto/",
"cp $$FONT_DIR/robotomono/*.ttf $$TMP/polygerrit_ui/fonts/robotomono/",
"cd $$TMP",
"find . -exec touch -t 198001010000 '{}' ';'",
"zip -qr $$ROOT/$@ *",
]),
)