| 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/$@ *", |
| ]), |
| ) |