Contributing to the PS client
=============================

ES2018
------

The client has a weird smattering of constraints:

- Replays are intended to support IE7 and later
- The rest of the client is intended to support IE9, Safari 5, and later

This means that our target is ES3 - even outside of replays, things like `{return: 1}` instead of `{"return": 1}` are not allowed.

This is very restrictive for 2018, but fortunately, with Babel 7 and polyfills, we can still write idiomatic ES2018. There are just a few things to watch out for:

- no `Map`s and `Set`s - these can technically be polyfilled, but it's better just to use Objects directly. `Object.create(null)` is available if you need it.
- no `async`/`await` - there's no way to compile them into ES3 - `Promise`s are okay, though
- no generators or iterables other than `Array` - they either have tons of overhead or are outright unsupported, and this lets us use `for`-`of` on arrays with zero overhead

We have polyfills for:
- `Array#includes` - Note: won't be able to find `NaN`s
- `Array.isArray`
- `String#startsWith`
- `String#endsWith`
- `String#includes`
- `String#trim`
- `Object.assign`
- `Object.create` - Note: second argument is unsupported

These polyfills are optimized for speed, not spec-compliance. As long as you don't write very nonstandard code, you won't have a problem.

`Array#includes` is put directly on the `Array` prototype, so you can't use `for-in` on Arrays. Fortunately, TypeScript will complain if you try.
