eslint 7.7.0 → 7.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/README.md +1 -1
  3. package/conf/config-schema.js +12 -0
  4. package/lib/cli-engine/cascading-config-array-factory.js +12 -0
  5. package/lib/cli-engine/cli-engine.js +2 -2
  6. package/lib/cli-engine/config-array/config-array.js +12 -0
  7. package/lib/cli-engine/config-array/config-dependency.js +12 -0
  8. package/lib/cli-engine/config-array/extracted-config.js +12 -0
  9. package/lib/cli-engine/config-array/ignore-pattern.js +12 -0
  10. package/lib/cli-engine/config-array/index.js +12 -0
  11. package/lib/cli-engine/config-array/override-tester.js +12 -0
  12. package/lib/cli-engine/config-array-factory.js +24 -6
  13. package/lib/eslint/eslint.js +7 -1
  14. package/lib/init/autoconfig.js +1 -1
  15. package/lib/init/config-initializer.js +3 -3
  16. package/lib/linter/code-path-analysis/code-path-analyzer.js +38 -0
  17. package/lib/linter/code-path-analysis/code-path-state.js +2 -2
  18. package/lib/linter/config-comment-parser.js +1 -1
  19. package/lib/linter/linter.js +6 -3
  20. package/lib/rules/constructor-super.js +17 -1
  21. package/lib/rules/id-length.js +20 -7
  22. package/lib/rules/no-inline-comments.js +25 -4
  23. package/lib/rules/no-loss-of-precision.js +10 -2
  24. package/lib/rules/no-magic-numbers.js +20 -3
  25. package/lib/rules/no-warning-comments.js +40 -7
  26. package/lib/rules/operator-assignment.js +1 -1
  27. package/lib/rules/prefer-destructuring.js +7 -0
  28. package/lib/rules/prefer-numeric-literals.js +10 -0
  29. package/lib/rules/utils/ast-utils.js +49 -13
  30. package/lib/shared/config-validator.js +14 -2
  31. package/lib/shared/relative-module-resolver.js +12 -0
  32. package/lib/shared/types.js +1 -1
  33. package/messages/plugin-invalid.txt +8 -0
  34. package/package.json +4 -3
  35. package/conf/environments.js +0 -168
  36. package/lib/shared/config-ops.js +0 -130
  37. package/lib/shared/naming.js +0 -97
