# Gerrit Polymer Frontend Follow the [setup instructions for Gerrit backend developers](https://gerrit-review.googlesource.com/Documentation/dev-readme.html) where applicable, the most important command is: ``` git clone --recurse-submodules https://gerrit.googlesource.com/gerrit ``` The --recurse-submodules option is needed on git clone to ensure that the core plugins, which are included as git submodules, are also cloned. ## Installing [Bazel](https://bazel.build/) Follow the instructions [here](https://gerrit-review.googlesource.com/Documentation/dev-bazel.html#_installation) to get and install Bazel. ## Installing [Node.js](https://nodejs.org/en/download/) and npm packages **Note**: Switch between an old branch with bower_components and a new branch with ui-npm packages (or vice versa) can lead to some build errors. To avoid such errors clean up the build repository: ```sh rm -rf node_modules/ \ polygerrit-ui/node_modules/ \ polygerrit-ui/app/node_modules \ tools/node_tools/node_modules bazel clean ``` If it doesn't help also try to run ```sh bazel clean --expunge ``` The minimum nodejs version supported is 8.x+ ```sh # Debian experimental sudo apt-get install nodejs sudo apt-get install npm # OS X with Homebrew brew install node brew install npm ``` All other platforms: [download from nodejs.org](https://nodejs.org/en/download/). or use [nvm - Node Version Manager](https://github.com/nvm-sh/nvm). ### Additional packages We have several bazel commands to install packages we may need for FE development. For first time users to get the local server up, `npm start` should be enough and will take care of all of them for you. ```sh # Install packages from root-level packages.json bazel fetch @npm//:node_modules # Install packages from polygerrit-ui/app/packages.json bazel fetch @ui_npm//:node_modules # Install packages from polygerrit-ui/packages.json bazel fetch @ui_dev_npm//:node_modules # Install packages from tools/node_tools/packages.json bazel fetch @tools_npm//:node_modules ``` More information for installing and using nodejs rules can be found here https://bazelbuild.github.io/rules_nodejs/install.html ### Upgrade to @bazel-scoped packages It might be necessary to run this command to upgrade to major `rules_nodejs` release: ```sh yarn remove @bazel/... ``` ## Setup typescript support in the IDE Modern IDE should automatically handle typescript settings from the `pollygerrit-ui/app/tsconfig.json` files. IDE places compiled files in the `.ts-out/pg` directory at the root of gerrit workspace and you can configure IDE to exclude the whole .ts-out directory. To do it in the IntelliJ IDEA click on this directory and select "Mark Directory As > Excluded" in the context menu. However, if you receive some errors from IDE, you can try to configure IDE manually. For example, if IntelliJ IDEA shows `Cannot find parent 'tsconfig.json'` error, you can try to setup typescript options `--project polygerrit-ui/app/tsconfig.json` in the IDE settings. ## Serving files locally #### Go server To test the local Polymer frontend against production data or a local test site execute: ```sh ./polygerrit-ui/run-server.sh // or npm run start ``` These commands start the [simple hand-written Go webserver](https://gerrit.googlesource.com/gerrit/+/master/polygerrit-ui/server.go). Mostly it just switches between serving files locally and proxying the real server based on the file name. It also does some basic response rewriting, e.g. it patches the `config/server/info` response with plugin information provided on the command line: ```sh ./polygerrit-ui/run-server.sh --plugins=plugins/my_plugin/static/my_plugin.js,plugins/my_plugin/static/my_plugin.html ``` If any issues occured, please refer to the Troubleshooting section at the bottom or contact the team! ## Running locally against production data ### Local website Start [Go server](#go-server) and then visit http://localhost:8081 The biggest draw back of this method is that you cannot log in, so cannot test scenarios that require it. #### Chrome extension: Gerrit FE Dev Helper To be able to bypass the auth and also help improve the productivity of Gerrit FE developers, we created this chrome extension: [Gerrit FE Dev Helper](https://chrome.google.com/webstore/detail/gerrit-fe-dev-helper/jimgomcnodkialnpmienbomamgomglkd). It basically works as a proxy that will block / redirect requests from current sites to any given url base on certain rules. The source code is in [Gerrit - gerrit-fe-dev-helper](https://gerrit-review.googlesource.com/q/project:gerrit-fe-dev-helper), contributions are welcomed! To use this extension, just follow its [readme here](https://gerrit.googlesource.com/gerrit-fe-dev-helper/+/master/README.md). ## Running locally against a Gerrit test site Set up a local test site once: 1. [Build Gerrit](https://gerrit-review.googlesource.com/Documentation/dev-bazel.html#_gerrit_development_war_file) 2. [Set up a local test site](https://gerrit-review.googlesource.com/Documentation/dev-readme.html#init). 3. Optionally [populate](https://gerrit.googlesource.com/gerrit/+/master/contrib/populate-fixture-data.py) your test site with some test data. For running a locally built Gerrit war against your test instance use [this command](https://gerrit-review.googlesource.com/Documentation/dev-readme.html#run_daemon). If you want to serve the Polymer frontend directly from the sources in `polygerrit_ui/app/` instead of from the war: 1. Start [Go server](#go-server) 2. Add the `--dev-cdn` option: ```sh $(bazel info output_base)/external/local_jdk/bin/java \ -DsourceRoot=$(bazel info workspace) \ -jar bazel-bin/gerrit.war daemon \ -d $GERRIT_SITE \ --console-log \ --dev-cdn http://localhost:8081 ``` *NOTE* You can use any other cdn here, for example: https://cdn.googlesource.com/polygerrit_ui/678.0 ## Running Tests For daily development you typically only want to run and debug individual tests. There are several ways to run tests. * Run all tests in headless mode (exactly like CI does): ```sh npm run test ``` This command uses bazel rules for running frontend tests. Bazel fetches all nessecary dependencies and runs all required rules. * Run all tests in debug mode (the command opens Chrome browser with the default Karma page; you should click the "Debug" button to start testing): ```sh # The following command doesn't compile code before tests npm run test:debug ``` * Run a single test file: ``` # Headless mode (doesn't compile code before run) npm run test:single async-foreach-behavior_test.js # Debug mode (doesn't compile code before run) npm run test:debug async-foreach-behavior_test.js ``` When converting a test file to typescript, the command for running tests is still using the .js suffix and not the new .ts suffix. Commands `test:debug` and `test:single` assumes that compiled code is located in the `./ts-out/polygerrit-ui/app` directory. It's up to you how to achieve it. For example, the following options are possible: * You can configure IDE for recompiling source code on changes * You can use `compile:local` command for running compiler once and `compile:watch` for running compiler in watch mode (`compile:...` places compile code exactly in the `./ts-out/polygerrit-ui/app` directory) ```sh # Compile frontend once and run tests from a file: npm run compile:local && npm run test:single async-foreach-behavior_test.js # Watch mode: ## Terminal 1: npm run compile:watch ## Terminal 2: npm run test:debug async-foreach-behavior_test.js ``` * You can run tests in IDE. : - [IntelliJ: running unit tests on Karma](https://www.jetbrains.com/help/idea/running-unit-tests-on-karma.html#ws_karma_running) - You should configure IDE to compile typescript before running tests. **NOTE**: Bazel plugin for IntelliJ has a bug - it recompiles typescript project only if .ts and/or .d.ts files have been changed. If only .js files were changed, the plugin doesn't run compiler. As a workaround, setup "Run npm script 'compile:local" action instead of the "Compile Typescript" in the "Before launch" section for IntelliJ. This is a temporary problem until typescript migration is complete. ## Style guide We follow the [Google JavaScript Style Guide](https://google.github.io/styleguide/javascriptguide.xml) with a few exceptions. When in doubt, remain consistent with the code around you. In addition, we encourage the use of [ESLint](http://eslint.org/). It is available as a command line utility, as well as a plugin for most editors and IDEs. `eslint-config-google` is a port of the Google JS Style Guide to an ESLint config module, and `eslint-plugin-html` allows ESLint to lint scripts inside HTML. We have an .eslintrc.json config file in the polygerrit-ui/ directory configured to enforce the preferred style of the PolyGerrit project. After installing, you can use `eslint` on any new file you create. In addition, you can supply the `--fix` flag to apply some suggested fixes for simple style issues. If you modify JS inside of `