First of, if you're reading this: thank you! Even considering contributing to Compiler Explorer is very much appreciated! Before we go too far, an apology: Compiler Explorer grew out of a bit of hacky JavaScript into a pretty large and well-used project pretty quickly. Not all the code was originally well-written or well-tested. Please be forgiving of that, and be ready to help in improving that.
Compiler Explorer follows a Code of Conduct which aims to foster an open and welcoming environment.
Compiler Explorer targets the latest Node.js LTS, so it's better if you do so as well when testing your changes locally.
Nonetheless, it should run in everything post-Node.js 8. Contact us if this is not the case for you.
- Make your changes, trying to stick to the style and format where possible.
- We use ESLint to ensure a consistent code base and PRs won't pass unless it detects no errors.
- Running
make lint
will run the linter, which will auto-fix everything it can and report back any errors and warnings.
- If adding a new server-side component please do your best to add a test to cover it. For client-side changes that's trickier.
- Run the git hooks installer (Only needed once):
make install-git-hooks
. This will automatically run the tests before you can commit, ensuring that they pass before committing your changes. You can disable this check withgit commit --no-verify
if needed. - You can run
make check
to run both the linter and the code tests - Do a smoke test:
Run
make
and ensure the site works as you'd expect. Concentrate on the areas you'd expect to have changed, but if you can, click about generally to help check you haven't unintentionally broken something else - Submit a Pull Request.
If you have any questions, don't hesitate: Contact us.
Code is separated into server-side code and client-side code.
All dependencies (server and client side) are installed via package.json
.
Server code is in app.js
and in the lib
directory.
Client code is all in the static
directory.
In the server code, the app.js
sets up a basic express
middleware-driven web server, delegating to the various compiler backends in
lib/compilers/
. All of them inherit from lib/base-compiler.js
which does
most of the work of running compilers, then parsing the output and forming a
JSON object to send to the client. Any assembly parsing is done in the
lib/asm-parser.js
, and similar, files.
In the client code, GoldenLayout is used as
the container. If you look at some of the components like the
static/compiler.js
, you'll see the general flow.
Any state stored makes it into the URL, so be careful not to stash
anything too big in there.
The client code follows GoldenLayout's message-based system: no component has a reference to any other and everything is done via messages. This will allow us to use pop-out windows, if we ever need to, as the messages are JSON-serializable between separate windows.
The recommended way to work on Compiler Explorer is to just run make dev
and let the automatic reloading do its magic.
Any changes to the server code will cause the server to reload, and any changes
to the client code will be reflected upon a page reload.
This makes for a pretty quick turnaround.
Note that a current issue makes every project media asset to be locally
unavailable. We will hopefully fix this in the near future.
- Stick to ES5 (no
let
or arrow operators) in the client-side code. Sadly there are still enough users out there on old browsers, but feel free to use all the cool stuff on the server side code. - Be aware that Compiler Explorer runs on a cluster on the live site. No local state is kept between invocations, and the user's next request will likely hit a different node in the cluster, so don't rely on any in-memory state.