package/CHANGELOG.md CHANGED
@@ -1,3 +1,70 @@
1
+ v7.10.0 - September 26, 2020
2
+
3
+ * [`6919fbb`](https://github.com/eslint/eslint/commit/6919fbb83f86552b0f49ae749da866e4edc7c46a) Docs: Clarify that ignorePattern should be a string (refs #13029) (#13718) (Brandon Mills)
4
+ * [`07d9bea`](https://github.com/eslint/eslint/commit/07d9bea7c6f953e8f754afffc9752edcee799431) Update: Add ignorePattern to no-inline-comments (#13029) (Edie Lemoine)
5
+ * [`d79bbe9`](https://github.com/eslint/eslint/commit/d79bbe982930b53358d34ad91cc6e5eaac8ddede) Docs: fix typo (#13717) (Alexander Liu)
6
+ * [`9b8490e`](https://github.com/eslint/eslint/commit/9b8490ee6391c986b1314540a92b71d8c1e0efc4) Docs: grammatical error (#13687) (rajdeep)
7
+ * [`cb44e93`](https://github.com/eslint/eslint/commit/cb44e93f4780e925a75a68ce2f7f6d065b5f756c) Fix: prefer-destructuring invalid autofix with computed property access (#13704) (Milos Djermanovic)
8
+ * [`46c73b1`](https://github.com/eslint/eslint/commit/46c73b159a5ceed2f7f26f254fd97e459fb0e81a) Upgrade: eslint-scope@5.1.1 (#13716) (Milos Djermanovic)
9
+ * [`b7b12ba`](https://github.com/eslint/eslint/commit/b7b12ba0bd4e9c66883f11e97de8ed84b600cdaa) Chore: Move comment to make tests more organized (#13707) (Yusuke Tanaka)
10
+ * [`51674a4`](https://github.com/eslint/eslint/commit/51674a4113a1ca877094606bbf4938ab06cc1aad) Docs: Add missing quotes (#13714) (Lucio Paiva)
11
+ * [`7c34a98`](https://github.com/eslint/eslint/commit/7c34a982aaf93a02348f56c9ce887c7dcf51b5bd) Chore: remove mistakenly added file (#13710) (Milos Djermanovic)
12
+ * [`30b76c9`](https://github.com/eslint/eslint/commit/30b76c9a13fae3dff59f7db406d6c66f11152973) Docs: Clarify package.json requirement in Getting Started (refs #13549) (#13696) (Nicholas C. Zakas)
13
+ * [`044560d`](https://github.com/eslint/eslint/commit/044560dcc74db98b28e293da2e2f3b41ecbf5884) Sponsors: Sync README with website (ESLint Jenkins)
14
+ * [`54000d1`](https://github.com/eslint/eslint/commit/54000d13f27d5255851b5ac0606ad027e2b8d331) Sponsors: Sync README with website (ESLint Jenkins)
15
+
16
+ v7.9.0 - September 12, 2020
17
+
18
+ * [`3ca2700`](https://github.com/eslint/eslint/commit/3ca27004ece5016ba7aed775f01ad13bc9282296) Fix: Corrected notice for invalid (:) plugin names (#13473) (Josh Goldberg)
19
+ * [`fc5783d`](https://github.com/eslint/eslint/commit/fc5783d2ff9e3b0d7a1f9664928d49270b4a6c01) Docs: Fix leaky anchors in v4 migration page (#13635) (Timo Tijhof)
20
+ * [`f1d07f1`](https://github.com/eslint/eslint/commit/f1d07f112be96c64dfdaa154aa9ac81985b16238) Docs: Provide install commands for Yarn (#13661) (Nikita Baksalyar)
21
+ * [`29d1cdc`](https://github.com/eslint/eslint/commit/29d1cdceedd6c056a39149723cf9ff2fbb260cbf) Fix: prefer-destructuring removes comments (refs #13678) (#13682) (Milos Djermanovic)
22
+ * [`b4da0a7`](https://github.com/eslint/eslint/commit/b4da0a7ca7995435bdfc116fd374eb0649470131) Docs: fix typo in working with plugins docs (#13683) (啸生)
23
+ * [`6f87db7`](https://github.com/eslint/eslint/commit/6f87db7c318225e48ccbbf0bec8b3758ea839b82) Update: fix id-length false negatives on Object.prototype property names (#13670) (Milos Djermanovic)
24
+ * [`361ac4d`](https://github.com/eslint/eslint/commit/361ac4d895c15086fb4351d4dca1405b2fdc4bd5) Fix: NonOctalDecimalIntegerLiteral is decimal integer (fixes #13588) (#13664) (Milos Djermanovic)
25
+ * [`f260716`](https://github.com/eslint/eslint/commit/f260716695064e4b4193337107b60401bd4b3f20) Docs: update outdated link (#13677) (klkhan)
26
+ * [`5138c91`](https://github.com/eslint/eslint/commit/5138c913c256e4266ffb68278783af45bf70af84) Docs: add missing eslint directive comments in no-await-in-loop (#13673) (Milos Djermanovic)
27
+ * [`17b58b5`](https://github.com/eslint/eslint/commit/17b58b528df62bf96813d50c087cafdf83306810) Docs: clarify correct example in no-return-await (fixes #13656) (#13657) (Milos Djermanovic)
28
+ * [`9171f0a`](https://github.com/eslint/eslint/commit/9171f0a99bb4d7c53f109b1c2b215004a7c27713) Chore: fix typo (#13660) (Nitin Kumar)
29
+ * [`6d9f8fb`](https://github.com/eslint/eslint/commit/6d9f8fbb7ed4361b475fb50d04e6d25744d5b1a2) Sponsors: Sync README with website (ESLint Jenkins)
30
+ * [`97b0dd9`](https://github.com/eslint/eslint/commit/97b0dd9a1af1ae4ae3857adcfe6eeac7837101ed) Sponsors: Sync README with website (ESLint Jenkins)
31
+ * [`deab125`](https://github.com/eslint/eslint/commit/deab125fc9220dab43baeb32c6cf78942ad25a83) Sponsors: Sync README with website (ESLint Jenkins)
32
+ * [`bf2e367`](https://github.com/eslint/eslint/commit/bf2e367bf4f6fde9930af9de8b8d8bc3d8b5782f) Sponsors: Sync README with website (ESLint Jenkins)
33
+ * [`8929208`](https://github.com/eslint/eslint/commit/89292084bf91ba5ae5bf966c6c56fa3da139ce57) Sponsors: Sync README with website (ESLint Jenkins)
34
+
35
+ v7.8.1 - September 1, 2020
36
+
37
+ * [`f542b5d`](https://github.com/eslint/eslint/commit/f542b5d0679b73326ad249fc44a54c3f848bd3e6) Fix: Update broken @eslint/eslintrc version (fixes #13641) (#13647) (Nicholas C. Zakas)
38
+ * [`c1b5696`](https://github.com/eslint/eslint/commit/c1b56966c2354e12d16e8394443de49fa54f4290) Sponsors: Sync README with website (ESLint Jenkins)
39
+ * [`8ddeda0`](https://github.com/eslint/eslint/commit/8ddeda01afdb1e9656a43853b8e25c9c4582e6ad) Sponsors: Sync README with website (ESLint Jenkins)
40
+ * [`e02e2fe`](https://github.com/eslint/eslint/commit/e02e2fe019a1ed9a34a7b96e4c8961c35093b0ce) Sponsors: Sync README with website (ESLint Jenkins)
41
+
42
+ v7.8.0 - August 31, 2020
43
+
44
+ * [`58abd93`](https://github.com/eslint/eslint/commit/58abd9311900a8af5a3c0963daaf64675bdd8383) Update: support logical assignments in code path analysis (refs #13569) (#13612) (Milos Djermanovic)
45
+ * [`db7488e`](https://github.com/eslint/eslint/commit/db7488e6326fd1b7ea04c5062beb1c5f75fc15ed) Update: support logical assignments in core rules (refs #13569) (#13618) (Milos Djermanovic)
46
+ * [`3729219`](https://github.com/eslint/eslint/commit/372921924778f2e525535985e17c97b988546210) Docs: Update Step 1 of Development Environment documentation (klkhan)
47
+ * [`a320324`](https://github.com/eslint/eslint/commit/a32032430a0779a4e3b2d137d4d0682844084b82) Chore: Test formatted integers in no-dupe-keys (refs #13568) (#13626) (Brandon Mills)
48
+ * [`88a9ade`](https://github.com/eslint/eslint/commit/88a9ade7643bb166efbab45cee15f3269496f4be) Update: add es2021 environment (refs #13602) (#13603) (Milos Djermanovic)
49
+ * [`0003dc0`](https://github.com/eslint/eslint/commit/0003dc0f966f2b47555595586f84eb3163cb0179) Update: support numeric separators (refs #13568) (#13581) (Milos Djermanovic)
50
+ * [`96b11a0`](https://github.com/eslint/eslint/commit/96b11a0717bf32b94ec768611574372320fb774b) Update: Add exceptionPatterns to id-length rule (fixes #13094) (#13576) (sodam)
51
+ * [`3439fea`](https://github.com/eslint/eslint/commit/3439fea5c0ed330d01d874b0c9df51dd51ae792c) Update: support numeric-separator in no-loss-of-precision (refs #13568) (#13574) (Anix)
52
+ * [`ed64767`](https://github.com/eslint/eslint/commit/ed64767859d776145d68145419a61f5379b4dd63) Update: add comment to message in no-warning-comments (fixes #12327) (#13522) (Anix)
53
+ * [`e60ec07`](https://github.com/eslint/eslint/commit/e60ec07fad0c1d4c966f28d214c5379da753ff4e) Sponsors: Sync README with website (ESLint Jenkins)
54
+ * [`483bf7f`](https://github.com/eslint/eslint/commit/483bf7f3cc40e0d866798d6ca9ee1c19aa77ddd2) Docs: fix examples in object-curly-newline (#13605) (Soobin Bak)
55
+ * [`1c35d57`](https://github.com/eslint/eslint/commit/1c35d57b0a5f374cc55f1727a7561bcab1962e83) Docs: Remove stale Keybase 2FA instructions (#13622) (Brandon Mills)
56
+ * [`82669fa`](https://github.com/eslint/eslint/commit/82669fa66670a00988db5b1d10fe8f3bf30be84e) Chore: Extract some functionality to eslintrc (refs #13481) (#13613) (Nicholas C. Zakas)
57
+ * [`4111d21`](https://github.com/eslint/eslint/commit/4111d21a046b73892e2c84f92815a21ef4db63e1) Docs: Fix typo and missing article before noun in docs (#13611) (Patrice Sandhu)
58
+ * [`091e52a`](https://github.com/eslint/eslint/commit/091e52ae1ca408f3e668f394c14d214c9ce806e6) Upgrade: espree@7.3.0 (refs #13568) (#13609) (Kai Cataldo)
59
+ * [`05074fb`](https://github.com/eslint/eslint/commit/05074fb2c243e904e8c09d714ad9d084acdd80d2) Sponsors: Sync README with website (ESLint Jenkins)
60
+ * [`bdb65ec`](https://github.com/eslint/eslint/commit/bdb65ec2e672c9815bee356b61d1cd60a1072152) Chore: add 3rd party parsers in BUG_REPORT template (#13606) (YeonJuan)
61
+ * [`f954476`](https://github.com/eslint/eslint/commit/f954476fb6b0664679c73babd5e8a0647572b81f) Chore: add common 3rd party parsers to issue template (#13596) (Kai Cataldo)
62
+ * [`2bee6d2`](https://github.com/eslint/eslint/commit/2bee6d256ae0516c9a9003bb3fdca24ff93253b5) Chore: Mark config-related files (refs #13481) (#13597) (Nicholas C. Zakas)
63
+ * [`66442a9`](https://github.com/eslint/eslint/commit/66442a9faf9872db4a40f56dde28c48f4d02fc7b) Update: Add no-magic-numbers 'ignoreDefaultValues' option (#12611) (Dieter Luypaert)
64
+ * [`b487164`](https://github.com/eslint/eslint/commit/b487164d01dd0bf66fdf2df0e374ce1c3bdb0339) Docs: add exponentiation operators to operator-assignment documentation (#13577) (Milos Djermanovic)
65
+ * [`2f27836`](https://github.com/eslint/eslint/commit/2f27836e989f3dfe236e34054b490febc359bc48) Sponsors: Sync README with website (ESLint Jenkins)
66
+ * [`60eafc1`](https://github.com/eslint/eslint/commit/60eafc15075f38955cb6816bf1f0bcf6e6e6d3a6) Sponsors: Sync README with website (ESLint Jenkins)
67
+
1
68
  v7.7.0 - August 14, 2020
2
69
 
3
70
  * [`b46f3ee`](https://github.com/eslint/eslint/commit/b46f3ee0dae4add9df99cae940b641ad8de58b9e) Update: allowFunctionParams option in no-underscore-dangle (fixes 12579) (#13545) (Sunghyun Cho)
package/README.md CHANGED
@@ -266,7 +266,7 @@ The following companies, organizations, and individuals support ESLint's ongoing
266
266
  <h3>Gold Sponsors</h3>
267
267
  <p><a href="https://www.salesforce.com"><img src="https://images.opencollective.com/salesforce/ca8f997/logo.png" alt="Salesforce" height="96"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="96"></a> <a href="https://aka.ms/microsoftfossfund"><img src="https://avatars1.githubusercontent.com/u/67931232?u=7fddc652a464d7151b97e8f108392af7d54fa3e8&v=4" alt="Microsoft FOSS Fund Sponsorships" height="96"></a></p><h3>Silver Sponsors</h3>
268
268
  <p><a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a> <a href="https://www.ampproject.org/"><img src="https://images.opencollective.com/amp/c8a3b25/logo.png" alt="AMP Project" height="64"></a></p><h3>Bronze Sponsors</h3>
269
- <p><a href="https://vpn-review.com/netflix-vpn"><img src="https://images.opencollective.com/vpn-for-netflix/4887627/logo.png" alt="vpn for netflix" height="32"></a> <a href="https://nettikasinolista.com"><img src="https://images.opencollective.com/nettikasinolista/fd361ee/logo.png" alt="Nettikasinolista.com" height="32"></a> <a href="https://www.veikkaajat.com"><img src="https://images.opencollective.com/veikkaajat/b92b427/logo.png" alt="Veikkaajat.com" height="32"></a> <a href="https://www.nettikasinot.media/"><img src="https://images.opencollective.com/nettikasinot-media/2dba7da/logo.png" alt="Nettikasinot.media" height="32"></a> <a href="https://mytruemedia.com/"><img src="https://images.opencollective.com/my-true-media/03e2168/logo.png" alt="My True Media" height="32"></a> <a href="https://www.norgekasino.com"><img src="https://images.opencollective.com/norgekasino/ecfd57a/logo.png" alt="Norgekasino" height="32"></a> <a href="https://www.japanesecasino.com/"><img src="https://images.opencollective.com/japanesecasino/b0ffe3c/logo.png" alt="Japanesecasino" height="32"></a> <a href="https://bruce.agency"><img src="https://images.opencollective.com/brucemade/0c70c59/logo.png" alt="Bruce" height="32"></a> <a href="https://www.casinotop.com/"><img src="https://images.opencollective.com/casinotop-com/10fd95b/logo.png" alt="CasinoTop.com" height="32"></a> <a href="https://www.casinotopp.net/"><img src="https://images.opencollective.com/casino-topp/1dd399a/logo.png" alt="Casino Topp" height="32"></a> <a href="https://writersperhour.com/write-my-essay"><img src="https://images.opencollective.com/writersperhour/5787d4b/logo.png" alt="Writers Per Hour" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://www.kasinot.fi"><img src="https://images.opencollective.com/kasinot-fi/e09aa2e/logo.png" alt="Kasinot.fi" height="32"></a> <a href="https://www.pelisivut.com"><img src="https://images.opencollective.com/pelisivut/04f08f2/logo.png" alt="Pelisivut" height="32"></a> <a href="https://www.nettikasinot.org"><img src="https://images.opencollective.com/nettikasinot-org/53a4b44/logo.png" alt="Nettikasinot.org" height="32"></a> <a href="https://www.bonus.com.de/freispiele"><img src="https://images.opencollective.com/bonusfinder-deutschland/646169e/logo.png" alt="BonusFinder Deutschland" height="32"></a> <a href="https://www.bugsnag.com/platforms?utm_source=Open Collective&utm_medium=Website&utm_content=open-source&utm_campaign=2019-community&utm_term="><img src="https://images.opencollective.com/bugsnag-stability-monitoring/c2cef36/logo.png" alt="Bugsnag Stability Monitoring" height="32"></a> <a href="https://mixpanel.com"><img src="https://images.opencollective.com/mixpanel/cd682f7/logo.png" alt="Mixpanel" height="32"></a> <a href="https://www.vpsserver.com"><img src="https://images.opencollective.com/vpsservercom/logo.png" alt="VPS Server" height="32"></a> <a href="https://icons8.com"><img src="https://images.opencollective.com/icons8/6e889f6/logo.png" alt="Icons8: free icons, photos, illustrations, and music" height="32"></a> <a href="https://discordapp.com"><img src="https://images.opencollective.com/discordapp/7e3d9a9/logo.png" alt="Discord" height="32"></a> <a href="https://themeisle.com"><img src="https://images.opencollective.com/themeisle/d5592fe/logo.png" alt="ThemeIsle" height="32"></a> <a href="https://www.marfeel.com/"><img src="https://images.opencollective.com/marfeel/4b88e30/logo.png" alt="Marfeel" height="32"></a> <a href="http://www.firesticktricks.com"><img src="https://images.opencollective.com/fire-stick-tricks/b8fbe2c/logo.png" alt="Fire Stick Tricks" height="32"></a></p>
269
+ <p><a href="https://www.betacalendars.com/printable-calendar"><img src="https://images.opencollective.com/betacalendars/9334b33/logo.png" alt="2021 calendar" height="32"></a> <a href="https://buy.fineproxy.org/eng/"><img src="https://images.opencollective.com/buy-fineproxy-org/2002c40/logo.png" alt="Buy.Fineproxy.Org" height="32"></a> <a href="https://www.veikkaajat.com"><img src="https://images.opencollective.com/veikkaajat/b92b427/logo.png" alt="Veikkaajat.com" height="32"></a> <a href="https://www.nettikasinot.media/"><img src="https://images.opencollective.com/nettikasinot-media/2dba7da/logo.png" alt="Nettikasinot.media" height="32"></a> <a href="https://mytruemedia.com/"><img src="https://images.opencollective.com/my-true-media/03e2168/logo.png" alt="My True Media" height="32"></a> <a href="https://www.norgekasino.com"><img src="https://images.opencollective.com/norgekasino/ecfd57a/logo.png" alt="Norgekasino" height="32"></a> <a href="https://www.japanesecasino.com/"><img src="https://images.opencollective.com/japanesecasino/b0ffe3c/logo.png" alt="Japanesecasino" height="32"></a> <a href="https://www.casinotop.com/"><img src="https://images.opencollective.com/casinotop-com/10fd95b/logo.png" alt="CasinoTop.com" height="32"></a> <a href="https://www.casinotopp.net/"><img src="https://images.opencollective.com/casino-topp/1dd399a/logo.png" alt="Casino Topp" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://www.kasinot.fi"><img src="https://images.opencollective.com/kasinot-fi/e09aa2e/logo.png" alt="Kasinot.fi" height="32"></a> <a href="https://www.pelisivut.com"><img src="https://images.opencollective.com/pelisivut/04f08f2/logo.png" alt="Pelisivut" height="32"></a> <a href="https://www.nettikasinot.org"><img src="https://images.opencollective.com/nettikasinot-org/53a4b44/logo.png" alt="Nettikasinot.org" height="32"></a> <a href="https://www.bonus.com.de/freispiele"><img src="https://images.opencollective.com/bonusfinder-deutschland/646169e/logo.png" alt="BonusFinder Deutschland" height="32"></a> <a href="null"><img src="https://images.opencollective.com/bugsnag-stability-monitoring/c2cef36/logo.png" alt="Bugsnag Stability Monitoring" height="32"></a> <a href="https://mixpanel.com"><img src="https://images.opencollective.com/mixpanel/cd682f7/logo.png" alt="Mixpanel" height="32"></a> <a href="https://www.vpsserver.com"><img src="https://images.opencollective.com/vpsservercom/logo.png" alt="VPS Server" height="32"></a> <a href="https://icons8.com"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8: free icons, photos, illustrations, and music" height="32"></a> <a href="https://discordapp.com"><img src="https://images.opencollective.com/discordapp/7e3d9a9/logo.png" alt="Discord" height="32"></a> <a href="https://themeisle.com"><img src="https://images.opencollective.com/themeisle/d5592fe/logo.png" alt="ThemeIsle" height="32"></a> <a href="https://www.marfeel.com/"><img src="https://images.opencollective.com/marfeel/4b88e30/logo.png" alt="Marfeel" height="32"></a> <a href="https://www.firesticktricks.com"><img src="https://images.opencollective.com/fire-stick-tricks/b8fbe2c/logo.png" alt="Fire Stick Tricks" height="32"></a></p>
270
270
  <!--sponsorsend-->
271
271
 
272
272
  ## <a name="technology-sponsors"></a>Technology Sponsors
@@ -1,3 +1,15 @@
1
+ /*
2
+ * STOP!!! DO NOT MODIFY.
3
+ *
4
+ * This file is part of the ongoing work to move the eslintrc-style config
5
+ * system into the @eslint/eslintrc package. This file needs to remain
6
+ * unchanged in order for this work to proceed.
7
+ *
8
+ * If you think you need to change this file, please contact @nzakas first.
9
+ *
10
+ * Thanks in advance for your cooperation.
11
+ */
12
+
1
13
  /**
2
14
  * @fileoverview Defines a schema for configs.
3
15
  * @author Sylvan Mably
@@ -1,3 +1,15 @@
1
+ /*
2
+ * STOP!!! DO NOT MODIFY.
3
+ *
4
+ * This file is part of the ongoing work to move the eslintrc-style config
5
+ * system into the @eslint/eslintrc package. This file needs to remain
6
+ * unchanged in order for this work to proceed.
7
+ *
8
+ * If you think you need to change this file, please contact @nzakas first.
9
+ *
10
+ * Thanks in advance for your cooperation.
11
+ */
12
+
1
13
  /**
2
14
  * @fileoverview `CascadingConfigArrayFactory` class.
3
15
  *
@@ -19,8 +19,8 @@ const fs = require("fs");
19
19
  const path = require("path");
20
20
  const defaultOptions = require("../../conf/default-cli-options");
21
21
  const pkg = require("../../package.json");
22
- const ConfigOps = require("../shared/config-ops");
23
- const naming = require("../shared/naming");
22
+ const ConfigOps = require("@eslint/eslintrc/lib/shared/config-ops");
23
+ const naming = require("@eslint/eslintrc/lib/shared/naming");
24
24
  const ModuleResolver = require("../shared/relative-module-resolver");
25
25
  const { Linter } = require("../linter");
26
26
  const builtInRules = require("../rules");
@@ -1,3 +1,15 @@
1
+ /*
2
+ * STOP!!! DO NOT MODIFY.
3
+ *
4
+ * This file is part of the ongoing work to move the eslintrc-style config
5
+ * system into the @eslint/eslintrc package. This file needs to remain
6
+ * unchanged in order for this work to proceed.
7
+ *
8
+ * If you think you need to change this file, please contact @nzakas first.
9
+ *
10
+ * Thanks in advance for your cooperation.
11
+ */
12
+
1
13
  /**
2
14
  * @fileoverview `ConfigArray` class.
3
15
  *
@@ -1,3 +1,15 @@
1
+ /*
2
+ * STOP!!! DO NOT MODIFY.
3
+ *
4
+ * This file is part of the ongoing work to move the eslintrc-style config
5
+ * system into the @eslint/eslintrc package. This file needs to remain
6
+ * unchanged in order for this work to proceed.
7
+ *
8
+ * If you think you need to change this file, please contact @nzakas first.
9
+ *
10
+ * Thanks in advance for your cooperation.
11
+ */
12
+
1
13
  /**
2
14
  * @fileoverview `ConfigDependency` class.
3
15
  *
@@ -1,3 +1,15 @@
1
+ /*
2
+ * STOP!!! DO NOT MODIFY.
3
+ *
4
+ * This file is part of the ongoing work to move the eslintrc-style config
5
+ * system into the @eslint/eslintrc package. This file needs to remain
6
+ * unchanged in order for this work to proceed.
7
+ *
8
+ * If you think you need to change this file, please contact @nzakas first.
9
+ *
10
+ * Thanks in advance for your cooperation.
11
+ */
12
+
1
13
  /**
2
14
  * @fileoverview `ExtractedConfig` class.
3
15
  *
@@ -1,3 +1,15 @@
1
+ /*
2
+ * STOP!!! DO NOT MODIFY.
3
+ *
4
+ * This file is part of the ongoing work to move the eslintrc-style config
5
+ * system into the @eslint/eslintrc package. This file needs to remain
6
+ * unchanged in order for this work to proceed.
7
+ *
8
+ * If you think you need to change this file, please contact @nzakas first.
9
+ *
10
+ * Thanks in advance for your cooperation.
11
+ */
12
+
1
13
  /**
2
14
  * @fileoverview `IgnorePattern` class.
3
15
  *
@@ -1,3 +1,15 @@
1
+ /*
2
+ * STOP!!! DO NOT MODIFY.
3
+ *
4
+ * This file is part of the ongoing work to move the eslintrc-style config
5
+ * system into the @eslint/eslintrc package. This file needs to remain
6
+ * unchanged in order for this work to proceed.
7
+ *
8
+ * If you think you need to change this file, please contact @nzakas first.
9
+ *
10
+ * Thanks in advance for your cooperation.
11
+ */
12
+
1
13
  /**
2
14
  * @fileoverview `ConfigArray` class.
3
15
  * @author Toru Nagashima <https://github.com/mysticatea>
@@ -1,3 +1,15 @@
1
+ /*
2
+ * STOP!!! DO NOT MODIFY.
3
+ *
4
+ * This file is part of the ongoing work to move the eslintrc-style config
5
+ * system into the @eslint/eslintrc package. This file needs to remain
6
+ * unchanged in order for this work to proceed.
7
+ *
8
+ * If you think you need to change this file, please contact @nzakas first.
9
+ *
10
+ * Thanks in advance for your cooperation.
11
+ */
12
+
1
13
  /**
2
14
  * @fileoverview `OverrideTester` class.
3
15
  *
@@ -1,3 +1,15 @@
1
+ /*
2
+ * STOP!!! DO NOT MODIFY.
3
+ *
4
+ * This file is part of the ongoing work to move the eslintrc-style config
5
+ * system into the @eslint/eslintrc package. This file needs to remain
6
+ * unchanged in order for this work to proceed.
7
+ *
8
+ * If you think you need to change this file, please contact @nzakas first.
9
+ *
10
+ * Thanks in advance for your cooperation.
11
+ */
12
+
1
13
  /**
2
14
  * @fileoverview The factory of `ConfigArray` objects.
3
15
  *
@@ -44,7 +56,7 @@ const path = require("path");
44
56
  const importFresh = require("import-fresh");
45
57
  const stripComments = require("strip-json-comments");
46
58
  const { validateConfigSchema } = require("../shared/config-validator");
47
- const naming = require("../shared/naming");
59
+ const naming = require("@eslint/eslintrc/lib/shared/naming");
48
60
  const ModuleResolver = require("../shared/relative-module-resolver");
49
61
  const {
50
62
  ConfigArray,
@@ -274,14 +286,15 @@ function loadESLintIgnoreFile(filePath) {
274
286
  * Creates an error to notify about a missing config to extend from.
275
287
  * @param {string} configName The name of the missing config.
276
288
  * @param {string} importerName The name of the config that imported the missing config
289
+ * @param {string} messageTemplate The text template to source error strings from.
277
290
  * @returns {Error} The error object to throw
278
291
  * @private
279
292
  */
280
- function configMissingError(configName, importerName) {
293
+ function configInvalidError(configName, importerName, messageTemplate) {
281
294
  return Object.assign(
282
295
  new Error(`Failed to load config "${configName}" to extend from.`),
283
296
  {
284
- messageTemplate: "extend-config-missing",
297
+ messageTemplate,
285
298
  messageData: { configName, importerName }
286
299
  }
287
300
  );
@@ -790,7 +803,7 @@ class ConfigArrayFactory {
790
803
  });
791
804
  }
792
805
 
793
- throw configMissingError(extendName, ctx.name);
806
+ throw configInvalidError(extendName, ctx.name, "extend-config-missing");
794
807
  }
795
808
 
796
809
  /**
@@ -802,6 +815,11 @@ class ConfigArrayFactory {
802
815
  */
803
816
  _loadExtendedPluginConfig(extendName, ctx) {
804
817
  const slashIndex = extendName.lastIndexOf("/");
818
+
819
+ if (slashIndex === -1) {
820
+ throw configInvalidError(extendName, ctx.filePath, "plugin-invalid");
821
+ }
822
+
805
823
  const pluginName = extendName.slice("plugin:".length, slashIndex);
806
824
  const configName = extendName.slice(slashIndex + 1);
807
825
 
@@ -822,7 +840,7 @@ class ConfigArrayFactory {
822
840
  });
823
841
  }
824
842
 
825
- throw plugin.error || configMissingError(extendName, ctx.filePath);
843
+ throw plugin.error || configInvalidError(extendName, ctx.filePath, "extend-config-missing");
826
844
  }
827
845
 
828
846
  /**
@@ -855,7 +873,7 @@ class ConfigArrayFactory {
855
873
  } catch (error) {
856
874
  /* istanbul ignore else */
857
875
  if (error && error.code === "MODULE_NOT_FOUND") {
858
- throw configMissingError(extendName, ctx.filePath);
876
+ throw configInvalidError(extendName, ctx.filePath, "extend-config-missing");
859
877
  }
860
878
  throw error;
861
879
  }
@@ -15,7 +15,13 @@ const fs = require("fs");
15
15
  const { promisify } = require("util");
16
16
  const { CLIEngine, getCLIEngineInternalSlots } = require("../cli-engine/cli-engine");
17
17
  const BuiltinRules = require("../rules");
18
- const { getRuleSeverity } = require("../shared/config-ops");
18
+ const {
19
+ Legacy: {
20
+ ConfigOps: {
21
+ getRuleSeverity
22
+ }
23
+ }
24
+ } = require("@eslint/eslintrc");
19
25
  const { version } = require("../../package.json");
20
26
 
21
27
  //------------------------------------------------------------------------------
@@ -11,7 +11,7 @@
11
11
 
12
12
  const lodash = require("lodash"),
13
13
  recConfig = require("../../conf/eslint-recommended"),
14
- ConfigOps = require("../shared/config-ops"),
14
+ ConfigOps = require("@eslint/eslintrc/lib/shared/config-ops"),
15
15
  { Linter } = require("../linter"),
16
16
  configRule = require("./config-rule");
17
17
 
@@ -17,9 +17,9 @@ const util = require("util"),
17
17
  semver = require("semver"),
18
18
  espree = require("espree"),
19
19
  recConfig = require("../../conf/eslint-recommended"),
20
- ConfigOps = require("../shared/config-ops"),
20
+ ConfigOps = require("@eslint/eslintrc/lib/shared/config-ops"),
21
21
  log = require("../shared/logging"),
22
- naming = require("../shared/naming"),
22
+ naming = require("@eslint/eslintrc/lib/shared/naming"),
23
23
  ModuleResolver = require("../shared/relative-module-resolver"),
24
24
  autoconfig = require("./autoconfig.js"),
25
25
  ConfigFile = require("./config-file"),
@@ -265,7 +265,7 @@ function processAnswers(answers) {
265
265
  };
266
266
 
267
267
  config.parserOptions.ecmaVersion = espree.latestEcmaVersion;
268
- config.env.es2020 = true;
268
+ config.env.es2021 = true;
269
269
 
270
270
  // set the module type
271
271
  if (answers.moduleType === "esm") {
@@ -39,6 +39,17 @@ function isHandledLogicalOperator(operator) {
39
39
  return operator === "&&" || operator === "||" || operator === "??";
40
40
  }
41
41
 
42
+ /**
43
+ * Checks whether the given assignment operator is a logical assignment operator.
44
+ * Logical assignments are taken into account for the code path analysis
45
+ * because of their short-circuiting semantics.
46
+ * @param {string} operator The operator found in the AssignmentExpression node
47
+ * @returns {boolean} `true` if the operator is "&&=" or "||=" or "??="
48
+ */
49
+ function isLogicalAssignmentOperator(operator) {
50
+ return operator === "&&=" || operator === "||=" || operator === "??=";
51
+ }
52
+
42
53
  /**
43
54
  * Gets the label if the parent node of a given node is a LabeledStatement.
44
55
  * @param {ASTNode} node A node to get.
@@ -71,6 +82,9 @@ function isForkingByTrueOrFalse(node) {
71
82
  case "LogicalExpression":
72
83
  return isHandledLogicalOperator(parent.operator);
73
84
 
85
+ case "AssignmentExpression":
86
+ return isLogicalAssignmentOperator(parent.operator);
87
+
74
88
  default:
75
89
  return false;
76
90
  }
@@ -266,6 +280,15 @@ function preprocess(analyzer, node) {
266
280
  }
267
281
  break;
268
282
 
283
+ case "AssignmentExpression":
284
+ if (
285
+ parent.right === node &&
286
+ isLogicalAssignmentOperator(parent.operator)
287
+ ) {
288
+ state.makeLogicalRight();
289
+ }
290
+ break;
291
+
269
292
  case "ConditionalExpression":
270
293
  case "IfStatement":
271
294
 
@@ -413,6 +436,15 @@ function processCodePathToEnter(analyzer, node) {
413
436
  }
414
437
  break;
415
438
 
439
+ case "AssignmentExpression":
440
+ if (isLogicalAssignmentOperator(node.operator)) {
441
+ state.pushChoiceContext(
442
+ node.operator.slice(0, -1), // removes `=` from the end
443
+ isForkingByTrueOrFalse(node)
444
+ );
445
+ }
446
+ break;
447
+
416
448
  case "ConditionalExpression":
417
449
  case "IfStatement":
418
450
  state.pushChoiceContext("test", false);
@@ -491,6 +523,12 @@ function processCodePathToExit(analyzer, node) {
491
523
  }
492
524
  break;
493
525
 
526
+ case "AssignmentExpression":
527
+ if (isLogicalAssignmentOperator(node.operator)) {
528
+ state.popChoiceContext();
529
+ }
530
+ break;
531
+
494
532
  case "SwitchStatement":
495
533
  state.popSwitchContext();
496
534
  break;
@@ -317,7 +317,7 @@ class CodePathState {
317
317
  //--------------------------------------------------------------------------
318
318
 
319
319
  /**
320
- * Creates a context for ConditionalExpression, LogicalExpression,
320
+ * Creates a context for ConditionalExpression, LogicalExpression, AssignmentExpression (logical assignments only),
321
321
  * IfStatement, WhileStatement, DoWhileStatement, or ForStatement.
322
322
  *
323
323
  * LogicalExpressions have cases that it goes different paths between the
@@ -339,7 +339,7 @@ class CodePathState {
339
339
  * a -> b -> foo();
340
340
  * a -> b -> bar();
341
341
  * @param {string} kind A kind string.
342
- * If the new context is LogicalExpression's, this is `"&&"` or `"||"`.
342
+ * If the new context is LogicalExpression's or AssignmentExpression's, this is `"&&"` or `"||"` or `"??"`.
343
343
  * If it's IfStatement's or ConditionalExpression's, this is `"test"`.
344
344
  * Otherwise, this is `"loop"`.
345
345
  * @param {boolean} isForkingAsResult A flag that shows that goes different
@@ -11,7 +11,7 @@
11
11
  //------------------------------------------------------------------------------
12
12
 
13
13
  const levn = require("levn"),
14
- ConfigOps = require("../shared/config-ops");
14
+ ConfigOps = require("@eslint/eslintrc/lib/shared/config-ops");
15
15
 
16
16
  const debug = require("debug")("eslint:config-comment-parser");
17
17
 
@@ -16,11 +16,11 @@ const
16
16
  evk = require("eslint-visitor-keys"),
17
17
  espree = require("espree"),
18
18
  lodash = require("lodash"),
19
- BuiltInEnvironments = require("../../conf/environments"),
19
+ BuiltInEnvironments = require("@eslint/eslintrc/conf/environments"),
20
20
  pkg = require("../../package.json"),
21
21
  astUtils = require("../shared/ast-utils"),
22
- ConfigOps = require("../shared/config-ops"),
23
- validator = require("../shared/config-validator"),
22
+ ConfigOps = require("@eslint/eslintrc/lib/shared/config-ops"),
23
+ ConfigValidator = require("@eslint/eslintrc/lib/shared/config-validator"),
24
24
  Traverser = require("../shared/traverser"),
25
25
  { SourceCode } = require("../source-code"),
26
26
  CodePathAnalyzer = require("./code-path-analysis/code-path-analyzer"),
@@ -293,6 +293,9 @@ function getDirectiveComments(filename, ast, ruleMapper, warnInlineConfig) {
293
293
  const exportedVariables = {};
294
294
  const problems = [];
295
295
  const disableDirectives = [];
296
+ const validator = new ConfigValidator({
297
+ builtInRules: Rules
298
+ });
296
299
 
297
300
  ast.comments.filter(token => token.type !== "Shebang").forEach(comment => {
298
301
  const trimmedCommentText = stripDirectiveComment(comment.value);
@@ -60,7 +60,23 @@ function isPossibleConstructor(node) {
60
60
  return node.name !== "undefined";
61
61
 
62
62
  case "AssignmentExpression":
63
- return isPossibleConstructor(node.right);
63
+ if (["=", "&&="].includes(node.operator)) {
64
+ return isPossibleConstructor(node.right);
65
+ }
66
+
67
+ if (["||=", "??="].includes(node.operator)) {
68
+ return (
69
+ isPossibleConstructor(node.left) ||
70
+ isPossibleConstructor(node.right)
71
+ );
72
+ }
73
+
74
+ /**
75
+ * All other assignment operators are mathematical assignment operators (arithmetic or bitwise).
76
+ * An assignment expression with a mathematical operator can either evaluate to a primitive value,
77
+ * or throw, depending on the operands. Thus, it cannot evaluate to a constructor function.
78
+ */
79
+ return false;
64
80
 
65
81
  case "LogicalExpression":
66
82
  return (
@@ -39,6 +39,13 @@ module.exports = {
39
39
  type: "string"
40
40
  }
41
41
  },
42
+ exceptionPatterns: {
43
+ type: "array",
44
+ uniqueItems: true,
45
+ items: {
46
+ type: "string"
47
+ }
48
+ },
42
49
  properties: {
43
50
  enum: ["always", "never"]
44
51
  }
@@ -57,14 +64,20 @@ module.exports = {
57
64
  const minLength = typeof options.min !== "undefined" ? options.min : 2;
58
65
  const maxLength = typeof options.max !== "undefined" ? options.max : Infinity;
59
66
  const properties = options.properties !== "never";
60
- const exceptions = (options.exceptions ? options.exceptions : [])
61
- .reduce((obj, item) => {
62
- obj[item] = true;
63
-
64
- return obj;
65
- }, {});
67
+ const exceptions = new Set(options.exceptions);
68
+ const exceptionPatterns = (options.exceptionPatterns || []).map(pattern => new RegExp(pattern, "u"));
66
69
  const reportedNode = new Set();
67
70
 
71
+ /**
72
+ * Checks if a string matches the provided exception patterns
73
+ * @param {string} name The string to check.
74
+ * @returns {boolean} if the string is a match
75
+ * @private
76
+ */
77
+ function matchesExceptionPattern(name) {
78
+ return exceptionPatterns.some(pattern => pattern.test(name));
79
+ }
80
+
68
81
  const SUPPORTED_EXPRESSIONS = {
69
82
  MemberExpression: properties && function(parent) {
70
83
  return !parent.computed && (
@@ -112,7 +125,7 @@ module.exports = {
112
125
  const isShort = name.length < minLength;
113
126
  const isLong = name.length > maxLength;
114
127
 
115
- if (!(isShort || isLong) || exceptions[name]) {
128
+ if (!(isShort || isLong) || exceptions.has(name) || matchesExceptionPattern(name)) {
116
129
  return; // Nothing to report
117
130
  }
118
131
 
@@ -21,7 +21,17 @@ module.exports = {
21
21
  url: "https://eslint.org/docs/rules/no-inline-comments"
22
22
  },
23
23
 
24
- schema: [],
24
+ schema: [
25
+ {
26
+ type: "object",
27
+ properties: {
28
+ ignorePattern: {
29
+ type: "string"
30
+ }
31
+ },
32
+ additionalProperties: false
33
+ }
34
+ ],
25
35
 
26
36
  messages: {
27
37
  unexpectedInlineComment: "Unexpected comment inline with code."
@@ -30,6 +40,12 @@ module.exports = {
30
40
 
31
41
  create(context) {
32
42
  const sourceCode = context.getSourceCode();
43
+ const options = context.options[0];
44
+ let customIgnoreRegExp;
45
+
46
+ if (options && options.ignorePattern) {
47
+ customIgnoreRegExp = new RegExp(options.ignorePattern, "u");
48
+ }
33
49
 
34
50
  /**
35
51
  * Will check that comments are not on lines starting with or ending with code
@@ -51,6 +67,11 @@ module.exports = {
51
67
  return;
52
68
  }
53
69
 
70
+ // Matches the ignore pattern
71
+ if (customIgnoreRegExp && customIgnoreRegExp.test(node.value)) {
72
+ return;
73
+ }
74
+
54
75
  // JSX Exception
55
76
  if (
56
77
  (isPreambleEmpty || preamble === "{") &&
@@ -80,9 +101,9 @@ module.exports = {
80
101
 
81
102
  return {
82
103
  Program() {
83
- const comments = sourceCode.getAllComments();
84
-
85
- comments.filter(token => token.type !== "Shebang").forEach(testCodeAroundComment);
104
+ sourceCode.getAllComments()
105
+ .filter(token => token.type !== "Shebang")
106
+ .forEach(testCodeAroundComment);
86
107
  }
87
108
  };
88
109
  }