Repository: unexpectedjs/unexpected
Pull request #529 (2018-10-27 18:54:25)

Upgrade eslint to version 5.8.0




We've upgraded a dependency and got test failures.

| name | version specification  | new version |
| --- | --- | --- |
| eslint | ^4.17.0 | 5.8.0 |



It looks like this version isn't compatible with your project right now. Please take a look at the exact failure to figure out if this is something you need to work on.

### What changed?


#### ✳️ eslint ( → 5.8.0) · [Repo](https://github.com/eslint/eslint) · [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)

<details>
<summary>Release Notes</summary>
<h4><a href="https://github.com/eslint/eslint/releases/tag/v5.8.0">5.8.0</a></h4>

<ul>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/9152417682371c134f831dfa23100da8782865d1"><tt>9152417</tt></a> Fix: deprecation warning in RuleTester using Node v11 (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/11009">#11009</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/e349a03caee9c7bffee1817f83151f36cb3d0065"><tt>e349a03</tt></a> Docs: Update issue templates to ask for PRs (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/11012">#11012</a>) (Nicholas C. Zakas)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/3d88b388aaa90f6053971b6073809e481f1ff457"><tt>3d88b38</tt></a> Chore: avoid using legacy report API in no-irregular-whitespace (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/11013">#11013</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/5a31a922600a0ca373cc18b182cafd6cd0bcefce"><tt>5a31a92</tt></a> Build: compile espree's deps to ES5 when generating site (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/11014">#11014</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/11015">#11015</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/3943635e10c6cf47d3268c91baf9e24c07401af9"><tt>3943635</tt></a> Update: Create Linter.version API (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/9271">#9271</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/11010">#11010</a>) (Nicholas C. Zakas)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/a940cf4e88760e74343f92c4f14f53aea146a494"><tt>a940cf4</tt></a> Docs: Mention version for config glob patterns (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/8793">#8793</a>) (Nicholas C. Zakas)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/6e1c5306c4bd63fd05ab08aed26449b04f1b37f7"><tt>6e1c530</tt></a> Build: run tests on Node 11 (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/11008">#11008</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/58ff359412368f1308b04575337965c6629a293d"><tt>58ff359</tt></a> Docs: add instructions for npm 2FA (refs <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10631">#10631</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10992">#10992</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/2f87bb3b46a85c84e0bee52686daa0a47cf7ab32"><tt>2f87bb3</tt></a> Upgrade: eslint-release@1.0.0 (refs <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10631">#10631</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10991">#10991</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/57ef0fdbfc7e9e976926e0632fa476a73b700d9d"><tt>57ef0fd</tt></a> Fix: prefer-const when using destructuring assign (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/8308">#8308</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10924">#10924</a>) (Nicholas C. Zakas)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/577cbf167c57de99fde4d3dbf856d9ca8850feb7"><tt>577cbf1</tt></a> Chore: Add typescript-specific edge case tests to space-infix-ops (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10986">#10986</a>) (Bence Dányi)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/d45b184df23a2bbb00b9c1249cc4904235ebe5f7"><tt>d45b184</tt></a> Chore: Using deconstruction assignment for shelljs (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10974">#10974</a>) (ZYSzys)</li>
</ul>
<h4><a href="https://github.com/eslint/eslint/releases/tag/v5.7.0">5.7.0</a></h4>

<ul>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/6cb63fd06658740bfb3d0aa007f41fbb28d0ac6f"><tt>6cb63fd</tt></a> Update: Add iife to padding-line-between-statements (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10853">#10853</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10916">#10916</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/5fd1bdab1183ba06f3b098e5d60b333c94f5ad2b"><tt>5fd1bda</tt></a> Update: no-tabs allowIndentationTabs option (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10256">#10256</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10925">#10925</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/d12be6944f4b1c889bdbdf716eb5713594204b4c"><tt>d12be69</tt></a> Fix: no-extra-bind No autofix if arg may have side effect (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10846">#10846</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10918">#10918</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/847372f7719c294aa78b0666142789d738d2c6a8"><tt>847372f</tt></a> Fix: no-unused-vars false pos. with markVariableAsUsed (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10952">#10952</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10954">#10954</a>) (Roy Sutton)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/4132de726801a96bf11df665c7bb14c4c4901a84"><tt>4132de7</tt></a> Chore: Simplify space-infix-ops (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10935">#10935</a>) (Bence Dányi)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/543edfa89e04ec76b2f68f4d9d11084d91af2bba"><tt>543edfa</tt></a> Fix: Fix error with one-var (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10937">#10937</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10938">#10938</a>) (Justin Krup)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/95c4cb18872eadd552c5ddb400f5a2da8df1e992"><tt>95c4cb1</tt></a> Docs: Fix typo for no-unsafe-finally (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10945">#10945</a>) (Sergio Santoro)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/5fe0e1a9fccaaf5c7c883ca2c9cea12fae0fcd1f"><tt>5fe0e1a</tt></a> Fix: no-invalid-regexp disallows \ at end of pattern (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10861">#10861</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10920">#10920</a>) (Toru Nagashima)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/f85547a961800ba568c9b52c90060b2006c00c84"><tt>f85547a</tt></a> Docs: Add 'When Not To Use' section to space-infix-ops (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10931">#10931</a>) (Bence Dányi)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/3dccac45f64bb225dcebae2b5eab88df2fae2f84"><tt>3dccac4</tt></a> Docs: Update working-with-parsers link (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10929">#10929</a>) (Azeem Bande-Ali)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/557a8bb4e72b61d0024e50cf6bde14d4109fe525"><tt>557a8bb</tt></a> Docs: Remove old note about caching, add a new one (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10739">#10739</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10913">#10913</a>) (Zac)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/fe8111ac01fe3994f94c528872125ea394e72211"><tt>fe8111a</tt></a> Chore: Add more test cases to space-infix-ops (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10936">#10936</a>) (Bence Dányi)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/066f7e07d4f722573c6dbe7f64b0765504595644"><tt>066f7e0</tt></a> Update: camelcase rule ignoreList added (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10783">#10783</a>) (Julien Martin)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/70bde6900290a50b90e2c1e77a27a8814d68d89f"><tt>70bde69</tt></a> Upgrade: table to version 5 (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10903">#10903</a>) (Rouven Weßling)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/2e52bca9e5aa24eb22d6f01afcefa819655ded78"><tt>2e52bca</tt></a> Chore: Update issue templates (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10900">#10900</a>) (Nicholas C. Zakas)</li>
</ul>
<h4><a href="https://github.com/eslint/eslint/releases/tag/v5.6.1">5.6.1</a></h4>

<ul>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/9b26bdb29102e04a83a26d7718223fa25bc3333a"><tt>9b26bdb</tt></a> Fix: avoid exponential require-atomic-updates traversal (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10893">#10893</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10894">#10894</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/9432b10196a10ad280a31fac5d5755e9c79c03e3"><tt>9432b10</tt></a> Fix: make separateRequires work in consecutive mode (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10784">#10784</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10886">#10886</a>) (Pig Fang)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/e51868d8efdfecdfa8e7593b501ff7f06f00dafa"><tt>e51868d</tt></a> Upgrade: debug@4 (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10854">#10854</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10887">#10887</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/d3f3994294cd3eea07b36a52287d59f11929fa72"><tt>d3f3994</tt></a> Docs: add information about reporting security issues (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10889">#10889</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/cc458f49d6bec2f3dd4597f89fd16a7804b5ea30"><tt>cc458f4</tt></a> Build: fix failing tests on master (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10890">#10890</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/a6ebfd3089fecd4fd13594ff7def3caeaf410fb5"><tt>a6ebfd3</tt></a> Docs: clarify defaultAssignment option, fix no-unneeded-ternary examples (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10874">#10874</a>) (CoffeeTableEspresso)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/9d52541b67b9bad6e77c5b62e9a2cb4212d4998a"><tt>9d52541</tt></a> Fix: Remove duplicate error message on crash (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/8964">#8964</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10865">#10865</a>) (Nicholas C. Zakas)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/4eb9a4980b81ea7effbd08c3b20a5ff221351284"><tt>4eb9a49</tt></a> Docs: Update quotes.md (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10862">#10862</a>) (The Jared Wilcurt)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/9159e9b621cf59f2b601f394a8d01b18cacd1546"><tt>9159e9b</tt></a> Docs: Update complexity.md (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10867">#10867</a>) (Szymon Przybylski)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/14f4e46f89583624ae43097e14670f3225fc25e6"><tt>14f4e46</tt></a> Docs: Use Linter instead of linter in Nodejs API page (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10864">#10864</a>) (Nicholas C. Zakas)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/b3e3cb1f2c0a043cc78522f465c43d4af3aaa748"><tt>b3e3cb1</tt></a> Chore: Update debug log name to match filename (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10863">#10863</a>) (Nicholas C. Zakas)</li>
</ul>
<h4><a href="https://github.com/eslint/eslint/releases/tag/v5.6.0">5.6.0</a></h4>

<ul>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/c5b688e5350d16b330222f13749ab8b6ead517f8"><tt>c5b688e</tt></a> Update: Added generators option to func-names (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/9511">#9511</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10697">#10697</a>) (Oscar Barrett)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/7da36d5ab335fb557e82a4a2a2dc9a4a1a7aa626"><tt>7da36d5</tt></a> Fix: respect generator function expressions in no-constant-condition (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10827">#10827</a>) (Julian Rosse)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/0a658449104c58c0ba94e5176aaf6e6f1570058f"><tt>0a65844</tt></a> Chore: quote enable avoidEscape option in eslint-config-eslint (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10626">#10626</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/32f41bdfea9ad13b4151c1a4649e1ee8d867e06a"><tt>32f41bd</tt></a> Chore: Add configuration wrapper markdown for the bug report template (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10669">#10669</a>) (Iulian Onofrei)</li>
</ul>
<h4><a href="https://github.com/eslint/eslint/releases/tag/v5.5.0">5.5.0</a></h4>

<ul>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/6e110e652f0b37911e70ab5e3e2f7f27c0a48119"><tt>6e110e6</tt></a> Fix: camelcase duplicate warning bug (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10801">#10801</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10802">#10802</a>) (Julian Rosse)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/5103ee758168d6fc11d213240d531f66a4f48838"><tt>5103ee7</tt></a> Docs: Add Brackets integration (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10813">#10813</a>) (Jan Pilzer)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/b61d2cd6992826f51cd29e3b793854696c73ca90"><tt>b61d2cd</tt></a> Update: max-params to only highlight function header (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10815">#10815</a>) (Ian Obermiller)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/2b2f11db68ab6ad6fbd73e3a7f7178d9a2afcfe7"><tt>2b2f11d</tt></a> Upgrade: babel-code-frame to version 7 (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10808">#10808</a>) (Rouven Weßling)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/2824d439eb96bbbc4365dac8d886efc6aabe9e20"><tt>2824d43</tt></a> Docs: fix comment placement in a code example (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10799">#10799</a>) (Vse Mozhet Byt)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/10690b7714d8a3c7d6d85a7ff75d7d793cd392ab"><tt>10690b7</tt></a> Upgrade: devdeps and deps to latest (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10622">#10622</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/80c85983fb8ec209e65fc2c481f1cdca595ed9da"><tt>80c8598</tt></a> Docs: gitignore syntax updates (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/8139">#8139</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10776">#10776</a>) (Gustavo Santana)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/cb946affd21e701fc8309fcb3305e5a1b8d285ed"><tt>cb946af</tt></a> Chore: use meta.messages in some rules (1/4) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10764">#10764</a>) (薛定谔的猫)</li>
</ul>
<h4><a href="https://github.com/eslint/eslint/releases/tag/v5.4.0">5.4.0</a></h4>

