55 lines
1.8 KiB
Markdown
55 lines
1.8 KiB
Markdown
Contributing
|
|
============
|
|
|
|
## Testing
|
|
|
|
All features and bugs should have tests that verify the fix. You can run all
|
|
tests using `npm test`.
|
|
|
|
The most common type of test are tests that verify input and output of the
|
|
Uglify transforms. These tests exist in `test/compress`. New tests can be added
|
|
either to an existing file or in a new file `issue-xxx.js`.
|
|
|
|
Tests that cannot be expressed as a simple AST can be found in `test/mocha`.
|
|
|
|
## Code style
|
|
|
|
- `LF` is always used as a line ending.
|
|
- Statements end with semicolons.
|
|
- Indentation uses 4 spaces, switch `case` 2 spaces.
|
|
- Identifiers use `snake_case`.
|
|
- Strings use double quotes (`"`).
|
|
- The Uglify code only uses ES5, even in the `harmony` branch.
|
|
- Line length should be at most 80 cols, except when it is easier to read a
|
|
longer line.
|
|
- If both sides of a comparison are of the same type, `==` and `!=` are used.
|
|
- Multiline conditions place `&&` and `||` first on the line.
|
|
|
|
Example:
|
|
|
|
```js
|
|
if (compressor.option("comparisons")) switch (self.operator) {
|
|
case "==":
|
|
case "!=":
|
|
// void 0 == x => null == x
|
|
if (!is_strict_comparison && is_undefined(self.left, compressor)) {
|
|
self.left = make_node(AST_Null, self.left);
|
|
}
|
|
// "undefined" == typeof x => undefined === x
|
|
else if (compressor.option("typeofs")
|
|
&& self.left instanceof AST_String
|
|
&& self.left.value == "undefined"
|
|
&& self.right instanceof AST_UnaryPrefix
|
|
&& self.right.operator == "typeof") {
|
|
var expr = self.right.expression;
|
|
if (expr instanceof AST_SymbolRef ? expr.is_declared(compressor)
|
|
: !(expr instanceof AST_PropAccess && compressor.option("ie8"))) {
|
|
self.right = expr;
|
|
self.left = make_node(AST_Undefined, self.left).optimize(compressor);
|
|
if (self.operator.length == 2) self.operator += "=";
|
|
}
|
|
}
|
|
...
|
|
}
|
|
```
|