<ul>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/a70909fd842bf24fd961e602f1bd55b4587d051b"><tt>a70909f</tt></a> Docs: Add jscs-dev.github.io links (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10771">#10771</a>) (Gustavo Santana)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/034690fe082aa31837dc4fca2a8e8aaaca0a4762"><tt>034690f</tt></a> Fix: no-invalid-meta crashes for non Object values (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10750">#10750</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10753">#10753</a>) (Sandeep Kumar Ranka)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/11a462d79bdfa07a6d21b619e82cfcac05c37b87"><tt>11a462d</tt></a> Docs: Broken jscs.info URLs (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10732">#10732</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10770">#10770</a>) (Gustavo Santana)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/985567d7a5ea925c394fdea70ac91f6fc483bdfe"><tt>985567d</tt></a> Chore: rm unused dep string.prototype.matchall (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10756">#10756</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/f3d8454cc8d51168f901d6f5c5055be6fe5e391a"><tt>f3d8454</tt></a> Update: Improve no-extra-parens error message (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10748">#10748</a>) (Timo Tijhof)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/562a03fb56d647d0ab5e29973f487aca6f78eccd"><tt>562a03f</tt></a> Fix: consistent-docs-url crashes if meta.docs is empty (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10722">#10722</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10749">#10749</a>) (Sandeep Kumar Ranka)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/6492233c7c9174d362bfc7db42f52a7fe4afb085"><tt>6492233</tt></a> Chore: enable no-prototype-builtins in codebase (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10660">#10660</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10664">#10664</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/137140f737d720fa93a4ac06ce79a86b523327f7"><tt>137140f</tt></a> Chore: use eslintrc overrides (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10677">#10677</a>) (薛定谔的猫)</li>
</ul>
<h4><a href="https://github.com/eslint/eslint/releases/tag/v5.3.0">5.3.0</a></h4>

<ul>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/dd6cb191ca64db3d883c836984bbde7938d66f1b"><tt>dd6cb19</tt></a> Docs: Updated no-return-await Rule Documentation (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/9695">#9695</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10699">#10699</a>) (Marla Foreman)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/6009239042cb651bc7ca6b8c81bbe44c40327430"><tt>6009239</tt></a> Chore: rename utils for consistency (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10727">#10727</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/6eb972ce13f00228b5e4e47966100cc743bce8b6"><tt>6eb972c</tt></a> New: require-unicode-regexp rule (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/9961">#9961</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10698">#10698</a>) (Toru Nagashima)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/5c5d64d239cc3641a730fa8d7534f5398688f773"><tt>5c5d64d</tt></a> Fix: ignored-paths for Windows path (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10687">#10687</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10691">#10691</a>) (Toru Nagashima)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/5f6a7655ce2f1e073127d47b2d027cbf2612d1f8"><tt>5f6a765</tt></a> Build: ensure URL fragments remain in documentation links (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10717">#10717</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10720">#10720</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/863aa784f23212f8a077e8008dc4d044faf48847"><tt>863aa78</tt></a> Docs: add another example for when not to use no-await-in-loop (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10714">#10714</a>) (Valeri Karpov)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/6e78b7dff2b2d77976252e3e51ec4db2e8ec01e5"><tt>6e78b7d</tt></a> Docs: remove links to terminated jscs.info domain (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10706">#10706</a>) (Piotr Kuczynski)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/d56c39d960a3f76ae8c25979ee752ee1cb518edd"><tt>d56c39d</tt></a> Fix: ESLint cache no longer stops autofix (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10679">#10679</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10694">#10694</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/2cc32405719b10083974022b1397963dc6e580fb"><tt>2cc3240</tt></a> New: add no-misleading-character-class (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10049">#10049</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10511">#10511</a>) (Toru Nagashima)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/877f4b8f3b1b8b1fccdf8c5f28fde229ba572a7d"><tt>877f4b8</tt></a> Fix: The "../.." folder is always ignored (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10675">#10675</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10682">#10682</a>) (Sridhar)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/5984820670c3085becc98b75827fc4899001e605"><tt>5984820</tt></a> Chore: Move lib/file-finder.js to lib/util/ (refs <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10559">#10559</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10695">#10695</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/e37a59381c3b7d80a93fa99017c13f51ef5ee15a"><tt>e37a593</tt></a> Update: Fix incorrect default value for position (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10670">#10670</a>) (Iulian Onofrei)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/8084bfca526969902c45ee52fa358a9c97de822e"><tt>8084bfc</tt></a> Docs: change when not to use object spread (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10621">#10621</a>) (Benny Powers)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/7f496e2a9d62dec103bec6e84f16dc27d9bf17ee"><tt>7f496e2</tt></a> Chore: Update require path for ast-utils (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10693">#10693</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/648a33a34d24de22240df99dfd68beded660a890"><tt>648a33a</tt></a> Chore: reorganize code structure of utilities (refs <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10599">#10599</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10680">#10680</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/f026fe1193aba89efe1ce72224af1b6df48b5bba"><tt>f026fe1</tt></a> Update: Fix 'function' in padding-line-between-statements (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10487">#10487</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10676">#10676</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/c2bb8bb1011347cb8883a0e0a78840ada0efd674"><tt>c2bb8bb</tt></a> Docs: Remove superfluous object option sample code (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10652">#10652</a>) (Iulian Onofrei)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/d34a13bb875705b3bde2beae716ab51873f4abfc"><tt>d34a13b</tt></a> Docs: add subheader in configuring/configuring-rules (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10686">#10686</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/d8aea28376c3ac02de618d1a00fddfaaef6becb2"><tt>d8aea28</tt></a> Chore: rm unnecessary plugin in eslint-config-eslint (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10685">#10685</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/9e76be70704c75d4e3f2a56a7528325d65e218e4"><tt>9e76be7</tt></a> Update: indent comments w/ nearby code if no blank lines (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/9733">#9733</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10640">#10640</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/9e93d46160513f02417c52b178ba37b11894b58e"><tt>9e93d46</tt></a> New: add no-async-promise-executor rule (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10217">#10217</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10661">#10661</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/5a2538c0ee9df928c71ce061505ed8294e3db35e"><tt>5a2538c</tt></a> New: require-atomic-updates rule (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10405">#10405</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10655">#10655</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/8b83d2bef3debbb21b91d7ce5d9e424afe75e1c4"><tt>8b83d2b</tt></a> Fix: always resolve default ignore patterns from CWD (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/9227">#9227</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10638">#10638</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/acb6658081eeed7e114d69b1ccf2c22c34da69c9"><tt>acb6658</tt></a> Fix: ESLint crash with prefer-object-spread (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10646">#10646</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10649">#10649</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/99fb7d30bea09c37c5125df237fc19d5bf46b4aa"><tt>99fb7d3</tt></a> Docs: fix misleading no-prototype-builtins description (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10666">#10666</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/005b8495e44296849d0a16cb633ce78d75191128"><tt>005b849</tt></a> Docs: fix outdated description of <code>baseConfig</code> option (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10657">#10657</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/15a77c4b44f03336d6c84bec5a61415e87d57bb9"><tt>15a77c4</tt></a> Docs: fix broken links (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint-jp/issues/6">eslint/eslint-jp#6</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10658">#10658</a>) (Toru Nagashima)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/87cd344e3ddd92223d35b1d0494a6f2af42ac46a"><tt>87cd344</tt></a> Docs: Make marking a default option consistent with other rules (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10650">#10650</a>) (Iulian Onofrei)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/0cb5e3e0d73455984d4fa24f1c2517ee8d5ee7b4"><tt>0cb5e3e</tt></a> Chore: Replace some function application with spread operators (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10645">#10645</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/b6daf0eb390bbbf382531177c915eb90bfb34264"><tt>b6daf0e</tt></a> Docs: Remove superfluous section from no-unsafe-negation (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10648">#10648</a>) (Iulian Onofrei)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/e1a3cac368636798a48f74f19eb6286c16b94185"><tt>e1a3cac</tt></a> Chore: rm deprecated experimentalObjectRestSpread option in tests (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10647">#10647</a>) (薛定谔的猫)</li>
</ul>
<h4><a href="https://github.com/eslint/eslint/releases/tag/v5.2.0">5.2.0</a></h4>

<ul>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/81283d082d7512038c4c6962df680235b4aae4a2"><tt>81283d0</tt></a> Update: Cache files that failed linting (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/9948">#9948</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10571">#10571</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/13cc63ef2ea94463e9e1d8d6e245b6ba7db24176"><tt>13cc63e</tt></a> Upgrade: ignore@4.0.2 (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10619">#10619</a>) (Rouven Weßling)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/ac77a8026ff71fd7ecd5809e851e30045fa2e8ab"><tt>ac77a80</tt></a> Chore: Fixing a call to Object.assign.apply in Linter (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10629">#10629</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/761f802f4eb44b41c023894d22e3e737f2b69336"><tt>761f802</tt></a> Upgrade: eslint-plugin-node to 7.0.1 (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10612">#10612</a>) (Toru Nagashima)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/c517b2aca928f82c239f5fdfa361aa4a80f784a5"><tt>c517b2a</tt></a> Build: fix npm run perf failing(fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10577">#10577</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10607">#10607</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/e5969399765132e4b918d5a637a445881a1b720b"><tt>e596939</tt></a> Chore: fix redundant equality check (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10617">#10617</a>) (Toru Nagashima)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/9f93d5feee5479147da840389819054aad34f0be"><tt>9f93d5f</tt></a> Docs: Updated Working with Custom Formatters (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/9950">#9950</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10592">#10592</a>) (Marla Foreman)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/9aaf195ca691d307e8896096cefffe975218c701"><tt>9aaf195</tt></a> Chore: Extract lint result cache logic (refs <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/9948">#9948</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10562">#10562</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/80b296ef331518f615fd931f726ca9212f25216b"><tt>80b296e</tt></a> Build: package.json update for eslint-config-eslint release (ESLint Jenkins)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/e4e7ff24ff569e88105ae44587aaef539c84c55c"><tt>e4e7ff2</tt></a> Chore: fix error message in eslint-config-eslint (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10588">#10588</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/1e88170fa57656206a39d579fd0c176d414c275b"><tt>1e88170</tt></a> Chore: Move lib/logging and lib/timing to lib/util/ (refs <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10559">#10559</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10579">#10579</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/64dfa21c9eedcf5063a8d9a91791a0ececcf77b3"><tt>64dfa21</tt></a> Build: Fix prerelease logic in blog post generation (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10578">#10578</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10581">#10581</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/0faf6338300887f5591aefe720409d6432042760"><tt>0faf633</tt></a> Chore: Simplify helper method in Linter tests (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10580">#10580</a>) (Kevin Partington)</li>
</ul>
<h4><a href="https://github.com/eslint/eslint/releases/tag/v5.1.0">5.1.0</a></h4>

<ul>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/7328f9918f4e77a4553b282282562c952eb47d02"><tt>7328f99</tt></a> Build: package.json update for eslint-config-eslint release (ESLint Jenkins)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/b161f6b62b5a75bd750ae940d2809faac537efb5"><tt>b161f6b</tt></a> Build: Include prerelease install info in release blog post (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10463">#10463</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/b2df73876b0339c05d4f83d7e8bbd973b572ab98"><tt>b2df738</tt></a> Fix: prefer-object-spread duplicated comma (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10512">#10512</a>, fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10532">#10532</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10524">#10524</a>) (Toru Nagashima)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/d8c3a25f5ae5fad47c694e3e2af6a66fe5ca78a8"><tt>d8c3a25</tt></a> Fix: wrap-regex doesn't work in some expression(fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10573">#10573</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10576">#10576</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/114f42ee55202e81b3b646d21a71831f34948186"><tt>114f42e</tt></a> Docs: Clarify option defaults in max-lines-per-function docs (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10569">#10569</a>) (Chris Harwood)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/63f36f7836bb6310e4e5498538665f5a2dd0fc92"><tt>63f36f7</tt></a> Fix: sort-keys in an object that contains spread (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10261">#10261</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10495">#10495</a>) (katerberg)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/601a5c4aecefa62530615ba4d47f6c429a555e3e"><tt>601a5c4</tt></a> Fix: Prefer-const rule crashing on array destructuring (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10520">#10520</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10527">#10527</a>) (Michael Mason)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/143890a462f8232ca82c4ecb506c5025d6e8d2a4"><tt>143890a</tt></a> Update: Adjust grammar of error/warnings fixable (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10546">#10546</a>) (Matt Mischuk)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/8ee39c5f2015b0d5670e3b9612ecbc1a4e49ff2f"><tt>8ee39c5</tt></a> Chore: small refactor config-validator (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10565">#10565</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/100f1beb2382d66a75c9a55b9972d22e8bd74727"><tt>100f1be</tt></a> Docs: add note about release issues to readme (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10572">#10572</a>) (Teddy Katz)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/02efeac65f9c4ec82edb484f138b6e1d7ed199cb"><tt>02efeac</tt></a> Fix: do not fail on nested unknown operators (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10561">#10561</a>) (Rubén Norte)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/92b19ca6140aacd7c0b38d5b0f2b9a8611eceff9"><tt>92b19ca</tt></a> Chore: use eslintrc overrides(dogfooding) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10566">#10566</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/076a6b6db038c06709d32b67ba4a3577829580ed"><tt>076a6b6</tt></a> Docs: add actionable fix to no-irregular-whitespace (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10558">#10558</a>) (Matteo Collina)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/de663ec14d0420178e9775dcf9427c9992b10045"><tt>de663ec</tt></a> Docs: Only successfully linted files are cached (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/9802">#9802</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10557">#10557</a>) (Kevin Partington)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/f0e22fc05ffd88a6e84f533121eeab6a3a539462"><tt>f0e22fc</tt></a> Upgrade: globals@11.7.0 (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10497">#10497</a>) (薛定谔的猫)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/8a2ff2c2e0b415cfc77ac324631b9ce9a372979d"><tt>8a2ff2c</tt></a> Docs:  adding a section about disable rules for some files (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10536">#10536</a>) (Wellington Soares)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/f22a3f80ab94be43d27febdc76e321cd73ca75a0"><tt>f22a3f8</tt></a> Docs: fix a word in no-implied-eval (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10539">#10539</a>) (Dan Homola)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/20d8bbd49b319b98677472da173281e977ce3926"><tt>20d8bbd</tt></a> Docs: add missing paragraph about "custom parsers" (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10547">#10547</a>) (Pig Fang)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/b7addf6fe9071d99c0b745ef4899bd36901b5b8a"><tt>b7addf6</tt></a> Update: deprecate no-catch-shadow (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10466">#10466</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10526">#10526</a>) (Toru Nagashima)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/e862dc3a8e500afb54a229a20ce892272bf41860"><tt>e862dc3</tt></a> Fix: Remove autofixer for no-debugger (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10242">#10242</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10509">#10509</a>) (Teddy Katz)</li>
</ul>
<h4><a href="https://github.com/eslint/eslint/releases/tag/v5.0.1">5.0.1</a></h4>

<ul>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/196c1021c070e52259f2ceccc4f141bdb7456c60"><tt>196c102</tt></a> Fix: valid-jsdoc should allow optional returns for async (fixes <a href="https://bounce.depfu.com/github.com/eslint/eslint/issues/10386">#10386</a>) (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10480">#10480</a>) (Mark Banner)</li>
<li>
<a href="https://bounce.depfu.com/github.com/eslint/eslint/commit/4c823bdf42af8f9a9fcf47473e48a99758881cf4"><tt>4c823bd</tt></a> Docs: Fix max-lines-per-function correct code's max value (<a href="https://bounce.depfu.com/github.com/eslint/eslint/pull/10513">#10513</a>) (Rhys Bower)</li>
</ul>
<p><em>Not all release notes shown. View the <a href="https://github.com/eslint/eslint/releases">full release notes</a></em></p>
</details>

<details>
<summary>Commits</summary>
<p><a href="https://github.com/eslint/eslint/compare/77bb2071b4b9f78929bdf4b97a016fef106348e6...9771442496bd366fd7e70bddcac7d46fdfa04df8">See the full diff on Github</a>. The new version differs by 14 commits:</p>

<ul>
<li><a href="https://github.com/eslint/eslint/commit/9771442496bd366fd7e70bddcac7d46fdfa04df8"><code>5.8.0</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/cef05cc3f5d3e5cd19fc54ecfe050ddb23d1290f"><code>Build: changelog update for 5.8.0</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/9152417682371c134f831dfa23100da8782865d1"><code>Fix: deprecation warning in RuleTester using Node v11 (#11009)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/e349a03caee9c7bffee1817f83151f36cb3d0065"><code>Docs: Update issue templates to ask for PRs (#11012)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/3d88b388aaa90f6053971b6073809e481f1ff457"><code>Chore: avoid using legacy report API in no-irregular-whitespace (#11013)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/5a31a922600a0ca373cc18b182cafd6cd0bcefce"><code>Build: compile espree&#39;s deps to ES5 when generating site (fixes #11014) (#11015)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/3943635e10c6cf47d3268c91baf9e24c07401af9"><code>Update: Create Linter.version API (fixes #9271) (#11010)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/a940cf4e88760e74343f92c4f14f53aea146a494"><code>Docs: Mention version for config glob patterns (fixes #8793)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/6e1c5306c4bd63fd05ab08aed26449b04f1b37f7"><code>Build: run tests on Node 11 (#11008)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/58ff359412368f1308b04575337965c6629a293d"><code>Docs: add instructions for npm 2FA (refs #10631) (#10992)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/2f87bb3b46a85c84e0bee52686daa0a47cf7ab32"><code>Upgrade: eslint-release@1.0.0 (refs #10631) (#10991)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/57ef0fdbfc7e9e976926e0632fa476a73b700d9d"><code>Fix: prefer-const when using destructuring assign (fixes #8308) (#10924)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/577cbf167c57de99fde4d3dbf856d9ca8850feb7"><code>Chore: Add typescript-specific edge case tests to space-infix-ops (#10986)</code></a></li>
<li><a href="https://github.com/eslint/eslint/commit/d45b184df23a2bbb00b9c1249cc4904235ebe5f7"><code>Chore: Using deconstruction assignment for shelljs (#10974)</code></a></li>
</ul>
</details>




---
![Depfu Status](https://depfu.com/badges/0426e53c73caad58f5f0a1adfe2ca1ac/stats.svg)

[Depfu](https://depfu.com) will automatically keep this PR conflict-free, as long as you don't add any commits to this branch yourself. You can also trigger a rebase manually by commenting with `@depfu rebase`.

<details><summary>All Depfu comment commands</summary>
<blockquote><dl>
<dt>@​depfu rebase</dt><dd>Rebases against your default branch and redoes this update</dd>
<dt>@​depfu merge</dt><dd>Merges this PR once your tests are passing and conflicts are resolved</dd>
<dt>@​depfu reopen</dt><dd>Restores the branch and reopens this PR (if it's closed)</dd>
<dt>@​depfu pause</dt><dd>Ignores all future updates for this dependency and closes this PR</dd>
<dt>@​depfu pause [minor|major]</dt><dd>Ignores all future minor/major updates for this dependency and closes this PR</dd>
<dt>@​depfu resume</dt><dd>Future versions of this dependency will create PRs again (leaves this PR as is)</dd>
</dl></blockquote>
</details>




Patch:
diff --git a/.travis.yml b/.travis.yml
index 4709eab5..20cee0f9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,12 @@
 language: node_js
 node_js:
-  - '6'
-  - '7'
-  - '8.4.0'
-  - '9'
-  - '10'
-script: 'make travis'
+   - "0.10"
+   - "0.12"
+   - "4"
+   - "5"
+   - "6"
+   - "7"
+   - "8.4.0"
+   - "9"
+   - "10"
+script: "make travis"
diff --git a/Makefile b/Makefile
index 868e2b5d..a17be4ea 100644
--- a/Makefile
+++ b/Makefile
@@ -65,9 +65,12 @@ test-jest:
 ifeq ($(MODERN_NODE), true)
 	./node_modules/.bin/jest
 else
-	./node_modules/.bin/jest --rootDir . -c test/jest.es5.config.json
+	./node_modules/.bin/jest -c test/jest.es5.config.json
 endif
 
+test-jest-if-supported-node-version:
+	@node-version-gte-6 && make test-jest || echo Skipping, jest is unsupported with node $(shell node --version)
+
 .PHONY: test
 test: test-sources
 	@./node_modules/.bin/mocha --opts $(MOCHA_OPTS) $(TEST_SOURCES) $(TEST_SOURCE_MARKDOWN)
@@ -90,7 +93,7 @@ test-browser: create-html-runners ${TARGETS}
 	@./node_modules/.bin/serve .
 
 .PHONY: travis-secondary
-travis-secondary: clean test test-jest coverage
+travis-secondary: clean test test-jest-if-supported-node-version coverage
 
 .PHONY: travis-main
 travis-main: clean lint test test-jasmine test-jest coverage
@@ -131,7 +134,7 @@ changelog: git-dirty-check
 	fi
 
 .PHONY: release-%
-release-%: git-dirty-check lint ${TARGETS} test-phantomjs test-jasmine test-jest commit-unexpected deploy-site
+release-%: git-dirty-check lint ${TARGETS} test-phantomjs test-jasmine test-jest-if-supported-node-version commit-unexpected deploy-site
 	IS_MAKE_RELEASE=yes npm version $*
 	make changelog
 	@echo $* release ready to be publised to NPM
diff --git a/documentation/api/addType.md b/documentation/api/addType.md
index 9f858232..6e02de1d 100644
--- a/documentation/api/addType.md
+++ b/documentation/api/addType.md
@@ -299,13 +299,13 @@ block. The outputs below shows the contrast between setting the
 inlineDiff = true;
 expect(
   {
-    JohnDoe: new Person('John Doe', 42),
-    JaneDoe: new Person('Janie Doe', 24)
+    'John Doe': new Person('John Doe', 42),
+    'Jane Doe': new Person('Janie Doe', 24)
   },
   'to equal',
   {
-    JohnDoe: new Person('John Doe', 42),
-    JaneDoe: new Person('Jane Doe', 24)
+    'John Doe': new Person('John Doe', 42),
+    'Jane Doe': new Person('Jane Doe', 24)
   }
 );
 ```
@@ -313,18 +313,18 @@ expect(
 ```output
 expected
 {
-  JohnDoe: new Person('John Doe', 42),
-  JaneDoe: new Person('Janie Doe', 24)
+  'John Doe': new Person('John Doe', 42),
+  'Jane Doe': new Person('Janie Doe', 24)
 }
 to equal
 {
-  JohnDoe: new Person('John Doe', 42),
-  JaneDoe: new Person('Jane Doe', 24)
+  'John Doe': new Person('John Doe', 42),
+  'Jane Doe': new Person('Jane Doe', 24)
 }
 
 {
-  JohnDoe: new Person('John Doe', 42),
-  JaneDoe: new Person(
+  'John Doe': new Person('John Doe', 42),
+  'Jane Doe': new Person(
     'Janie Doe', // should be 'Jane Doe'
                  // -Janie Doe
                  // +Jane Doe
@@ -337,13 +337,13 @@ to equal
 inlineDiff = false;
 expect(
   {
-    JohnDoe: new Person('John Doe', 42),
-    JaneDoe: new Person('Janie Doe', 24)
+    'John Doe': new Person('John Doe', 42),
+    'Jane Doe': new Person('Janie Doe', 24)
   },
   'to equal',
   {
-    JohnDoe: new Person('John Doe', 42),
-    JaneDoe: new Person('Jane Doe', 24)
+    'John Doe': new Person('John Doe', 42),
+    'Jane Doe': new Person('Jane Doe', 24)
   }
 );
 ```
@@ -351,25 +351,25 @@ expect(
 ```output
 expected
 {
-  JohnDoe: new Person('John Doe', 42),
-  JaneDoe: new Person('Janie Doe', 24)
+  'John Doe': new Person('John Doe', 42),
+  'Jane Doe': new Person('Janie Doe', 24)
 }
 to equal
 {
-  JohnDoe: new Person('John Doe', 42),
-  JaneDoe: new Person('Jane Doe', 24)
+  'John Doe': new Person('John Doe', 42),
+  'Jane Doe': new Person('Jane Doe', 24)
 }
 
 {
-  JohnDoe: new Person('John Doe', 42),
-  JaneDoe: new Person('Janie Doe', 24) // should equal new Person('Jane Doe', 24)
-                                       //
-                                       // new Person(
-                                       //   'Janie Doe', // should be 'Jane Doe'
-                                       //                // -Janie Doe
-                                       //                // +Jane Doe
-                                       //   24
-                                       // )
+  'John Doe': new Person('John Doe', 42),
+  'Jane Doe': new Person('Janie Doe', 24) // should equal new Person('Jane Doe', 24)
+                                          //
+                                          // new Person(
+                                          //   'Janie Doe', // should be 'Jane Doe'
+                                          //                // -Janie Doe
+                                          //                // +Jane Doe
+                                          //   24
+                                          // )
 }
 ```
 
diff --git a/lib/Unexpected.js b/lib/Unexpected.js
index ecdb5613..bef52f2d 100644
--- a/lib/Unexpected.js
+++ b/lib/Unexpected.js
@@ -13,6 +13,7 @@ const defaultDepth = require('./defaultDepth');
 const createWrappedExpectProto = require('./createWrappedExpectProto');
 const AssertionString = require('./AssertionString');
 const throwIfNonUnexpectedError = require('./throwIfNonUnexpectedError');
+const makeDiffResultBackwardsCompatible = require('./makeDiffResultBackwardsCompatible');
 
 function isAssertionArg({ type }) {
   return type.is('assertion');
@@ -234,16 +235,6 @@ function createExpectIt(unexpected, expectations) {
         ? context
         : new Context(unexpected);
 
-    if (
-      orGroups.length === 1 &&
-      orGroups[0].length === 1 &&
-      orGroups[0][0].length === 1 &&
-      typeof orGroups[0][0][0] === 'function'
-    ) {
-      // expect.it(subject => ...)
-      return oathbreaker(orGroups[0][0][0](subject));
-    }
-
     const groupEvaluations = [];
     const promises = [];
     orGroups.forEach(orGroup => {
@@ -826,13 +817,15 @@ Unexpected.prototype.addType = function(type, childUnexpected) {
       );
     }
 
-    return baseType.diff(
-      actual,
-      expected,
-      output.clone(),
-      (actual, expected) => that.diff(actual, expected, output.clone()),
-      (value, depth) => output.clone().appendInspected(value, depth),
-      that.equal.bind(that)
+    return makeDiffResultBackwardsCompatible(
+      baseType.diff(
+        actual,
+        expected,
+        output.clone(),
+        (actual, expected) => that.diff(actual, expected, output.clone()),
+        (value, depth) => output.clone().appendInspected(value, depth),
+        that.equal.bind(that)
+      )
     );
   };
 
@@ -1336,7 +1329,7 @@ Unexpected.prototype._expect = function expect(context, args) {
 
   if (args.length < 2) {
     throw new Error('The expect function requires at least two parameters.');
-  } else if (typeof testDescriptionString === 'function') {
+  } else if (testDescriptionString && testDescriptionString._expectIt) {
     return that.expect.withError(
       () => testDescriptionString(subject),
       err => {
@@ -1411,7 +1404,7 @@ Unexpected.prototype._expect = function expect(context, args) {
           wrappedExpect,
           subject
         );
-      } else if (typeof testDescriptionString === 'function') {
+      } else if (testDescriptionString && testDescriptionString._expectIt) {
         wrappedExpect.errorMode = 'nested';
         return wrappedExpect.withError(
           () => testDescriptionString(subject),
@@ -1593,14 +1586,16 @@ Unexpected.prototype.diff = function(
     seen.push(a);
   }
 
-  return this.findCommonType(a, b).diff(
-    a,
-    b,
-    output,
-    (actual, expected) =>
-      that.diff(actual, expected, output.clone(), recursions - 1, seen),
-    (v, depth) => output.clone().appendInspected(v, depth),
-    (actual, expected) => that.equal(actual, expected)
+  return makeDiffResultBackwardsCompatible(
+    this.findCommonType(a, b).diff(
+      a,
+      b,
+      output,
+      (actual, expected) =>
+        that.diff(actual, expected, output.clone(), recursions - 1, seen),
+      (v, depth) => output.clone().appendInspected(v, depth),
+      (actual, expected) => that.equal(actual, expected)
+    )
   );
 };
 
diff --git a/lib/UnexpectedError.js b/lib/UnexpectedError.js
index 24acec17..b5cead74 100644
--- a/lib/UnexpectedError.js
+++ b/lib/UnexpectedError.js
@@ -1,6 +1,7 @@
 const utils = require('./utils');
 const defaultDepth = require('./defaultDepth');
 const useFullStackTrace = require('./useFullStackTrace');
+const makeDiffResultBackwardsCompatible = require('./makeDiffResultBackwardsCompatible');
 
 const errorMethodBlacklist = [
   'message',
@@ -70,12 +71,14 @@ UnexpectedError.prototype.buildDiff = function(options) {
   const expect = this.expect;
   return (
     this.createDiff &&
-    this.createDiff(
-      output,
-      (actual, expected) => expect.diff(actual, expected, output.clone()),
-      (v, depth) =>
-        output.clone().appendInspected(v, (depth || defaultDepth) - 1),
-      (actual, expected) => expect.equal(actual, expected)
+    makeDiffResultBackwardsCompatible(
+      this.createDiff(
+        output,
+        (actual, expected) => expect.diff(actual, expected, output.clone()),
+        (v, depth) =>
+          output.clone().appendInspected(v, (depth || defaultDepth) - 1),
+        (actual, expected) => expect.equal(actual, expected)
+      )
     )
   );
 };
diff --git a/lib/assertions.js b/lib/assertions.js
index eedeb458..fdc63d3c 100644
--- a/lib/assertions.js
+++ b/lib/assertions.js
@@ -1094,11 +1094,10 @@ module.exports = expect => {
       const expected = {};
       keys.forEach((key, index) => {
         if (typeof nextArg === 'string') {
-          expected[key] = expect.it(s => expect.shift(s));
+          expected[key] = s => expect.shift(s);
         } else if (typeof nextArg === 'function') {
-          expected[key] = nextArg._expectIt
-            ? nextArg
-            : expect.it(s => nextArg(s, index));
+          expected[key] = s =>
+            nextArg._expectIt ? nextArg(s, expect.context) : nextArg(s, index);
         } else {
           expected[key] = nextArg;
         }
@@ -1505,7 +1504,7 @@ module.exports = expect => {
           const valueKey = valueType.valueForKey(value, keyInValue);
           const valueKeyType = expect.findTypeOf(valueKey);
 
-          if (valueKeyType.is('expect.it')) {
+          if (valueKeyType.is('function')) {
             return valueKey(subjectKey);
           } else {
             return expect(subjectKey, 'to [exhaustively] satisfy', valueKey);
@@ -1716,9 +1715,7 @@ module.exports = expect => {
                           } else if (type === 'insert') {
                             this.annotationBlock(function() {
                               if (
-                                expect
-                                  .findTypeOf(diffItem.value)
-                                  .is('expect.it')
+                                expect.findTypeOf(diffItem.value).is('function')
                               ) {
                                 this.error('missing: ').block(function() {
                                   this.omitSubject = undefined;
@@ -1838,38 +1835,32 @@ module.exports = expect => {
       if (valueType.is('array-like') && !subjectIsArrayLike) {
         expect.fail();
       }
-
+      const promiseByKey = {};
+      const keys = valueType.getKeys(value);
       const subjectKeys = subjectType.getKeys(subject);
-      const valueKeys = valueType.getKeys(value);
-      // calculate the unique keys early given enumerability no
-      // longer affects what is included in the list of keys
-      const uniqueKeys = subjectType.uniqueKeys(subjectKeys, valueKeys);
 
-      const promiseByKey = {};
-      let forceExhaustivelyComparison = false;
-      uniqueKeys.forEach((key, index) => {
-        const subjectKey = subjectType.valueForKey(subject, key);
-        const valueKey = valueType.valueForKey(value, key);
-        const valueKeyType = expect.findTypeOf(valueKey);
-        const isDefinedSubjectKey = typeof subjectKey !== 'undefined';
-        const isDefinedValueKey = typeof valueKey !== 'undefined';
-
-        if (expect.flags.exhaustively) {
-          if (valueKeyType.is('expect.it') && !isDefinedSubjectKey) {
-            // ensure value only expect.it key is marked missing
-            forceExhaustivelyComparison = true;
-          }
-        } else {
-          if (isDefinedSubjectKey && !isDefinedValueKey) {
-            // ignore subject only keys unless we are being exhaustive
-            return;
+      if (!subjectIsArrayLike) {
+        // Find all non-enumerable subject keys present in value, but not returned by subjectType.getKeys:
+        keys.forEach(key => {
+          if (
+            Object.prototype.hasOwnProperty.call(subject, key) &&
+            subjectKeys.indexOf(key) === -1
+          ) {
+            subjectKeys.push(key);
           }
-        }
+        });
+      }
 
+      keys.forEach((key, index) => {
         promiseByKey[key] = expect.promise(() => {
+          const subjectKey = subjectType.valueForKey(subject, key);
+          const valueKey = valueType.valueForKey(value, key);
+          const valueKeyType = expect.findTypeOf(valueKey);
           if (valueKeyType.is('expect.it')) {
             expect.context.thisObject = subject;
             return valueKey(subjectKey, expect.context);
+          } else if (valueKeyType.is('function')) {
+            return valueKey(subjectKey);
           } else {
             return expect(subjectKey, 'to [exhaustively] satisfy', valueKey);
           }
@@ -1879,8 +1870,25 @@ module.exports = expect => {
       return expect.promise
         .all([
           expect.promise(() => {
-            if (forceExhaustivelyComparison) {
-              throw new Error('exhaustive comparison failure');
+            if (expect.flags.exhaustively) {
+              const nonOwnKeysWithDefinedValues = keys.filter(
+                key =>
+                  !Object.prototype.hasOwnProperty.call(subject, key) &&
+                  typeof subjectType.valueForKey(subject, key) !== 'undefined'
+              );
+              const valueKeysWithDefinedValues = keys.filter(
+                key => typeof valueType.valueForKey(value, key) !== 'undefined'
+              );
+              const subjectKeysWithDefinedValues = subjectKeys.filter(
+                key =>
+                  typeof subjectType.valueForKey(subject, key) !== 'undefined'
+              );
+              expect(
+                valueKeysWithDefinedValues.length -
+                  nonOwnKeysWithDefinedValues.length,
+                'to equal',
+                subjectKeysWithDefinedValues.length
+              );
             }
           }),
           expect.promise.all(promiseByKey)
@@ -1891,13 +1899,16 @@ module.exports = expect => {
               diff(output, diff, inspect, equal) {
                 output.inline = true;
                 const subjectIsArrayLike = subjectType.is('array-like');
-                // Skip missing keys expected to be missing so they don't get rendered in the diff
-                const keys = uniqueKeys.filter(key => {
-                  return (
-                    subjectType.hasKey(subject, key) ||
-                    typeof valueType.valueForKey(value, key) !== 'undefined'
-                  );
-                });
+                const valueKeys = valueType.getKeys(value);
+                const keys = subjectType
+                  .uniqueKeys(subjectKeys, valueKeys)
+                  .filter(key => {
+                    // Skip missing keys expected to be missing so they don't get rendered in the diff
+                    return (
+                      subjectType.hasKey(subject, key) ||
+                      typeof valueType.valueForKey(value, key) !== 'undefined'
+                    );
+                  });
                 const prefixOutput = subjectType.prefix(
                   output.clone(),
                   subject
@@ -1942,7 +1953,7 @@ module.exports = expect => {
                           conflicting = null;
                         }
                       } else if (!subjectType.hasKey(subject, key)) {
-                        if (expect.findTypeOf(valueKey).is('expect.it')) {
+                        if (expect.findTypeOf(valueKey).is('function')) {
                           if (promiseByKey[key].isRejected()) {
                             output.error('// missing:').sp();
                             valueOutput = output
@@ -2385,19 +2396,14 @@ module.exports = expect => {
             }
           });
         },
-        err => {
-          if (err.isOperational && !err.propertyIsEnumerable('isOperational')) {
-            delete err.isOperational;
-          }
-
+        err =>
           expect.withError(
             () => expect.shift(err),
             e => {
               e.originalError = err;
               throw e;
             }
-          );
-        }
+          )
       );
     }
   );
diff --git a/lib/index.js b/lib/index.js
index f825a7bc..de1ff88c 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -2,8 +2,7 @@ module.exports = require('./Unexpected')
   .create()
   .use(require('./styles'))
   .use(require('./types'))
-  .use(require('./assertions'))
-  .freeze();
+  .use(require('./assertions'));
 
 // Add an inspect method to all the promises we return that will make the REPL, console.log, and util.inspect render it nicely in node.js:
 require('unexpected-bluebird').prototype.inspect = function() {
diff --git a/lib/makeDiffResultBackwardsCompatible.js b/lib/makeDiffResultBackwardsCompatible.js
new file mode 100644
index 00000000..379a1928
--- /dev/null
+++ b/lib/makeDiffResultBackwardsCompatible.js
@@ -0,0 +1,19 @@
+module.exports = function makeDiffResultBackwardsCompatible(diff) {
+  if (diff) {
+    if (diff.isMagicPen) {
+      // New format: { [MagicPen], inline: <boolean> }
+      // Make backwards compatible by adding a 'diff' property that points
+      // to the instance itself.
+      diff.diff = diff;
+    } else {
+      // Old format: { inline: <boolean>, diff: <magicpen> }
+      // Upgrade to the new format by moving the inline property to
+      // the magicpen instance, and remain backwards compatibly by adding
+      // the diff property pointing to the instance itself.
+      diff.diff.inline = diff.inline;
+      diff = diff.diff;
+      diff.diff = diff;
+    }
+  }
+  return diff;
+};
diff --git a/lib/types.js b/lib/types.js
index 7a69af06..dc9eca58 100644
--- a/lib/types.js
+++ b/lib/types.js
@@ -114,7 +114,7 @@ module.exports = function(expect) {
     },
     getKeys: Object.getOwnPropertySymbols
       ? obj => {
-          const keys = Object.getOwnPropertyNames(obj);
+          const keys = Object.keys(obj);
           const symbols = Object.getOwnPropertySymbols(obj);
           if (symbols.length > 0) {
             return keys.concat(symbols);
@@ -122,7 +122,7 @@ module.exports = function(expect) {
             return keys;
           }
         }
-      : Object.getOwnPropertyNames,
+      : Object.keys,
     // If Symbol support is not detected default to undefined which, when
     // passed to Array.prototype.sort, means "natural" (asciibetical) sort.
     keyComparator:
@@ -154,7 +154,44 @@ module.exports = function(expect) {
           }
         : undefined,
     equal(a, b, equal) {
-      return utils.checkObjectEqualityUsingType(a, b, this, equal);
+      if (a === b) {
+        return true;
+      }
+
+      if (b.constructor !== a.constructor) {
+        return false;
+      }
+
+      const actualKeys = this.getKeys(a).filter(
+        key => typeof this.valueForKey(a, key) !== 'undefined'
+      );
+      const expectedKeys = this.getKeys(b).filter(
+        key => typeof this.valueForKey(b, key) !== 'undefined'
+      );
+
+      // having the same number of owned properties (keys incorporates hasOwnProperty)
+      if (actualKeys.length !== expectedKeys.length) {
+        return false;
+      }
+      //the same set of keys (although not necessarily the same order),
+      actualKeys.sort(this.keyComparator);
+      expectedKeys.sort(this.keyComparator);
+      // cheap key test
+      for (let i = 0; i < actualKeys.length; i += 1) {
+        if (actualKeys[i] !== expectedKeys[i]) {
+          return false;
+        }
+      }
+
+      //equivalent values for every corresponding key, and
+      // possibly expensive deep test
+      for (let j = 0; j < actualKeys.length; j += 1) {
+        const key = actualKeys[j];
+        if (!equal(this.valueForKey(a, key), this.valueForKey(b, key))) {
+          return false;
+        }
+      }
+      return true;
     },
     hasKey(obj, key) {
       return key in obj;
@@ -762,20 +799,12 @@ module.exports = function(expect) {
     'sourceId',
     'sourceURL',
     'stack',
-    'stackArray',
-    '__stackCleaned__',
-    'isOperational' // added by the promise implementation
+    'stackArray'
   ].reduce((result, prop) => {
     result[prop] = true;
     return result;
   }, {});
 
-  if (new Error().hasOwnProperty('arguments')) {
-    // node.js 0.10 adds two extra non-enumerable properties to Error instances:
-    errorMethodBlacklist.arguments = true;
-    errorMethodBlacklist.type = true;
-  }
-
   expect.addType({
     base: 'object',
     name: 'Error',
@@ -797,9 +826,7 @@ module.exports = function(expect) {
     },
     equal(a, b, equal) {
       return (
-        a === b ||
-        (equal(a.message, b.message) &&
-          utils.checkObjectEqualityUsingType(a, b, this, equal))
+        a === b || (equal(a.message, b.message) && this.baseType.equal(a, b))
       );
     },
     inspect(value, depth, output, inspect) {
diff --git a/lib/utils.js b/lib/utils.js
index fc51be61..6b683f33 100644
--- a/lib/utils.js
+++ b/lib/utils.js
@@ -27,48 +27,6 @@ const utils = (module.exports = {
       return a === b;
     }),
 
-  checkObjectEqualityUsingType(a, b, type, isEqual) {
-    if (a === b) {
-      return true;
-    }
-
-    if (b.constructor !== a.constructor) {
-      return false;
-    }
-
-    const actualKeys = type
-      .getKeys(a)
-      .filter(key => typeof type.valueForKey(a, key) !== 'undefined');
-    const expectedKeys = type
-      .getKeys(b)
-      .filter(key => typeof type.valueForKey(b, key) !== 'undefined');
-
-    // having the same number of owned properties (keys incorporates hasOwnProperty)
-    if (actualKeys.length !== expectedKeys.length) {
-      return false;
-    }
-
-    //the same set of keys (although not necessarily the same order),
-    actualKeys.sort(type.keyComparator);
-    expectedKeys.sort(type.keyComparator);
-    // cheap key test
-    for (let i = 0; i < actualKeys.length; i += 1) {
-      if (actualKeys[i] !== expectedKeys[i]) {
-        return false;
-      }
-    }
-
-    //equivalent values for every corresponding key, and
-    // possibly expensive deep test
-    for (let j = 0; j < actualKeys.length; j += 1) {
-      const key = actualKeys[j];
-      if (!isEqual(type.valueForKey(a, key), type.valueForKey(b, key))) {
-        return false;
-      }
-    }
-    return true;
-  },
-
   duplicateArrayLikeUsingType(obj, type) {
     const keys = type.getKeys(obj);
 
diff --git a/package.json b/package.json
index e93edfce..f3dd4b61 100644
--- a/package.json
+++ b/package.json
@@ -38,30 +38,30 @@
     "babel-preset-es2015-without-strict": "^0.0.4",
     "coveralls": "^3.0.0",
     "es5-shim": "^4.5.9",
-    "eslint": "^5.6.1",
-    "eslint-config-pretty-standard": "^2.0.0",
+    "eslint": "^5.8.0",
+    "eslint-config-pretty-standard": "^1.2.0",
     "eslint-plugin-import": "^2.8.0",
     "eslint-plugin-mocha": "^5.2.0",
-    "eslint-plugin-prettier": "^3.0.0",
+    "eslint-plugin-prettier": "^2.6.0",
     "find-node-modules": "^1.0.4",
-    "gh-pages": "^2.0.0",
+    "gh-pages": "^2.0.1",
     "istanbul": "^0.4.5",
     "jasmine": "^3.1.0",
     "jasmine-core": "^3.1.0",
     "jest": "^23.0.0",
     "minimist": "^1.2.0",
-    "mocha": "^5.2.0",
+    "mocha": "^3.2.0",
     "mocha-phantomjs-core": "^2.1.2",
     "mocha-slow-reporter": "^*",
     "node-version-check": "^2.2.0",
-    "nyc": "^13.0.1",
+    "nyc": "^10.3.2",
     "offline-github-changelog": "^1.2.0",
     "prettier": "~1.14.0",
     "rollup": "^0.66.1",
     "rollup-plugin-commonjs": "^9.1.0",
     "rollup-plugin-node-globals": "^1.1.0",
     "rollup-plugin-node-resolve": "^3.0.0",
-    "rollup-plugin-uglify": "^6.0.0",
+    "rollup-plugin-uglify": "^4.0.0",
     "rsvp": "^4.7.0",
     "serve": "*",
     "unexpected-documentation-site-generator": "^4.6.1",


Test patch:
diff --git a/externaltests/assertionSucceedsWhilePromiseIsPending.spec.js b/externaltests/assertionSucceedsWhilePromiseIsPending.spec.js
index a0dd202e..d2bd62ed 100644
--- a/externaltests/assertionSucceedsWhilePromiseIsPending.spec.js
+++ b/externaltests/assertionSucceedsWhilePromiseIsPending.spec.js
@@ -1,4 +1,4 @@
-var expect = require('../lib').clone();
+var expect = require('../lib');
 
 expect.addAssertion('<any> to bar', function(expect, subject) {
   expect(subject, 'to equal', 'bar');
diff --git a/externaltests/failingAsync.spec.js b/externaltests/failingAsync.spec.js
index 0ce091c5..1bfc572d 100644
--- a/externaltests/failingAsync.spec.js
+++ b/externaltests/failingAsync.spec.js
@@ -1,4 +1,4 @@
-var expect = require('../lib').clone();
+var expect = require('../lib');
 
 expect.addAssertion('<any> when delayed a little bit <assertion?>', function(
   expect,
diff --git a/externaltests/forgotToReturnPromiseRejectedInTheNextTick.spec.js b/externaltests/forgotToReturnPromiseRejectedInTheNextTick.spec.js
index c7f6aae9..97e7171d 100644
--- a/externaltests/forgotToReturnPromiseRejectedInTheNextTick.spec.js
+++ b/externaltests/forgotToReturnPromiseRejectedInTheNextTick.spec.js
@@ -1,4 +1,4 @@
-var expect = require('../lib').clone();
+var expect = require('../lib');
 
 it('should fail', () => {
   expect.addAssertion('<any> to foo', function(expect, subject) {
diff --git a/test/api/addType.spec.js b/test/api/addType.spec.js
index 17124894..2a9b9acb 100644
--- a/test/api/addType.spec.js
+++ b/test/api/addType.spec.js
@@ -220,6 +220,48 @@ describe('addType', () => {
         );
       });
     });
+
+    it('allows adding a type whose diff method returns an old-style { inline: <boolean>, diff: <magicpen> } object', () => {
+      clonedExpect.addType({
+        name: 'box',
+        identify(obj) {
+          return obj && typeof obj === 'object' && obj.isBox;
+        },
+        equal(a, b, equal) {
+          return a === b || equal(a.value, b.value);
+        },
+        inspect(obj, depth, output, inspect) {
+          return output
+            .text('box(')
+            .append(inspect(obj.value))
+            .text(')');
+        },
+        diff(actual, expected, output, diff) {
+          return {
+            inline: true,
+            diff: output
+              .text('box(')
+              .append(diff({ value: actual.value }, { value: expected.value }))
+              .text(')')
+          };
+        }
+      });
+
+      expect(
+        function() {
+          clonedExpect(box('abc'), 'to equal', box('abe'));
+        },
+        'to throw',
+        "expected box('abc') to equal box('abe')\n" +
+          '\n' +
+          'box({\n' +
+          "  value: 'abc' // should equal 'abe'\n" +
+          '               //\n' +
+          '               // -abc\n' +
+          '               // +abe\n' +
+          '})'
+      );
+    });
   });
 
   describe('#inspect', () => {
diff --git a/test/api/fail.spec.js b/test/api/fail.spec.js
index abbd1534..aa6b5863 100644
--- a/test/api/fail.spec.js
+++ b/test/api/fail.spec.js
@@ -150,5 +150,26 @@ describe('fail assertion', () => {
         "expected 'bar' to foo\n" + '\n' + 'custom'
       );
     });
+
+    it('should support a diff function that uses the old API', () => {
+      var clonedExpect = expect.clone();
+      clonedExpect.addAssertion('<any> to foo', function(expect, subject) {
+        expect.fail({
+          diff(output, diff, inspect, equal) {
+            return {
+              inline: false,
+              diff: output.text('custom')
+            };
+          }
+        });
+      });
+      expect(
+        function() {
+          clonedExpect('bar', 'to foo');
+        },
+        'to throw',
+        "expected 'bar' to foo\n" + '\n' + 'custom'
+      );
+    });
   });
 });
diff --git a/test/api/inspect.spec.js b/test/api/inspect.spec.js
index 70c06718..c240dc58 100644
--- a/test/api/inspect.spec.js
+++ b/test/api/inspect.spec.js
@@ -207,9 +207,9 @@ describe('inspect', () => {
             deeply: {
               nested: { object: 'This should not be shown' },
               string: 'should be shown',
-              list: [1, 2, 3]
+              'a list': [1, 2, 3]
             },
-            list: [1, 2, 3]
+            'a list': [1, 2, 3]
           }
         }
       }
@@ -269,8 +269,8 @@ describe('inspect', () => {
         '    circular: { self: [Circular] },\n' +
         '    this: {\n' +
         '      is: {\n' +
-        "        deeply: { nested: ..., string: 'should be shown', list: ... },\n" +
-        '        list: [ 1, 2, 3 ]\n' +
+        "        deeply: { nested: ..., string: 'should be shown', 'a list': ... },\n" +
+        "        'a list': [ 1, 2, 3 ]\n" +
         '      }\n' +
         '    }\n' +
         '  }\n' +
@@ -321,7 +321,7 @@ describe('inspect', () => {
         "      { id: 4, name: 'Barbara Lynn' },\n" +
         "      { id: 5, name: 'Sharpe Downs' }\n" +
         '    ],\n' +
-        "    circular: { self: [Circular] }, this: { is: { deeply: { nested: ..., string: 'should be shown', list: ... }, list: [ 1, 2, 3 ] } }\n" +
+        "    circular: { self: [Circular] }, this: { is: { deeply: { nested: ..., string: 'should be shown', 'a list': ... }, 'a list': [ 1, 2, 3 ] } }\n" +
         '  }\n' +
         ']'
     );
diff --git a/test/api/it.spec.js b/test/api/it.spec.js
index 5a681369..9b31e912 100644
--- a/test/api/it.spec.js
+++ b/test/api/it.spec.js
@@ -346,14 +346,14 @@ describe('expect.it', () => {
 
   describe('when passed a function', () => {
     it('should succeed', () => {
-      expect.it(value => {
+      expect.it(function(value) {
         expect(value, 'to equal', 'foo');
       })('foo');
     });
 
     it('should fail with a diff', () => {
       expect(
-        () => {
+        function() {
           expect.it(function(value) {
             expect(value, 'to equal', 'bar');
           })('foo');
@@ -363,22 +363,9 @@ describe('expect.it', () => {
       );
     });
 
-    it('supports returning a promise from the function', () => {
-      return expect(
-        () =>
-          expect.it(value =>
-            expect.promise(run => {
-              setTimeout(run(() => expect(value, 'to equal', 'bar')));
-            })
-          )('foo'),
-        'to be rejected with',
-        "expected 'foo' to equal 'bar'\n" + '\n' + '-foo\n' + '+bar'
-      );
-    });
-
     it('should fail when passed more than two arguments', () => {
       expect(
-        () => {
+        function() {
           expect.it(function(value) {
             expect(value, 'to equal', 'bar');
           }, 'yadda')('foo');
@@ -387,45 +374,5 @@ describe('expect.it', () => {
         'expect.it(<function>) does not accept additional arguments'
       );
     });
-
-    describe('and chained the expression is chained', () => {
-      describe('and the first expression is a function', () => {
-        it('fails with a diff including all items in the chain', () => {
-          expect(
-            () => {
-              expect
-                .it(function(value) {
-                  expect(value, 'to equal', 'bar');
-                })
-                .and('to be a string')('foo');
-            },
-            'to throw',
-            "⨯ expected 'foo' to equal 'bar' and\n" +
-              '\n' +
-              '  -foo\n' +
-              '  +bar\n' +
-              "✓ expected 'foo' to be a string"
-          );
-        });
-      });
-
-      describe('and the second expression is a function', () => {
-        it('fails with a diff including all items in the chain', () => {
-          expect(
-            () => {
-              expect.it('to be a string').and(function(value) {
-                expect(value, 'to equal', 'bar');
-              })('foo');
-            },
-            'to throw',
-            "✓ expected 'foo' to be a string and\n" +
-              "⨯ expected 'foo' to equal 'bar'\n" +
-              '\n' +
-              '  -foo\n' +
-              '  +bar'
-          );
-        });
-      });
-    });
   });
 });
diff --git a/test/assertions/to-have-property.spec.js b/test/assertions/to-have-property.spec.js
index fe79e238..25bed92f 100644
--- a/test/assertions/to-have-property.spec.js
+++ b/test/assertions/to-have-property.spec.js
@@ -42,24 +42,21 @@ describe('to have property assertion', () => {
           expect(subject, 'to have enumerable property', 'enumFalse');
         },
         'to throw exception',
-        "expected { a: 'b', enumFalse: 't', configFalse: 't', writableFalse: 't' }\n" +
-          "to have enumerable property 'enumFalse'"
+        "expected { a: 'b' } to have enumerable property 'enumFalse'"
       );
       expect(
         function() {
           expect(subject, 'to have configurable property', 'configFalse');
         },
         'to throw exception',
-        "expected { a: 'b', enumFalse: 't', configFalse: 't', writableFalse: 't' }\n" +
-          "to have configurable property 'configFalse'"
+        "expected { a: 'b' } to have configurable property 'configFalse'"
       );
       expect(
         function() {
           expect(subject, 'to have writable property', 'writableFalse');
         },
         'to throw exception',
-        "expected { a: 'b', enumFalse: 't', configFalse: 't', writableFalse: 't' }\n" +
-          "to have writable property 'writableFalse'"
+        "expected { a: 'b' } to have writable property 'writableFalse'"
       );
     });
   });
diff --git a/test/assertions/to-satisfy.spec.js b/test/assertions/to-satisfy.spec.js
index 47e75164..9273ea8b 100644
--- a/test/assertions/to-satisfy.spec.js
+++ b/test/assertions/to-satisfy.spec.js
@@ -680,33 +680,6 @@ describe('to satisfy assertion', () => {
     });
   });
 
-  describe('with a expect.it function wrapper', () => {
-    it("succeeds if the function doesn't throw", () => {
-      expect({ foo: 'bar' }, 'to satisfy', {
-        foo: expect.it(v => expect(v, 'to be a string'))
-      });
-    });
-
-    it('should fail with an diff if the function fails', () => {
-      expect(
-        () => {
-          expect({ foo: 3 }, 'to satisfy', {
-            foo: expect.it(function(v) {
-              expect(v, 'to equal', 2);
-            })
-          });
-        },
-        'to throw',
-        'expected { foo: 3 }\n' +
-          "to satisfy { foo: expect.it(function (v) { expect(v, 'to equal', 2); }) }\n" +
-          '\n' +
-          '{\n' +
-          '  foo: 3 // should equal 2\n' +
-          '}'
-      );
-    });
-  });
-
   describe('with a synchronous expect.it in the RHS object', () => {
     it('should support an object with a property value of expect.it', () => {
       expect({ foo: 'bar' }, 'to satisfy', {
@@ -2223,8 +2196,7 @@ describe('to satisfy assertion', () => {
               });
             },
             'to throw',
-            "expected { nonEnumerable: 'theValue' }\n" +
-              "to exhaustively satisfy { nonEnumerable: 'wrong' }\n" +
+            "expected {} to exhaustively satisfy { nonEnumerable: 'wrong' }\n" +
               '\n' +
               '{\n' +
               '  nonEnumerable:\n' +
@@ -2238,6 +2210,10 @@ describe('to satisfy assertion', () => {
       });
 
       describe('when not matching the non-enumerable property', () => {
+        it('should succeed', () => {
+          expect(bar, 'to exhaustively satisfy', {});
+        });
+
         it('should fail with a diff', () => {
           expect(
             function() {
@@ -2246,11 +2222,9 @@ describe('to satisfy assertion', () => {
               });
             },
             'to throw',
-            "expected { nonEnumerable: 'theValue' }\n" +
-              "to exhaustively satisfy { somethingElse: 'wrong' }\n" +
+            "expected {} to exhaustively satisfy { somethingElse: 'wrong' }\n" +
               '\n' +
               '{\n' +
-              "  nonEnumerable: 'theValue' // should be removed\n" +
               "  // missing somethingElse: 'wrong'\n" +
               '}'
           );
@@ -2259,26 +2233,23 @@ describe('to satisfy assertion', () => {
     });
   });
 
-  describe('when an unpresent value to is satisfied against an expect.it function wrapper', () => {
-    it('should allow an unpresent value to be satisfied against the function', () => {
-      expect({}, 'to satisfy', {
-        foo: expect.it(v => {
-          expect(v, 'to be undefined');
-        })
-      });
+  // Debatable:
+  describe('when an unpresent value to is satisfied against a function', () => {
+    it('should allow an unpresent value to be satisfied against a non-expect.it function', () => {
+      expect({}, 'to satisfy', { foo: function() {} });
     });
 
     it('should fail when the function throws', () => {
       expect(
-        () => {
+        function() {
           expect({}, 'to satisfy', {
-            foo: expect.it(value => {
+            foo(value) {
               expect(value, 'to be a string');
-            })
+            }
           });
         },
         'to throw',
-        err => {
+        function(err) {
           // Compensate for V8 5.1+ setting { foo: function () {} }.foo.name === 'foo'
           // http://v8project.blogspot.dk/2016/04/v8-release-51.html
           expect(
@@ -2301,7 +2272,7 @@ describe('to satisfy assertion', () => {
 
     it('should fail with a diff', () => {
       expect(
-        () => {
+        function() {
           expect({}, 'to satisfy', { foo: expect.it('to be a string') });
         },
         'to throw',
@@ -2316,16 +2287,11 @@ describe('to satisfy assertion', () => {
 
   it('should not break when the assertion fails and there is a fulfilled function in the RHS', () => {
     expect(
-      () => {
-        expect({}, 'to satisfy', {
-          bar: 123,
-          foo: expect.it(function(v) {
-            expect(v, 'to be undefined');
-          })
-        });
+      function() {
+        expect({}, 'to satisfy', { bar: 123, foo: function() {} });
       },
       'to throw',
-      err => {
+      function(err) {
         // Compensate for V8 5.1+ setting { foo: function () {} }.foo.name === 'foo'
         // http://v8project.blogspot.dk/2016/04/v8-release-51.html
         expect(
@@ -2334,40 +2300,17 @@ describe('to satisfy assertion', () => {
             .toString()
             .replace(/function foo/g, 'function '),
           'to satisfy',
-          'expected {} to satisfy\n' +
-            '{\n' +
-            '  bar: 123,\n' +
-            "  foo: expect.it(function (v) { expect(v, 'to be undefined'); })\n" +
-            '}\n' +
+          'expected {} to satisfy { bar: 123, foo: function () {} }\n' +
             '\n' +
             '{\n' +
             '  // missing bar: 123\n' +
-            "  // missing foo: should satisfy expect.it(function (v) { expect(v, 'to be undefined'); })\n" +
+            '  // missing foo: should satisfy function () {}\n' +
             '}'
         );
       }
     );
   });
 
-  it('should render a diff when the function differs', () => {
-    function myFunction() {}
-    function myOtherFunction() {}
-
-    expect(
-      () => {
-        expect({ foo: myFunction }, 'to satisfy', { foo: myOtherFunction });
-      },
-      'to throw',
-      'expected { foo: function myFunction() {} }\n' +
-        'to satisfy { foo: function myOtherFunction() {} }\n' +
-        '\n' +
-        '{\n' +
-        '  foo: function myFunction() {} // expected { foo: function myFunction() {} }\n' +
-        '                                // to satisfy { foo: function myOtherFunction() {} }\n' +
-        '}'
-    );
-  });
-
   describe('when matching the constructor property of an object', () => {
     function Foo() {}
 
diff --git a/test/external.spec.js b/test/external.spec.js
index 650b6c4a..9f2519f6 100644
--- a/test/external.spec.js
+++ b/test/external.spec.js
@@ -245,122 +245,44 @@ if (typeof process === 'object') {
       });
     });
 
-    describe('executed through jest', () => {
-      expect.addAssertion(
-        '<array|string> executed through jest <object?>',
-        function(expect, subject, env) {
-          if (!Array.isArray(subject)) {
-            subject = [subject];
-          }
-          return expect.promise(function(run) {
-            childProcess.execFile(
-              pathModule.resolve(basePath, 'node_modules', '.bin', 'jest'),
-              [
-                '--config',
-                pathModule.resolve(externaltestsDir, 'jestconfig.json')
-              ].concat(
-                subject.map(function(fileName) {
-                  return pathModule.resolve(
-                    externaltestsDir,
-                    `${fileName}.spec.js`
-                  );
+    // jest requires node.js 6 or above:
+    if (!/^v[012345]\./.test(process.version)) {
+      describe('executed through jest', () => {
+        expect.addAssertion(
+          '<array|string> executed through jest <object?>',
+          function(expect, subject, env) {
+            if (!Array.isArray(subject)) {
+              subject = [subject];
+            }
+            return expect.promise(function(run) {
+              childProcess.execFile(
+                pathModule.resolve(basePath, 'node_modules', '.bin', 'jest'),
+                [
+                  '--config',
+                  pathModule.resolve(externaltestsDir, 'jestconfig.json')
+                ].concat(
+                  subject.map(function(fileName) {
+                    return pathModule.resolve(
+                      externaltestsDir,
+                      `${fileName}.spec.js`
+                    );
+                  })
+                ),
+                {
+                  cwd: basePath,
+                  env: extend({}, process.env, env || {})
+                },
+                run(function(err, stdout, stderr) {
+                  return [err, stdout, stderr];
                 })
-              ),
-              {
-                cwd: basePath,
-                env: extend({}, process.env, env || {})
-              },
-              run(function(err, stdout, stderr) {
-                return [err, stdout, stderr];
-              })
-            );
-          });
-        }
-      );
-
-      it('should report that a promise was created, but not returned by the it block', () => {
-        return expect(
-          'forgotToReturnPendingPromiseFromSuccessfulItBlock',
-          'executed through jest'
-        ).spread(function(err, stdout, stderr) {
-          expect(
-            stderr,
-            'to contain',
-            'should call the callback: You have created a promise that was not returned from the it block'
-          );
-          expect(err, 'to satisfy', { code: 1 });
-        });
-      });
-
-      it('should not report that a promise was created if the test already failed synchronously', () => {
-        return expect(
-          'forgotToReturnPendingPromiseFromFailingItBlock',
-          'executed through jest'
-        ).spread(function(err, stdout, stderr) {
-          expect(
-            stderr,
-            'not to contain',
-            'should call the callback: You have created a promise that was not returned from the it block'
-          );
-          expect(err, 'to satisfy', { code: 1 });
-        });
-      });
-
-      it('should trim unexpected plugins from the stack trace when the UNEXPECTED_FULL_TRACE environment variable is not set', () => {
-        return expect('fullTrace', 'executed through jest', {
-          UNEXPECTED_FULL_TRACE: ''
-        }).spread(function(err, stdout, stderr) {
-          expect(stderr, 'not to contain', 'node_modules/unexpected-bogus/');
-          expect(err, 'to satisfy', { code: 1 });
-        });
-      });
-
-      it('should not trim unexpected plugins from the stack trace when the UNEXPECTED_FULL_TRACE environment variable is set', () => {
-        return expect('fullTrace', 'executed through jest', {
-          UNEXPECTED_FULL_TRACE: 'yes'
-        }).spread(function(err, stdout, stderr) {
-          expect(stderr, 'to contain', 'node_modules/unexpected-bogus/');
-          expect(err, 'to satisfy', { code: 1 });
-        });
-      });
-
-      it('should accept an UNEXPECTED_DEPTH environment variable', () => {
-        return expect('deepObject', 'executed through jest', {
-          UNEXPECTED_DEPTH: 6
-        }).spread(function(err, stdout, stderr) {
-          expect(err, 'to be falsy');
-        });
-      });
-
-      it('should render a long stack trace for an async test', () => {
-        return expect('failingAsync', 'executed through jest').spread(function(
-          err,
-          stdout,
-          stderr
-        ) {
-          expect(err, 'to be truthy');
-          expect(stderr, 'to contain', 'From previous event:');
-        });
-      });
-
-      it('should fail when a promise failing in the next tick is created but not returned', () => {
-        return expect(
-          'forgotToReturnPromiseRejectedInTheNextTick',
-          'executed through jest'
-        ).spread(function(err, stdout, stderr) {
-          expect(
-            stderr,
-            'to contain',
-            'should fail: You have created a promise that was not returned from the it block'
-          );
-          expect(err, 'to satisfy', { code: 1 });
-        });
-      });
+              );
+            });
+          }
+        );
 
-      describe('with a test suite spanning multiple files', () => {
-        it('should report that a promise was created, but not returned by the it block in the first test', () => {
+        it('should report that a promise was created, but not returned by the it block', () => {
           return expect(
-            ['forgotToReturnPendingPromiseFromSuccessfulItBlock', 'successful'],
+            'forgotToReturnPendingPromiseFromSuccessfulItBlock',
             'executed through jest'
           ).spread(function(err, stdout, stderr) {
             expect(
@@ -372,40 +294,126 @@ if (typeof process === 'object') {
           });
         });
 
-        it('should report that a promise was created, but not returned by the it block in the second test', () => {
+        it('should not report that a promise was created if the test already failed synchronously', () => {
           return expect(
-            ['successful', 'forgotToReturnPendingPromiseFromSuccessfulItBlock'],
+            'forgotToReturnPendingPromiseFromFailingItBlock',
             'executed through jest'
           ).spread(function(err, stdout, stderr) {
             expect(
               stderr,
-              'to contain',
+              'not to contain',
               'should call the callback: You have created a promise that was not returned from the it block'
             );
             expect(err, 'to satisfy', { code: 1 });
           });
         });
-      });
 
-      describe('with an assertion that succeeds, but creates a promise that remains pending', () => {
-        it('should pass', () => {
+        it('should trim unexpected plugins from the stack trace when the UNEXPECTED_FULL_TRACE environment variable is not set', () => {
+          return expect('fullTrace', 'executed through jest', {
+            UNEXPECTED_FULL_TRACE: ''
+          }).spread(function(err, stdout, stderr) {
+            expect(stderr, 'not to contain', 'node_modules/unexpected-bogus/');
+            expect(err, 'to satisfy', { code: 1 });
+          });
+        });
+
+        it('should not trim unexpected plugins from the stack trace when the UNEXPECTED_FULL_TRACE environment variable is set', () => {
+          return expect('fullTrace', 'executed through jest', {
+            UNEXPECTED_FULL_TRACE: 'yes'
+          }).spread(function(err, stdout, stderr) {
+            expect(stderr, 'to contain', 'node_modules/unexpected-bogus/');
+            expect(err, 'to satisfy', { code: 1 });
+          });
+        });
+
+        it('should accept an UNEXPECTED_DEPTH environment variable', () => {
+          return expect('deepObject', 'executed through jest', {
+            UNEXPECTED_DEPTH: 6
+          }).spread(function(err, stdout, stderr) {
+            expect(err, 'to be falsy');
+          });
+        });
+
+        it('should render a long stack trace for an async test', () => {
+          return expect('failingAsync', 'executed through jest').spread(
+            function(err, stdout, stderr) {
+              expect(err, 'to be truthy');
+              expect(stderr, 'to contain', 'From previous event:');
+            }
+          );
+        });
+
+        it('should fail when a promise failing in the next tick is created but not returned', () => {
           return expect(
-            'assertionSucceedsWhilePromiseIsPending',
+            'forgotToReturnPromiseRejectedInTheNextTick',
             'executed through jest'
           ).spread(function(err, stdout, stderr) {
             expect(
               stderr,
-              'not to contain',
-              'should call the callback: You have created a promise that was not returned from the it block'
+              'to contain',
+              'should fail: You have created a promise that was not returned from the it block'
             );
-            expect(err, 'to be falsy');
+            expect(err, 'to satisfy', { code: 1 });
           });
         });
-      });
 
-      it('should render the stack trace of the thrown error without any artifacts when "not to error" encounters an error', () => {
-        return expect('notToErrorCaughtError', 'executed through jest').spread(
-          function(err, stdout, stderr) {
+        describe('with a test suite spanning multiple files', () => {
+          it('should report that a promise was created, but not returned by the it block in the first test', () => {
+            return expect(
+              [
+                'forgotToReturnPendingPromiseFromSuccessfulItBlock',
+                'successful'
+              ],
+              'executed through jest'
+            ).spread(function(err, stdout, stderr) {
+              expect(
+                stderr,
+                'to contain',
+                'should call the callback: You have created a promise that was not returned from the it block'
+              );
+              expect(err, 'to satisfy', { code: 1 });
+            });
+          });
+
+          it('should report that a promise was created, but not returned by the it block in the second test', () => {
+            return expect(
+              [
+                'successful',
+                'forgotToReturnPendingPromiseFromSuccessfulItBlock'
+              ],
+              'executed through jest'
+            ).spread(function(err, stdout, stderr) {
+              expect(
+                stderr,
+                'to contain',
+                'should call the callback: You have created a promise that was not returned from the it block'
+              );
+              expect(err, 'to satisfy', { code: 1 });
+            });
+          });
+        });
+
+        describe('with an assertion that succeeds, but creates a promise that remains pending', () => {
+          it('should pass', () => {
+            return expect(
+              'assertionSucceedsWhilePromiseIsPending',
+              'executed through jest'
+            ).spread(function(err, stdout, stderr) {
+              expect(
+                stderr,
+                'not to contain',
+                'should call the callback: You have created a promise that was not returned from the it block'
+              );
+              expect(err, 'to be falsy');
+            });
+          });
+        });
+
+        it('should render the stack trace of the thrown error without any artifacts when "not to error" encounters an error', () => {
+          return expect(
+            'notToErrorCaughtError',
+            'executed through jest'
+          ).spread(function(err, stdout, stderr) {
             expect(err, 'to satisfy', { code: 1 });
             expect(
               stderr,
@@ -413,9 +421,9 @@ if (typeof process === 'object') {
               '    not to error\n' +
                 "      returned promise rejected with: Error('argh')\n"
             ).and('to contain', '      at thisIsImportant');
-          }
-        );
+          });
+        });
       });
-    });
+    }
   });
 }
diff --git a/test/jest.es5.config.json b/test/jest.es5.config.json
index 02a06395..8d7d2ac5 100644
--- a/test/jest.es5.config.json
+++ b/test/jest.es5.config.json
@@ -1,5 +1,5 @@
 {
-  "setupFiles": ["<rootDir>/build/test/promisePolyfill.js"],
+  "setupFiles": ["<rootDir>/build/test/promisePolyfill"],
   "setupTestFrameworkScriptFile": "<rootDir>/build/test/common.js",
   "testMatch": ["<rootDir>/build/test/**.spec.js"]
 }
diff --git a/test/types/error-type.spec.js b/test/types/error-type.spec.js
index 8fcc0782..f7c68684 100644
--- a/test/types/error-type.spec.js
+++ b/test/types/error-type.spec.js
@@ -61,14 +61,8 @@ describe('Error type', () => {
     }
 
     function MyError(message) {
-      var instance = new Error(message);
-      var proto = Object.getPrototypeOf(this);
-      if (Object.setPrototypeOf) {
-        Object.setPrototypeOf(instance, proto);
-      } else {
-        instance.__proto__ = proto; // eslint-disable-line no-proto
-      }
-      return instance;
+      Error.call(this);
+      this.message = message;
     }
 
     inherits(MyError, Error);
@@ -146,16 +140,4 @@ describe('Error type', () => {
       });
     });
   });
-
-  describe('when comparing Error objects with differing enumerable keys', () => {
-    it('should not break', () => {
-      var e1 = new Error('foo');
-      var e2 = new Error();
-      e2.message = 'foo';
-
-      expect(() => {
-        expect(e1, 'to equal', e2);
-      }, 'not to throw');
-    });
-  });
 });
diff --git a/test/types/function-type.spec.js b/test/types/function-type.spec.js
index 52e28057..bb6f8a12 100644
--- a/test/types/function-type.spec.js
+++ b/test/types/function-type.spec.js
@@ -14,9 +14,11 @@ describe('function type', () => {
     expect(fn, 'to inspect as', 'function foo() {}');
   });
 
+  var isNodeJs3OrBelow =
+    typeof process === 'object' && /^v[0123]\./.test(process.version);
   var isPhantomJs =
     typeof navigator !== 'undefined' && /phantom/i.test(navigator.userAgent);
-  if (!isPhantomJs) {
+  if (!isNodeJs3OrBelow && !isPhantomJs) {
     // Node.js 3 and below and phantom.js don't include "bound " and the
     // old Phantom.js version that's currently available on Travis doesn't
     // even have Function#bind, which we then polyfill via es5-shim, leading
diff --git a/test/unexpected.spec.js b/test/unexpected.spec.js
index 19944c48..54aa6b87 100644
--- a/test/unexpected.spec.js
+++ b/test/unexpected.spec.js
@@ -1,4 +1,4 @@
-/*global unexpected, weknowhow*/
+/*global unexpected*/
 
 it.skipIf = function(condition) {
   (condition ? it.skip : it).apply(
@@ -10,19 +10,6 @@ it.skipIf = function(condition) {
 describe('unexpected', () => {
   var expect = unexpected.clone();
 
-  it('should freeze the top-level unexpected instance', () => {
-    const topLevelExpect =
-      typeof weknowhow === 'undefined' ? require('../lib/') : weknowhow.expect;
-
-    expect(
-      function() {
-        topLevelExpect.addAssertion('<any> to foo', function() {});
-      },
-      'to throw',
-      'Cannot add an assertion to a frozen instance, please run .clone() first'
-    );
-  });
-
   describe('argument validation', () => {
     it('fails when given no parameters', () => {
       expect(