Update checked-in dependencies
This commit is contained in:
parent
6b0d45a5c6
commit
cc1adb825a
4247 changed files with 144820 additions and 149530 deletions
336
node_modules/eslint/CHANGELOG.md
generated
vendored
336
node_modules/eslint/CHANGELOG.md
generated
vendored
|
|
@ -1,3 +1,339 @@
|
|||
v7.31.0 - July 17, 2021
|
||||
|
||||
* [`efdbb12`](https://github.com/eslint/eslint/commit/efdbb1227019427ec2d968a8d6e9151dd8a77c35) Upgrade: @eslint/eslintrc to v0.4.3 (#14808) (Brandon Mills)
|
||||
* [`a96b05f`](https://github.com/eslint/eslint/commit/a96b05f6c5649cfee112d605c91d95aa191e2f78) Update: add end location to report in `consistent-return` (refs #12334) (#14798) (Nitin Kumar)
|
||||
* [`e0e8e30`](https://github.com/eslint/eslint/commit/e0e8e308929c9c66612505f2da89043f8592eea7) Docs: update BUG_REPORT template (#14787) (Nitin Kumar)
|
||||
* [`39115c8`](https://github.com/eslint/eslint/commit/39115c8b71d2629161359f6456f47fdbd552fddd) Docs: provide more context to no-eq-null (#14801) (gfyoung)
|
||||
* [`9a3c73c`](https://github.com/eslint/eslint/commit/9a3c73c130d437a65f4edba0dcb63390e68cac41) Docs: fix a broken link (#14790) (Sam Chen)
|
||||
* [`ddffa8a`](https://github.com/eslint/eslint/commit/ddffa8ad58b4b124b08061e9045fdb5370cbdbe3) Update: Indicating the operator in question (#14764) (Paul Smith)
|
||||
* [`bba714c`](https://github.com/eslint/eslint/commit/bba714c2ed813821ed288fbc07722cdde6e534fe) Update: Clarifying what changes need to be made in no-mixed-operators (#14765) (Paul Smith)
|
||||
* [`b0d22e3`](https://github.com/eslint/eslint/commit/b0d22e3eff18ea7f08189134c07cddceaec69a09) Docs: Mention benefit of providing `meta.docs.url` (#14774) (Bryan Mishkin)
|
||||
* [`000cc79`](https://github.com/eslint/eslint/commit/000cc796fd487e7b9ba8bcc5857dd691044479cc) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`a6a7438`](https://github.com/eslint/eslint/commit/a6a7438502abc6a1e29ec35cfbe2058ffc0803b1) Chore: pin fs-teardown@0.1.1 (#14771) (Milos Djermanovic)
|
||||
|
||||
v7.30.0 - July 2, 2021
|
||||
|
||||
* [`5f74642`](https://github.com/eslint/eslint/commit/5f746420700d457b92dd86659de588d272937b79) Chore: don't check Program.start in SourceCode#getComments (refs #14744) (#14748) (Milos Djermanovic)
|
||||
* [`19a871a`](https://github.com/eslint/eslint/commit/19a871a35ae9997ce352624b1081c96c54b73a9f) Docs: Suggest linting plugins for ESLint plugin developers (#14754) (Bryan Mishkin)
|
||||
* [`aa87329`](https://github.com/eslint/eslint/commit/aa87329d919f569404ca573b439934552006572f) Docs: fix broken links (#14756) (Sam Chen)
|
||||
* [`278813a`](https://github.com/eslint/eslint/commit/278813a6e759f6b5512ac64c7530c9c51732e692) Docs: fix and add more examples for new-cap rule (fixes #12874) (#14725) (Nitin Kumar)
|
||||
* [`ed1da5d`](https://github.com/eslint/eslint/commit/ed1da5d96af2587b7211854e45cf8657ef808710) Update: ecmaVersion allows "latest" (#14720) (薛定谔的猫)
|
||||
* [`104c0b5`](https://github.com/eslint/eslint/commit/104c0b592f203d315a108d311c58375357e40b24) Update: improve use-isnan rule to detect `Number.NaN` (fixes #14715) (#14718) (Nitin Kumar)
|
||||
* [`b08170b`](https://github.com/eslint/eslint/commit/b08170b92beb22db6ec612ebdfff930f9e0582ab) Update: Implement FlatConfigArray (refs #13481) (#14321) (Nicholas C. Zakas)
|
||||
* [`f113cdd`](https://github.com/eslint/eslint/commit/f113cdd872257d72bbd66d95e4eaf13623323b24) Chore: upgrade eslint-plugin-eslint-plugin (#14738) (薛定谔的猫)
|
||||
* [`1b8997a`](https://github.com/eslint/eslint/commit/1b8997ab63781f4ebf87e3269400b2ef4c7d2973) Docs: Fix getRulesMetaForResults link syntax (#14723) (Brandon Mills)
|
||||
* [`aada733`](https://github.com/eslint/eslint/commit/aada733d2aee830aa32cccb9828cd72db4ccd6bd) Docs: fix two broken links (#14726) (Sam Chen)
|
||||
* [`8972529`](https://github.com/eslint/eslint/commit/8972529f82d13bd04059ee8852b4ebb9b5350962) Docs: Update README team and sponsors (ESLint Jenkins)
|
||||
|
||||
v7.29.0 - June 18, 2021
|
||||
|
||||
* [`bfbfe5c`](https://github.com/eslint/eslint/commit/bfbfe5c1fd4c39a06d5e159dbe48479ca4305fc0) New: Add only to RuleTester (refs eslint/rfcs#73) (#14677) (Brandon Mills)
|
||||
* [`c2cd7b4`](https://github.com/eslint/eslint/commit/c2cd7b4a18057ca6067bdfc16de771dc5d90c0ea) New: Add ESLint#getRulesMetaForResults() (refs #13654) (#14716) (Nicholas C. Zakas)
|
||||
* [`eea7e0d`](https://github.com/eslint/eslint/commit/eea7e0d09d6ef43d6663cbe424e7974764a5f7fe) Chore: remove duplicate code (#14719) (Nitin Kumar)
|
||||
* [`6a1c7a0`](https://github.com/eslint/eslint/commit/6a1c7a0dac050ea5876972c50563a7eb867b38d3) Fix: allow fallthrough comment inside block (fixes #14701) (#14702) (Kevin Gibbons)
|
||||
* [`a47e5e3`](https://github.com/eslint/eslint/commit/a47e5e30b0da364593b6881f6826c595da8696f5) Docs: Add Mega-Linter to the list of integrations (#14707) (Nicolas Vuillamy)
|
||||
* [`353ddf9`](https://github.com/eslint/eslint/commit/353ddf965078030794419b089994373e27ffc86e) Chore: enable reportUnusedDisableDirectives in eslint-config-eslint (#14699) (薛定谔的猫)
|
||||
* [`757c495`](https://github.com/eslint/eslint/commit/757c49584a5852c468c1b4a0b74ad3aa39d954e5) Chore: add some rules to eslint-config-eslint (#14692) (薛定谔的猫)
|
||||
* [`c93a222`](https://github.com/eslint/eslint/commit/c93a222563177a9b5bc7a59aa106bc0a6d31e063) Docs: fix a broken link (#14697) (Sam Chen)
|
||||
* [`655c118`](https://github.com/eslint/eslint/commit/655c1187fc845bac61ae8d06c556f1a59ee2071b) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`e2bed2e`](https://github.com/eslint/eslint/commit/e2bed2ead22b575d55ccaeed94eecd3a979dd871) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`8490fb4`](https://github.com/eslint/eslint/commit/8490fb42e559ef0b3c34ac60be4e05e0d879a9cb) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`ddbe877`](https://github.com/eslint/eslint/commit/ddbe877c95224e127215d35562a175c6f2b7ba22) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.28.0 - June 4, 2021
|
||||
|
||||
* [`1237705`](https://github.com/eslint/eslint/commit/1237705dd08c209c5e3136045ec51a4ba87a3abe) Upgrade: @eslint/eslintrc to 0.4.2 (#14672) (Milos Djermanovic)
|
||||
* [`123fb86`](https://github.com/eslint/eslint/commit/123fb8648731c2c23313c544ffa1872d3024fe68) Docs: Add Feedback Needed triage description (#14670) (Nicholas C. Zakas)
|
||||
* [`c545163`](https://github.com/eslint/eslint/commit/c5451635b4e89827cfc8d8d77083647c74506e42) Update: support multiline /*eslint-env*/ directives (fixes #14652) (#14660) (薛定谔的猫)
|
||||
* [`8d1e75a`](https://github.com/eslint/eslint/commit/8d1e75a31b3e3d67130709a219bdd07ce6f3cf74) Upgrade: glob-parent version in package.json (#14658) (Hamza Najeeb)
|
||||
* [`1f048cb`](https://github.com/eslint/eslint/commit/1f048cb0eec660d2052f1758f4b2ad7b1cb424e1) Fix: no-implicit-coercion false positive with `String()` (fixes #14623) (#14641) (Milos Djermanovic)
|
||||
* [`d709abf`](https://github.com/eslint/eslint/commit/d709abfdde087325d4578b6709dc61040b8ca9d8) Chore: fix comment location in no-unused-vars (#14648) (Milos Djermanovic)
|
||||
* [`e44ce0a`](https://github.com/eslint/eslint/commit/e44ce0a8acfaad513c385150c25e76e82a1b8f12) Fix: no-duplicate-imports allow unmergeable (fixes #12758, fixes #12760) (#14238) (Soufiane Boutahlil)
|
||||
* [`bb66a3d`](https://github.com/eslint/eslint/commit/bb66a3d91af426dac9a7ffdbe47bdbbc0ffd4dd7) New: add `getPhysicalFilename()` method to rule context (fixes #11989) (#14616) (Nitin Kumar)
|
||||
* [`2e43dac`](https://github.com/eslint/eslint/commit/2e43dacd24337a82d4184fac9b44d497675f46ef) Docs: fix `no-sequences` example (#14643) (Nitin Kumar)
|
||||
* [`958ff4e`](https://github.com/eslint/eslint/commit/958ff4e8a5102f204f1484d09985e28a79790996) Docs: add note for arrow functions in no-seq rule (#14578) (Nitin Kumar)
|
||||
* [`e4f111b`](https://github.com/eslint/eslint/commit/e4f111b67d114adbf76a9c9dbb18fa4f49bc91b6) Fix: arrow-body-style crash with object pattern (fixes #14633) (#14635) (Milos Djermanovic)
|
||||
* [`ec28b5a`](https://github.com/eslint/eslint/commit/ec28b5a2bdc69f34ce29d670f5e84d2446774a00) Chore: upgrade eslint-plugin-eslint-plugin (#14590) (薛定谔的猫)
|
||||
* [`85a2725`](https://github.com/eslint/eslint/commit/85a2725b1fade5538e727102d9701ccb503e54d4) Docs: Update README team and sponsors (ESLint Jenkins)
|
||||
|
||||
v7.27.0 - May 21, 2021
|
||||
|
||||
* [`2c0868c`](https://github.com/eslint/eslint/commit/2c0868cbeadc9f42716fa1178ebdc6b4cee6d31e) Chore: merge all html formatter files into `html.js` (#14612) (Milos Djermanovic)
|
||||
* [`9e9b5e0`](https://github.com/eslint/eslint/commit/9e9b5e07475564813b62cd1d7562a93c5fb4bc74) Update: no-unused-vars false negative with comma operator (fixes #14325) (#14354) (Nitin Kumar)
|
||||
* [`afe9569`](https://github.com/eslint/eslint/commit/afe95693e1e4316a1c6f01d39345061d4c5921c7) Chore: use includes instead of indexOf (#14607) (Mikhail Bodrov)
|
||||
* [`c0f418e`](https://github.com/eslint/eslint/commit/c0f418e2476df98519bc156b81d20431984e8704) Chore: Remove lodash (#14287) (Stephen Wade)
|
||||
* [`52655dd`](https://github.com/eslint/eslint/commit/52655dd54925ee02af2ba3a0ebc09de959ae3101) Update: no-restricted-imports custom message for patterns (fixes #11843) (#14580) (Alex Holden)
|
||||
* [`967b1c4`](https://github.com/eslint/eslint/commit/967b1c4ceca8f5248378477da94ff118dafaa647) Chore: Fix typo in large.js (#14589) (Ikko Ashimine)
|
||||
* [`2466a05`](https://github.com/eslint/eslint/commit/2466a05160de60958457d984b79fd445c12ebc98) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`fe29f18`](https://github.com/eslint/eslint/commit/fe29f18227fd02fd7c3da033417d621275b00d0a) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`086c1d6`](https://github.com/eslint/eslint/commit/086c1d6e8593cf8e7851daa8f2a890c213cf6999) Chore: add more test cases for `no-sequences` (#14579) (Nitin Kumar)
|
||||
* [`6a2ced8`](https://github.com/eslint/eslint/commit/6a2ced892c0dc43fa4942293b9f1c4b9151c3741) Docs: Update README team and sponsors (ESLint Jenkins)
|
||||
|
||||
v7.26.0 - May 7, 2021
|
||||
|
||||
* [`aaf65e6`](https://github.com/eslint/eslint/commit/aaf65e629adb74401092c3ccc9cb4e4bd1c8609b) Upgrade: eslintrc for ModuleResolver fix (#14577) (Brandon Mills)
|
||||
* [`ae6dbd1`](https://github.com/eslint/eslint/commit/ae6dbd148aaca83e4bd04b9351b54029c50fac8a) Fix: track variables, not names in require-atomic-updates (fixes #14208) (#14282) (Patrick Ahmetovic)
|
||||
* [`6a86e50`](https://github.com/eslint/eslint/commit/6a86e5018a3733049c09261bcabae422fbea893d) Chore: remove loose-parser tests (fixes #14315) (#14569) (Milos Djermanovic)
|
||||
* [`ee3a3ea`](https://github.com/eslint/eslint/commit/ee3a3ead893d185cc4b1ae9041940cb0968767e1) Fix: create `.eslintrc.cjs` for `module` type (#14304) (Nitin Kumar)
|
||||
* [`6791dec`](https://github.com/eslint/eslint/commit/6791decfc58b7b09cfd0aabd15a3d14148aae073) Docs: fix example for require-atomic-updates (#14562) (Milos Djermanovic)
|
||||
* [`388eb7e`](https://github.com/eslint/eslint/commit/388eb7e14039b8951462b311d6121002ca5232cb) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`f071d1e`](https://github.com/eslint/eslint/commit/f071d1ef91286bf2e3fb63d9b679ff7702819a1e) Update: Add automated suggestion to `radix` rule for parsing decimals (#14291) (Bryan Mishkin)
|
||||
* [`0b6a3f3`](https://github.com/eslint/eslint/commit/0b6a3f31e6e78825114f82d4e0aed9cd72f784ac) New: Include XO style guide in `eslint --init` (#14193) (Federico Brigante)
|
||||
|
||||
v7.25.0 - April 23, 2021
|
||||
|
||||
* [`5df5e4a`](https://github.com/eslint/eslint/commit/5df5e4a9976964fcf4dc67e241d4e22ec1370fe0) Update: highlight last write reference for no-unused-vars (fixes #14324) (#14335) (Nitin Kumar)
|
||||
* [`0023872`](https://github.com/eslint/eslint/commit/00238729329b86b4f8af89ebfe278da3095a6075) Docs: Add deprecated note to `working-with-rules-deprecated` page (#14344) (Michael Novotny)
|
||||
* [`36fca70`](https://github.com/eslint/eslint/commit/36fca70fa29ab65080076810de98e09133254b8a) Chore: Upgrade eslump to 3.0.0 (#14350) (Stephen Wade)
|
||||
* [`59b689a`](https://github.com/eslint/eslint/commit/59b689a0b3fa658b8380431007cc1facb4617a3b) Chore: add node v16 (#14355) (薛定谔的猫)
|
||||
* [`35a1f5e`](https://github.com/eslint/eslint/commit/35a1f5e967e4e87360d3e70d3fca0f7adeeaa1d7) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`fb0a92b`](https://github.com/eslint/eslint/commit/fb0a92b3d2fed4a17bc39b7f02c540cd1175ec7d) Chore: rename misspelled identifier in test (#14346) (Tobias Nießen)
|
||||
* [`f2babb1`](https://github.com/eslint/eslint/commit/f2babb1069194166e0ac1afd1269bbd06ac299b6) Docs: update pull request template (#14336) (Nitin Kumar)
|
||||
* [`02dde29`](https://github.com/eslint/eslint/commit/02dde29eeb523ca24bc4ae7797d38627c3ba9fe9) Docs: Fix anchor in 'docs/developer-guide/working-with-rules.md' (#14332) (Nate-Wilkins)
|
||||
* [`07d14c3`](https://github.com/eslint/eslint/commit/07d14c304c358fbc9c3d318e1377d2b2bda9179f) Chore: remove extraneous command from lint-staged config (#14314) (James George)
|
||||
* [`41b3570`](https://github.com/eslint/eslint/commit/41b3570b6c014c534bb3208ed00050fd99842101) Update: lint code block with same extension but different content (#14227) (JounQin)
|
||||
* [`eb29996`](https://github.com/eslint/eslint/commit/eb299966bdc3920dd2c6f9774d95103d242fc409) Docs: add more examples with arrow functions for no-sequences rule (#14313) (Nitin Kumar)
|
||||
|
||||
v7.24.0 - April 9, 2021
|
||||
|
||||
* [`0c346c8`](https://github.com/eslint/eslint/commit/0c346c87fa83c6d1184fdafb9c0748c2e15a423d) Chore: ignore `pnpm-lock.yaml` (#14303) (Nitin Kumar)
|
||||
* [`f06ecdf`](https://github.com/eslint/eslint/commit/f06ecdf78b6d6f366434d73a6acfe7041d575223) Update: Add disallowTemplateShorthand option in no-implicit-coercion (#13579) (Remco Haszing)
|
||||
* [`71a80e3`](https://github.com/eslint/eslint/commit/71a80e38aab2dada01b808ed43d9b0e806d863c4) Docs: fix broken links in Node.js API docs toc (#14296) (u-sho (Shouhei Uechi))
|
||||
* [`bd46dc4`](https://github.com/eslint/eslint/commit/bd46dc4647faa4c3bbb5f60d4c00616a64081398) Docs: Fix incorrect reference to "braces" in arrow-parens (#14300) (emclain)
|
||||
* [`0d6235e`](https://github.com/eslint/eslint/commit/0d6235ea201b8b90761ee69bb4d46ae18899c28d) Docs: update header in max-lines (#14273) (Shinigami)
|
||||
* [`70c9216`](https://github.com/eslint/eslint/commit/70c92164017238e329e3a2d1654a0227b8f953f7) Docs: Update issue triage to include blocked column (#14275) (Nicholas C. Zakas)
|
||||
* [`abca186`](https://github.com/eslint/eslint/commit/abca186a845200fd7728c4e5f220973e640054f9) Docs: Fix typo in suggestions section (#14293) (Kevin Partington)
|
||||
* [`c4d8b0d`](https://github.com/eslint/eslint/commit/c4d8b0db62b859e721105d4bc0f4044ce346995e) Fix: no-unused-vars ignoreRestSiblings check assignments (fixes #14163) (#14264) (YeonJuan)
|
||||
* [`b51d077`](https://github.com/eslint/eslint/commit/b51d0778d76c2aa27578caca3ea82c867dced3e4) Update: add ignoreNonDeclaration to no-multi-assign rule (fixes #12545) (#14185) (t-mangoe)
|
||||
* [`c981fb1`](https://github.com/eslint/eslint/commit/c981fb1994cd04914042ced1980aa86b68ba7be9) Chore: Upgrade mocha to 8.3.2 (#14278) (Stephen Wade)
|
||||
* [`147fc04`](https://github.com/eslint/eslint/commit/147fc045e699811fab33dddf77498324ddf7e9d6) Docs: Fix `repro:needed` label in bug report template (#14285) (Milos Djermanovic)
|
||||
* [`e1cfde9`](https://github.com/eslint/eslint/commit/e1cfde93eec71a15c2df1ad660a7a6171204ba80) Docs: Update bug report template (#14276) (Nicholas C. Zakas)
|
||||
* [`c85c2f1`](https://github.com/eslint/eslint/commit/c85c2f1138a9e952655f19ee780ab0c8e35431a8) Docs: Add fatal to Node.js API LintMessage type (#14251) (Brandon Mills)
|
||||
|
||||
v7.23.0 - March 26, 2021
|
||||
|
||||
* [`687ccae`](https://github.com/eslint/eslint/commit/687ccae517b8b815cf21e948f80d22e2bf118a99) Update: add option "allowInParentheses" to no-sequences (fixes #14197) (#14199) (Daniel Rentz)
|
||||
* [`dbf2529`](https://github.com/eslint/eslint/commit/dbf252964d9a2b8957cfe0aed5c87a6d4a5cce24) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`4bdf2c1`](https://github.com/eslint/eslint/commit/4bdf2c1dade27625b601080687ce95b8c229e491) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`49d1697`](https://github.com/eslint/eslint/commit/49d16977d969070e5240074e76036f56631a90d3) Chore: Upgrade eslint-plugin-jsdoc to v25 and remove --legacy-peer-deps (#14244) (Brandon Mills)
|
||||
* [`43f1685`](https://github.com/eslint/eslint/commit/43f1685356b9840e09631843ad9ccf0440a498b0) Update: `--quiet` should not supress `--max-warnings` (fixes #14202) (#14242) (Milos Djermanovic)
|
||||
* [`909c727`](https://github.com/eslint/eslint/commit/909c7271b8d294bd884827ad5df02615b6ec5e82) Docs: Add valid example that shows vars in a block scope (#14230) (Ed S)
|
||||
* [`28583eb`](https://github.com/eslint/eslint/commit/28583eb8ada20f32579841bec3fbd60a018d5931) Fix: no-mixed-operators false positives with `? :` (fixes #14223) (#14226) (Milos Djermanovic)
|
||||
* [`a99eb2d`](https://github.com/eslint/eslint/commit/a99eb2dc2a297d16e40a9feef3956668716c4eb5) Fix: Clarify line breaks in object-curly-newline (fixes #14024) (#14063) (armin yahya)
|
||||
* [`8984c91`](https://github.com/eslint/eslint/commit/8984c91372e64d1e8dd2ce21b87b80977d57bff9) Update: eslint --env-info output os info (#14059) (薛定谔的猫)
|
||||
* [`2a79306`](https://github.com/eslint/eslint/commit/2a79306f71c4c80f1e3e73be2a140d07cf55c63d) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`ebd7026`](https://github.com/eslint/eslint/commit/ebd70263f6e6fe597613d90f4b8de84710c2f3d6) Docs: Fix typo (#14225) (Greg Finley)
|
||||
* [`a2013fc`](https://github.com/eslint/eslint/commit/a2013fcf996c8651bc760df21d900442828a6884) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.22.0 - March 12, 2021
|
||||
|
||||
* [`3a432d8`](https://github.com/eslint/eslint/commit/3a432d82b3a5710aff7da20302fe0b94fedc46c2) Docs: Improve documentation for indent rule (#14168) (Serkan Özel)
|
||||
* [`f62ec8d`](https://github.com/eslint/eslint/commit/f62ec8d30d925e70e4d0d40640857c587ac2e116) Update: throw error when fix range is invalid (#14142) (Jacob Bandes-Storch)
|
||||
* [`0eecad2`](https://github.com/eslint/eslint/commit/0eecad271358f753730741fcfcb2f7cc915c1fa7) Upgrade: Update lodash in package.json to V 4.17.21 (#14159) (Basem Al-Nabulsi)
|
||||
* [`5ad91aa`](https://github.com/eslint/eslint/commit/5ad91aa7df3d6bc185786e6eccd9e055fd951055) Update: report es2021 globals in no-extend-native (refs #13602) (#14177) (Milos Djermanovic)
|
||||
* [`c295581`](https://github.com/eslint/eslint/commit/c295581aca4e08ec4ae8e5ee5726a6f454a3ee26) Chore: remove leftover JSDoc from lint-result-cache (#14176) (Milos Djermanovic)
|
||||
* [`0d541f9`](https://github.com/eslint/eslint/commit/0d541f9d9d58966372e2055a8f69fb9483d56a4b) Chore: Reduce lodash usage (#14178) (Stephen Wade)
|
||||
* [`27a67d7`](https://github.com/eslint/eslint/commit/27a67d71ffa9bbd7af02ae448844e127bcf956dc) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`459d821`](https://github.com/eslint/eslint/commit/459d821f4a599501ceb002f9d7a5034fc45ffbb0) Chore: upgrade dependencies of browser test (#14127) (Pig Fang)
|
||||
* [`ebfb63a`](https://github.com/eslint/eslint/commit/ebfb63a682004a008f2707dbad616e5ae1630b2c) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`3ba029f`](https://github.com/eslint/eslint/commit/3ba029fbffd44068be93254890fc2aec3e92c212) Docs: Remove Extraneous Dash (#14164) (Danny Hurlburt)
|
||||
* [`6f4540e`](https://github.com/eslint/eslint/commit/6f4540ea7ea39775906526506fd7abd7ea97610c) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`ddf361c`](https://github.com/eslint/eslint/commit/ddf361ca2a2a01a9974f421e5f62270df282d0e8) Docs: Fix Formatting (#14154) (Danny Hurlburt)
|
||||
* [`c0d2ac1`](https://github.com/eslint/eslint/commit/c0d2ac16f8f9c75c62c78e9fe6a24a25ba0d7828) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`a8df03e`](https://github.com/eslint/eslint/commit/a8df03efe3bc47665d2112c2cdd5bead337d475d) Docs: Clarify triage process (#14117) (Nicholas C. Zakas)
|
||||
|
||||
v7.21.0 - February 27, 2021
|
||||
|
||||
* [`3cd5440`](https://github.com/eslint/eslint/commit/3cd5440b94d5fa4f11a09f50b685f6150f0c2d41) Upgrade: @eslint/eslintrc to 0.4.0 (#14147) (Brandon Mills)
|
||||
* [`c0b8c71`](https://github.com/eslint/eslint/commit/c0b8c71df4d0b3f54b20587432d9133741985d5c) Upgrade: Puppeteer to 7.1.0 (#14122) (Tim van der Lippe)
|
||||
* [`08ae31e`](https://github.com/eslint/eslint/commit/08ae31e539e381cd0eabf6393fa5c20f1d59125f) New: Implement cacheStrategy (refs eslint/rfcs#63) (#14119) (Manu Chambon)
|
||||
* [`5e51fd2`](https://github.com/eslint/eslint/commit/5e51fd28dc773c11c924450d24088f97f2824f00) Update: do not ignore symbolic links (fixes #13551, fixes #13615) (#14126) (Pig Fang)
|
||||
* [`87c43a5`](https://github.com/eslint/eslint/commit/87c43a5d7ea2018cffd6d9b5c431ecb60caaf0d6) Chore: improve a few comments and fix typos (#14125) (Tobias Nießen)
|
||||
* [`e19c51e`](https://github.com/eslint/eslint/commit/e19c51ea2ef2cf666d94218c66f6b223bb2e9dae) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`b8aea99`](https://github.com/eslint/eslint/commit/b8aea9988b6451b6a05af4f3ede8d6ed5c1d9926) Fix: pluralize 'line' to 'lines' in max-lines-per-function description (#14115) (Trevin Hofmann)
|
||||
* [`f5b53e2`](https://github.com/eslint/eslint/commit/f5b53e285ab5286ea382d73b379b820f649c20d0) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`eee1213`](https://github.com/eslint/eslint/commit/eee12134ce0956e9f825c1630776b1731551a948) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`5c4d7ea`](https://github.com/eslint/eslint/commit/5c4d7ea8d2e8d137c42b918dc99a84b4a5fed9b3) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.20.0 - February 12, 2021
|
||||
|
||||
* [`f4ac3b0`](https://github.com/eslint/eslint/commit/f4ac3b0e7072fbd3c14e9c64ff0c2c255a4eb730) Docs: fix sibling selector descriptions (#14099) (Milos Djermanovic)
|
||||
* [`9d6063a`](https://github.com/eslint/eslint/commit/9d6063add931f0803cae1676d5df307baf114360) Fix: Crash with esquery when using JSX (fixes #13639) (#14072) (Yosuke Ota)
|
||||
* [`a0871f1`](https://github.com/eslint/eslint/commit/a0871f1840060bd23cfe0952a096b107142db2f0) Docs: Triage process (#14014) (Nicholas C. Zakas)
|
||||
* [`ad90761`](https://github.com/eslint/eslint/commit/ad9076183bc2c2029525edfc4596e403999348d1) Update: add enforceForJSX option to no-unused-expressions rule (#14012) (Duncan Beevers)
|
||||
* [`d6c84af`](https://github.com/eslint/eslint/commit/d6c84af67318537177ffac0120a81af08e3e9df4) Fix: `--init` autoconfig shouldn't add deprecated rules (fixes #14017) (#14060) (Milos Djermanovic)
|
||||
* [`9b277a1`](https://github.com/eslint/eslint/commit/9b277a16a7261e51b7ba36d6de7f996e9203a6a4) Fix: Support ENOTDIR error code in the folder existence checking utility (#13973) (Constantine Genchevsky)
|
||||
* [`7aeb127`](https://github.com/eslint/eslint/commit/7aeb12798f2b9da706f3593f26a02e717929c9af) Upgrade: pin @babel/code-frame@7.12.11 (#14067) (Milos Djermanovic)
|
||||
* [`b4e2af5`](https://github.com/eslint/eslint/commit/b4e2af5db1c29343ffec2cd104b04bf39b77ee56) Docs: Add more fields to bug report template (#14039) (Nicholas C. Zakas)
|
||||
* [`96f1d49`](https://github.com/eslint/eslint/commit/96f1d49a4647e59f2fb918be096654e290513adc) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`cb27b0a`](https://github.com/eslint/eslint/commit/cb27b0abeda6dfee55dd43b9cbe12afad321f55d) Build: package.json update for eslint-config-eslint release (ESLint Jenkins)
|
||||
* [`4cab165`](https://github.com/eslint/eslint/commit/4cab165bf4e6e5e9f42a59a37a8ff2548c0af87d) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.19.0 - January 30, 2021
|
||||
|
||||
* [`ce7f061`](https://github.com/eslint/eslint/commit/ce7f06121d9eb9cc2b3da24b4456b4d382e1413b) Update: add shadowed variable loc to message in no-shadow (fixes #13646) (#13841) (t-mangoe)
|
||||
* [`c60e23f`](https://github.com/eslint/eslint/commit/c60e23ff306a14ca6eabcadb275ed27995fcc6e4) Update: fix `let` logic in for-in and for-of loops in no-extra-parens (#14011) (Milos Djermanovic)
|
||||
* [`d76e8f6`](https://github.com/eslint/eslint/commit/d76e8f69bd791357c67ada7b5c55608acf29b622) Fix: no-useless-rename invalid autofix with parenthesized identifiers (#14032) (Milos Djermanovic)
|
||||
* [`5800d92`](https://github.com/eslint/eslint/commit/5800d921144ec330b6ee7cd03364434007331354) Docs: Clarify stylistic rule update policy (#14052) (Brandon Mills)
|
||||
* [`0ccf6d2`](https://github.com/eslint/eslint/commit/0ccf6d200147437b338cadb34546451972befd75) Docs: remove configuring.md (#14036) (Milos Djermanovic)
|
||||
* [`65bb0ab`](https://github.com/eslint/eslint/commit/65bb0abde56f72586036fff151aa2d13f1b7be6c) Chore: Clean up new issue workflow (#14040) (Nicholas C. Zakas)
|
||||
* [`e1da90f`](https://github.com/eslint/eslint/commit/e1da90fc414a3c9c16f52db4a5bd81bd4f9532a4) Fix: nested indenting for offsetTernaryExpressions: true (fixes #13971) (#13972) (Chris Brody)
|
||||
* [`1a078b9`](https://github.com/eslint/eslint/commit/1a078b9166f29cb3760435ddbc1a0da4a0974d4a) Update: check ternary `:` even if `?` was reported in space-infix-ops (#13963) (Milos Djermanovic)
|
||||
* [`fb27422`](https://github.com/eslint/eslint/commit/fb274226242eaebc1480fc9c901202986afc3c8a) Fix: extend prefer-const fixer range to whole declaration (fixes #13899) (#14033) (Nitin Kumar)
|
||||
* [`e0b05c7`](https://github.com/eslint/eslint/commit/e0b05c704f3ce6f549d14718236d22fe49fcb611) Docs: add a correct example to no-unsafe-optional-chaining (refs #14029) (#14050) (armin yahya)
|
||||
* [`46e836d`](https://github.com/eslint/eslint/commit/46e836d46442d2ec756038a2e12ba19b74394dbd) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`3fc4fa4`](https://github.com/eslint/eslint/commit/3fc4fa485ca9ccd5e16dbc7e53ba31452d22dc4a) Docs: update configuring links (#14038) (Milos Djermanovic)
|
||||
* [`8561c21`](https://github.com/eslint/eslint/commit/8561c2116ef89e53ebffb750066f1b00a4acdb76) Docs: fix broken links in configuring/README.md (#14046) (Milos Djermanovic)
|
||||
* [`1c309eb`](https://github.com/eslint/eslint/commit/1c309ebca4a81a0faf397103dbc621019dea8c9c) Update: fix no-invalid-regexp false negatives with no flags specified (#14018) (Milos Djermanovic)
|
||||
* [`f6602d5`](https://github.com/eslint/eslint/commit/f6602d569427e9e2a4f3b5ca3fc3a8bffb28d15e) Docs: Reorganize Configuration Documentation (#13837) (klkhan)
|
||||
* [`c753b44`](https://github.com/eslint/eslint/commit/c753b442ef67867a178ffc2ad29b4e0534f72469) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`a4fdb70`](https://github.com/eslint/eslint/commit/a4fdb7001aa41b9ad8bb92cc8a47b9135c94afc7) Docs: Fixed Typo (#14007) (Yash Singh)
|
||||
* [`f7ca481`](https://github.com/eslint/eslint/commit/f7ca48165d025e01c38698352cff24d1de87cc8b) Docs: Explain why we disable lock files (refs eslint/tsc-meetings#234) (#14006) (Brandon Mills)
|
||||
|
||||
v7.18.0 - January 15, 2021
|
||||
|
||||
* [`e3264b2`](https://github.com/eslint/eslint/commit/e3264b26a625d926a1ea96df1c4b643af5c3797c) Upgrade: @eslint/eslintrc to improve error message for invalid extends (#14009) (Milos Djermanovic)
|
||||
* [`f17c3c3`](https://github.com/eslint/eslint/commit/f17c3c371789ffa84f0cda57101e8193899adbe6) Update: check logical assignment operators in the complexity rule (#13979) (Milos Djermanovic)
|
||||
* [`672deb0`](https://github.com/eslint/eslint/commit/672deb057a14a7acad8c669189870009f1edb8a6) Docs: fix no-invalid-regexp docs regarding ecmaVersion (#13991) (Milos Djermanovic)
|
||||
* [`179a910`](https://github.com/eslint/eslint/commit/179a910b32e853bc12a9dd71f7c10e762cbeac44) Fix: --init crash on question to upgrade/downgrade ESLint (fixes #13978) (#13995) (Milos Djermanovic)
|
||||
* [`292b1c0`](https://github.com/eslint/eslint/commit/292b1c0017bc442d399f67e01d699c59e6b71453) Fix: no-extra-parens false positive with `let` identifier in for-loop (#13981) (Milos Djermanovic)
|
||||
* [`de61f94`](https://github.com/eslint/eslint/commit/de61f9444cf58a4d70e126ab3d10bf20851de7c9) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`9250d16`](https://github.com/eslint/eslint/commit/9250d167ceb5684669eabe93dae326e33f0684f2) Upgrade: Bump lodash to fix security issue (#13993) (Frederik Prijck)
|
||||
* [`75fea9b`](https://github.com/eslint/eslint/commit/75fea9bcdd3dde5a07e0089d9011a4df518cdbe3) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`f2687e7`](https://github.com/eslint/eslint/commit/f2687e71f9e2a2773f821c4dc1a02abe95b97df4) Docs: update space-in-parens related rules (#13985) (Chris Brody)
|
||||
* [`4a38bbe`](https://github.com/eslint/eslint/commit/4a38bbe81b4b29ca1a4e62d0a0cc8d525455b063) Docs: space-in-parens examples with no arguments etc. (#13987) (Chris Brody)
|
||||
* [`3e49169`](https://github.com/eslint/eslint/commit/3e491698687aa08b3b798cee0931f0872ca1bc55) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`c5bf1f2`](https://github.com/eslint/eslint/commit/c5bf1f2150a9fbbb9e74c04808dc3bfeda1ed321) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`98a729c`](https://github.com/eslint/eslint/commit/98a729c9def54cee9e5478e75e8bd6f28167d5e8) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`e83a696`](https://github.com/eslint/eslint/commit/e83a6962b51b05c2ddfe42b0748b405d515eeb9d) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`78cb483`](https://github.com/eslint/eslint/commit/78cb48345c725e9f90fd0e631c476802244df4a4) Chore: test `foo( )` with space-in-parens option "always" (#13986) (Chris Brody)
|
||||
* [`f6948f6`](https://github.com/eslint/eslint/commit/f6948f6bdc763dca0787bb2786bc9f6f9ed88f43) Docs: Update semantic versioning policy (#13970) (Nicholas C. Zakas)
|
||||
* [`0688212`](https://github.com/eslint/eslint/commit/068821248e2d2eff11152f270102d537d8fa8126) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`aeba5e5`](https://github.com/eslint/eslint/commit/aeba5e5e6062095a06d9b867d7e7ee75422f25b9) Chore: fix typo (#13975) (Nitin Kumar)
|
||||
* [`4ee1134`](https://github.com/eslint/eslint/commit/4ee113414bdcbea240a5d9db27da6a10df472005) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.17.0 - January 1, 2021
|
||||
|
||||
* [`e128e77`](https://github.com/eslint/eslint/commit/e128e775e9fa116a0ad68a071f1f0997589f8cd4) Update: check logical assignment in no-constant-condition (#13946) (Milos Djermanovic)
|
||||
* [`cc48713`](https://github.com/eslint/eslint/commit/cc4871369645c3409dc56ded7a555af8a9f63d51) Chore: refactor calculating range and loc in no-useless-escape (#13964) (Milos Djermanovic)
|
||||
* [`535fe47`](https://github.com/eslint/eslint/commit/535fe47fee6544b4957378f9408117c8318d4762) Update: use regexpp's default ecmaVersion in no-control-regex (#13969) (Milos Djermanovic)
|
||||
* [`83e98cd`](https://github.com/eslint/eslint/commit/83e98cd48ce3d1acf729f4fb9be40cff332abd6e) Fix: use regexpp's default ecmaVersion in no-invalid-regexp (#13968) (Milos Djermanovic)
|
||||
* [`7297363`](https://github.com/eslint/eslint/commit/7297363ea355d0e3b2a74aaec586126deb91fd93) Docs: fix examples for no-multi-str (#13966) (Milos Djermanovic)
|
||||
* [`0649871`](https://github.com/eslint/eslint/commit/06498716bfba65ed8c7217917a29a07ad267193a) Update: add autofix to rule multiline-ternary (#13958) (薛定谔的猫)
|
||||
* [`f6e7e32`](https://github.com/eslint/eslint/commit/f6e7e3231bc43c989f8c953de8e0d328bac5eea0) Fix: no-useless-escape wrong loc and fix with CRLF in template elements (#13953) (Milos Djermanovic)
|
||||
* [`19c69c0`](https://github.com/eslint/eslint/commit/19c69c0293a98634ff0d4884a0cdabc1213ebcb4) Fix: one-var shouldn't split declaration if it isn't in a statement list (#13959) (Milos Djermanovic)
|
||||
* [`e451b96`](https://github.com/eslint/eslint/commit/e451b9664aface32ad9321eaf5619c875dc76553) Docs: update build tool for webpack (#13962) (Sam Chen)
|
||||
* [`c3e9acc`](https://github.com/eslint/eslint/commit/c3e9accce2f61b04ab699fd37c90703305281aa3) Chore: fix typos (#13960) (YeonJuan)
|
||||
* [`7289ecf`](https://github.com/eslint/eslint/commit/7289ecf58ed0d2e7f0ad7f1e5004c8927a7bf805) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.16.0 - December 18, 2020
|
||||
|
||||
* [`a62ad6f`](https://github.com/eslint/eslint/commit/a62ad6f03151358b93b5fede022a30d67310705c) Update: fix false negative of no-extra-parens with NewExpression (#13930) (Milos Djermanovic)
|
||||
* [`f85b4c7`](https://github.com/eslint/eslint/commit/f85b4c72668c95c79fdb342b74dbd53d21baa93f) Fix: require-atomic-updates false positive across await (fixes #11954) (#13915) (buhi)
|
||||
* [`301d0c0`](https://github.com/eslint/eslint/commit/301d0c05229dbd6cfb1045d716524e8ec46fa2c1) Fix: no-constant-condition false positives with unary expressions (#13927) (Milos Djermanovic)
|
||||
* [`555c128`](https://github.com/eslint/eslint/commit/555c128b49ae6d9c100a9f8429416417edb40d13) Fix: false positive with await and ** in no-extra-parens (fixes #12739) (#13923) (Milos Djermanovic)
|
||||
* [`d93c935`](https://github.com/eslint/eslint/commit/d93c9350361d2aa1a1976c553e47ab399e51e8c9) Docs: update JSON Schema links (#13936) (Milos Djermanovic)
|
||||
* [`8d0c93a`](https://github.com/eslint/eslint/commit/8d0c93a7ef9449c7b7d082bbb4b7d8465b0d6bac) Upgrade: table@6.0.4 (#13920) (Rouven Weßling)
|
||||
* [`9247683`](https://github.com/eslint/eslint/commit/924768377a4935a95a6ff3866f9545a5a6178b53) Docs: Remove for deleted npm run profile script (#13931) (Brandon Mills)
|
||||
* [`ab240d4`](https://github.com/eslint/eslint/commit/ab240d49833b4e6e594667c1abe5b0caa8a9cf70) Fix: prefer-exponentiation-operator invalid autofix with await (#13924) (Milos Djermanovic)
|
||||
* [`dc76911`](https://github.com/eslint/eslint/commit/dc7691103554a99bdb2142561cb507f50f547e3b) Chore: Add .pre-commit-hooks.yaml file (#13628) (Álvaro Mondéjar)
|
||||
* [`2124e1b`](https://github.com/eslint/eslint/commit/2124e1b5dad30a905dc26bde9da472bf622d3f50) Docs: Fix wrong rule name (#13913) (noisyboy25)
|
||||
* [`06b5809`](https://github.com/eslint/eslint/commit/06b58096975935ec016d96dd5f333f059c270f26) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`26fc12f`](https://github.com/eslint/eslint/commit/26fc12f88109af9d4081bf0e16364c411bce3009) Docs: Update README team and sponsors (ESLint Jenkins)
|
||||
|
||||
v7.15.0 - December 5, 2020
|
||||
|
||||
* [`5c11aab`](https://github.com/eslint/eslint/commit/5c11aabbe8249aeb8cad29bc6a33fc20c8c683ef) Upgrade: @eslint/esintrc and espree for bug fixes (refs #13878) (#13908) (Brandon Mills)
|
||||
* [`0eb7957`](https://github.com/eslint/eslint/commit/0eb7957e27fd521317bd5c8479ce7abc1399169c) Upgrade: file-entry-cache@6.0.0 (#13877) (Rouven Weßling)
|
||||
* [`683ad00`](https://github.com/eslint/eslint/commit/683ad00c41e1ae4d889deff82b2a94318e8c2129) New: no-unsafe-optional-chaining rule (fixes #13431) (#13859) (YeonJuan)
|
||||
* [`cbc57fb`](https://github.com/eslint/eslint/commit/cbc57fb7d07c00663ed5781f5e6bc8f534cc2d76) Fix: one-var autofixing for export (fixes #13834) (#13891) (Anix)
|
||||
* [`110cf96`](https://github.com/eslint/eslint/commit/110cf962d05625a8a1bf7b5f4ec2194db150eb32) Docs: Fix a broken link in working-with-rules.md (#13875) (Anton Niklasson)
|
||||
|
||||
v7.14.0 - November 20, 2020
|
||||
|
||||
* [`5f09073`](https://github.com/eslint/eslint/commit/5f0907399a9666dec78c74384c8969c01483c30e) Update: fix 'skip' options in no-irregular-whitespace (fixes #13852) (#13853) (Milos Djermanovic)
|
||||
* [`1861b40`](https://github.com/eslint/eslint/commit/1861b4086f1018f43ab19744d866d5da986c500d) Docs: correct the function-call-argument-newline 'default' descriptions (#13866) (Trevin Hofmann)
|
||||
* [`98c00c4`](https://github.com/eslint/eslint/commit/98c00c41d2aecb3a990393d430694f4ce6b47de5) New: Add no-nonoctal-decimal-escape rule (fixes #13765) (#13845) (Milos Djermanovic)
|
||||
* [`95d2fe6`](https://github.com/eslint/eslint/commit/95d2fe6057498fc1cc2193d28c8c2d1593224b33) Chore: remove eslint comment from no-octal-escape tests (#13846) (Milos Djermanovic)
|
||||
* [`2004b7e`](https://github.com/eslint/eslint/commit/2004b7ecd3db0d4e7376cc3344246f7b9ada5801) Fix: enable debug logs for @eslint/eslintrc (fixes #13850) (#13861) (Milos Djermanovic)
|
||||
* [`d2239a1`](https://github.com/eslint/eslint/commit/d2239a1fdec452e24ede04e990d16d42516fa538) Fix: no-useless-constructor crash on bodyless constructor (fixes #13830) (#13842) (Ari Perkkiö)
|
||||
* [`eda0aa1`](https://github.com/eslint/eslint/commit/eda0aa18498dd85eb618873e8e0f4ac97032cfca) Docs: no-restricted-imports is only for static imports (#13863) (Robat Williams)
|
||||
* [`042ae44`](https://github.com/eslint/eslint/commit/042ae44682a8a6c5037d920689124e2304056dd8) Docs: Fix JS syntax and doc URL in working-with-custom-formatters.md (#13828) (Raphael LANG)
|
||||
* [`038dc73`](https://github.com/eslint/eslint/commit/038dc73c99ae68eae2035ef303f3a947053c8f05) Chore: Test on Node.js 15 (#13844) (Brandon Mills)
|
||||
* [`37a06d6`](https://github.com/eslint/eslint/commit/37a06d633d3669f0f43236141dc43465b8bc7ec5) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.13.0 - November 6, 2020
|
||||
|
||||
* [`254e00f`](https://github.com/eslint/eslint/commit/254e00fea8745ff5a8bcc8cb874fcfd02996d81b) New: Configurable List Size For Per-Rule Performance Metrics (#13812) (Bryan Mishkin)
|
||||
* [`6c3c710`](https://github.com/eslint/eslint/commit/6c3c710ade7cd8654990f1adb55b58f038eab92d) Docs: fix broken url in docs (#13815) (SaintMalik)
|
||||
* [`4a09149`](https://github.com/eslint/eslint/commit/4a091495a236d231a5065ece972719a0c4dd1b77) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`fb6fcbf`](https://github.com/eslint/eslint/commit/fb6fcbfe0a8c41b92f0a33ab90f159037bd195e2) Docs: Fix reference to Code of Conduct (#13797) (Tobias Nießen)
|
||||
* [`1b89ebe`](https://github.com/eslint/eslint/commit/1b89ebe1bdbef7de6001100945b8f71429df302c) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.12.1 - October 26, 2020
|
||||
|
||||
* [`08f33e8`](https://github.com/eslint/eslint/commit/08f33e8b9a353c3183be6f937785db7a30fb90eb) Upgrade: @eslint/eslintrc to fix rule schema validation (fixes #13793) (#13794) (Brandon Mills)
|
||||
* [`aeef485`](https://github.com/eslint/eslint/commit/aeef485dc790571b1a82ac09904329e0226b66a9) Fix: Pass internal config paths in FileEnumerator default (fixes #13789) (#13792) (Brandon Mills)
|
||||
* [`631ae8b`](https://github.com/eslint/eslint/commit/631ae8b50e5f7975f10860e9e763b70b4f25182e) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.12.0 - October 23, 2020
|
||||
|
||||
* [`cbf3585`](https://github.com/eslint/eslint/commit/cbf3585f1d6c60414c07380367a8b4505ee3538d) Update: skip keyword check for fns in space-before-blocks (fixes #13553) (#13712) (Milos Djermanovic)
|
||||
* [`256f656`](https://github.com/eslint/eslint/commit/256f656455b47bcf9ed3fc30fbf72532678f97da) Fix: autofix shouldn't produce template literals with `\8` or `\9` (#13737) (Milos Djermanovic)
|
||||
* [`b165aa5`](https://github.com/eslint/eslint/commit/b165aa5f4d4d19328f13ab80e5f058cbce94c3a6) Fix: yoda rule autofix produces syntax errors with adjacent tokens (#13760) (Milos Djermanovic)
|
||||
* [`3175316`](https://github.com/eslint/eslint/commit/3175316db26aebef4b19e269aca90c8ce3955363) Fix: prefer-destructuring invalid autofix with comma operator (#13761) (Milos Djermanovic)
|
||||
* [`1a9f171`](https://github.com/eslint/eslint/commit/1a9f17151a4e93eb17c8a2bf4f0a5320cce616de) Chore: Remove more ESLintRC-related files (refs #13481) (#13762) (Nicholas C. Zakas)
|
||||
* [`bfddced`](https://github.com/eslint/eslint/commit/bfddcedace5587d662c840c2edf33062b54a178e) Update: remove suggestion if it didn't provide a fix (fixes #13723) (#13772) (Milos Djermanovic)
|
||||
* [`5183b14`](https://github.com/eslint/eslint/commit/5183b14a2420b42b4089fb134a61ae57142f31fd) Update: check template literal in no-script-url (#13775) (YeonJuan)
|
||||
* [`bfe97d2`](https://github.com/eslint/eslint/commit/bfe97d2332e711ca76b1fd2e7f8548b0cc84cb1c) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`6c51ade`](https://github.com/eslint/eslint/commit/6c51adeb86f1de292cd02d2ee19f7b56182e358b) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`603de04`](https://github.com/eslint/eslint/commit/603de04cab5e700df12999af2918decd4da9d11b) Update: treat all literals like boolean literal in no-constant-condition (#13245) (Zen)
|
||||
* [`289aa6f`](https://github.com/eslint/eslint/commit/289aa6fcef3874ba5f86455f9302dc4209ea83e5) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`9a1f669`](https://github.com/eslint/eslint/commit/9a1f6694e59eb3e584d4c5a98b98675c895a9783) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`637f818`](https://github.com/eslint/eslint/commit/637f8187404ded600fb3d4013b3cd495d5ae675b) Docs: add more examples for no-func-assign (fixes #13705) (#13777) (Nitin Kumar)
|
||||
* [`17cc0dd`](https://github.com/eslint/eslint/commit/17cc0dd9b5d2d500359c36881cd3e5637443c133) Chore: add test case for no-func-assign (refs #13705) (#13783) (Nitin Kumar)
|
||||
* [`dee0f77`](https://github.com/eslint/eslint/commit/dee0f7764a1d5a323c89b22c4db94acee2b3c718) Docs: add TOC to user-guide/configuring.md (#13727) (metasean)
|
||||
* [`0510621`](https://github.com/eslint/eslint/commit/05106212985cb1ffa1e6fa996a57f6fd2fc3c970) Update: Fix && vs || short-circuiting false negatives (fixes #13634) (#13769) (Brandon Mills)
|
||||
* [`8b6ed69`](https://github.com/eslint/eslint/commit/8b6ed691c48189b7d096339441a78cb5874d4137) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`1457509`](https://github.com/eslint/eslint/commit/145750991b04fd4cfb3fff3c5d4211a4428e011c) Docs: fix broken links in Node.js API docs (#13771) (Laura Barluzzi)
|
||||
* [`7c813d4`](https://github.com/eslint/eslint/commit/7c813d458f9aedf7a94351d137728a4647542879) Docs: Fix typo in v7 migration page (#13778) (Yusuke Sasaki)
|
||||
* [`b025795`](https://github.com/eslint/eslint/commit/b0257953be704d0bb387fc15afd7859fd6f19ba5) Docs: Fix the format option name in the document (#13770) (Hideki Igarashi)
|
||||
* [`84fd591`](https://github.com/eslint/eslint/commit/84fd591c234accc41bb5af555f178825012fd35d) Chore: Increase Mocha timeout for copying fixtures (#13768) (Brandon Mills)
|
||||
* [`1faeb84`](https://github.com/eslint/eslint/commit/1faeb84e663d88c5d85a3cb3f15cd224cc552c2d) Docs: clarify that space-unary-ops doesn't apply when space is required (#13767) (Taylor Morgan)
|
||||
* [`67c0605`](https://github.com/eslint/eslint/commit/67c06059dd1ddcee6f369c650ce71220da1510c3) Update: check computed keys in no-prototype-builtins (fixes #13088) (#13755) (Milos Djermanovic)
|
||||
* [`b5e011c`](https://github.com/eslint/eslint/commit/b5e011c865e95d700d29cb9a4ba71c671d99e423) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.11.0 - October 9, 2020
|
||||
|
||||
* [`23e966f`](https://github.com/eslint/eslint/commit/23e966f6cf2a6c6b699dff5d6950ece3cc396498) Chore: Refactor CLIEngine tests (refs #13481) (#13709) (Nicholas C. Zakas)
|
||||
* [`fa9429a`](https://github.com/eslint/eslint/commit/fa9429aac0ffed505f3f02e8fc75f646c69f5c61) Fix: don't count line after EOF in max-lines (#13735) (Milos Djermanovic)
|
||||
* [`d973675`](https://github.com/eslint/eslint/commit/d973675a5c06a2bd4f8ce640c78b67842cfebfd4) Docs: Update anchor links to use existing linkrefs (refs #13715) (#13741) (Brandon Mills)
|
||||
* [`2c6d774`](https://github.com/eslint/eslint/commit/2c6d774c89dcd14f386bd9d73d451fa2a892c3ef) Docs: Fix typos (#13730) (Frieder Bluemle)
|
||||
* [`cc468c0`](https://github.com/eslint/eslint/commit/cc468c01021385a028de727eefcd442e7f34875c) Upgrade: eslint-visitor-keys@2.0.0 (#13732) (Milos Djermanovic)
|
||||
* [`ab0ac6c`](https://github.com/eslint/eslint/commit/ab0ac6c532fb7b7d49779c8913146244d680743b) Docs: Fix anchor links (#13715) (Gary Moore)
|
||||
* [`27f0de6`](https://github.com/eslint/eslint/commit/27f0de62e6281c28043be38ef051818c9edc15cd) Fix: account for linebreaks before postfix `++`/`--` in no-extra-parens (#13731) (Milos Djermanovic)
|
||||
* [`da78fa1`](https://github.com/eslint/eslint/commit/da78fa11632a2908db4ac494012a16f5d5a88a64) Update: support async arrow fn in function-paren-newline (fixes #13728) (#13729) (Michal Dziekonski)
|
||||
* [`fe301b8`](https://github.com/eslint/eslint/commit/fe301b8cc0762d7f4edd59603ca51ed0ec0c2a43) Docs: Add configuration comments in examples (#13738) (YeonJuan)
|
||||
* [`504408c`](https://github.com/eslint/eslint/commit/504408cd65e9d8827b2b8bbeb8f589df90eee523) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`3900659`](https://github.com/eslint/eslint/commit/390065985b2289ad4412a83598e3e833c382d27e) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`c1974b3`](https://github.com/eslint/eslint/commit/c1974b3f7169a8e5fab7007df92d02d8c1a8d5a3) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`6f4abe5`](https://github.com/eslint/eslint/commit/6f4abe5d5ade2711cc4c21bc8485af952763c2d3) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.10.0 - September 26, 2020
|
||||
|
||||
* [`6919fbb`](https://github.com/eslint/eslint/commit/6919fbb83f86552b0f49ae749da866e4edc7c46a) Docs: Clarify that ignorePattern should be a string (refs #13029) (#13718) (Brandon Mills)
|
||||
* [`07d9bea`](https://github.com/eslint/eslint/commit/07d9bea7c6f953e8f754afffc9752edcee799431) Update: Add ignorePattern to no-inline-comments (#13029) (Edie Lemoine)
|
||||
* [`d79bbe9`](https://github.com/eslint/eslint/commit/d79bbe982930b53358d34ad91cc6e5eaac8ddede) Docs: fix typo (#13717) (Alexander Liu)
|
||||
* [`9b8490e`](https://github.com/eslint/eslint/commit/9b8490ee6391c986b1314540a92b71d8c1e0efc4) Docs: grammatical error (#13687) (rajdeep)
|
||||
* [`cb44e93`](https://github.com/eslint/eslint/commit/cb44e93f4780e925a75a68ce2f7f6d065b5f756c) Fix: prefer-destructuring invalid autofix with computed property access (#13704) (Milos Djermanovic)
|
||||
* [`46c73b1`](https://github.com/eslint/eslint/commit/46c73b159a5ceed2f7f26f254fd97e459fb0e81a) Upgrade: eslint-scope@5.1.1 (#13716) (Milos Djermanovic)
|
||||
* [`b7b12ba`](https://github.com/eslint/eslint/commit/b7b12ba0bd4e9c66883f11e97de8ed84b600cdaa) Chore: Move comment to make tests more organized (#13707) (Yusuke Tanaka)
|
||||
* [`51674a4`](https://github.com/eslint/eslint/commit/51674a4113a1ca877094606bbf4938ab06cc1aad) Docs: Add missing quotes (#13714) (Lucio Paiva)
|
||||
* [`7c34a98`](https://github.com/eslint/eslint/commit/7c34a982aaf93a02348f56c9ce887c7dcf51b5bd) Chore: remove mistakenly added file (#13710) (Milos Djermanovic)
|
||||
* [`30b76c9`](https://github.com/eslint/eslint/commit/30b76c9a13fae3dff59f7db406d6c66f11152973) Docs: Clarify package.json requirement in Getting Started (refs #13549) (#13696) (Nicholas C. Zakas)
|
||||
* [`044560d`](https://github.com/eslint/eslint/commit/044560dcc74db98b28e293da2e2f3b41ecbf5884) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
* [`54000d1`](https://github.com/eslint/eslint/commit/54000d13f27d5255851b5ac0606ad027e2b8d331) Sponsors: Sync README with website (ESLint Jenkins)
|
||||
|
||||
v7.9.0 - September 12, 2020
|
||||
|
||||
* [`3ca2700`](https://github.com/eslint/eslint/commit/3ca27004ece5016ba7aed775f01ad13bc9282296) Fix: Corrected notice for invalid (:) plugin names (#13473) (Josh Goldberg)
|
||||
|
|
|
|||
64
node_modules/eslint/README.md
generated
vendored
64
node_modules/eslint/README.md
generated
vendored
|
|
@ -1,4 +1,4 @@
|
|||
[](https://www.npmjs.com/package/eslint)
|
||||
[](https://www.npmjs.com/package/eslint)
|
||||
[](https://www.npmjs.com/package/eslint)
|
||||
[](https://github.com/eslint/eslint/actions)
|
||||
[](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Feslint%2Feslint?ref=badge_shield)
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
[Rules](https://eslint.org/docs/rules/) |
|
||||
[Contributing](https://eslint.org/docs/developer-guide/contributing) |
|
||||
[Reporting Bugs](https://eslint.org/docs/developer-guide/contributing/reporting-bugs) |
|
||||
[Code of Conduct](https://js.foundation/community/code-of-conduct) |
|
||||
[Code of Conduct](https://eslint.org/conduct) |
|
||||
[Twitter](https://twitter.com/geteslint) |
|
||||
[Mailing List](https://groups.google.com/group/eslint) |
|
||||
[Chat Room](https://eslint.org/chat)
|
||||
|
|
@ -35,10 +35,11 @@ ESLint is a tool for identifying and reporting on patterns found in ECMAScript/J
|
|||
6. [Releases](#releases)
|
||||
7. [Security Policy](#security-policy)
|
||||
8. [Semantic Versioning Policy](#semantic-versioning-policy)
|
||||
9. [License](#license)
|
||||
10. [Team](#team)
|
||||
11. [Sponsors](#sponsors)
|
||||
12. [Technology Sponsors](#technology-sponsors)
|
||||
9. [Stylistic Rule Updates](#stylistic-rule-updates)
|
||||
10. [License](#license)
|
||||
11. [Team](#team)
|
||||
12. [Sponsors](#sponsors)
|
||||
13. [Technology Sponsors](#technology-sponsors)
|
||||
|
||||
## <a name="installation-and-usage"></a>Installation and Usage
|
||||
|
||||
|
|
@ -85,7 +86,7 @@ The three error levels allow you fine-grained control over how ESLint applies ru
|
|||
|
||||
## <a name="code-of-conduct"></a>Code of Conduct
|
||||
|
||||
ESLint adheres to the [JS Foundation Code of Conduct](https://js.foundation/community/code-of-conduct).
|
||||
ESLint adheres to the [JS Foundation Code of Conduct](https://eslint.org/conduct).
|
||||
|
||||
## <a name="filing-issues"></a>Filing Issues
|
||||
|
||||
|
|
@ -136,6 +137,16 @@ Once a language feature has been adopted into the ECMAScript standard (stage 4 a
|
|||
|
||||
Join our [Mailing List](https://groups.google.com/group/eslint) or [Chatroom](https://eslint.org/chat).
|
||||
|
||||
### Why doesn't ESLint lock dependency versions?
|
||||
|
||||
Lock files like `package-lock.json` are helpful for deployed applications. They ensure that dependencies are consistent between environments and across deployments.
|
||||
|
||||
Packages like `eslint` that get published to the npm registry do not include lock files. `npm install eslint` as a user will respect version constraints in ESLint's `package.json`. ESLint and its dependencies will be included in the user's lock file if one exists, but ESLint's own lock file would not be used.
|
||||
|
||||
We intentionally don't lock dependency versions so that we have the latest compatible dependency versions in development and CI that our users get when installing ESLint in a project.
|
||||
|
||||
The Twilio blog has a [deeper dive](https://www.twilio.com/blog/lockfiles-nodejs) to learn more.
|
||||
|
||||
## <a name="releases"></a>Releases
|
||||
|
||||
We have scheduled releases every two weeks on Friday or Saturday. You can follow a [release issue](https://github.com/eslint/eslint/issues?q=is%3Aopen+is%3Aissue+label%3Arelease) for updates about the scheduling of any particular release.
|
||||
|
|
@ -158,6 +169,7 @@ ESLint follows [semantic versioning](https://semver.org). However, due to the na
|
|||
* A bug fix in a rule that results in ESLint reporting more linting errors.
|
||||
* A new rule is created.
|
||||
* A new option to an existing rule that does not result in ESLint reporting more linting errors by default.
|
||||
* A new addition to an existing rule to support a newly-added language feature (within the last 12 months) that will result in ESLint reporting more linting errors by default.
|
||||
* An existing rule is deprecated.
|
||||
* A new CLI capability is created.
|
||||
* New capabilities to the public API are added (new classes, new methods, new arguments to existing methods, etc.).
|
||||
|
|
@ -176,6 +188,15 @@ ESLint follows [semantic versioning](https://semver.org). However, due to the na
|
|||
|
||||
According to our policy, any minor update may report more linting errors than the previous release (ex: from a bug fix). As such, we recommend using the tilde (`~`) in `package.json` e.g. `"eslint": "~3.1.0"` to guarantee the results of your builds.
|
||||
|
||||
## <a name="stylistic-rule-updates"></a>Stylistic Rule Updates
|
||||
|
||||
Stylistic rules are frozen according to [our policy](https://eslint.org/blog/2020/05/changes-to-rules-policies) on how we evaluate new rules and rule changes.
|
||||
This means:
|
||||
|
||||
* **Bug fixes**: We will still fix bugs in stylistic rules.
|
||||
* **New ECMAScript features**: We will also make sure stylistic rules are compatible with new ECMAScript features.
|
||||
* **New options**: We will **not** add any new options to stylistic rules unless an option is the only way to fix a bug or support a newly-added ECMAScript feature.
|
||||
|
||||
## <a name="license"></a>License
|
||||
|
||||
[](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Feslint%2Feslint?ref=badge_large)
|
||||
|
|
@ -202,16 +223,6 @@ Nicholas C. Zakas
|
|||
Brandon Mills
|
||||
</a>
|
||||
</td><td align="center" valign="top" width="11%">
|
||||
<a href="https://github.com/mysticatea">
|
||||
<img src="https://github.com/mysticatea.png?s=75" width="75" height="75"><br />
|
||||
Toru Nagashima
|
||||
</a>
|
||||
</td><td align="center" valign="top" width="11%">
|
||||
<a href="https://github.com/kaicataldo">
|
||||
<img src="https://github.com/kaicataldo.png?s=75" width="75" height="75"><br />
|
||||
Kai Cataldo
|
||||
</a>
|
||||
</td><td align="center" valign="top" width="11%">
|
||||
<a href="https://github.com/mdjermanovic">
|
||||
<img src="https://github.com/mdjermanovic.png?s=75" width="75" height="75"><br />
|
||||
Milos Djermanovic
|
||||
|
|
@ -224,6 +235,11 @@ Milos Djermanovic
|
|||
The people who review and implement new features.
|
||||
|
||||
<table><tbody><tr><td align="center" valign="top" width="11%">
|
||||
<a href="https://github.com/mysticatea">
|
||||
<img src="https://github.com/mysticatea.png?s=75" width="75" height="75"><br />
|
||||
Toru Nagashima
|
||||
</a>
|
||||
</td><td align="center" valign="top" width="11%">
|
||||
<a href="https://github.com/aladdin-add">
|
||||
<img src="https://github.com/aladdin-add.png?s=75" width="75" height="75"><br />
|
||||
薛定谔的猫
|
||||
|
|
@ -252,6 +268,11 @@ Anix
|
|||
<img src="https://github.com/yeonjuan.png?s=75" width="75" height="75"><br />
|
||||
YeonJuan
|
||||
</a>
|
||||
</td><td align="center" valign="top" width="11%">
|
||||
<a href="https://github.com/snitin315">
|
||||
<img src="https://github.com/snitin315.png?s=75" width="75" height="75"><br />
|
||||
Nitin Kumar
|
||||
</a>
|
||||
</td></tr></tbody></table>
|
||||
|
||||
|
||||
|
|
@ -263,10 +284,11 @@ The following companies, organizations, and individuals support ESLint's ongoing
|
|||
|
||||
<!-- NOTE: This section is autogenerated. Do not manually edit.-->
|
||||
<!--sponsorsstart-->
|
||||
<h3>Gold Sponsors</h3>
|
||||
<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>
|
||||
<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>
|
||||
<p><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>
|
||||
<h3>Platinum Sponsors</h3>
|
||||
<p><a href="https://automattic.com"><img src="https://images.opencollective.com/photomatt/d0ef3e1/logo.png" alt="Automattic" height="undefined"></a></p><h3>Gold Sponsors</h3>
|
||||
<p><a href="https://nx.dev"><img src="https://images.opencollective.com/nx/0efbe42/logo.png" alt="Nx (by Nrwl)" height="96"></a> <a href="https://google.com/chrome"><img src="https://images.opencollective.com/chrome/dc55bd4/logo.png" alt="Chrome's Web Framework & Tools Performance Fund" height="96"></a> <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://coinbase.com"><img src="https://avatars.githubusercontent.com/u/1885080?v=4" alt="Coinbase" height="96"></a> <a href="https://substack.com/"><img src="https://avatars.githubusercontent.com/u/53023767?v=4" alt="Substack" height="96"></a></p><h3>Silver Sponsors</h3>
|
||||
<p><a href="https://retool.com/"><img src="https://images.opencollective.com/retool/98ea68e/logo.png" alt="Retool" height="64"></a> <a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a></p><h3>Bronze Sponsors</h3>
|
||||
<p><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="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://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/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.firesticktricks.com"><img src="https://images.opencollective.com/fire-stick-tricks/b8fbe2c/logo.png" alt="Fire Stick Tricks" height="32"></a> <a href="https://www.practiceignition.com"><img src="https://avatars.githubusercontent.com/u/5753491?v=4" alt="Practice Ignition" height="32"></a></p>
|
||||
<!--sponsorsend-->
|
||||
|
||||
## <a name="technology-sponsors"></a>Technology Sponsors
|
||||
|
|
|
|||
16
node_modules/eslint/bin/eslint.js
generated
vendored
16
node_modules/eslint/bin/eslint.js
generated
vendored
|
|
@ -14,7 +14,7 @@ require("v8-compile-cache");
|
|||
|
||||
// must do this initialization *before* other requires in order to work
|
||||
if (process.argv.includes("--debug")) {
|
||||
require("debug").enable("eslint:*,-eslint:code-path");
|
||||
require("debug").enable("eslint:*,-eslint:code-path,eslintrc:*");
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -66,11 +66,8 @@ function readStdin() {
|
|||
*/
|
||||
function getErrorMessage(error) {
|
||||
|
||||
// Lazy loading because those are used only if error happened.
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
// Lazy loading because this is used only if an error happened.
|
||||
const util = require("util");
|
||||
const lodash = require("lodash");
|
||||
|
||||
// Foolproof -- thirdparty module might throw non-object.
|
||||
if (typeof error !== "object" || error === null) {
|
||||
|
|
@ -80,14 +77,7 @@ function getErrorMessage(error) {
|
|||
// Use templates if `error.messageTemplate` is present.
|
||||
if (typeof error.messageTemplate === "string") {
|
||||
try {
|
||||
const templateFilePath = path.resolve(
|
||||
__dirname,
|
||||
`../messages/${error.messageTemplate}.txt`
|
||||
);
|
||||
|
||||
// Use sync API because Node.js should exit at this tick.
|
||||
const templateText = fs.readFileSync(templateFilePath, "utf-8");
|
||||
const template = lodash.template(templateText);
|
||||
const template = require(`../messages/${error.messageTemplate}.js`);
|
||||
|
||||
return template(error.messageData || {});
|
||||
} catch {
|
||||
|
|
|
|||
1
node_modules/eslint/conf/default-cli-options.js
generated
vendored
1
node_modules/eslint/conf/default-cli-options.js
generated
vendored
|
|
@ -24,6 +24,7 @@ module.exports = {
|
|||
*/
|
||||
cacheLocation: "",
|
||||
cacheFile: ".eslintcache",
|
||||
cacheStrategy: "metadata",
|
||||
fix: false,
|
||||
allowInlineConfig: true,
|
||||
reportUnusedDisableDirectives: void 0,
|
||||
|
|
|
|||
502
node_modules/eslint/lib/cli-engine/cascading-config-array-factory.js
generated
vendored
502
node_modules/eslint/lib/cli-engine/cascading-config-array-factory.js
generated
vendored
|
|
@ -1,502 +0,0 @@
|
|||
/*
|
||||
* STOP!!! DO NOT MODIFY.
|
||||
*
|
||||
* This file is part of the ongoing work to move the eslintrc-style config
|
||||
* system into the @eslint/eslintrc package. This file needs to remain
|
||||
* unchanged in order for this work to proceed.
|
||||
*
|
||||
* If you think you need to change this file, please contact @nzakas first.
|
||||
*
|
||||
* Thanks in advance for your cooperation.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview `CascadingConfigArrayFactory` class.
|
||||
*
|
||||
* `CascadingConfigArrayFactory` class has a responsibility:
|
||||
*
|
||||
* 1. Handles cascading of config files.
|
||||
*
|
||||
* It provides two methods:
|
||||
*
|
||||
* - `getConfigArrayForFile(filePath)`
|
||||
* Get the corresponded configuration of a given file. This method doesn't
|
||||
* throw even if the given file didn't exist.
|
||||
* - `clearCache()`
|
||||
* Clear the internal cache. You have to call this method when
|
||||
* `additionalPluginPool` was updated if `baseConfig` or `cliConfig` depends
|
||||
* on the additional plugins. (`CLIEngine#addPlugin()` method calls this.)
|
||||
*
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
*/
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const os = require("os");
|
||||
const path = require("path");
|
||||
const { validateConfigArray } = require("../shared/config-validator");
|
||||
const { emitDeprecationWarning } = require("../shared/deprecation-warnings");
|
||||
const { ConfigArrayFactory } = require("./config-array-factory");
|
||||
const { ConfigArray, ConfigDependency, IgnorePattern } = require("./config-array");
|
||||
const loadRules = require("./load-rules");
|
||||
const debug = require("debug")("eslint:cascading-config-array-factory");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// Define types for VSCode IntelliSense.
|
||||
/** @typedef {import("../shared/types").ConfigData} ConfigData */
|
||||
/** @typedef {import("../shared/types").Parser} Parser */
|
||||
/** @typedef {import("../shared/types").Plugin} Plugin */
|
||||
/** @typedef {ReturnType<ConfigArrayFactory["create"]>} ConfigArray */
|
||||
|
||||
/**
|
||||
* @typedef {Object} CascadingConfigArrayFactoryOptions
|
||||
* @property {Map<string,Plugin>} [additionalPluginPool] The map for additional plugins.
|
||||
* @property {ConfigData} [baseConfig] The config by `baseConfig` option.
|
||||
* @property {ConfigData} [cliConfig] The config by CLI options (`--env`, `--global`, `--ignore-pattern`, `--parser`, `--parser-options`, `--plugin`, and `--rule`). CLI options overwrite the setting in config files.
|
||||
* @property {string} [cwd] The base directory to start lookup.
|
||||
* @property {string} [ignorePath] The path to the alternative file of `.eslintignore`.
|
||||
* @property {string[]} [rulePaths] The value of `--rulesdir` option.
|
||||
* @property {string} [specificConfigPath] The value of `--config` option.
|
||||
* @property {boolean} [useEslintrc] if `false` then it doesn't load config files.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} CascadingConfigArrayFactoryInternalSlots
|
||||
* @property {ConfigArray} baseConfigArray The config array of `baseConfig` option.
|
||||
* @property {ConfigData} baseConfigData The config data of `baseConfig` option. This is used to reset `baseConfigArray`.
|
||||
* @property {ConfigArray} cliConfigArray The config array of CLI options.
|
||||
* @property {ConfigData} cliConfigData The config data of CLI options. This is used to reset `cliConfigArray`.
|
||||
* @property {ConfigArrayFactory} configArrayFactory The factory for config arrays.
|
||||
* @property {Map<string, ConfigArray>} configCache The cache from directory paths to config arrays.
|
||||
* @property {string} cwd The base directory to start lookup.
|
||||
* @property {WeakMap<ConfigArray, ConfigArray>} finalizeCache The cache from config arrays to finalized config arrays.
|
||||
* @property {string} [ignorePath] The path to the alternative file of `.eslintignore`.
|
||||
* @property {string[]|null} rulePaths The value of `--rulesdir` option. This is used to reset `baseConfigArray`.
|
||||
* @property {string|null} specificConfigPath The value of `--config` option. This is used to reset `cliConfigArray`.
|
||||
* @property {boolean} useEslintrc if `false` then it doesn't load config files.
|
||||
*/
|
||||
|
||||
/** @type {WeakMap<CascadingConfigArrayFactory, CascadingConfigArrayFactoryInternalSlots>} */
|
||||
const internalSlotsMap = new WeakMap();
|
||||
|
||||
/**
|
||||
* Create the config array from `baseConfig` and `rulePaths`.
|
||||
* @param {CascadingConfigArrayFactoryInternalSlots} slots The slots.
|
||||
* @returns {ConfigArray} The config array of the base configs.
|
||||
*/
|
||||
function createBaseConfigArray({
|
||||
configArrayFactory,
|
||||
baseConfigData,
|
||||
rulePaths,
|
||||
cwd
|
||||
}) {
|
||||
const baseConfigArray = configArrayFactory.create(
|
||||
baseConfigData,
|
||||
{ name: "BaseConfig" }
|
||||
);
|
||||
|
||||
/*
|
||||
* Create the config array element for the default ignore patterns.
|
||||
* This element has `ignorePattern` property that ignores the default
|
||||
* patterns in the current working directory.
|
||||
*/
|
||||
baseConfigArray.unshift(configArrayFactory.create(
|
||||
{ ignorePatterns: IgnorePattern.DefaultPatterns },
|
||||
{ name: "DefaultIgnorePattern" }
|
||||
)[0]);
|
||||
|
||||
/*
|
||||
* Load rules `--rulesdir` option as a pseudo plugin.
|
||||
* Use a pseudo plugin to define rules of `--rulesdir`, so we can validate
|
||||
* the rule's options with only information in the config array.
|
||||
*/
|
||||
if (rulePaths && rulePaths.length > 0) {
|
||||
baseConfigArray.push({
|
||||
type: "config",
|
||||
name: "--rulesdir",
|
||||
filePath: "",
|
||||
plugins: {
|
||||
"": new ConfigDependency({
|
||||
definition: {
|
||||
rules: rulePaths.reduce(
|
||||
(map, rulesPath) => Object.assign(
|
||||
map,
|
||||
loadRules(rulesPath, cwd)
|
||||
),
|
||||
{}
|
||||
)
|
||||
},
|
||||
filePath: "",
|
||||
id: "",
|
||||
importerName: "--rulesdir",
|
||||
importerPath: ""
|
||||
})
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return baseConfigArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the config array from CLI options.
|
||||
* @param {CascadingConfigArrayFactoryInternalSlots} slots The slots.
|
||||
* @returns {ConfigArray} The config array of the base configs.
|
||||
*/
|
||||
function createCLIConfigArray({
|
||||
cliConfigData,
|
||||
configArrayFactory,
|
||||
cwd,
|
||||
ignorePath,
|
||||
specificConfigPath
|
||||
}) {
|
||||
const cliConfigArray = configArrayFactory.create(
|
||||
cliConfigData,
|
||||
{ name: "CLIOptions" }
|
||||
);
|
||||
|
||||
cliConfigArray.unshift(
|
||||
...(ignorePath
|
||||
? configArrayFactory.loadESLintIgnore(ignorePath)
|
||||
: configArrayFactory.loadDefaultESLintIgnore())
|
||||
);
|
||||
|
||||
if (specificConfigPath) {
|
||||
cliConfigArray.unshift(
|
||||
...configArrayFactory.loadFile(
|
||||
specificConfigPath,
|
||||
{ name: "--config", basePath: cwd }
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return cliConfigArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* The error type when there are files matched by a glob, but all of them have been ignored.
|
||||
*/
|
||||
class ConfigurationNotFoundError extends Error {
|
||||
|
||||
// eslint-disable-next-line jsdoc/require-description
|
||||
/**
|
||||
* @param {string} directoryPath The directory path.
|
||||
*/
|
||||
constructor(directoryPath) {
|
||||
super(`No ESLint configuration found in ${directoryPath}.`);
|
||||
this.messageTemplate = "no-config-found";
|
||||
this.messageData = { directoryPath };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This class provides the functionality that enumerates every file which is
|
||||
* matched by given glob patterns and that configuration.
|
||||
*/
|
||||
class CascadingConfigArrayFactory {
|
||||
|
||||
/**
|
||||
* Initialize this enumerator.
|
||||
* @param {CascadingConfigArrayFactoryOptions} options The options.
|
||||
*/
|
||||
constructor({
|
||||
additionalPluginPool = new Map(),
|
||||
baseConfig: baseConfigData = null,
|
||||
cliConfig: cliConfigData = null,
|
||||
cwd = process.cwd(),
|
||||
ignorePath,
|
||||
resolvePluginsRelativeTo,
|
||||
rulePaths = [],
|
||||
specificConfigPath = null,
|
||||
useEslintrc = true
|
||||
} = {}) {
|
||||
const configArrayFactory = new ConfigArrayFactory({
|
||||
additionalPluginPool,
|
||||
cwd,
|
||||
resolvePluginsRelativeTo
|
||||
});
|
||||
|
||||
internalSlotsMap.set(this, {
|
||||
baseConfigArray: createBaseConfigArray({
|
||||
baseConfigData,
|
||||
configArrayFactory,
|
||||
cwd,
|
||||
rulePaths
|
||||
}),
|
||||
baseConfigData,
|
||||
cliConfigArray: createCLIConfigArray({
|
||||
cliConfigData,
|
||||
configArrayFactory,
|
||||
cwd,
|
||||
ignorePath,
|
||||
specificConfigPath
|
||||
}),
|
||||
cliConfigData,
|
||||
configArrayFactory,
|
||||
configCache: new Map(),
|
||||
cwd,
|
||||
finalizeCache: new WeakMap(),
|
||||
ignorePath,
|
||||
rulePaths,
|
||||
specificConfigPath,
|
||||
useEslintrc
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* The path to the current working directory.
|
||||
* This is used by tests.
|
||||
* @type {string}
|
||||
*/
|
||||
get cwd() {
|
||||
const { cwd } = internalSlotsMap.get(this);
|
||||
|
||||
return cwd;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the config array of a given file.
|
||||
* If `filePath` was not given, it returns the config which contains only
|
||||
* `baseConfigData` and `cliConfigData`.
|
||||
* @param {string} [filePath] The file path to a file.
|
||||
* @param {Object} [options] The options.
|
||||
* @param {boolean} [options.ignoreNotFoundError] If `true` then it doesn't throw `ConfigurationNotFoundError`.
|
||||
* @returns {ConfigArray} The config array of the file.
|
||||
*/
|
||||
getConfigArrayForFile(filePath, { ignoreNotFoundError = false } = {}) {
|
||||
const {
|
||||
baseConfigArray,
|
||||
cliConfigArray,
|
||||
cwd
|
||||
} = internalSlotsMap.get(this);
|
||||
|
||||
if (!filePath) {
|
||||
return new ConfigArray(...baseConfigArray, ...cliConfigArray);
|
||||
}
|
||||
|
||||
const directoryPath = path.dirname(path.resolve(cwd, filePath));
|
||||
|
||||
debug(`Load config files for ${directoryPath}.`);
|
||||
|
||||
return this._finalizeConfigArray(
|
||||
this._loadConfigInAncestors(directoryPath),
|
||||
directoryPath,
|
||||
ignoreNotFoundError
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the config data to override all configs.
|
||||
* Require to call `clearCache()` method after this method is called.
|
||||
* @param {ConfigData} configData The config data to override all configs.
|
||||
* @returns {void}
|
||||
*/
|
||||
setOverrideConfig(configData) {
|
||||
const slots = internalSlotsMap.get(this);
|
||||
|
||||
slots.cliConfigData = configData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear config cache.
|
||||
* @returns {void}
|
||||
*/
|
||||
clearCache() {
|
||||
const slots = internalSlotsMap.get(this);
|
||||
|
||||
slots.baseConfigArray = createBaseConfigArray(slots);
|
||||
slots.cliConfigArray = createCLIConfigArray(slots);
|
||||
slots.configCache.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Load and normalize config files from the ancestor directories.
|
||||
* @param {string} directoryPath The path to a leaf directory.
|
||||
* @param {boolean} configsExistInSubdirs `true` if configurations exist in subdirectories.
|
||||
* @returns {ConfigArray} The loaded config.
|
||||
* @private
|
||||
*/
|
||||
_loadConfigInAncestors(directoryPath, configsExistInSubdirs = false) {
|
||||
const {
|
||||
baseConfigArray,
|
||||
configArrayFactory,
|
||||
configCache,
|
||||
cwd,
|
||||
useEslintrc
|
||||
} = internalSlotsMap.get(this);
|
||||
|
||||
if (!useEslintrc) {
|
||||
return baseConfigArray;
|
||||
}
|
||||
|
||||
let configArray = configCache.get(directoryPath);
|
||||
|
||||
// Hit cache.
|
||||
if (configArray) {
|
||||
debug(`Cache hit: ${directoryPath}.`);
|
||||
return configArray;
|
||||
}
|
||||
debug(`No cache found: ${directoryPath}.`);
|
||||
|
||||
const homePath = os.homedir();
|
||||
|
||||
// Consider this is root.
|
||||
if (directoryPath === homePath && cwd !== homePath) {
|
||||
debug("Stop traversing because of considered root.");
|
||||
if (configsExistInSubdirs) {
|
||||
const filePath = ConfigArrayFactory.getPathToConfigFileInDirectory(directoryPath);
|
||||
|
||||
if (filePath) {
|
||||
emitDeprecationWarning(
|
||||
filePath,
|
||||
"ESLINT_PERSONAL_CONFIG_SUPPRESS"
|
||||
);
|
||||
}
|
||||
}
|
||||
return this._cacheConfig(directoryPath, baseConfigArray);
|
||||
}
|
||||
|
||||
// Load the config on this directory.
|
||||
try {
|
||||
configArray = configArrayFactory.loadInDirectory(directoryPath);
|
||||
} catch (error) {
|
||||
/* istanbul ignore next */
|
||||
if (error.code === "EACCES") {
|
||||
debug("Stop traversing because of 'EACCES' error.");
|
||||
return this._cacheConfig(directoryPath, baseConfigArray);
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
|
||||
if (configArray.length > 0 && configArray.isRoot()) {
|
||||
debug("Stop traversing because of 'root:true'.");
|
||||
configArray.unshift(...baseConfigArray);
|
||||
return this._cacheConfig(directoryPath, configArray);
|
||||
}
|
||||
|
||||
// Load from the ancestors and merge it.
|
||||
const parentPath = path.dirname(directoryPath);
|
||||
const parentConfigArray = parentPath && parentPath !== directoryPath
|
||||
? this._loadConfigInAncestors(
|
||||
parentPath,
|
||||
configsExistInSubdirs || configArray.length > 0
|
||||
)
|
||||
: baseConfigArray;
|
||||
|
||||
if (configArray.length > 0) {
|
||||
configArray.unshift(...parentConfigArray);
|
||||
} else {
|
||||
configArray = parentConfigArray;
|
||||
}
|
||||
|
||||
// Cache and return.
|
||||
return this._cacheConfig(directoryPath, configArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* Freeze and cache a given config.
|
||||
* @param {string} directoryPath The path to a directory as a cache key.
|
||||
* @param {ConfigArray} configArray The config array as a cache value.
|
||||
* @returns {ConfigArray} The `configArray` (frozen).
|
||||
*/
|
||||
_cacheConfig(directoryPath, configArray) {
|
||||
const { configCache } = internalSlotsMap.get(this);
|
||||
|
||||
Object.freeze(configArray);
|
||||
configCache.set(directoryPath, configArray);
|
||||
|
||||
return configArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finalize a given config array.
|
||||
* Concatenate `--config` and other CLI options.
|
||||
* @param {ConfigArray} configArray The parent config array.
|
||||
* @param {string} directoryPath The path to the leaf directory to find config files.
|
||||
* @param {boolean} ignoreNotFoundError If `true` then it doesn't throw `ConfigurationNotFoundError`.
|
||||
* @returns {ConfigArray} The loaded config.
|
||||
* @private
|
||||
*/
|
||||
_finalizeConfigArray(configArray, directoryPath, ignoreNotFoundError) {
|
||||
const {
|
||||
cliConfigArray,
|
||||
configArrayFactory,
|
||||
finalizeCache,
|
||||
useEslintrc
|
||||
} = internalSlotsMap.get(this);
|
||||
|
||||
let finalConfigArray = finalizeCache.get(configArray);
|
||||
|
||||
if (!finalConfigArray) {
|
||||
finalConfigArray = configArray;
|
||||
|
||||
// Load the personal config if there are no regular config files.
|
||||
if (
|
||||
useEslintrc &&
|
||||
configArray.every(c => !c.filePath) &&
|
||||
cliConfigArray.every(c => !c.filePath) // `--config` option can be a file.
|
||||
) {
|
||||
const homePath = os.homedir();
|
||||
|
||||
debug("Loading the config file of the home directory:", homePath);
|
||||
|
||||
const personalConfigArray = configArrayFactory.loadInDirectory(
|
||||
homePath,
|
||||
{ name: "PersonalConfig" }
|
||||
);
|
||||
|
||||
if (
|
||||
personalConfigArray.length > 0 &&
|
||||
!directoryPath.startsWith(homePath)
|
||||
) {
|
||||
const lastElement =
|
||||
personalConfigArray[personalConfigArray.length - 1];
|
||||
|
||||
emitDeprecationWarning(
|
||||
lastElement.filePath,
|
||||
"ESLINT_PERSONAL_CONFIG_LOAD"
|
||||
);
|
||||
}
|
||||
|
||||
finalConfigArray = finalConfigArray.concat(personalConfigArray);
|
||||
}
|
||||
|
||||
// Apply CLI options.
|
||||
if (cliConfigArray.length > 0) {
|
||||
finalConfigArray = finalConfigArray.concat(cliConfigArray);
|
||||
}
|
||||
|
||||
// Validate rule settings and environments.
|
||||
validateConfigArray(finalConfigArray);
|
||||
|
||||
// Cache it.
|
||||
Object.freeze(finalConfigArray);
|
||||
finalizeCache.set(configArray, finalConfigArray);
|
||||
|
||||
debug(
|
||||
"Configuration was determined: %o on %s",
|
||||
finalConfigArray,
|
||||
directoryPath
|
||||
);
|
||||
}
|
||||
|
||||
// At least one element (the default ignore patterns) exists.
|
||||
if (!ignoreNotFoundError && useEslintrc && finalConfigArray.length <= 1) {
|
||||
throw new ConfigurationNotFoundError(directoryPath);
|
||||
}
|
||||
|
||||
return finalConfigArray;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
module.exports = { CascadingConfigArrayFactory };
|
||||
32
node_modules/eslint/lib/cli-engine/cli-engine.js
generated
vendored
32
node_modules/eslint/lib/cli-engine/cli-engine.js
generated
vendored
|
|
@ -19,14 +19,24 @@ const fs = require("fs");
|
|||
const path = require("path");
|
||||
const defaultOptions = require("../../conf/default-cli-options");
|
||||
const pkg = require("../../package.json");
|
||||
const ConfigOps = require("@eslint/eslintrc/lib/shared/config-ops");
|
||||
const naming = require("@eslint/eslintrc/lib/shared/naming");
|
||||
const ModuleResolver = require("../shared/relative-module-resolver");
|
||||
|
||||
|
||||
const {
|
||||
Legacy: {
|
||||
ConfigOps,
|
||||
naming,
|
||||
CascadingConfigArrayFactory,
|
||||
IgnorePattern,
|
||||
getUsedExtractedConfigs,
|
||||
ModuleResolver
|
||||
}
|
||||
} = require("@eslint/eslintrc");
|
||||
|
||||
const { FileEnumerator } = require("./file-enumerator");
|
||||
|
||||
const { Linter } = require("../linter");
|
||||
const builtInRules = require("../rules");
|
||||
const { CascadingConfigArrayFactory } = require("./cascading-config-array-factory");
|
||||
const { IgnorePattern, getUsedExtractedConfigs } = require("./config-array");
|
||||
const { FileEnumerator } = require("./file-enumerator");
|
||||
const loadRules = require("./load-rules");
|
||||
const hash = require("./hash");
|
||||
const LintResultCache = require("./lint-result-cache");
|
||||
|
||||
|
|
@ -516,7 +526,7 @@ function directoryExists(resolvedPath) {
|
|||
try {
|
||||
return fs.statSync(resolvedPath).isDirectory();
|
||||
} catch (error) {
|
||||
if (error && error.code === "ENOENT") {
|
||||
if (error && (error.code === "ENOENT" || error.code === "ENOTDIR")) {
|
||||
return false;
|
||||
}
|
||||
throw error;
|
||||
|
|
@ -559,7 +569,11 @@ class CLIEngine {
|
|||
resolvePluginsRelativeTo: options.resolvePluginsRelativeTo,
|
||||
rulePaths: options.rulePaths,
|
||||
specificConfigPath: options.configFile,
|
||||
useEslintrc: options.useEslintrc
|
||||
useEslintrc: options.useEslintrc,
|
||||
builtInRules,
|
||||
loadRules,
|
||||
eslintRecommendedPath: path.resolve(__dirname, "../../conf/eslint-recommended.js"),
|
||||
eslintAllPath: path.resolve(__dirname, "../../conf/eslint-all.js")
|
||||
});
|
||||
const fileEnumerator = new FileEnumerator({
|
||||
configArrayFactory,
|
||||
|
|
@ -570,7 +584,7 @@ class CLIEngine {
|
|||
ignore: options.ignore
|
||||
});
|
||||
const lintResultCache =
|
||||
options.cache ? new LintResultCache(cacheFilePath) : null;
|
||||
options.cache ? new LintResultCache(cacheFilePath, options.cacheStrategy) : null;
|
||||
const linter = new Linter({ cwd: options.cwd });
|
||||
|
||||
/** @type {ConfigArray[]} */
|
||||
|
|
|
|||
1092
node_modules/eslint/lib/cli-engine/config-array-factory.js
generated
vendored
1092
node_modules/eslint/lib/cli-engine/config-array-factory.js
generated
vendored
File diff suppressed because it is too large
Load diff
536
node_modules/eslint/lib/cli-engine/config-array/config-array.js
generated
vendored
536
node_modules/eslint/lib/cli-engine/config-array/config-array.js
generated
vendored
|
|
@ -1,536 +0,0 @@
|
|||
/*
|
||||
* STOP!!! DO NOT MODIFY.
|
||||
*
|
||||
* This file is part of the ongoing work to move the eslintrc-style config
|
||||
* system into the @eslint/eslintrc package. This file needs to remain
|
||||
* unchanged in order for this work to proceed.
|
||||
*
|
||||
* If you think you need to change this file, please contact @nzakas first.
|
||||
*
|
||||
* Thanks in advance for your cooperation.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview `ConfigArray` class.
|
||||
*
|
||||
* `ConfigArray` class expresses the full of a configuration. It has the entry
|
||||
* config file, base config files that were extended, loaded parsers, and loaded
|
||||
* plugins.
|
||||
*
|
||||
* `ConfigArray` class provides three properties and two methods.
|
||||
*
|
||||
* - `pluginEnvironments`
|
||||
* - `pluginProcessors`
|
||||
* - `pluginRules`
|
||||
* The `Map` objects that contain the members of all plugins that this
|
||||
* config array contains. Those map objects don't have mutation methods.
|
||||
* Those keys are the member ID such as `pluginId/memberName`.
|
||||
* - `isRoot()`
|
||||
* If `true` then this configuration has `root:true` property.
|
||||
* - `extractConfig(filePath)`
|
||||
* Extract the final configuration for a given file. This means merging
|
||||
* every config array element which that `criteria` property matched. The
|
||||
* `filePath` argument must be an absolute path.
|
||||
*
|
||||
* `ConfigArrayFactory` provides the loading logic of config files.
|
||||
*
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
*/
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const { ExtractedConfig } = require("./extracted-config");
|
||||
const { IgnorePattern } = require("./ignore-pattern");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// Define types for VSCode IntelliSense.
|
||||
/** @typedef {import("../../shared/types").Environment} Environment */
|
||||
/** @typedef {import("../../shared/types").GlobalConf} GlobalConf */
|
||||
/** @typedef {import("../../shared/types").RuleConf} RuleConf */
|
||||
/** @typedef {import("../../shared/types").Rule} Rule */
|
||||
/** @typedef {import("../../shared/types").Plugin} Plugin */
|
||||
/** @typedef {import("../../shared/types").Processor} Processor */
|
||||
/** @typedef {import("./config-dependency").DependentParser} DependentParser */
|
||||
/** @typedef {import("./config-dependency").DependentPlugin} DependentPlugin */
|
||||
/** @typedef {import("./override-tester")["OverrideTester"]} OverrideTester */
|
||||
|
||||
/**
|
||||
* @typedef {Object} ConfigArrayElement
|
||||
* @property {string} name The name of this config element.
|
||||
* @property {string} filePath The path to the source file of this config element.
|
||||
* @property {InstanceType<OverrideTester>|null} criteria The tester for the `files` and `excludedFiles` of this config element.
|
||||
* @property {Record<string, boolean>|undefined} env The environment settings.
|
||||
* @property {Record<string, GlobalConf>|undefined} globals The global variable settings.
|
||||
* @property {IgnorePattern|undefined} ignorePattern The ignore patterns.
|
||||
* @property {boolean|undefined} noInlineConfig The flag that disables directive comments.
|
||||
* @property {DependentParser|undefined} parser The parser loader.
|
||||
* @property {Object|undefined} parserOptions The parser options.
|
||||
* @property {Record<string, DependentPlugin>|undefined} plugins The plugin loaders.
|
||||
* @property {string|undefined} processor The processor name to refer plugin's processor.
|
||||
* @property {boolean|undefined} reportUnusedDisableDirectives The flag to report unused `eslint-disable` comments.
|
||||
* @property {boolean|undefined} root The flag to express root.
|
||||
* @property {Record<string, RuleConf>|undefined} rules The rule settings
|
||||
* @property {Object|undefined} settings The shared settings.
|
||||
* @property {"config" | "ignore" | "implicit-processor"} type The element type.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} ConfigArrayInternalSlots
|
||||
* @property {Map<string, ExtractedConfig>} cache The cache to extract configs.
|
||||
* @property {ReadonlyMap<string, Environment>|null} envMap The map from environment ID to environment definition.
|
||||
* @property {ReadonlyMap<string, Processor>|null} processorMap The map from processor ID to environment definition.
|
||||
* @property {ReadonlyMap<string, Rule>|null} ruleMap The map from rule ID to rule definition.
|
||||
*/
|
||||
|
||||
/** @type {WeakMap<ConfigArray, ConfigArrayInternalSlots>} */
|
||||
const internalSlotsMap = new class extends WeakMap {
|
||||
get(key) {
|
||||
let value = super.get(key);
|
||||
|
||||
if (!value) {
|
||||
value = {
|
||||
cache: new Map(),
|
||||
envMap: null,
|
||||
processorMap: null,
|
||||
ruleMap: null
|
||||
};
|
||||
super.set(key, value);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
}();
|
||||
|
||||
/**
|
||||
* Get the indices which are matched to a given file.
|
||||
* @param {ConfigArrayElement[]} elements The elements.
|
||||
* @param {string} filePath The path to a target file.
|
||||
* @returns {number[]} The indices.
|
||||
*/
|
||||
function getMatchedIndices(elements, filePath) {
|
||||
const indices = [];
|
||||
|
||||
for (let i = elements.length - 1; i >= 0; --i) {
|
||||
const element = elements[i];
|
||||
|
||||
if (!element.criteria || (filePath && element.criteria.test(filePath))) {
|
||||
indices.push(i);
|
||||
}
|
||||
}
|
||||
|
||||
return indices;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a value is a non-null object.
|
||||
* @param {any} x The value to check.
|
||||
* @returns {boolean} `true` if the value is a non-null object.
|
||||
*/
|
||||
function isNonNullObject(x) {
|
||||
return typeof x === "object" && x !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge two objects.
|
||||
*
|
||||
* Assign every property values of `y` to `x` if `x` doesn't have the property.
|
||||
* If `x`'s property value is an object, it does recursive.
|
||||
* @param {Object} target The destination to merge
|
||||
* @param {Object|undefined} source The source to merge.
|
||||
* @returns {void}
|
||||
*/
|
||||
function mergeWithoutOverwrite(target, source) {
|
||||
if (!isNonNullObject(source)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const key of Object.keys(source)) {
|
||||
if (key === "__proto__") {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isNonNullObject(target[key])) {
|
||||
mergeWithoutOverwrite(target[key], source[key]);
|
||||
} else if (target[key] === void 0) {
|
||||
if (isNonNullObject(source[key])) {
|
||||
target[key] = Array.isArray(source[key]) ? [] : {};
|
||||
mergeWithoutOverwrite(target[key], source[key]);
|
||||
} else if (source[key] !== void 0) {
|
||||
target[key] = source[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The error for plugin conflicts.
|
||||
*/
|
||||
class PluginConflictError extends Error {
|
||||
|
||||
/**
|
||||
* Initialize this error object.
|
||||
* @param {string} pluginId The plugin ID.
|
||||
* @param {{filePath:string, importerName:string}[]} plugins The resolved plugins.
|
||||
*/
|
||||
constructor(pluginId, plugins) {
|
||||
super(`Plugin "${pluginId}" was conflicted between ${plugins.map(p => `"${p.importerName}"`).join(" and ")}.`);
|
||||
this.messageTemplate = "plugin-conflict";
|
||||
this.messageData = { pluginId, plugins };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge plugins.
|
||||
* `target`'s definition is prior to `source`'s.
|
||||
* @param {Record<string, DependentPlugin>} target The destination to merge
|
||||
* @param {Record<string, DependentPlugin>|undefined} source The source to merge.
|
||||
* @returns {void}
|
||||
*/
|
||||
function mergePlugins(target, source) {
|
||||
if (!isNonNullObject(source)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const key of Object.keys(source)) {
|
||||
if (key === "__proto__") {
|
||||
continue;
|
||||
}
|
||||
const targetValue = target[key];
|
||||
const sourceValue = source[key];
|
||||
|
||||
// Adopt the plugin which was found at first.
|
||||
if (targetValue === void 0) {
|
||||
if (sourceValue.error) {
|
||||
throw sourceValue.error;
|
||||
}
|
||||
target[key] = sourceValue;
|
||||
} else if (sourceValue.filePath !== targetValue.filePath) {
|
||||
throw new PluginConflictError(key, [
|
||||
{
|
||||
filePath: targetValue.filePath,
|
||||
importerName: targetValue.importerName
|
||||
},
|
||||
{
|
||||
filePath: sourceValue.filePath,
|
||||
importerName: sourceValue.importerName
|
||||
}
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge rule configs.
|
||||
* `target`'s definition is prior to `source`'s.
|
||||
* @param {Record<string, Array>} target The destination to merge
|
||||
* @param {Record<string, RuleConf>|undefined} source The source to merge.
|
||||
* @returns {void}
|
||||
*/
|
||||
function mergeRuleConfigs(target, source) {
|
||||
if (!isNonNullObject(source)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const key of Object.keys(source)) {
|
||||
if (key === "__proto__") {
|
||||
continue;
|
||||
}
|
||||
const targetDef = target[key];
|
||||
const sourceDef = source[key];
|
||||
|
||||
// Adopt the rule config which was found at first.
|
||||
if (targetDef === void 0) {
|
||||
if (Array.isArray(sourceDef)) {
|
||||
target[key] = [...sourceDef];
|
||||
} else {
|
||||
target[key] = [sourceDef];
|
||||
}
|
||||
|
||||
/*
|
||||
* If the first found rule config is severity only and the current rule
|
||||
* config has options, merge the severity and the options.
|
||||
*/
|
||||
} else if (
|
||||
targetDef.length === 1 &&
|
||||
Array.isArray(sourceDef) &&
|
||||
sourceDef.length >= 2
|
||||
) {
|
||||
targetDef.push(...sourceDef.slice(1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the extracted config.
|
||||
* @param {ConfigArray} instance The config elements.
|
||||
* @param {number[]} indices The indices to use.
|
||||
* @returns {ExtractedConfig} The extracted config.
|
||||
*/
|
||||
function createConfig(instance, indices) {
|
||||
const config = new ExtractedConfig();
|
||||
const ignorePatterns = [];
|
||||
|
||||
// Merge elements.
|
||||
for (const index of indices) {
|
||||
const element = instance[index];
|
||||
|
||||
// Adopt the parser which was found at first.
|
||||
if (!config.parser && element.parser) {
|
||||
if (element.parser.error) {
|
||||
throw element.parser.error;
|
||||
}
|
||||
config.parser = element.parser;
|
||||
}
|
||||
|
||||
// Adopt the processor which was found at first.
|
||||
if (!config.processor && element.processor) {
|
||||
config.processor = element.processor;
|
||||
}
|
||||
|
||||
// Adopt the noInlineConfig which was found at first.
|
||||
if (config.noInlineConfig === void 0 && element.noInlineConfig !== void 0) {
|
||||
config.noInlineConfig = element.noInlineConfig;
|
||||
config.configNameOfNoInlineConfig = element.name;
|
||||
}
|
||||
|
||||
// Adopt the reportUnusedDisableDirectives which was found at first.
|
||||
if (config.reportUnusedDisableDirectives === void 0 && element.reportUnusedDisableDirectives !== void 0) {
|
||||
config.reportUnusedDisableDirectives = element.reportUnusedDisableDirectives;
|
||||
}
|
||||
|
||||
// Collect ignorePatterns
|
||||
if (element.ignorePattern) {
|
||||
ignorePatterns.push(element.ignorePattern);
|
||||
}
|
||||
|
||||
// Merge others.
|
||||
mergeWithoutOverwrite(config.env, element.env);
|
||||
mergeWithoutOverwrite(config.globals, element.globals);
|
||||
mergeWithoutOverwrite(config.parserOptions, element.parserOptions);
|
||||
mergeWithoutOverwrite(config.settings, element.settings);
|
||||
mergePlugins(config.plugins, element.plugins);
|
||||
mergeRuleConfigs(config.rules, element.rules);
|
||||
}
|
||||
|
||||
// Create the predicate function for ignore patterns.
|
||||
if (ignorePatterns.length > 0) {
|
||||
config.ignores = IgnorePattern.createIgnore(ignorePatterns.reverse());
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Collect definitions.
|
||||
* @template T, U
|
||||
* @param {string} pluginId The plugin ID for prefix.
|
||||
* @param {Record<string,T>} defs The definitions to collect.
|
||||
* @param {Map<string, U>} map The map to output.
|
||||
* @param {function(T): U} [normalize] The normalize function for each value.
|
||||
* @returns {void}
|
||||
*/
|
||||
function collect(pluginId, defs, map, normalize) {
|
||||
if (defs) {
|
||||
const prefix = pluginId && `${pluginId}/`;
|
||||
|
||||
for (const [key, value] of Object.entries(defs)) {
|
||||
map.set(
|
||||
`${prefix}${key}`,
|
||||
normalize ? normalize(value) : value
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize a rule definition.
|
||||
* @param {Function|Rule} rule The rule definition to normalize.
|
||||
* @returns {Rule} The normalized rule definition.
|
||||
*/
|
||||
function normalizePluginRule(rule) {
|
||||
return typeof rule === "function" ? { create: rule } : rule;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the mutation methods from a given map.
|
||||
* @param {Map<any, any>} map The map object to delete.
|
||||
* @returns {void}
|
||||
*/
|
||||
function deleteMutationMethods(map) {
|
||||
Object.defineProperties(map, {
|
||||
clear: { configurable: true, value: void 0 },
|
||||
delete: { configurable: true, value: void 0 },
|
||||
set: { configurable: true, value: void 0 }
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Create `envMap`, `processorMap`, `ruleMap` with the plugins in the config array.
|
||||
* @param {ConfigArrayElement[]} elements The config elements.
|
||||
* @param {ConfigArrayInternalSlots} slots The internal slots.
|
||||
* @returns {void}
|
||||
*/
|
||||
function initPluginMemberMaps(elements, slots) {
|
||||
const processed = new Set();
|
||||
|
||||
slots.envMap = new Map();
|
||||
slots.processorMap = new Map();
|
||||
slots.ruleMap = new Map();
|
||||
|
||||
for (const element of elements) {
|
||||
if (!element.plugins) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const [pluginId, value] of Object.entries(element.plugins)) {
|
||||
const plugin = value.definition;
|
||||
|
||||
if (!plugin || processed.has(pluginId)) {
|
||||
continue;
|
||||
}
|
||||
processed.add(pluginId);
|
||||
|
||||
collect(pluginId, plugin.environments, slots.envMap);
|
||||
collect(pluginId, plugin.processors, slots.processorMap);
|
||||
collect(pluginId, plugin.rules, slots.ruleMap, normalizePluginRule);
|
||||
}
|
||||
}
|
||||
|
||||
deleteMutationMethods(slots.envMap);
|
||||
deleteMutationMethods(slots.processorMap);
|
||||
deleteMutationMethods(slots.ruleMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create `envMap`, `processorMap`, `ruleMap` with the plugins in the config array.
|
||||
* @param {ConfigArray} instance The config elements.
|
||||
* @returns {ConfigArrayInternalSlots} The extracted config.
|
||||
*/
|
||||
function ensurePluginMemberMaps(instance) {
|
||||
const slots = internalSlotsMap.get(instance);
|
||||
|
||||
if (!slots.ruleMap) {
|
||||
initPluginMemberMaps(instance, slots);
|
||||
}
|
||||
|
||||
return slots;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* The Config Array.
|
||||
*
|
||||
* `ConfigArray` instance contains all settings, parsers, and plugins.
|
||||
* You need to call `ConfigArray#extractConfig(filePath)` method in order to
|
||||
* extract, merge and get only the config data which is related to an arbitrary
|
||||
* file.
|
||||
* @extends {Array<ConfigArrayElement>}
|
||||
*/
|
||||
class ConfigArray extends Array {
|
||||
|
||||
/**
|
||||
* Get the plugin environments.
|
||||
* The returned map cannot be mutated.
|
||||
* @type {ReadonlyMap<string, Environment>} The plugin environments.
|
||||
*/
|
||||
get pluginEnvironments() {
|
||||
return ensurePluginMemberMaps(this).envMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin processors.
|
||||
* The returned map cannot be mutated.
|
||||
* @type {ReadonlyMap<string, Processor>} The plugin processors.
|
||||
*/
|
||||
get pluginProcessors() {
|
||||
return ensurePluginMemberMaps(this).processorMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin rules.
|
||||
* The returned map cannot be mutated.
|
||||
* @returns {ReadonlyMap<string, Rule>} The plugin rules.
|
||||
*/
|
||||
get pluginRules() {
|
||||
return ensurePluginMemberMaps(this).ruleMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this config has `root` flag.
|
||||
* @returns {boolean} `true` if this config array is root.
|
||||
*/
|
||||
isRoot() {
|
||||
for (let i = this.length - 1; i >= 0; --i) {
|
||||
const root = this[i].root;
|
||||
|
||||
if (typeof root === "boolean") {
|
||||
return root;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the config data which is related to a given file.
|
||||
* @param {string} filePath The absolute path to the target file.
|
||||
* @returns {ExtractedConfig} The extracted config data.
|
||||
*/
|
||||
extractConfig(filePath) {
|
||||
const { cache } = internalSlotsMap.get(this);
|
||||
const indices = getMatchedIndices(this, filePath);
|
||||
const cacheKey = indices.join(",");
|
||||
|
||||
if (!cache.has(cacheKey)) {
|
||||
cache.set(cacheKey, createConfig(this, indices));
|
||||
}
|
||||
|
||||
return cache.get(cacheKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a given path is an additional lint target.
|
||||
* @param {string} filePath The absolute path to the target file.
|
||||
* @returns {boolean} `true` if the file is an additional lint target.
|
||||
*/
|
||||
isAdditionalTargetPath(filePath) {
|
||||
for (const { criteria, type } of this) {
|
||||
if (
|
||||
type === "config" &&
|
||||
criteria &&
|
||||
!criteria.endsWithWildcard &&
|
||||
criteria.test(filePath)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const exportObject = {
|
||||
ConfigArray,
|
||||
|
||||
/**
|
||||
* Get the used extracted configs.
|
||||
* CLIEngine will use this method to collect used deprecated rules.
|
||||
* @param {ConfigArray} instance The config array object to get.
|
||||
* @returns {ExtractedConfig[]} The used extracted configs.
|
||||
* @private
|
||||
*/
|
||||
getUsedExtractedConfigs(instance) {
|
||||
const { cache } = internalSlotsMap.get(instance);
|
||||
|
||||
return Array.from(cache.values());
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = exportObject;
|
||||
128
node_modules/eslint/lib/cli-engine/config-array/config-dependency.js
generated
vendored
128
node_modules/eslint/lib/cli-engine/config-array/config-dependency.js
generated
vendored
|
|
@ -1,128 +0,0 @@
|
|||
/*
|
||||
* STOP!!! DO NOT MODIFY.
|
||||
*
|
||||
* This file is part of the ongoing work to move the eslintrc-style config
|
||||
* system into the @eslint/eslintrc package. This file needs to remain
|
||||
* unchanged in order for this work to proceed.
|
||||
*
|
||||
* If you think you need to change this file, please contact @nzakas first.
|
||||
*
|
||||
* Thanks in advance for your cooperation.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview `ConfigDependency` class.
|
||||
*
|
||||
* `ConfigDependency` class expresses a loaded parser or plugin.
|
||||
*
|
||||
* If the parser or plugin was loaded successfully, it has `definition` property
|
||||
* and `filePath` property. Otherwise, it has `error` property.
|
||||
*
|
||||
* When `JSON.stringify()` converted a `ConfigDependency` object to a JSON, it
|
||||
* omits `definition` property.
|
||||
*
|
||||
* `ConfigArrayFactory` creates `ConfigDependency` objects when it loads parsers
|
||||
* or plugins.
|
||||
*
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
*/
|
||||
"use strict";
|
||||
|
||||
const util = require("util");
|
||||
|
||||
/**
|
||||
* The class is to store parsers or plugins.
|
||||
* This class hides the loaded object from `JSON.stringify()` and `console.log`.
|
||||
* @template T
|
||||
*/
|
||||
class ConfigDependency {
|
||||
|
||||
/**
|
||||
* Initialize this instance.
|
||||
* @param {Object} data The dependency data.
|
||||
* @param {T} [data.definition] The dependency if the loading succeeded.
|
||||
* @param {Error} [data.error] The error object if the loading failed.
|
||||
* @param {string} [data.filePath] The actual path to the dependency if the loading succeeded.
|
||||
* @param {string} data.id The ID of this dependency.
|
||||
* @param {string} data.importerName The name of the config file which loads this dependency.
|
||||
* @param {string} data.importerPath The path to the config file which loads this dependency.
|
||||
*/
|
||||
constructor({
|
||||
definition = null,
|
||||
error = null,
|
||||
filePath = null,
|
||||
id,
|
||||
importerName,
|
||||
importerPath
|
||||
}) {
|
||||
|
||||
/**
|
||||
* The loaded dependency if the loading succeeded.
|
||||
* @type {T|null}
|
||||
*/
|
||||
this.definition = definition;
|
||||
|
||||
/**
|
||||
* The error object if the loading failed.
|
||||
* @type {Error|null}
|
||||
*/
|
||||
this.error = error;
|
||||
|
||||
/**
|
||||
* The loaded dependency if the loading succeeded.
|
||||
* @type {string|null}
|
||||
*/
|
||||
this.filePath = filePath;
|
||||
|
||||
/**
|
||||
* The ID of this dependency.
|
||||
* @type {string}
|
||||
*/
|
||||
this.id = id;
|
||||
|
||||
/**
|
||||
* The name of the config file which loads this dependency.
|
||||
* @type {string}
|
||||
*/
|
||||
this.importerName = importerName;
|
||||
|
||||
/**
|
||||
* The path to the config file which loads this dependency.
|
||||
* @type {string}
|
||||
*/
|
||||
this.importerPath = importerPath;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line jsdoc/require-description
|
||||
/**
|
||||
* @returns {Object} a JSON compatible object.
|
||||
*/
|
||||
toJSON() {
|
||||
const obj = this[util.inspect.custom]();
|
||||
|
||||
// Display `error.message` (`Error#message` is unenumerable).
|
||||
if (obj.error instanceof Error) {
|
||||
obj.error = { ...obj.error, message: obj.error.message };
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line jsdoc/require-description
|
||||
/**
|
||||
* @returns {Object} an object to display by `console.log()`.
|
||||
*/
|
||||
[util.inspect.custom]() {
|
||||
const {
|
||||
definition: _ignore, // eslint-disable-line no-unused-vars
|
||||
...obj
|
||||
} = this;
|
||||
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
|
||||
/** @typedef {ConfigDependency<import("../../shared/types").Parser>} DependentParser */
|
||||
/** @typedef {ConfigDependency<import("../../shared/types").Plugin>} DependentPlugin */
|
||||
|
||||
module.exports = { ConfigDependency };
|
||||
158
node_modules/eslint/lib/cli-engine/config-array/extracted-config.js
generated
vendored
158
node_modules/eslint/lib/cli-engine/config-array/extracted-config.js
generated
vendored
|
|
@ -1,158 +0,0 @@
|
|||
/*
|
||||
* STOP!!! DO NOT MODIFY.
|
||||
*
|
||||
* This file is part of the ongoing work to move the eslintrc-style config
|
||||
* system into the @eslint/eslintrc package. This file needs to remain
|
||||
* unchanged in order for this work to proceed.
|
||||
*
|
||||
* If you think you need to change this file, please contact @nzakas first.
|
||||
*
|
||||
* Thanks in advance for your cooperation.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview `ExtractedConfig` class.
|
||||
*
|
||||
* `ExtractedConfig` class expresses a final configuration for a specific file.
|
||||
*
|
||||
* It provides one method.
|
||||
*
|
||||
* - `toCompatibleObjectAsConfigFileContent()`
|
||||
* Convert this configuration to the compatible object as the content of
|
||||
* config files. It converts the loaded parser and plugins to strings.
|
||||
* `CLIEngine#getConfigForFile(filePath)` method uses this method.
|
||||
*
|
||||
* `ConfigArray#extractConfig(filePath)` creates a `ExtractedConfig` instance.
|
||||
*
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
*/
|
||||
"use strict";
|
||||
|
||||
const { IgnorePattern } = require("./ignore-pattern");
|
||||
|
||||
// For VSCode intellisense
|
||||
/** @typedef {import("../../shared/types").ConfigData} ConfigData */
|
||||
/** @typedef {import("../../shared/types").GlobalConf} GlobalConf */
|
||||
/** @typedef {import("../../shared/types").SeverityConf} SeverityConf */
|
||||
/** @typedef {import("./config-dependency").DependentParser} DependentParser */
|
||||
/** @typedef {import("./config-dependency").DependentPlugin} DependentPlugin */
|
||||
|
||||
/**
|
||||
* Check if `xs` starts with `ys`.
|
||||
* @template T
|
||||
* @param {T[]} xs The array to check.
|
||||
* @param {T[]} ys The array that may be the first part of `xs`.
|
||||
* @returns {boolean} `true` if `xs` starts with `ys`.
|
||||
*/
|
||||
function startsWith(xs, ys) {
|
||||
return xs.length >= ys.length && ys.every((y, i) => y === xs[i]);
|
||||
}
|
||||
|
||||
/**
|
||||
* The class for extracted config data.
|
||||
*/
|
||||
class ExtractedConfig {
|
||||
constructor() {
|
||||
|
||||
/**
|
||||
* The config name what `noInlineConfig` setting came from.
|
||||
* @type {string}
|
||||
*/
|
||||
this.configNameOfNoInlineConfig = "";
|
||||
|
||||
/**
|
||||
* Environments.
|
||||
* @type {Record<string, boolean>}
|
||||
*/
|
||||
this.env = {};
|
||||
|
||||
/**
|
||||
* Global variables.
|
||||
* @type {Record<string, GlobalConf>}
|
||||
*/
|
||||
this.globals = {};
|
||||
|
||||
/**
|
||||
* The glob patterns that ignore to lint.
|
||||
* @type {(((filePath:string, dot?:boolean) => boolean) & { basePath:string; patterns:string[] }) | undefined}
|
||||
*/
|
||||
this.ignores = void 0;
|
||||
|
||||
/**
|
||||
* The flag that disables directive comments.
|
||||
* @type {boolean|undefined}
|
||||
*/
|
||||
this.noInlineConfig = void 0;
|
||||
|
||||
/**
|
||||
* Parser definition.
|
||||
* @type {DependentParser|null}
|
||||
*/
|
||||
this.parser = null;
|
||||
|
||||
/**
|
||||
* Options for the parser.
|
||||
* @type {Object}
|
||||
*/
|
||||
this.parserOptions = {};
|
||||
|
||||
/**
|
||||
* Plugin definitions.
|
||||
* @type {Record<string, DependentPlugin>}
|
||||
*/
|
||||
this.plugins = {};
|
||||
|
||||
/**
|
||||
* Processor ID.
|
||||
* @type {string|null}
|
||||
*/
|
||||
this.processor = null;
|
||||
|
||||
/**
|
||||
* The flag that reports unused `eslint-disable` directive comments.
|
||||
* @type {boolean|undefined}
|
||||
*/
|
||||
this.reportUnusedDisableDirectives = void 0;
|
||||
|
||||
/**
|
||||
* Rule settings.
|
||||
* @type {Record<string, [SeverityConf, ...any[]]>}
|
||||
*/
|
||||
this.rules = {};
|
||||
|
||||
/**
|
||||
* Shared settings.
|
||||
* @type {Object}
|
||||
*/
|
||||
this.settings = {};
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert this config to the compatible object as a config file content.
|
||||
* @returns {ConfigData} The converted object.
|
||||
*/
|
||||
toCompatibleObjectAsConfigFileContent() {
|
||||
const {
|
||||
/* eslint-disable no-unused-vars */
|
||||
configNameOfNoInlineConfig: _ignore1,
|
||||
processor: _ignore2,
|
||||
/* eslint-enable no-unused-vars */
|
||||
ignores,
|
||||
...config
|
||||
} = this;
|
||||
|
||||
config.parser = config.parser && config.parser.filePath;
|
||||
config.plugins = Object.keys(config.plugins).filter(Boolean).reverse();
|
||||
config.ignorePatterns = ignores ? ignores.patterns : [];
|
||||
|
||||
// Strip the default patterns from `ignorePatterns`.
|
||||
if (startsWith(config.ignorePatterns, IgnorePattern.DefaultPatterns)) {
|
||||
config.ignorePatterns =
|
||||
config.ignorePatterns.slice(IgnorePattern.DefaultPatterns.length);
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { ExtractedConfig };
|
||||
249
node_modules/eslint/lib/cli-engine/config-array/ignore-pattern.js
generated
vendored
249
node_modules/eslint/lib/cli-engine/config-array/ignore-pattern.js
generated
vendored
|
|
@ -1,249 +0,0 @@
|
|||
/*
|
||||
* STOP!!! DO NOT MODIFY.
|
||||
*
|
||||
* This file is part of the ongoing work to move the eslintrc-style config
|
||||
* system into the @eslint/eslintrc package. This file needs to remain
|
||||
* unchanged in order for this work to proceed.
|
||||
*
|
||||
* If you think you need to change this file, please contact @nzakas first.
|
||||
*
|
||||
* Thanks in advance for your cooperation.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview `IgnorePattern` class.
|
||||
*
|
||||
* `IgnorePattern` class has the set of glob patterns and the base path.
|
||||
*
|
||||
* It provides two static methods.
|
||||
*
|
||||
* - `IgnorePattern.createDefaultIgnore(cwd)`
|
||||
* Create the default predicate function.
|
||||
* - `IgnorePattern.createIgnore(ignorePatterns)`
|
||||
* Create the predicate function from multiple `IgnorePattern` objects.
|
||||
*
|
||||
* It provides two properties and a method.
|
||||
*
|
||||
* - `patterns`
|
||||
* The glob patterns that ignore to lint.
|
||||
* - `basePath`
|
||||
* The base path of the glob patterns. If absolute paths existed in the
|
||||
* glob patterns, those are handled as relative paths to the base path.
|
||||
* - `getPatternsRelativeTo(basePath)`
|
||||
* Get `patterns` as modified for a given base path. It modifies the
|
||||
* absolute paths in the patterns as prepending the difference of two base
|
||||
* paths.
|
||||
*
|
||||
* `ConfigArrayFactory` creates `IgnorePattern` objects when it processes
|
||||
* `ignorePatterns` properties.
|
||||
*
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
*/
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const assert = require("assert");
|
||||
const path = require("path");
|
||||
const ignore = require("ignore");
|
||||
const debug = require("debug")("eslint:ignore-pattern");
|
||||
|
||||
/** @typedef {ReturnType<import("ignore").default>} Ignore */
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Get the path to the common ancestor directory of given paths.
|
||||
* @param {string[]} sourcePaths The paths to calculate the common ancestor.
|
||||
* @returns {string} The path to the common ancestor directory.
|
||||
*/
|
||||
function getCommonAncestorPath(sourcePaths) {
|
||||
let result = sourcePaths[0];
|
||||
|
||||
for (let i = 1; i < sourcePaths.length; ++i) {
|
||||
const a = result;
|
||||
const b = sourcePaths[i];
|
||||
|
||||
// Set the shorter one (it's the common ancestor if one includes the other).
|
||||
result = a.length < b.length ? a : b;
|
||||
|
||||
// Set the common ancestor.
|
||||
for (let j = 0, lastSepPos = 0; j < a.length && j < b.length; ++j) {
|
||||
if (a[j] !== b[j]) {
|
||||
result = a.slice(0, lastSepPos);
|
||||
break;
|
||||
}
|
||||
if (a[j] === path.sep) {
|
||||
lastSepPos = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let resolvedResult = result || path.sep;
|
||||
|
||||
// if Windows common ancestor is root of drive must have trailing slash to be absolute.
|
||||
if (resolvedResult && resolvedResult.endsWith(":") && process.platform === "win32") {
|
||||
resolvedResult += path.sep;
|
||||
}
|
||||
return resolvedResult;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make relative path.
|
||||
* @param {string} from The source path to get relative path.
|
||||
* @param {string} to The destination path to get relative path.
|
||||
* @returns {string} The relative path.
|
||||
*/
|
||||
function relative(from, to) {
|
||||
const relPath = path.relative(from, to);
|
||||
|
||||
if (path.sep === "/") {
|
||||
return relPath;
|
||||
}
|
||||
return relPath.split(path.sep).join("/");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the trailing slash if existed.
|
||||
* @param {string} filePath The path to check.
|
||||
* @returns {string} The trailing slash if existed.
|
||||
*/
|
||||
function dirSuffix(filePath) {
|
||||
const isDir = (
|
||||
filePath.endsWith(path.sep) ||
|
||||
(process.platform === "win32" && filePath.endsWith("/"))
|
||||
);
|
||||
|
||||
return isDir ? "/" : "";
|
||||
}
|
||||
|
||||
const DefaultPatterns = Object.freeze(["/**/node_modules/*"]);
|
||||
const DotPatterns = Object.freeze([".*", "!.eslintrc.*", "!../"]);
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Public
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
class IgnorePattern {
|
||||
|
||||
/**
|
||||
* The default patterns.
|
||||
* @type {string[]}
|
||||
*/
|
||||
static get DefaultPatterns() {
|
||||
return DefaultPatterns;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the default predicate function.
|
||||
* @param {string} cwd The current working directory.
|
||||
* @returns {((filePath:string, dot:boolean) => boolean) & {basePath:string; patterns:string[]}}
|
||||
* The preficate function.
|
||||
* The first argument is an absolute path that is checked.
|
||||
* The second argument is the flag to not ignore dotfiles.
|
||||
* If the predicate function returned `true`, it means the path should be ignored.
|
||||
*/
|
||||
static createDefaultIgnore(cwd) {
|
||||
return this.createIgnore([new IgnorePattern(DefaultPatterns, cwd)]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the predicate function from multiple `IgnorePattern` objects.
|
||||
* @param {IgnorePattern[]} ignorePatterns The list of ignore patterns.
|
||||
* @returns {((filePath:string, dot?:boolean) => boolean) & {basePath:string; patterns:string[]}}
|
||||
* The preficate function.
|
||||
* The first argument is an absolute path that is checked.
|
||||
* The second argument is the flag to not ignore dotfiles.
|
||||
* If the predicate function returned `true`, it means the path should be ignored.
|
||||
*/
|
||||
static createIgnore(ignorePatterns) {
|
||||
debug("Create with: %o", ignorePatterns);
|
||||
|
||||
const basePath = getCommonAncestorPath(ignorePatterns.map(p => p.basePath));
|
||||
const patterns = [].concat(
|
||||
...ignorePatterns.map(p => p.getPatternsRelativeTo(basePath))
|
||||
);
|
||||
const ig = ignore().add([...DotPatterns, ...patterns]);
|
||||
const dotIg = ignore().add(patterns);
|
||||
|
||||
debug(" processed: %o", { basePath, patterns });
|
||||
|
||||
return Object.assign(
|
||||
(filePath, dot = false) => {
|
||||
assert(path.isAbsolute(filePath), "'filePath' should be an absolute path.");
|
||||
const relPathRaw = relative(basePath, filePath);
|
||||
const relPath = relPathRaw && (relPathRaw + dirSuffix(filePath));
|
||||
const adoptedIg = dot ? dotIg : ig;
|
||||
const result = relPath !== "" && adoptedIg.ignores(relPath);
|
||||
|
||||
debug("Check", { filePath, dot, relativePath: relPath, result });
|
||||
return result;
|
||||
},
|
||||
{ basePath, patterns }
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize a new `IgnorePattern` instance.
|
||||
* @param {string[]} patterns The glob patterns that ignore to lint.
|
||||
* @param {string} basePath The base path of `patterns`.
|
||||
*/
|
||||
constructor(patterns, basePath) {
|
||||
assert(path.isAbsolute(basePath), "'basePath' should be an absolute path.");
|
||||
|
||||
/**
|
||||
* The glob patterns that ignore to lint.
|
||||
* @type {string[]}
|
||||
*/
|
||||
this.patterns = patterns;
|
||||
|
||||
/**
|
||||
* The base path of `patterns`.
|
||||
* @type {string}
|
||||
*/
|
||||
this.basePath = basePath;
|
||||
|
||||
/**
|
||||
* If `true` then patterns which don't start with `/` will match the paths to the outside of `basePath`. Defaults to `false`.
|
||||
*
|
||||
* It's set `true` for `.eslintignore`, `package.json`, and `--ignore-path` for backward compatibility.
|
||||
* It's `false` as-is for `ignorePatterns` property in config files.
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.loose = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get `patterns` as modified for a given base path. It modifies the
|
||||
* absolute paths in the patterns as prepending the difference of two base
|
||||
* paths.
|
||||
* @param {string} newBasePath The base path.
|
||||
* @returns {string[]} Modifired patterns.
|
||||
*/
|
||||
getPatternsRelativeTo(newBasePath) {
|
||||
assert(path.isAbsolute(newBasePath), "'newBasePath' should be an absolute path.");
|
||||
const { basePath, loose, patterns } = this;
|
||||
|
||||
if (newBasePath === basePath) {
|
||||
return patterns;
|
||||
}
|
||||
const prefix = `/${relative(newBasePath, basePath)}`;
|
||||
|
||||
return patterns.map(pattern => {
|
||||
const negative = pattern.startsWith("!");
|
||||
const head = negative ? "!" : "";
|
||||
const body = negative ? pattern.slice(1) : pattern;
|
||||
|
||||
if (body.startsWith("/") || body.startsWith("../")) {
|
||||
return `${head}${prefix}${body}`;
|
||||
}
|
||||
return loose ? pattern : `${head}${prefix}/**/${body}`;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { IgnorePattern };
|
||||
32
node_modules/eslint/lib/cli-engine/config-array/index.js
generated
vendored
32
node_modules/eslint/lib/cli-engine/config-array/index.js
generated
vendored
|
|
@ -1,32 +0,0 @@
|
|||
/*
|
||||
* STOP!!! DO NOT MODIFY.
|
||||
*
|
||||
* This file is part of the ongoing work to move the eslintrc-style config
|
||||
* system into the @eslint/eslintrc package. This file needs to remain
|
||||
* unchanged in order for this work to proceed.
|
||||
*
|
||||
* If you think you need to change this file, please contact @nzakas first.
|
||||
*
|
||||
* Thanks in advance for your cooperation.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview `ConfigArray` class.
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
*/
|
||||
"use strict";
|
||||
|
||||
const { ConfigArray, getUsedExtractedConfigs } = require("./config-array");
|
||||
const { ConfigDependency } = require("./config-dependency");
|
||||
const { ExtractedConfig } = require("./extracted-config");
|
||||
const { IgnorePattern } = require("./ignore-pattern");
|
||||
const { OverrideTester } = require("./override-tester");
|
||||
|
||||
module.exports = {
|
||||
ConfigArray,
|
||||
ConfigDependency,
|
||||
ExtractedConfig,
|
||||
IgnorePattern,
|
||||
OverrideTester,
|
||||
getUsedExtractedConfigs
|
||||
};
|
||||
235
node_modules/eslint/lib/cli-engine/config-array/override-tester.js
generated
vendored
235
node_modules/eslint/lib/cli-engine/config-array/override-tester.js
generated
vendored
|
|
@ -1,235 +0,0 @@
|
|||
/*
|
||||
* STOP!!! DO NOT MODIFY.
|
||||
*
|
||||
* This file is part of the ongoing work to move the eslintrc-style config
|
||||
* system into the @eslint/eslintrc package. This file needs to remain
|
||||
* unchanged in order for this work to proceed.
|
||||
*
|
||||
* If you think you need to change this file, please contact @nzakas first.
|
||||
*
|
||||
* Thanks in advance for your cooperation.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview `OverrideTester` class.
|
||||
*
|
||||
* `OverrideTester` class handles `files` property and `excludedFiles` property
|
||||
* of `overrides` config.
|
||||
*
|
||||
* It provides one method.
|
||||
*
|
||||
* - `test(filePath)`
|
||||
* Test if a file path matches the pair of `files` property and
|
||||
* `excludedFiles` property. The `filePath` argument must be an absolute
|
||||
* path.
|
||||
*
|
||||
* `ConfigArrayFactory` creates `OverrideTester` objects when it processes
|
||||
* `overrides` properties.
|
||||
*
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
*/
|
||||
"use strict";
|
||||
|
||||
const assert = require("assert");
|
||||
const path = require("path");
|
||||
const util = require("util");
|
||||
const { Minimatch } = require("minimatch");
|
||||
const minimatchOpts = { dot: true, matchBase: true };
|
||||
|
||||
/**
|
||||
* @typedef {Object} Pattern
|
||||
* @property {InstanceType<Minimatch>[] | null} includes The positive matchers.
|
||||
* @property {InstanceType<Minimatch>[] | null} excludes The negative matchers.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Normalize a given pattern to an array.
|
||||
* @param {string|string[]|undefined} patterns A glob pattern or an array of glob patterns.
|
||||
* @returns {string[]|null} Normalized patterns.
|
||||
* @private
|
||||
*/
|
||||
function normalizePatterns(patterns) {
|
||||
if (Array.isArray(patterns)) {
|
||||
return patterns.filter(Boolean);
|
||||
}
|
||||
if (typeof patterns === "string" && patterns) {
|
||||
return [patterns];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the matchers of given patterns.
|
||||
* @param {string[]} patterns The patterns.
|
||||
* @returns {InstanceType<Minimatch>[] | null} The matchers.
|
||||
*/
|
||||
function toMatcher(patterns) {
|
||||
if (patterns.length === 0) {
|
||||
return null;
|
||||
}
|
||||
return patterns.map(pattern => {
|
||||
if (/^\.[/\\]/u.test(pattern)) {
|
||||
return new Minimatch(
|
||||
pattern.slice(2),
|
||||
|
||||
// `./*.js` should not match with `subdir/foo.js`
|
||||
{ ...minimatchOpts, matchBase: false }
|
||||
);
|
||||
}
|
||||
return new Minimatch(pattern, minimatchOpts);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a given matcher to string.
|
||||
* @param {Pattern} matchers The matchers.
|
||||
* @returns {string} The string expression of the matcher.
|
||||
*/
|
||||
function patternToJson({ includes, excludes }) {
|
||||
return {
|
||||
includes: includes && includes.map(m => m.pattern),
|
||||
excludes: excludes && excludes.map(m => m.pattern)
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* The class to test given paths are matched by the patterns.
|
||||
*/
|
||||
class OverrideTester {
|
||||
|
||||
/**
|
||||
* Create a tester with given criteria.
|
||||
* If there are no criteria, returns `null`.
|
||||
* @param {string|string[]} files The glob patterns for included files.
|
||||
* @param {string|string[]} excludedFiles The glob patterns for excluded files.
|
||||
* @param {string} basePath The path to the base directory to test paths.
|
||||
* @returns {OverrideTester|null} The created instance or `null`.
|
||||
*/
|
||||
static create(files, excludedFiles, basePath) {
|
||||
const includePatterns = normalizePatterns(files);
|
||||
const excludePatterns = normalizePatterns(excludedFiles);
|
||||
let endsWithWildcard = false;
|
||||
|
||||
if (includePatterns.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Rejects absolute paths or relative paths to parents.
|
||||
for (const pattern of includePatterns) {
|
||||
if (path.isAbsolute(pattern) || pattern.includes("..")) {
|
||||
throw new Error(`Invalid override pattern (expected relative path not containing '..'): ${pattern}`);
|
||||
}
|
||||
if (pattern.endsWith("*")) {
|
||||
endsWithWildcard = true;
|
||||
}
|
||||
}
|
||||
for (const pattern of excludePatterns) {
|
||||
if (path.isAbsolute(pattern) || pattern.includes("..")) {
|
||||
throw new Error(`Invalid override pattern (expected relative path not containing '..'): ${pattern}`);
|
||||
}
|
||||
}
|
||||
|
||||
const includes = toMatcher(includePatterns);
|
||||
const excludes = toMatcher(excludePatterns);
|
||||
|
||||
return new OverrideTester(
|
||||
[{ includes, excludes }],
|
||||
basePath,
|
||||
endsWithWildcard
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Combine two testers by logical and.
|
||||
* If either of the testers was `null`, returns the other tester.
|
||||
* The `basePath` property of the two must be the same value.
|
||||
* @param {OverrideTester|null} a A tester.
|
||||
* @param {OverrideTester|null} b Another tester.
|
||||
* @returns {OverrideTester|null} Combined tester.
|
||||
*/
|
||||
static and(a, b) {
|
||||
if (!b) {
|
||||
return a && new OverrideTester(
|
||||
a.patterns,
|
||||
a.basePath,
|
||||
a.endsWithWildcard
|
||||
);
|
||||
}
|
||||
if (!a) {
|
||||
return new OverrideTester(
|
||||
b.patterns,
|
||||
b.basePath,
|
||||
b.endsWithWildcard
|
||||
);
|
||||
}
|
||||
|
||||
assert.strictEqual(a.basePath, b.basePath);
|
||||
return new OverrideTester(
|
||||
a.patterns.concat(b.patterns),
|
||||
a.basePath,
|
||||
a.endsWithWildcard || b.endsWithWildcard
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize this instance.
|
||||
* @param {Pattern[]} patterns The matchers.
|
||||
* @param {string} basePath The base path.
|
||||
* @param {boolean} endsWithWildcard If `true` then a pattern ends with `*`.
|
||||
*/
|
||||
constructor(patterns, basePath, endsWithWildcard = false) {
|
||||
|
||||
/** @type {Pattern[]} */
|
||||
this.patterns = patterns;
|
||||
|
||||
/** @type {string} */
|
||||
this.basePath = basePath;
|
||||
|
||||
/** @type {boolean} */
|
||||
this.endsWithWildcard = endsWithWildcard;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if a given path is matched or not.
|
||||
* @param {string} filePath The absolute path to the target file.
|
||||
* @returns {boolean} `true` if the path was matched.
|
||||
*/
|
||||
test(filePath) {
|
||||
if (typeof filePath !== "string" || !path.isAbsolute(filePath)) {
|
||||
throw new Error(`'filePath' should be an absolute path, but got ${filePath}.`);
|
||||
}
|
||||
const relativePath = path.relative(this.basePath, filePath);
|
||||
|
||||
return this.patterns.every(({ includes, excludes }) => (
|
||||
(!includes || includes.some(m => m.match(relativePath))) &&
|
||||
(!excludes || !excludes.some(m => m.match(relativePath)))
|
||||
));
|
||||
}
|
||||
|
||||
// eslint-disable-next-line jsdoc/require-description
|
||||
/**
|
||||
* @returns {Object} a JSON compatible object.
|
||||
*/
|
||||
toJSON() {
|
||||
if (this.patterns.length === 1) {
|
||||
return {
|
||||
...patternToJson(this.patterns[0]),
|
||||
basePath: this.basePath
|
||||
};
|
||||
}
|
||||
return {
|
||||
AND: this.patterns.map(patternToJson),
|
||||
basePath: this.basePath
|
||||
};
|
||||
}
|
||||
|
||||
// eslint-disable-next-line jsdoc/require-description
|
||||
/**
|
||||
* @returns {Object} an object to display by `console.log()`.
|
||||
*/
|
||||
[util.inspect.custom]() {
|
||||
return this.toJSON();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { OverrideTester };
|
||||
26
node_modules/eslint/lib/cli-engine/file-enumerator.js
generated
vendored
26
node_modules/eslint/lib/cli-engine/file-enumerator.js
generated
vendored
|
|
@ -38,10 +38,15 @@ const fs = require("fs");
|
|||
const path = require("path");
|
||||
const getGlobParent = require("glob-parent");
|
||||
const isGlob = require("is-glob");
|
||||
const { escapeRegExp } = require("lodash");
|
||||
const escapeRegExp = require("escape-string-regexp");
|
||||
const { Minimatch } = require("minimatch");
|
||||
const { IgnorePattern } = require("./config-array");
|
||||
const { CascadingConfigArrayFactory } = require("./cascading-config-array-factory");
|
||||
|
||||
const {
|
||||
Legacy: {
|
||||
IgnorePattern,
|
||||
CascadingConfigArrayFactory
|
||||
}
|
||||
} = require("@eslint/eslintrc");
|
||||
const debug = require("debug")("eslint:file-enumerator");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -208,7 +213,11 @@ class FileEnumerator {
|
|||
*/
|
||||
constructor({
|
||||
cwd = process.cwd(),
|
||||
configArrayFactory = new CascadingConfigArrayFactory({ cwd }),
|
||||
configArrayFactory = new CascadingConfigArrayFactory({
|
||||
cwd,
|
||||
eslintRecommendedPath: path.resolve(__dirname, "../../conf/eslint-recommended.js"),
|
||||
eslintAllPath: path.resolve(__dirname, "../../conf/eslint-all.js")
|
||||
}),
|
||||
extensions = null,
|
||||
globInputPaths = true,
|
||||
errorOnUnmatchedPattern = true,
|
||||
|
|
@ -424,9 +433,14 @@ class FileEnumerator {
|
|||
// Enumerate the files of this directory.
|
||||
for (const entry of readdirSafeSync(directoryPath)) {
|
||||
const filePath = path.join(directoryPath, entry.name);
|
||||
const fileInfo = entry.isSymbolicLink() ? statSafeSync(filePath) : entry;
|
||||
|
||||
if (!fileInfo) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if the file is matched.
|
||||
if (entry.isFile()) {
|
||||
if (fileInfo.isFile()) {
|
||||
if (!config) {
|
||||
config = configArrayFactory.getConfigArrayForFile(
|
||||
filePath,
|
||||
|
|
@ -462,7 +476,7 @@ class FileEnumerator {
|
|||
}
|
||||
|
||||
// Dive into the sub directory.
|
||||
} else if (options.recursive && entry.isDirectory()) {
|
||||
} else if (options.recursive && fileInfo.isDirectory()) {
|
||||
if (!config) {
|
||||
config = configArrayFactory.getConfigArrayForFile(
|
||||
filePath,
|
||||
|
|
|
|||
8
node_modules/eslint/lib/cli-engine/formatters/html-template-message.html
generated
vendored
8
node_modules/eslint/lib/cli-engine/formatters/html-template-message.html
generated
vendored
|
|
@ -1,8 +0,0 @@
|
|||
<tr style="display:none" class="f-<%= parentIndex %>">
|
||||
<td><%= lineNumber %>:<%= columnNumber %></td>
|
||||
<td class="clr-<%= severityNumber %>"><%= severityName %></td>
|
||||
<td><%- message %></td>
|
||||
<td>
|
||||
<a href="<%= ruleUrl %>" target="_blank" rel="noopener noreferrer"><%= ruleId %></a>
|
||||
</td>
|
||||
</tr>
|
||||
115
node_modules/eslint/lib/cli-engine/formatters/html-template-page.html
generated
vendored
115
node_modules/eslint/lib/cli-engine/formatters/html-template-page.html
generated
vendored
|
|
@ -1,115 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>ESLint Report</title>
|
||||
<style>
|
||||
body {
|
||||
font-family:Arial, "Helvetica Neue", Helvetica, sans-serif;
|
||||
font-size:16px;
|
||||
font-weight:normal;
|
||||
margin:0;
|
||||
padding:0;
|
||||
color:#333
|
||||
}
|
||||
#overview {
|
||||
padding:20px 30px
|
||||
}
|
||||
td, th {
|
||||
padding:5px 10px
|
||||
}
|
||||
h1 {
|
||||
margin:0
|
||||
}
|
||||
table {
|
||||
margin:30px;
|
||||
width:calc(100% - 60px);
|
||||
max-width:1000px;
|
||||
border-radius:5px;
|
||||
border:1px solid #ddd;
|
||||
border-spacing:0px;
|
||||
}
|
||||
th {
|
||||
font-weight:400;
|
||||
font-size:medium;
|
||||
text-align:left;
|
||||
cursor:pointer
|
||||
}
|
||||
td.clr-1, td.clr-2, th span {
|
||||
font-weight:700
|
||||
}
|
||||
th span {
|
||||
float:right;
|
||||
margin-left:20px
|
||||
}
|
||||
th span:after {
|
||||
content:"";
|
||||
clear:both;
|
||||
display:block
|
||||
}
|
||||
tr:last-child td {
|
||||
border-bottom:none
|
||||
}
|
||||
tr td:first-child, tr td:last-child {
|
||||
color:#9da0a4
|
||||
}
|
||||
#overview.bg-0, tr.bg-0 th {
|
||||
color:#468847;
|
||||
background:#dff0d8;
|
||||
border-bottom:1px solid #d6e9c6
|
||||
}
|
||||
#overview.bg-1, tr.bg-1 th {
|
||||
color:#f0ad4e;
|
||||
background:#fcf8e3;
|
||||
border-bottom:1px solid #fbeed5
|
||||
}
|
||||
#overview.bg-2, tr.bg-2 th {
|
||||
color:#b94a48;
|
||||
background:#f2dede;
|
||||
border-bottom:1px solid #eed3d7
|
||||
}
|
||||
td {
|
||||
border-bottom:1px solid #ddd
|
||||
}
|
||||
td.clr-1 {
|
||||
color:#f0ad4e
|
||||
}
|
||||
td.clr-2 {
|
||||
color:#b94a48
|
||||
}
|
||||
td a {
|
||||
color:#3a33d1;
|
||||
text-decoration:none
|
||||
}
|
||||
td a:hover {
|
||||
color:#272296;
|
||||
text-decoration:underline
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="overview" class="bg-<%= reportColor %>">
|
||||
<h1>ESLint Report</h1>
|
||||
<div>
|
||||
<span><%= reportSummary %></span> - Generated on <%= date %>
|
||||
</div>
|
||||
</div>
|
||||
<table>
|
||||
<tbody>
|
||||
<%= results %>
|
||||
</tbody>
|
||||
</table>
|
||||
<script type="text/javascript">
|
||||
var groups = document.querySelectorAll("tr[data-group]");
|
||||
for (i = 0; i < groups.length; i++) {
|
||||
groups[i].addEventListener("click", function() {
|
||||
var inGroup = document.getElementsByClassName(this.getAttribute("data-group"));
|
||||
this.innerHTML = (this.innerHTML.indexOf("+") > -1) ? this.innerHTML.replace("+", "-") : this.innerHTML.replace("-", "+");
|
||||
for (var j = 0; j < inGroup.length; j++) {
|
||||
inGroup[j].style.display = (inGroup[j].style.display !== "none") ? "none" : "table-row";
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
6
node_modules/eslint/lib/cli-engine/formatters/html-template-result.html
generated
vendored
6
node_modules/eslint/lib/cli-engine/formatters/html-template-result.html
generated
vendored
|
|
@ -1,6 +0,0 @@
|
|||
<tr class="bg-<%- color %>" data-group="f-<%- index %>">
|
||||
<th colspan="4">
|
||||
[+] <%- filePath %>
|
||||
<span><%- summary %></span>
|
||||
</th>
|
||||
</tr>
|
||||
206
node_modules/eslint/lib/cli-engine/formatters/html.js
generated
vendored
206
node_modules/eslint/lib/cli-engine/formatters/html.js
generated
vendored
|
|
@ -4,17 +4,153 @@
|
|||
*/
|
||||
"use strict";
|
||||
|
||||
const lodash = require("lodash");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const pageTemplate = lodash.template(fs.readFileSync(path.join(__dirname, "html-template-page.html"), "utf-8"));
|
||||
const messageTemplate = lodash.template(fs.readFileSync(path.join(__dirname, "html-template-message.html"), "utf-8"));
|
||||
const resultTemplate = lodash.template(fs.readFileSync(path.join(__dirname, "html-template-result.html"), "utf-8"));
|
||||
const encodeHTML = (function() {
|
||||
const encodeHTMLRules = {
|
||||
"&": "&",
|
||||
"<": "<",
|
||||
">": ">",
|
||||
'"': """,
|
||||
"'": "'"
|
||||
};
|
||||
const matchHTML = /[&<>"']/ug;
|
||||
|
||||
return function(code) {
|
||||
return code
|
||||
? code.toString().replace(matchHTML, m => encodeHTMLRules[m] || m)
|
||||
: "";
|
||||
};
|
||||
}());
|
||||
|
||||
/**
|
||||
* Get the final HTML document.
|
||||
* @param {Object} it data for the document.
|
||||
* @returns {string} HTML document.
|
||||
*/
|
||||
function pageTemplate(it) {
|
||||
const { reportColor, reportSummary, date, results } = it;
|
||||
|
||||
return `
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>ESLint Report</title>
|
||||
<style>
|
||||
body {
|
||||
font-family:Arial, "Helvetica Neue", Helvetica, sans-serif;
|
||||
font-size:16px;
|
||||
font-weight:normal;
|
||||
margin:0;
|
||||
padding:0;
|
||||
color:#333
|
||||
}
|
||||
#overview {
|
||||
padding:20px 30px
|
||||
}
|
||||
td, th {
|
||||
padding:5px 10px
|
||||
}
|
||||
h1 {
|
||||
margin:0
|
||||
}
|
||||
table {
|
||||
margin:30px;
|
||||
width:calc(100% - 60px);
|
||||
max-width:1000px;
|
||||
border-radius:5px;
|
||||
border:1px solid #ddd;
|
||||
border-spacing:0px;
|
||||
}
|
||||
th {
|
||||
font-weight:400;
|
||||
font-size:medium;
|
||||
text-align:left;
|
||||
cursor:pointer
|
||||
}
|
||||
td.clr-1, td.clr-2, th span {
|
||||
font-weight:700
|
||||
}
|
||||
th span {
|
||||
float:right;
|
||||
margin-left:20px
|
||||
}
|
||||
th span:after {
|
||||
content:"";
|
||||
clear:both;
|
||||
display:block
|
||||
}
|
||||
tr:last-child td {
|
||||
border-bottom:none
|
||||
}
|
||||
tr td:first-child, tr td:last-child {
|
||||
color:#9da0a4
|
||||
}
|
||||
#overview.bg-0, tr.bg-0 th {
|
||||
color:#468847;
|
||||
background:#dff0d8;
|
||||
border-bottom:1px solid #d6e9c6
|
||||
}
|
||||
#overview.bg-1, tr.bg-1 th {
|
||||
color:#f0ad4e;
|
||||
background:#fcf8e3;
|
||||
border-bottom:1px solid #fbeed5
|
||||
}
|
||||
#overview.bg-2, tr.bg-2 th {
|
||||
color:#b94a48;
|
||||
background:#f2dede;
|
||||
border-bottom:1px solid #eed3d7
|
||||
}
|
||||
td {
|
||||
border-bottom:1px solid #ddd
|
||||
}
|
||||
td.clr-1 {
|
||||
color:#f0ad4e
|
||||
}
|
||||
td.clr-2 {
|
||||
color:#b94a48
|
||||
}
|
||||
td a {
|
||||
color:#3a33d1;
|
||||
text-decoration:none
|
||||
}
|
||||
td a:hover {
|
||||
color:#272296;
|
||||
text-decoration:underline
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="overview" class="bg-${reportColor}">
|
||||
<h1>ESLint Report</h1>
|
||||
<div>
|
||||
<span>${reportSummary}</span> - Generated on ${date}
|
||||
</div>
|
||||
</div>
|
||||
<table>
|
||||
<tbody>
|
||||
${results}
|
||||
</tbody>
|
||||
</table>
|
||||
<script type="text/javascript">
|
||||
var groups = document.querySelectorAll("tr[data-group]");
|
||||
for (i = 0; i < groups.length; i++) {
|
||||
groups[i].addEventListener("click", function() {
|
||||
var inGroup = document.getElementsByClassName(this.getAttribute("data-group"));
|
||||
this.innerHTML = (this.innerHTML.indexOf("+") > -1) ? this.innerHTML.replace("+", "-") : this.innerHTML.replace("-", "+");
|
||||
for (var j = 0; j < inGroup.length; j++) {
|
||||
inGroup[j].style.display = (inGroup[j].style.display !== "none") ? "none" : "table-row";
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
`.trimLeft();
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a word and a count, append an s if count is not one.
|
||||
|
|
@ -58,6 +194,35 @@ function renderColor(totalErrors, totalWarnings) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTML (table row) describing a single message.
|
||||
* @param {Object} it data for the message.
|
||||
* @returns {string} HTML (table row) describing the message.
|
||||
*/
|
||||
function messageTemplate(it) {
|
||||
const {
|
||||
parentIndex,
|
||||
lineNumber,
|
||||
columnNumber,
|
||||
severityNumber,
|
||||
severityName,
|
||||
message,
|
||||
ruleUrl,
|
||||
ruleId
|
||||
} = it;
|
||||
|
||||
return `
|
||||
<tr style="display:none" class="f-${parentIndex}">
|
||||
<td>${lineNumber}:${columnNumber}</td>
|
||||
<td class="clr-${severityNumber}">${severityName}</td>
|
||||
<td>${encodeHTML(message)}</td>
|
||||
<td>
|
||||
<a href="${ruleUrl ? ruleUrl : ""}" target="_blank" rel="noopener noreferrer">${ruleId ? ruleId : ""}</a>
|
||||
</td>
|
||||
</tr>
|
||||
`.trimLeft();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTML (table rows) describing the messages.
|
||||
* @param {Array} messages Messages.
|
||||
|
|
@ -72,7 +237,7 @@ function renderMessages(messages, parentIndex, rulesMeta) {
|
|||
* @param {Object} message Message.
|
||||
* @returns {string} HTML (table row) describing a message.
|
||||
*/
|
||||
return lodash.map(messages, message => {
|
||||
return messages.map(message => {
|
||||
const lineNumber = message.line || 0;
|
||||
const columnNumber = message.column || 0;
|
||||
let ruleUrl;
|
||||
|
|
@ -80,7 +245,9 @@ function renderMessages(messages, parentIndex, rulesMeta) {
|
|||
if (rulesMeta) {
|
||||
const meta = rulesMeta[message.ruleId];
|
||||
|
||||
ruleUrl = lodash.get(meta, "docs.url", null);
|
||||
if (meta && meta.docs && meta.docs.url) {
|
||||
ruleUrl = meta.docs.url;
|
||||
}
|
||||
}
|
||||
|
||||
return messageTemplate({
|
||||
|
|
@ -96,6 +263,24 @@ function renderMessages(messages, parentIndex, rulesMeta) {
|
|||
}).join("\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTML (table row) describing the result for a single file.
|
||||
* @param {Object} it data for the file.
|
||||
* @returns {string} HTML (table row) describing the result for the file.
|
||||
*/
|
||||
function resultTemplate(it) {
|
||||
const { color, index, filePath, summary } = it;
|
||||
|
||||
return `
|
||||
<tr class="bg-${color}" data-group="f-${index}">
|
||||
<th colspan="4">
|
||||
[+] ${encodeHTML(filePath)}
|
||||
<span>${encodeHTML(summary)}</span>
|
||||
</th>
|
||||
</tr>
|
||||
`.trimLeft();
|
||||
}
|
||||
|
||||
// eslint-disable-next-line jsdoc/require-description
|
||||
/**
|
||||
* @param {Array} results Test results.
|
||||
|
|
@ -103,12 +288,11 @@ function renderMessages(messages, parentIndex, rulesMeta) {
|
|||
* @returns {string} HTML string describing the results.
|
||||
*/
|
||||
function renderResults(results, rulesMeta) {
|
||||
return lodash.map(results, (result, index) => resultTemplate({
|
||||
return results.map((result, index) => resultTemplate({
|
||||
index,
|
||||
color: renderColor(result.errorCount, result.warningCount),
|
||||
filePath: result.filePath,
|
||||
summary: renderSummary(result.errorCount, result.warningCount)
|
||||
|
||||
}) + renderMessages(result.messages, index, rulesMeta)).join("\n");
|
||||
}
|
||||
|
||||
|
|
|
|||
63
node_modules/eslint/lib/cli-engine/lint-result-cache.js
generated
vendored
63
node_modules/eslint/lib/cli-engine/lint-result-cache.js
generated
vendored
|
|
@ -15,6 +15,8 @@ const stringify = require("json-stable-stringify-without-jsonify");
|
|||
const pkg = require("../../package.json");
|
||||
const hash = require("./hash");
|
||||
|
||||
const debug = require("debug")("eslint:lint-result-cache");
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -22,6 +24,22 @@ const hash = require("./hash");
|
|||
const configHashCache = new WeakMap();
|
||||
const nodeVersion = process && process.version;
|
||||
|
||||
const validCacheStrategies = ["metadata", "content"];
|
||||
const invalidCacheStrategyErrorMessage = `Cache strategy must be one of: ${validCacheStrategies
|
||||
.map(strategy => `"${strategy}"`)
|
||||
.join(", ")}`;
|
||||
|
||||
/**
|
||||
* Tests whether a provided cacheStrategy is valid
|
||||
* @param {string} cacheStrategy The cache strategy to use
|
||||
* @returns {boolean} true if `cacheStrategy` is one of `validCacheStrategies`; false otherwise
|
||||
*/
|
||||
function isValidCacheStrategy(cacheStrategy) {
|
||||
return (
|
||||
validCacheStrategies.indexOf(cacheStrategy) !== -1
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the hash of the config
|
||||
* @param {ConfigArray} config The config.
|
||||
|
|
@ -49,12 +67,30 @@ class LintResultCache {
|
|||
/**
|
||||
* Creates a new LintResultCache instance.
|
||||
* @param {string} cacheFileLocation The cache file location.
|
||||
* configuration lookup by file path).
|
||||
* @param {"metadata" | "content"} cacheStrategy The cache strategy to use.
|
||||
*/
|
||||
constructor(cacheFileLocation) {
|
||||
constructor(cacheFileLocation, cacheStrategy) {
|
||||
assert(cacheFileLocation, "Cache file location is required");
|
||||
assert(cacheStrategy, "Cache strategy is required");
|
||||
assert(
|
||||
isValidCacheStrategy(cacheStrategy),
|
||||
invalidCacheStrategyErrorMessage
|
||||
);
|
||||
|
||||
this.fileEntryCache = fileEntryCache.create(cacheFileLocation);
|
||||
debug(`Caching results to ${cacheFileLocation}`);
|
||||
|
||||
const useChecksum = cacheStrategy === "content";
|
||||
|
||||
debug(
|
||||
`Using "${cacheStrategy}" strategy to detect changes`
|
||||
);
|
||||
|
||||
this.fileEntryCache = fileEntryCache.create(
|
||||
cacheFileLocation,
|
||||
void 0,
|
||||
useChecksum
|
||||
);
|
||||
this.cacheFileLocation = cacheFileLocation;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -76,17 +112,28 @@ class LintResultCache {
|
|||
* was previously linted
|
||||
* If any of these are not true, we will not reuse the lint results.
|
||||
*/
|
||||
|
||||
const fileDescriptor = this.fileEntryCache.getFileDescriptor(filePath);
|
||||
const hashOfConfig = hashOfConfigFor(config);
|
||||
const changed = fileDescriptor.changed || fileDescriptor.meta.hashOfConfig !== hashOfConfig;
|
||||
const changed =
|
||||
fileDescriptor.changed ||
|
||||
fileDescriptor.meta.hashOfConfig !== hashOfConfig;
|
||||
|
||||
if (fileDescriptor.notFound || changed) {
|
||||
if (fileDescriptor.notFound) {
|
||||
debug(`File not found on the file system: ${filePath}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
debug(`Cache entry not found or no longer valid: ${filePath}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
// If source is present but null, need to reread the file from the filesystem.
|
||||
if (fileDescriptor.meta.results && fileDescriptor.meta.results.source === null) {
|
||||
if (
|
||||
fileDescriptor.meta.results &&
|
||||
fileDescriptor.meta.results.source === null
|
||||
) {
|
||||
debug(`Rereading cached result source from filesystem: ${filePath}`);
|
||||
fileDescriptor.meta.results.source = fs.readFileSync(filePath, "utf-8");
|
||||
}
|
||||
|
||||
|
|
@ -112,6 +159,7 @@ class LintResultCache {
|
|||
const fileDescriptor = this.fileEntryCache.getFileDescriptor(filePath);
|
||||
|
||||
if (fileDescriptor && !fileDescriptor.notFound) {
|
||||
debug(`Updating cached result: ${filePath}`);
|
||||
|
||||
// Serialize the result, except that we want to remove the file source if present.
|
||||
const resultToSerialize = Object.assign({}, result);
|
||||
|
|
@ -135,6 +183,7 @@ class LintResultCache {
|
|||
* @returns {void}
|
||||
*/
|
||||
reconcile() {
|
||||
debug(`Persisting cached results: ${this.cacheFileLocation}`);
|
||||
this.fileEntryCache.reconcile();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
15
node_modules/eslint/lib/cli.js
generated
vendored
15
node_modules/eslint/lib/cli.js
generated
vendored
|
|
@ -32,6 +32,7 @@ const debug = require("debug")("eslint:cli");
|
|||
/** @typedef {import("./eslint/eslint").ESLintOptions} ESLintOptions */
|
||||
/** @typedef {import("./eslint/eslint").LintMessage} LintMessage */
|
||||
/** @typedef {import("./eslint/eslint").LintResult} LintResult */
|
||||
/** @typedef {import("./options").ParsedCLIOptions} ParsedCLIOptions */
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
|
|
@ -54,7 +55,7 @@ function quietFixPredicate(message) {
|
|||
|
||||
/**
|
||||
* Translates the CLI options into the options expected by the CLIEngine.
|
||||
* @param {Object} cliOptions The CLI options to translate.
|
||||
* @param {ParsedCLIOptions} cliOptions The CLI options to translate.
|
||||
* @returns {ESLintOptions} The options object for the CLIEngine.
|
||||
* @private
|
||||
*/
|
||||
|
|
@ -62,6 +63,7 @@ function translateOptions({
|
|||
cache,
|
||||
cacheFile,
|
||||
cacheLocation,
|
||||
cacheStrategy,
|
||||
config,
|
||||
env,
|
||||
errorOnUnmatchedPattern,
|
||||
|
|
@ -88,6 +90,7 @@ function translateOptions({
|
|||
allowInlineConfig: inlineConfig,
|
||||
cache,
|
||||
cacheLocation: cacheLocation || cacheFile,
|
||||
cacheStrategy,
|
||||
errorOnUnmatchedPattern,
|
||||
extensions: ext,
|
||||
fix: (fix || fixDryRun) && (quiet ? quietFixPredicate : true),
|
||||
|
|
@ -219,6 +222,8 @@ const cli = {
|
|||
if (Array.isArray(args)) {
|
||||
debug("CLI args: %o", args.slice(2));
|
||||
}
|
||||
|
||||
/** @type {ParsedCLIOptions} */
|
||||
let options;
|
||||
|
||||
try {
|
||||
|
|
@ -299,12 +304,16 @@ const cli = {
|
|||
await ESLint.outputFixes(results);
|
||||
}
|
||||
|
||||
let resultsToPrint = results;
|
||||
|
||||
if (options.quiet) {
|
||||
debug("Quiet mode enabled - filtering out warnings");
|
||||
results = ESLint.getErrorResults(results);
|
||||
resultsToPrint = ESLint.getErrorResults(resultsToPrint);
|
||||
}
|
||||
|
||||
if (await printResults(engine, results, options.format, options.outputFile)) {
|
||||
if (await printResults(engine, resultsToPrint, options.format, options.outputFile)) {
|
||||
|
||||
// Errors and warnings from the original unfiltered results should determine the exit code
|
||||
const { errorCount, warningCount } = countErrors(results);
|
||||
const tooManyWarnings =
|
||||
options.maxWarnings >= 0 && warningCount > options.maxWarnings;
|
||||
|
|
|
|||
52
node_modules/eslint/lib/config/default-config.js
generated
vendored
Normal file
52
node_modules/eslint/lib/config/default-config.js
generated
vendored
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* @fileoverview Default configuration
|
||||
* @author Nicholas C. Zakas
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
const Rules = require("../rules");
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
exports.defaultConfig = [
|
||||
{
|
||||
plugins: {
|
||||
"@": {
|
||||
parsers: {
|
||||
espree: require("espree")
|
||||
},
|
||||
|
||||
/*
|
||||
* Because we try to delay loading rules until absolutely
|
||||
* necessary, a proxy allows us to hook into the lazy-loading
|
||||
* aspect of the rules map while still keeping all of the
|
||||
* relevant configuration inside of the config array.
|
||||
*/
|
||||
rules: new Proxy({}, {
|
||||
get(target, property) {
|
||||
return Rules.get(property);
|
||||
},
|
||||
|
||||
has(target, property) {
|
||||
return Rules.has(property);
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
ignores: [
|
||||
"**/node_modules/**",
|
||||
".git/**"
|
||||
],
|
||||
languageOptions: {
|
||||
parser: "@/espree"
|
||||
}
|
||||
}
|
||||
];
|
||||
125
node_modules/eslint/lib/config/flat-config-array.js
generated
vendored
Normal file
125
node_modules/eslint/lib/config/flat-config-array.js
generated
vendored
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
/**
|
||||
* @fileoverview Flat Config Array
|
||||
* @author Nicholas C. Zakas
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
const { ConfigArray, ConfigArraySymbol } = require("@humanwhocodes/config-array");
|
||||
const { flatConfigSchema } = require("./flat-config-schema");
|
||||
const { RuleValidator } = require("./rule-validator");
|
||||
const { defaultConfig } = require("./default-config");
|
||||
const recommendedConfig = require("../../conf/eslint-recommended");
|
||||
const allConfig = require("../../conf/eslint-all");
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
const ruleValidator = new RuleValidator();
|
||||
|
||||
/**
|
||||
* Splits a plugin identifier in the form a/b/c into two parts: a/b and c.
|
||||
* @param {string} identifier The identifier to parse.
|
||||
* @returns {{objectName: string, pluginName: string}} The parts of the plugin
|
||||
* name.
|
||||
*/
|
||||
function splitPluginIdentifier(identifier) {
|
||||
const parts = identifier.split("/");
|
||||
|
||||
return {
|
||||
objectName: parts.pop(),
|
||||
pluginName: parts.join("/")
|
||||
};
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Exports
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Represents an array containing configuration information for ESLint.
|
||||
*/
|
||||
class FlatConfigArray extends ConfigArray {
|
||||
|
||||
/**
|
||||
* Creates a new instance.
|
||||
* @param {*[]} configs An array of configuration information.
|
||||
* @param {{basePath: string, baseConfig: FlatConfig}} options The options
|
||||
* to use for the config array instance.
|
||||
*/
|
||||
constructor(configs, { basePath, baseConfig = defaultConfig }) {
|
||||
super(configs, {
|
||||
basePath,
|
||||
schema: flatConfigSchema
|
||||
});
|
||||
|
||||
this.unshift(baseConfig);
|
||||
}
|
||||
|
||||
/* eslint-disable class-methods-use-this */
|
||||
/**
|
||||
* Replaces a config with another config to allow us to put strings
|
||||
* in the config array that will be replaced by objects before
|
||||
* normalization.
|
||||
* @param {Object} config The config to preprocess.
|
||||
* @returns {Object} The preprocessed config.
|
||||
*/
|
||||
[ConfigArraySymbol.preprocessConfig](config) {
|
||||
if (config === "eslint:recommended") {
|
||||
return recommendedConfig;
|
||||
}
|
||||
|
||||
if (config === "eslint:all") {
|
||||
return allConfig;
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finalizes the config by replacing plugin references with their objects
|
||||
* and validating rule option schemas.
|
||||
* @param {Object} config The config to finalize.
|
||||
* @returns {Object} The finalized config.
|
||||
* @throws {TypeError} If the config is invalid.
|
||||
*/
|
||||
[ConfigArraySymbol.finalizeConfig](config) {
|
||||
|
||||
const { plugins, languageOptions, processor } = config;
|
||||
|
||||
// Check parser value
|
||||
if (languageOptions && languageOptions.parser && typeof languageOptions.parser === "string") {
|
||||
const { pluginName, objectName: parserName } = splitPluginIdentifier(languageOptions.parser);
|
||||
|
||||
if (!plugins || !plugins[pluginName] || !plugins[pluginName].parsers || !plugins[pluginName].parsers[parserName]) {
|
||||
throw new TypeError(`Key "parser": Could not find "${parserName}" in plugin "${pluginName}".`);
|
||||
}
|
||||
|
||||
languageOptions.parser = plugins[pluginName].parsers[parserName];
|
||||
}
|
||||
|
||||
// Check processor value
|
||||
if (processor && typeof processor === "string") {
|
||||
const { pluginName, objectName: processorName } = splitPluginIdentifier(processor);
|
||||
|
||||
if (!plugins || !plugins[pluginName] || !plugins[pluginName].processors || !plugins[pluginName].processors[processorName]) {
|
||||
throw new TypeError(`Key "processor": Could not find "${processorName}" in plugin "${pluginName}".`);
|
||||
}
|
||||
|
||||
config.processor = plugins[pluginName].processors[processorName];
|
||||
}
|
||||
|
||||
ruleValidator.validate(config);
|
||||
|
||||
return config;
|
||||
}
|
||||
/* eslint-enable class-methods-use-this */
|
||||
|
||||
}
|
||||
|
||||
exports.FlatConfigArray = FlatConfigArray;
|
||||
452
node_modules/eslint/lib/config/flat-config-schema.js
generated
vendored
Normal file
452
node_modules/eslint/lib/config/flat-config-schema.js
generated
vendored
Normal file
|
|
@ -0,0 +1,452 @@
|
|||
/**
|
||||
* @fileoverview Flat config schema
|
||||
* @author Nicholas C. Zakas
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Type Definitions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* @typedef ObjectPropertySchema
|
||||
* @property {Function|string} merge The function or name of the function to call
|
||||
* to merge multiple objects with this property.
|
||||
* @property {Function|string} validate The function or name of the function to call
|
||||
* to validate the value of this property.
|
||||
*/
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
const ruleSeverities = new Map([
|
||||
[0, 0], ["off", 0],
|
||||
[1, 1], ["warn", 1],
|
||||
[2, 2], ["error", 2]
|
||||
]);
|
||||
|
||||
const globalVariablesValues = new Set([
|
||||
true, "true", "writable", "writeable",
|
||||
false, "false", "readonly", "readable", null,
|
||||
"off"
|
||||
]);
|
||||
|
||||
/**
|
||||
* Check if a value is a non-null object.
|
||||
* @param {any} value The value to check.
|
||||
* @returns {boolean} `true` if the value is a non-null object.
|
||||
*/
|
||||
function isNonNullObject(value) {
|
||||
return typeof value === "object" && value !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a value is undefined.
|
||||
* @param {any} value The value to check.
|
||||
* @returns {boolean} `true` if the value is undefined.
|
||||
*/
|
||||
function isUndefined(value) {
|
||||
return typeof value === "undefined";
|
||||
}
|
||||
|
||||
/**
|
||||
* Deeply merges two objects.
|
||||
* @param {Object} first The base object.
|
||||
* @param {Object} second The overrides object.
|
||||
* @returns {Object} An object with properties from both first and second.
|
||||
*/
|
||||
function deepMerge(first = {}, second = {}) {
|
||||
|
||||
/*
|
||||
* If the second value is an array, just return it. We don't merge
|
||||
* arrays because order matters and we can't know the correct order.
|
||||
*/
|
||||
if (Array.isArray(second)) {
|
||||
return second;
|
||||
}
|
||||
|
||||
/*
|
||||
* First create a result object where properties from the second object
|
||||
* overwrite properties from the first. This sets up a baseline to use
|
||||
* later rather than needing to inspect and change every property
|
||||
* individually.
|
||||
*/
|
||||
const result = {
|
||||
...first,
|
||||
...second
|
||||
};
|
||||
|
||||
for (const key of Object.keys(second)) {
|
||||
|
||||
// avoid hairy edge case
|
||||
if (key === "__proto__") {
|
||||
continue;
|
||||
}
|
||||
|
||||
const firstValue = first[key];
|
||||
const secondValue = second[key];
|
||||
|
||||
if (isNonNullObject(firstValue)) {
|
||||
result[key] = deepMerge(firstValue, secondValue);
|
||||
} else if (isUndefined(firstValue)) {
|
||||
if (isNonNullObject(secondValue)) {
|
||||
result[key] = deepMerge(
|
||||
Array.isArray(secondValue) ? [] : {},
|
||||
secondValue
|
||||
);
|
||||
} else if (!isUndefined(secondValue)) {
|
||||
result[key] = secondValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalizes the rule options config for a given rule by ensuring that
|
||||
* it is an array and that the first item is 0, 1, or 2.
|
||||
* @param {Array|string|number} ruleOptions The rule options config.
|
||||
* @returns {Array} An array of rule options.
|
||||
*/
|
||||
function normalizeRuleOptions(ruleOptions) {
|
||||
|
||||
const finalOptions = Array.isArray(ruleOptions)
|
||||
? ruleOptions.slice(0)
|
||||
: [ruleOptions];
|
||||
|
||||
finalOptions[0] = ruleSeverities.get(finalOptions[0]);
|
||||
return finalOptions;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Assertions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Validates that a value is a valid rule options entry.
|
||||
* @param {any} value The value to check.
|
||||
* @returns {void}
|
||||
* @throws {TypeError} If the value isn't a valid rule options.
|
||||
*/
|
||||
function assertIsRuleOptions(value) {
|
||||
|
||||
if (typeof value !== "string" && typeof value !== "number" && !Array.isArray(value)) {
|
||||
throw new TypeError("Expected a string, number, or array.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates that a value is valid rule severity.
|
||||
* @param {any} value The value to check.
|
||||
* @returns {void}
|
||||
* @throws {TypeError} If the value isn't a valid rule severity.
|
||||
*/
|
||||
function assertIsRuleSeverity(value) {
|
||||
const severity = typeof value === "string"
|
||||
? ruleSeverities.get(value.toLowerCase())
|
||||
: ruleSeverities.get(value);
|
||||
|
||||
if (typeof severity === "undefined") {
|
||||
throw new TypeError("Expected severity of \"off\", 0, \"warn\", 1, \"error\", or 2.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates that a given string is the form pluginName/objectName.
|
||||
* @param {string} value The string to check.
|
||||
* @returns {void}
|
||||
* @throws {TypeError} If the string isn't in the correct format.
|
||||
*/
|
||||
function assertIsPluginMemberName(value) {
|
||||
if (!/[@a-z0-9-_$]+(?:\/(?:[a-z0-9-_$]+))+$/iu.test(value)) {
|
||||
throw new TypeError(`Expected string in the form "pluginName/objectName" but found "${value}".`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates that a value is an object.
|
||||
* @param {any} value The value to check.
|
||||
* @returns {void}
|
||||
* @throws {TypeError} If the value isn't an object.
|
||||
*/
|
||||
function assertIsObject(value) {
|
||||
if (!isNonNullObject(value)) {
|
||||
throw new TypeError("Expected an object.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates that a value is an object or a string.
|
||||
* @param {any} value The value to check.
|
||||
* @returns {void}
|
||||
* @throws {TypeError} If the value isn't an object or a string.
|
||||
*/
|
||||
function assertIsObjectOrString(value) {
|
||||
if ((!value || typeof value !== "object") && typeof value !== "string") {
|
||||
throw new TypeError("Expected an object or string.");
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Low-Level Schemas
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
/** @type {ObjectPropertySchema} */
|
||||
const numberSchema = {
|
||||
merge: "replace",
|
||||
validate: "number"
|
||||
};
|
||||
|
||||
/** @type {ObjectPropertySchema} */
|
||||
const booleanSchema = {
|
||||
merge: "replace",
|
||||
validate: "boolean"
|
||||
};
|
||||
|
||||
/** @type {ObjectPropertySchema} */
|
||||
const deepObjectAssignSchema = {
|
||||
merge(first = {}, second = {}) {
|
||||
return deepMerge(first, second);
|
||||
},
|
||||
validate: "object"
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// High-Level Schemas
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
/** @type {ObjectPropertySchema} */
|
||||
const globalsSchema = {
|
||||
merge: "assign",
|
||||
validate(value) {
|
||||
|
||||
assertIsObject(value);
|
||||
|
||||
for (const key of Object.keys(value)) {
|
||||
|
||||
// avoid hairy edge case
|
||||
if (key === "__proto__") {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (key !== key.trim()) {
|
||||
throw new TypeError(`Global "${key}" has leading or trailing whitespace.`);
|
||||
}
|
||||
|
||||
if (!globalVariablesValues.has(value[key])) {
|
||||
throw new TypeError(`Key "${key}": Expected "readonly", "writable", or "off".`);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/** @type {ObjectPropertySchema} */
|
||||
const parserSchema = {
|
||||
merge: "replace",
|
||||
validate(value) {
|
||||
assertIsObjectOrString(value);
|
||||
|
||||
if (typeof value === "object" && typeof value.parse !== "function" && typeof value.parseForESLint !== "function") {
|
||||
throw new TypeError("Expected object to have a parse() or parseForESLint() method.");
|
||||
}
|
||||
|
||||
if (typeof value === "string") {
|
||||
assertIsPluginMemberName(value);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/** @type {ObjectPropertySchema} */
|
||||
const pluginsSchema = {
|
||||
merge(first = {}, second = {}) {
|
||||
const keys = new Set([...Object.keys(first), ...Object.keys(second)]);
|
||||
const result = {};
|
||||
|
||||
// manually validate that plugins are not redefined
|
||||
for (const key of keys) {
|
||||
|
||||
// avoid hairy edge case
|
||||
if (key === "__proto__") {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (key in first && key in second && first[key] !== second[key]) {
|
||||
throw new TypeError(`Cannot redefine plugin "${key}".`);
|
||||
}
|
||||
|
||||
result[key] = second[key] || first[key];
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
validate(value) {
|
||||
|
||||
// first check the value to be sure it's an object
|
||||
if (value === null || typeof value !== "object") {
|
||||
throw new TypeError("Expected an object.");
|
||||
}
|
||||
|
||||
// second check the keys to make sure they are objects
|
||||
for (const key of Object.keys(value)) {
|
||||
|
||||
// avoid hairy edge case
|
||||
if (key === "__proto__") {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (value[key] === null || typeof value[key] !== "object") {
|
||||
throw new TypeError(`Key "${key}": Expected an object.`);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/** @type {ObjectPropertySchema} */
|
||||
const processorSchema = {
|
||||
merge: "replace",
|
||||
validate(value) {
|
||||
if (typeof value === "string") {
|
||||
assertIsPluginMemberName(value);
|
||||
} else if (value && typeof value === "object") {
|
||||
if (typeof value.preprocess !== "function" || typeof value.postprocess !== "function") {
|
||||
throw new TypeError("Object must have a preprocess() and a postprocess() method.");
|
||||
}
|
||||
} else {
|
||||
throw new TypeError("Expected an object or a string.");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/** @type {ObjectPropertySchema} */
|
||||
const rulesSchema = {
|
||||
merge(first = {}, second = {}) {
|
||||
|
||||
const result = {
|
||||
...first,
|
||||
...second
|
||||
};
|
||||
|
||||
for (const ruleId of Object.keys(result)) {
|
||||
|
||||
// avoid hairy edge case
|
||||
if (ruleId === "__proto__") {
|
||||
|
||||
/* eslint-disable-next-line no-proto */
|
||||
delete result.__proto__;
|
||||
continue;
|
||||
}
|
||||
|
||||
result[ruleId] = normalizeRuleOptions(result[ruleId]);
|
||||
|
||||
/*
|
||||
* If either rule config is missing, then the correct
|
||||
* config is already present and we just need to normalize
|
||||
* the severity.
|
||||
*/
|
||||
if (!(ruleId in first) || !(ruleId in second)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const firstRuleOptions = normalizeRuleOptions(first[ruleId]);
|
||||
const secondRuleOptions = normalizeRuleOptions(second[ruleId]);
|
||||
|
||||
/*
|
||||
* If the second rule config only has a severity (length of 1),
|
||||
* then use that severity and keep the rest of the options from
|
||||
* the first rule config.
|
||||
*/
|
||||
if (secondRuleOptions.length === 1) {
|
||||
result[ruleId] = [secondRuleOptions[0], ...firstRuleOptions.slice(1)];
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* In any other situation, then the second rule config takes
|
||||
* precedence. That means the value at `result[ruleId]` is
|
||||
* already correct and no further work is necessary.
|
||||
*/
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
validate(value) {
|
||||
assertIsObject(value);
|
||||
|
||||
let lastRuleId;
|
||||
|
||||
// Performance: One try-catch has less overhead than one per loop iteration
|
||||
try {
|
||||
|
||||
/*
|
||||
* We are not checking the rule schema here because there is no
|
||||
* guarantee that the rule definition is present at this point. Instead
|
||||
* we wait and check the rule schema during the finalization step
|
||||
* of calculating a config.
|
||||
*/
|
||||
for (const ruleId of Object.keys(value)) {
|
||||
|
||||
// avoid hairy edge case
|
||||
if (ruleId === "__proto__") {
|
||||
continue;
|
||||
}
|
||||
|
||||
lastRuleId = ruleId;
|
||||
|
||||
const ruleOptions = value[ruleId];
|
||||
|
||||
assertIsRuleOptions(ruleOptions);
|
||||
|
||||
if (Array.isArray(ruleOptions)) {
|
||||
assertIsRuleSeverity(ruleOptions[0]);
|
||||
} else {
|
||||
assertIsRuleSeverity(ruleOptions);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
error.message = `Key "${lastRuleId}": ${error.message}`;
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/** @type {ObjectPropertySchema} */
|
||||
const sourceTypeSchema = {
|
||||
merge: "replace",
|
||||
validate(value) {
|
||||
if (typeof value !== "string" || !/^(?:script|module|commonjs)$/u.test(value)) {
|
||||
throw new TypeError("Expected \"script\", \"module\", or \"commonjs\".");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Full schema
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
exports.flatConfigSchema = {
|
||||
settings: deepObjectAssignSchema,
|
||||
linterOptions: {
|
||||
schema: {
|
||||
noInlineConfig: booleanSchema,
|
||||
reportUnusedDisableDirectives: booleanSchema
|
||||
}
|
||||
},
|
||||
languageOptions: {
|
||||
schema: {
|
||||
ecmaVersion: numberSchema,
|
||||
sourceType: sourceTypeSchema,
|
||||
globals: globalsSchema,
|
||||
parser: parserSchema,
|
||||
parserOptions: deepObjectAssignSchema
|
||||
}
|
||||
},
|
||||
processor: processorSchema,
|
||||
plugins: pluginsSchema,
|
||||
rules: rulesSchema
|
||||
};
|
||||
169
node_modules/eslint/lib/config/rule-validator.js
generated
vendored
Normal file
169
node_modules/eslint/lib/config/rule-validator.js
generated
vendored
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
/**
|
||||
* @fileoverview Rule Validator
|
||||
* @author Nicholas C. Zakas
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
const ajv = require("../shared/ajv")();
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Finds a rule with the given ID in the given config.
|
||||
* @param {string} ruleId The ID of the rule to find.
|
||||
* @param {Object} config The config to search in.
|
||||
* @returns {{create: Function, schema: (Array|null)}} THe rule object.
|
||||
*/
|
||||
function findRuleDefinition(ruleId, config) {
|
||||
const ruleIdParts = ruleId.split("/");
|
||||
let pluginName, ruleName;
|
||||
|
||||
// built-in rule
|
||||
if (ruleIdParts.length === 1) {
|
||||
pluginName = "@";
|
||||
ruleName = ruleIdParts[0];
|
||||
} else {
|
||||
ruleName = ruleIdParts.pop();
|
||||
pluginName = ruleIdParts.join("/");
|
||||
}
|
||||
|
||||
if (!config.plugins || !config.plugins[pluginName]) {
|
||||
throw new TypeError(`Key "rules": Key "${ruleId}": Could not find plugin "${pluginName}".`);
|
||||
}
|
||||
|
||||
if (!config.plugins[pluginName].rules || !config.plugins[pluginName].rules[ruleName]) {
|
||||
throw new TypeError(`Key "rules": Key "${ruleId}": Could not find "${ruleName}" in plugin "${pluginName}".`);
|
||||
}
|
||||
|
||||
return config.plugins[pluginName].rules[ruleName];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a complete options schema for a rule.
|
||||
* @param {{create: Function, schema: (Array|null)}} rule A new-style rule object
|
||||
* @returns {Object} JSON Schema for the rule's options.
|
||||
*/
|
||||
function getRuleOptionsSchema(rule) {
|
||||
|
||||
if (!rule) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const schema = rule.schema || rule.meta && rule.meta.schema;
|
||||
|
||||
if (Array.isArray(schema)) {
|
||||
if (schema.length) {
|
||||
return {
|
||||
type: "array",
|
||||
items: schema,
|
||||
minItems: 0,
|
||||
maxItems: schema.length
|
||||
};
|
||||
}
|
||||
return {
|
||||
type: "array",
|
||||
minItems: 0,
|
||||
maxItems: 0
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
// Given a full schema, leave it alone
|
||||
return schema || null;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Exports
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Implements validation functionality for the rules portion of a config.
|
||||
*/
|
||||
class RuleValidator {
|
||||
|
||||
/**
|
||||
* Creates a new instance.
|
||||
*/
|
||||
constructor() {
|
||||
|
||||
/**
|
||||
* A collection of compiled validators for rules that have already
|
||||
* been validated.
|
||||
* @type {WeakMap}
|
||||
* @property validators
|
||||
*/
|
||||
this.validators = new WeakMap();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates all of the rule configurations in a config against each
|
||||
* rule's schema.
|
||||
* @param {Object} config The full config to validate. This object must
|
||||
* contain both the rules section and the plugins section.
|
||||
* @returns {void}
|
||||
* @throws {Error} If a rule's configuration does not match its schema.
|
||||
*/
|
||||
validate(config) {
|
||||
|
||||
if (!config.rules) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const [ruleId, ruleOptions] of Object.entries(config.rules)) {
|
||||
|
||||
// check for edge case
|
||||
if (ruleId === "__proto__") {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* If a rule is disabled, we don't do any validation. This allows
|
||||
* users to safely set any value to 0 or "off" without worrying
|
||||
* that it will cause a validation error.
|
||||
*
|
||||
* Note: ruleOptions is always an array at this point because
|
||||
* this validation occurs after FlatConfigArray has merged and
|
||||
* normalized values.
|
||||
*/
|
||||
if (ruleOptions[0] === 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const rule = findRuleDefinition(ruleId, config);
|
||||
|
||||
// Precompile and cache validator the first time
|
||||
if (!this.validators.has(rule)) {
|
||||
const schema = getRuleOptionsSchema(rule);
|
||||
|
||||
if (schema) {
|
||||
this.validators.set(rule, ajv.compile(schema));
|
||||
}
|
||||
}
|
||||
|
||||
const validateRule = this.validators.get(rule);
|
||||
|
||||
if (validateRule) {
|
||||
|
||||
validateRule(ruleOptions.slice(1));
|
||||
|
||||
if (validateRule.errors) {
|
||||
throw new Error(`Key "rules": Key "${ruleId}": ${
|
||||
validateRule.errors.map(
|
||||
error => `\tValue ${JSON.stringify(error.data)} ${error.message}.\n`
|
||||
).join("")
|
||||
}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exports.RuleValidator = RuleValidator;
|
||||
53
node_modules/eslint/lib/eslint/eslint.js
generated
vendored
53
node_modules/eslint/lib/eslint/eslint.js
generated
vendored
|
|
@ -43,6 +43,7 @@ const { version } = require("../../package.json");
|
|||
* @property {ConfigData} [baseConfig] Base config object, extended by all configs used with this instance
|
||||
* @property {boolean} [cache] Enable result caching.
|
||||
* @property {string} [cacheLocation] The cache file to use instead of .eslintcache.
|
||||
* @property {"metadata" | "content"} [cacheStrategy] The strategy used to detect changed files.
|
||||
* @property {string} [cwd] The value to use for the current working directory.
|
||||
* @property {boolean} [errorOnUnmatchedPattern] If `false` then `ESLint#lintFiles()` doesn't throw even if no target files found. Defaults to `true`.
|
||||
* @property {string[]} [extensions] An array of file extensions to check.
|
||||
|
|
@ -157,6 +158,7 @@ function processOptions({
|
|||
baseConfig = null,
|
||||
cache = false,
|
||||
cacheLocation = ".eslintcache",
|
||||
cacheStrategy = "metadata",
|
||||
cwd = process.cwd(),
|
||||
errorOnUnmatchedPattern = true,
|
||||
extensions = null, // ← should be null by default because if it's an array then it suppresses RFC20 feature.
|
||||
|
|
@ -216,6 +218,12 @@ function processOptions({
|
|||
if (!isNonEmptyString(cacheLocation)) {
|
||||
errors.push("'cacheLocation' must be a non-empty string.");
|
||||
}
|
||||
if (
|
||||
cacheStrategy !== "metadata" &&
|
||||
cacheStrategy !== "content"
|
||||
) {
|
||||
errors.push("'cacheStrategy' must be any of \"metadata\", \"content\".");
|
||||
}
|
||||
if (!isNonEmptyString(cwd) || !path.isAbsolute(cwd)) {
|
||||
errors.push("'cwd' must be an absolute path.");
|
||||
}
|
||||
|
|
@ -272,7 +280,7 @@ function processOptions({
|
|||
errors.push("'rulePaths' must be an array of non-empty strings.");
|
||||
}
|
||||
if (typeof useEslintrc !== "boolean") {
|
||||
errors.push("'useElintrc' must be a boolean.");
|
||||
errors.push("'useEslintrc' must be a boolean.");
|
||||
}
|
||||
|
||||
if (errors.length > 0) {
|
||||
|
|
@ -284,6 +292,7 @@ function processOptions({
|
|||
baseConfig,
|
||||
cache,
|
||||
cacheLocation,
|
||||
cacheStrategy,
|
||||
configFile: overrideConfigFile,
|
||||
cwd,
|
||||
errorOnUnmatchedPattern,
|
||||
|
|
@ -505,6 +514,39 @@ class ESLint {
|
|||
return CLIEngine.getErrorResults(results);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns meta objects for each rule represented in the lint results.
|
||||
* @param {LintResult[]} results The results to fetch rules meta for.
|
||||
* @returns {Object} A mapping of ruleIds to rule meta objects.
|
||||
*/
|
||||
getRulesMetaForResults(results) {
|
||||
|
||||
const resultRuleIds = new Set();
|
||||
|
||||
// first gather all ruleIds from all results
|
||||
|
||||
for (const result of results) {
|
||||
for (const { ruleId } of result.messages) {
|
||||
resultRuleIds.add(ruleId);
|
||||
}
|
||||
}
|
||||
|
||||
// create a map of all rules in the results
|
||||
|
||||
const { cliEngine } = privateMembersMap.get(this);
|
||||
const rules = cliEngine.getRules();
|
||||
const resultRules = new Map();
|
||||
|
||||
for (const [ruleId, rule] of rules) {
|
||||
if (resultRuleIds.has(ruleId)) {
|
||||
resultRules.set(ruleId, rule);
|
||||
}
|
||||
}
|
||||
|
||||
return createRulesMeta(resultRules);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes the current configuration on an array of file and directory names.
|
||||
* @param {string[]} patterns An array of file and directory names.
|
||||
|
|
@ -543,9 +585,12 @@ class ESLint {
|
|||
...unknownOptions
|
||||
} = options || {};
|
||||
|
||||
for (const key of Object.keys(unknownOptions)) {
|
||||
throw new Error(`'options' must not include the unknown option '${key}'`);
|
||||
const unknownOptionKeys = Object.keys(unknownOptions);
|
||||
|
||||
if (unknownOptionKeys.length > 0) {
|
||||
throw new Error(`'options' must not include the unknown option(s): ${unknownOptionKeys.join(", ")}`);
|
||||
}
|
||||
|
||||
if (filePath !== void 0 && !isNonEmptyString(filePath)) {
|
||||
throw new Error("'options.filePath' must be a non-empty string or undefined");
|
||||
}
|
||||
|
|
@ -563,7 +608,7 @@ class ESLint {
|
|||
|
||||
/**
|
||||
* Returns the formatter representing the given formatter name.
|
||||
* @param {string} [name] The name of the formattter to load.
|
||||
* @param {string} [name] The name of the formatter to load.
|
||||
* The following values are allowed:
|
||||
* - `undefined` ... Load `stylish` builtin formatter.
|
||||
* - A builtin formatter name ... Load the builtin formatter.
|
||||
|
|
|
|||
6
node_modules/eslint/lib/init/autoconfig.js
generated
vendored
6
node_modules/eslint/lib/init/autoconfig.js
generated
vendored
|
|
@ -9,7 +9,7 @@
|
|||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash"),
|
||||
const equal = require("fast-deep-equal"),
|
||||
recConfig = require("../../conf/eslint-recommended"),
|
||||
ConfigOps = require("@eslint/eslintrc/lib/shared/config-ops"),
|
||||
{ Linter } = require("../linter"),
|
||||
|
|
@ -85,7 +85,7 @@ class Registry {
|
|||
* @returns {void}
|
||||
*/
|
||||
populateFromCoreRules() {
|
||||
const rulesConfig = configRule.createCoreRuleConfigs();
|
||||
const rulesConfig = configRule.createCoreRuleConfigs(/* noDeprecated = */ true);
|
||||
|
||||
this.rules = makeRegistryItems(rulesConfig);
|
||||
}
|
||||
|
|
@ -329,7 +329,7 @@ function extendFromRecommended(config) {
|
|||
const recRules = Object.keys(recConfig.rules).filter(ruleId => ConfigOps.isErrorSeverity(recConfig.rules[ruleId]));
|
||||
|
||||
recRules.forEach(ruleId => {
|
||||
if (lodash.isEqual(recConfig.rules[ruleId], newConfig.rules[ruleId])) {
|
||||
if (equal(recConfig.rules[ruleId], newConfig.rules[ruleId])) {
|
||||
delete newConfig.rules[ruleId];
|
||||
}
|
||||
});
|
||||
|
|
|
|||
1
node_modules/eslint/lib/init/config-file.js
generated
vendored
1
node_modules/eslint/lib/init/config-file.js
generated
vendored
|
|
@ -117,6 +117,7 @@ function writeJSConfigFile(config, filePath) {
|
|||
function write(config, filePath) {
|
||||
switch (path.extname(filePath)) {
|
||||
case ".js":
|
||||
case ".cjs":
|
||||
writeJSConfigFile(config, filePath);
|
||||
break;
|
||||
|
||||
|
|
|
|||
18
node_modules/eslint/lib/init/config-initializer.js
generated
vendored
18
node_modules/eslint/lib/init/config-initializer.js
generated
vendored
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
const util = require("util"),
|
||||
path = require("path"),
|
||||
fs = require("fs"),
|
||||
enquirer = require("enquirer"),
|
||||
ProgressBar = require("progress"),
|
||||
semver = require("semver"),
|
||||
|
|
@ -48,6 +49,16 @@ function writeFile(config, format) {
|
|||
extname = ".yml";
|
||||
} else if (format === "JSON") {
|
||||
extname = ".json";
|
||||
} else if (format === "JavaScript") {
|
||||
const pkgJSONPath = npmUtils.findPackageJson();
|
||||
|
||||
if (pkgJSONPath) {
|
||||
const pkgJSONContents = JSON.parse(fs.readFileSync(pkgJSONPath, "utf8"));
|
||||
|
||||
if (pkgJSONContents.type === "module") {
|
||||
extname = ".cjs";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const installedESLint = config.installedESLint;
|
||||
|
|
@ -531,7 +542,8 @@ function promptUser() {
|
|||
choices: [
|
||||
{ message: "Airbnb: https://github.com/airbnb/javascript", name: "airbnb" },
|
||||
{ message: "Standard: https://github.com/standard/standard", name: "standard" },
|
||||
{ message: "Google: https://github.com/google/eslint-config-google", name: "google" }
|
||||
{ message: "Google: https://github.com/google/eslint-config-google", name: "google" },
|
||||
{ message: "XO: https://github.com/xojs/eslint-config-xo", name: "xo" }
|
||||
],
|
||||
skip() {
|
||||
this.state.answers.packageJsonExists = npmUtils.checkPackageJson();
|
||||
|
|
@ -565,7 +577,8 @@ function promptUser() {
|
|||
{
|
||||
type: "toggle",
|
||||
name: "installESLint",
|
||||
message(answers) {
|
||||
message() {
|
||||
const { answers } = this.state;
|
||||
const verb = semver.ltr(answers.localESLintVersion, answers.requiredESLintVersionRange)
|
||||
? "upgrade"
|
||||
: "downgrade";
|
||||
|
|
@ -682,6 +695,7 @@ const init = {
|
|||
hasESLintVersionConflict,
|
||||
installModules,
|
||||
processAnswers,
|
||||
writeFile,
|
||||
/* istanbul ignore next */initializeConfig() {
|
||||
return promptUser();
|
||||
}
|
||||
|
|
|
|||
4
node_modules/eslint/lib/init/npm-utils.js
generated
vendored
4
node_modules/eslint/lib/init/npm-utils.js
generated
vendored
|
|
@ -50,8 +50,7 @@ function findPackageJson(startDir) {
|
|||
*/
|
||||
function installSyncSaveDev(packages) {
|
||||
const packageList = Array.isArray(packages) ? packages : [packages];
|
||||
const npmProcess = spawn.sync("npm", ["i", "--save-dev"].concat(packageList),
|
||||
{ stdio: "inherit" });
|
||||
const npmProcess = spawn.sync("npm", ["i", "--save-dev"].concat(packageList), { stdio: "inherit" });
|
||||
const error = npmProcess.error;
|
||||
|
||||
if (error && error.code === "ENOENT") {
|
||||
|
|
@ -172,6 +171,7 @@ function checkPackageJson(startDir) {
|
|||
module.exports = {
|
||||
installSyncSaveDev,
|
||||
fetchPeerDependencies,
|
||||
findPackageJson,
|
||||
checkDeps,
|
||||
checkDevDeps,
|
||||
checkPackageJson
|
||||
|
|
|
|||
18
node_modules/eslint/lib/linter/apply-disable-directives.js
generated
vendored
18
node_modules/eslint/lib/linter/apply-disable-directives.js
generated
vendored
|
|
@ -5,8 +5,6 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const lodash = require("lodash");
|
||||
|
||||
/**
|
||||
* Compares the locations of two objects in a source file
|
||||
* @param {{line: number, column: number}} itemA The first object
|
||||
|
|
@ -124,7 +122,21 @@ module.exports = ({ directives, problems, reportUnusedDisableDirectives = "off"
|
|||
.map(directive => Object.assign({}, directive, { unprocessedDirective: directive }))
|
||||
.sort(compareLocations);
|
||||
|
||||
const lineDirectives = lodash.flatMap(directives, directive => {
|
||||
/**
|
||||
* Returns a new array formed by applying a given callback function to each element of the array, and then flattening the result by one level.
|
||||
* TODO(stephenwade): Replace this with array.flatMap when we drop support for Node v10
|
||||
* @param {any[]} array The array to process
|
||||
* @param {Function} fn The function to use
|
||||
* @returns {any[]} The result array
|
||||
*/
|
||||
function flatMap(array, fn) {
|
||||
const mapped = array.map(fn);
|
||||
const flattened = [].concat(...mapped);
|
||||
|
||||
return flattened;
|
||||
}
|
||||
|
||||
const lineDirectives = flatMap(directives, directive => {
|
||||
switch (directive.type) {
|
||||
case "disable":
|
||||
case "enable":
|
||||
|
|
|
|||
62
node_modules/eslint/lib/linter/linter.js
generated
vendored
62
node_modules/eslint/lib/linter/linter.js
generated
vendored
|
|
@ -15,7 +15,7 @@ const
|
|||
eslintScope = require("eslint-scope"),
|
||||
evk = require("eslint-visitor-keys"),
|
||||
espree = require("espree"),
|
||||
lodash = require("lodash"),
|
||||
merge = require("lodash.merge"),
|
||||
BuiltInEnvironments = require("@eslint/eslintrc/conf/environments"),
|
||||
pkg = require("../../package.json"),
|
||||
astUtils = require("../shared/ast-utils"),
|
||||
|
|
@ -37,8 +37,10 @@ const
|
|||
const debug = require("debug")("eslint:linter");
|
||||
const MAX_AUTOFIX_PASSES = 10;
|
||||
const DEFAULT_PARSER_NAME = "espree";
|
||||
const DEFAULT_ECMA_VERSION = 5;
|
||||
const commentParser = new ConfigCommentParser();
|
||||
const DEFAULT_ERROR_LOC = { start: { line: 1, column: 0 }, end: { line: 1, column: 1 } };
|
||||
const parserSymbol = Symbol.for("eslint.RuleTester.parser");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Typedefs
|
||||
|
|
@ -432,10 +434,16 @@ function getDirectiveComments(filename, ast, ruleMapper, warnInlineConfig) {
|
|||
|
||||
/**
|
||||
* Normalize ECMAScript version from the initial config
|
||||
* @param {number} ecmaVersion ECMAScript version from the initial config
|
||||
* @param {Parser} parser The parser which uses this options.
|
||||
* @param {number} ecmaVersion ECMAScript version from the initial config
|
||||
* @returns {number} normalized ECMAScript version
|
||||
*/
|
||||
function normalizeEcmaVersion(ecmaVersion) {
|
||||
function normalizeEcmaVersion(parser, ecmaVersion) {
|
||||
if ((parser[parserSymbol] || parser) === espree) {
|
||||
if (ecmaVersion === "latest") {
|
||||
return espree.latestEcmaVersion;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate ECMAScript edition number from official year version starting with
|
||||
|
|
@ -444,7 +452,7 @@ function normalizeEcmaVersion(ecmaVersion) {
|
|||
return ecmaVersion >= 2015 ? ecmaVersion - 2009 : ecmaVersion;
|
||||
}
|
||||
|
||||
const eslintEnvPattern = /\/\*\s*eslint-env\s(.+?)\*\//gu;
|
||||
const eslintEnvPattern = /\/\*\s*eslint-env\s(.+?)\*\//gsu;
|
||||
|
||||
/**
|
||||
* Checks whether or not there is a comment which has "eslint-env *" in a given text.
|
||||
|
|
@ -521,16 +529,17 @@ function normalizeVerifyOptions(providedOptions, config) {
|
|||
|
||||
/**
|
||||
* Combines the provided parserOptions with the options from environments
|
||||
* @param {string} parserName The parser name which uses this options.
|
||||
* @param {Parser} parser The parser which uses this options.
|
||||
* @param {ParserOptions} providedOptions The provided 'parserOptions' key in a config
|
||||
* @param {Environment[]} enabledEnvironments The environments enabled in configuration and with inline comments
|
||||
* @returns {ParserOptions} Resulting parser options after merge
|
||||
*/
|
||||
function resolveParserOptions(parserName, providedOptions, enabledEnvironments) {
|
||||
function resolveParserOptions(parser, providedOptions, enabledEnvironments) {
|
||||
|
||||
const parserOptionsFromEnv = enabledEnvironments
|
||||
.filter(env => env.parserOptions)
|
||||
.reduce((parserOptions, env) => lodash.merge(parserOptions, env.parserOptions), {});
|
||||
const mergedParserOptions = lodash.merge(parserOptionsFromEnv, providedOptions || {});
|
||||
.reduce((parserOptions, env) => merge(parserOptions, env.parserOptions), {});
|
||||
const mergedParserOptions = merge(parserOptionsFromEnv, providedOptions || {});
|
||||
const isModule = mergedParserOptions.sourceType === "module";
|
||||
|
||||
if (isModule) {
|
||||
|
|
@ -542,12 +551,7 @@ function resolveParserOptions(parserName, providedOptions, enabledEnvironments)
|
|||
mergedParserOptions.ecmaFeatures = Object.assign({}, mergedParserOptions.ecmaFeatures, { globalReturn: false });
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: @aladdin-add
|
||||
* 1. for a 3rd-party parser, do not normalize parserOptions
|
||||
* 2. for espree, no need to do this (espree will do it)
|
||||
*/
|
||||
mergedParserOptions.ecmaVersion = normalizeEcmaVersion(mergedParserOptions.ecmaVersion);
|
||||
mergedParserOptions.ecmaVersion = normalizeEcmaVersion(parser, mergedParserOptions.ecmaVersion);
|
||||
|
||||
return mergedParserOptions;
|
||||
}
|
||||
|
|
@ -606,7 +610,7 @@ function getRuleOptions(ruleConfig) {
|
|||
*/
|
||||
function analyzeScope(ast, parserOptions, visitorKeys) {
|
||||
const ecmaFeatures = parserOptions.ecmaFeatures || {};
|
||||
const ecmaVersion = parserOptions.ecmaVersion || 5;
|
||||
const ecmaVersion = parserOptions.ecmaVersion || DEFAULT_ECMA_VERSION;
|
||||
|
||||
return eslintScope.analyze(ast, {
|
||||
ignoreEval: true,
|
||||
|
|
@ -828,9 +832,10 @@ const BASE_TRAVERSAL_CONTEXT = Object.freeze(
|
|||
* @param {string} filename The reported filename of the code
|
||||
* @param {boolean} disableFixes If true, it doesn't make `fix` properties.
|
||||
* @param {string | undefined} cwd cwd of the cli
|
||||
* @param {string} physicalFilename The full path of the file on disk without any code block information
|
||||
* @returns {Problem[]} An array of reported problems
|
||||
*/
|
||||
function runRules(sourceCode, configuredRules, ruleMapper, parserOptions, parserName, settings, filename, disableFixes, cwd) {
|
||||
function runRules(sourceCode, configuredRules, ruleMapper, parserOptions, parserName, settings, filename, disableFixes, cwd, physicalFilename) {
|
||||
const emitter = createEmitter();
|
||||
const nodeQueue = [];
|
||||
let currentNode = sourceCode.ast;
|
||||
|
|
@ -859,6 +864,7 @@ function runRules(sourceCode, configuredRules, ruleMapper, parserOptions, parser
|
|||
getDeclaredVariables: sourceCode.scopeManager.getDeclaredVariables.bind(sourceCode.scopeManager),
|
||||
getCwd: () => cwd,
|
||||
getFilename: () => filename,
|
||||
getPhysicalFilename: () => physicalFilename || filename,
|
||||
getScope: () => getScope(sourceCode.scopeManager, currentNode),
|
||||
getSourceCode: () => sourceCode,
|
||||
markVariableAsUsed: name => markVariableAsUsed(sourceCode.scopeManager, currentNode, parserOptions, name),
|
||||
|
|
@ -942,7 +948,9 @@ function runRules(sourceCode, configuredRules, ruleMapper, parserOptions, parser
|
|||
});
|
||||
|
||||
// only run code path analyzer if the top level node is "Program", skip otherwise
|
||||
const eventGenerator = nodeQueue[0].node.type === "Program" ? new CodePathAnalyzer(new NodeEventGenerator(emitter)) : new NodeEventGenerator(emitter);
|
||||
const eventGenerator = nodeQueue[0].node.type === "Program"
|
||||
? new CodePathAnalyzer(new NodeEventGenerator(emitter, { visitorKeys: sourceCode.visitorKeys, fallback: Traverser.getKeys }))
|
||||
: new NodeEventGenerator(emitter, { visitorKeys: sourceCode.visitorKeys, fallback: Traverser.getKeys });
|
||||
|
||||
nodeQueue.forEach(traversalInfo => {
|
||||
currentNode = traversalInfo.node;
|
||||
|
|
@ -1119,7 +1127,7 @@ class Linter {
|
|||
.map(envName => getEnv(slots, envName))
|
||||
.filter(env => env);
|
||||
|
||||
const parserOptions = resolveParserOptions(parserName, config.parserOptions || {}, enabledEnvs);
|
||||
const parserOptions = resolveParserOptions(parser, config.parserOptions || {}, enabledEnvs);
|
||||
const configuredGlobals = resolveGlobals(config.globals || {}, enabledEnvs);
|
||||
const settings = config.settings || {};
|
||||
|
||||
|
|
@ -1179,7 +1187,8 @@ class Linter {
|
|||
settings,
|
||||
options.filename,
|
||||
options.disableFixes,
|
||||
slots.cwd
|
||||
slots.cwd,
|
||||
providedOptions.physicalFilename
|
||||
);
|
||||
} catch (err) {
|
||||
err.message += `\nOccurred while linting ${options.filename}`;
|
||||
|
|
@ -1282,9 +1291,12 @@ class Linter {
|
|||
_verifyWithProcessor(textOrSourceCode, config, options, configForRecursive) {
|
||||
const filename = options.filename || "<input>";
|
||||
const filenameToExpose = normalizeFilename(filename);
|
||||
const physicalFilename = options.physicalFilename || filenameToExpose;
|
||||
const text = ensureText(textOrSourceCode);
|
||||
const preprocess = options.preprocess || (rawText => [rawText]);
|
||||
const postprocess = options.postprocess || lodash.flatten;
|
||||
|
||||
// TODO(stephenwade): Replace this with array.flat() when we drop support for Node v10
|
||||
const postprocess = options.postprocess || (array => [].concat(...array));
|
||||
const filterCodeBlock =
|
||||
options.filterCodeBlock ||
|
||||
(blockFilename => blockFilename.endsWith(".js"));
|
||||
|
|
@ -1306,13 +1318,13 @@ class Linter {
|
|||
return [];
|
||||
}
|
||||
|
||||
// Resolve configuration again if the file extension was changed.
|
||||
if (configForRecursive && path.extname(blockName) !== originalExtname) {
|
||||
debug("Resolving configuration again because the file extension was changed.");
|
||||
// Resolve configuration again if the file content or extension was changed.
|
||||
if (configForRecursive && (text !== blockText || path.extname(blockName) !== originalExtname)) {
|
||||
debug("Resolving configuration again because the file content or extension was changed.");
|
||||
return this._verifyWithConfigArray(
|
||||
blockText,
|
||||
configForRecursive,
|
||||
{ ...options, filename: blockName }
|
||||
{ ...options, filename: blockName, physicalFilename }
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -1320,7 +1332,7 @@ class Linter {
|
|||
return this._verifyWithoutProcessors(
|
||||
blockText,
|
||||
config,
|
||||
{ ...options, filename: blockName }
|
||||
{ ...options, filename: blockName, physicalFilename }
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
|||
55
node_modules/eslint/lib/linter/node-event-generator.js
generated
vendored
55
node_modules/eslint/lib/linter/node-event-generator.js
generated
vendored
|
|
@ -10,7 +10,6 @@
|
|||
//------------------------------------------------------------------------------
|
||||
|
||||
const esquery = require("esquery");
|
||||
const lodash = require("lodash");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Typedefs
|
||||
|
|
@ -32,6 +31,35 @@ const lodash = require("lodash");
|
|||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Computes the union of one or more arrays
|
||||
* @param {...any[]} arrays One or more arrays to union
|
||||
* @returns {any[]} The union of the input arrays
|
||||
*/
|
||||
function union(...arrays) {
|
||||
|
||||
// TODO(stephenwade): Replace this with arrays.flat() when we drop support for Node v10
|
||||
return [...new Set([].concat(...arrays))];
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the intersection of one or more arrays
|
||||
* @param {...any[]} arrays One or more arrays to intersect
|
||||
* @returns {any[]} The intersection of the input arrays
|
||||
*/
|
||||
function intersection(...arrays) {
|
||||
if (arrays.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
let result = [...new Set(arrays[0])];
|
||||
|
||||
for (const array of arrays.slice(1)) {
|
||||
result = result.filter(x => array.includes(x));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the possible types of a selector
|
||||
* @param {Object} parsedSelector An object (from esquery) describing the matching behavior of the selector
|
||||
|
|
@ -46,7 +74,7 @@ function getPossibleTypes(parsedSelector) {
|
|||
const typesForComponents = parsedSelector.selectors.map(getPossibleTypes);
|
||||
|
||||
if (typesForComponents.every(Boolean)) {
|
||||
return lodash.union(...typesForComponents);
|
||||
return union(...typesForComponents);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
@ -63,7 +91,7 @@ function getPossibleTypes(parsedSelector) {
|
|||
* If at least one of the components could only match a particular type, the compound could only match
|
||||
* the intersection of those types.
|
||||
*/
|
||||
return lodash.intersection(...typesForComponents);
|
||||
return intersection(...typesForComponents);
|
||||
}
|
||||
|
||||
case "child":
|
||||
|
|
@ -166,15 +194,21 @@ function tryParseSelector(rawSelector) {
|
|||
}
|
||||
}
|
||||
|
||||
const selectorCache = new Map();
|
||||
|
||||
/**
|
||||
* Parses a raw selector string, and returns the parsed selector along with specificity and type information.
|
||||
* @param {string} rawSelector A raw AST selector
|
||||
* @returns {ASTSelector} A selector descriptor
|
||||
*/
|
||||
const parseSelector = lodash.memoize(rawSelector => {
|
||||
function parseSelector(rawSelector) {
|
||||
if (selectorCache.has(rawSelector)) {
|
||||
return selectorCache.get(rawSelector);
|
||||
}
|
||||
|
||||
const parsedSelector = tryParseSelector(rawSelector);
|
||||
|
||||
return {
|
||||
const result = {
|
||||
rawSelector,
|
||||
isExit: rawSelector.endsWith(":exit"),
|
||||
parsedSelector,
|
||||
|
|
@ -182,7 +216,10 @@ const parseSelector = lodash.memoize(rawSelector => {
|
|||
attributeCount: countClassAttributes(parsedSelector),
|
||||
identifierCount: countIdentifiers(parsedSelector)
|
||||
};
|
||||
});
|
||||
|
||||
selectorCache.set(rawSelector, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
|
|
@ -208,10 +245,12 @@ class NodeEventGenerator {
|
|||
* An SafeEmitter which is the destination of events. This emitter must already
|
||||
* have registered listeners for all of the events that it needs to listen for.
|
||||
* (See lib/linter/safe-emitter.js for more details on `SafeEmitter`.)
|
||||
* @param {ESQueryOptions} esqueryOptions `esquery` options for traversing custom nodes.
|
||||
* @returns {NodeEventGenerator} new instance
|
||||
*/
|
||||
constructor(emitter) {
|
||||
constructor(emitter, esqueryOptions) {
|
||||
this.emitter = emitter;
|
||||
this.esqueryOptions = esqueryOptions;
|
||||
this.currentAncestry = [];
|
||||
this.enterSelectorsByNodeType = new Map();
|
||||
this.exitSelectorsByNodeType = new Map();
|
||||
|
|
@ -250,7 +289,7 @@ class NodeEventGenerator {
|
|||
* @returns {void}
|
||||
*/
|
||||
applySelector(node, selector) {
|
||||
if (esquery.matches(node, selector.parsedSelector, this.currentAncestry)) {
|
||||
if (esquery.matches(node, selector.parsedSelector, this.currentAncestry, this.esqueryOptions)) {
|
||||
this.emitter.emit(selector.rawSelector, node);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
37
node_modules/eslint/lib/linter/report-translator.js
generated
vendored
37
node_modules/eslint/lib/linter/report-translator.js
generated
vendored
|
|
@ -115,6 +115,17 @@ function normalizeReportLoc(descriptor) {
|
|||
return descriptor.node.loc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check that a fix has a valid range.
|
||||
* @param {Fix|null} fix The fix to validate.
|
||||
* @returns {void}
|
||||
*/
|
||||
function assertValidFix(fix) {
|
||||
if (fix) {
|
||||
assert(fix.range && typeof fix.range[0] === "number" && typeof fix.range[1] === "number", `Fix has invalid range: ${JSON.stringify(fix, null, 2)}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares items in a fixes array by range.
|
||||
* @param {Fix} a The first message.
|
||||
|
|
@ -133,6 +144,10 @@ function compareFixesByRange(a, b) {
|
|||
* @returns {{text: string, range: number[]}} The merged fixes
|
||||
*/
|
||||
function mergeFixes(fixes, sourceCode) {
|
||||
for (const fix of fixes) {
|
||||
assertValidFix(fix);
|
||||
}
|
||||
|
||||
if (fixes.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
|
@ -181,6 +196,8 @@ function normalizeFixes(descriptor, sourceCode) {
|
|||
if (fix && Symbol.iterator in fix) {
|
||||
return mergeFixes(Array.from(fix), sourceCode);
|
||||
}
|
||||
|
||||
assertValidFix(fix);
|
||||
return fix;
|
||||
}
|
||||
|
||||
|
|
@ -196,15 +213,19 @@ function mapSuggestions(descriptor, sourceCode, messages) {
|
|||
return [];
|
||||
}
|
||||
|
||||
return descriptor.suggest.map(suggestInfo => {
|
||||
const computedDesc = suggestInfo.desc || messages[suggestInfo.messageId];
|
||||
return descriptor.suggest
|
||||
.map(suggestInfo => {
|
||||
const computedDesc = suggestInfo.desc || messages[suggestInfo.messageId];
|
||||
|
||||
return {
|
||||
...suggestInfo,
|
||||
desc: interpolate(computedDesc, suggestInfo.data),
|
||||
fix: normalizeFixes(suggestInfo, sourceCode)
|
||||
};
|
||||
});
|
||||
return {
|
||||
...suggestInfo,
|
||||
desc: interpolate(computedDesc, suggestInfo.data),
|
||||
fix: normalizeFixes(suggestInfo, sourceCode)
|
||||
};
|
||||
})
|
||||
|
||||
// Remove suggestions that didn't provide a fix
|
||||
.filter(({ fix }) => fix);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
25
node_modules/eslint/lib/linter/timing.js
generated
vendored
25
node_modules/eslint/lib/linter/timing.js
generated
vendored
|
|
@ -44,6 +44,26 @@ const enabled = !!process.env.TIMING;
|
|||
const HEADERS = ["Rule", "Time (ms)", "Relative"];
|
||||
const ALIGN = [alignLeft, alignRight, alignRight];
|
||||
|
||||
/**
|
||||
* Decide how many rules to show in the output list.
|
||||
* @returns {number} the number of rules to show
|
||||
*/
|
||||
function getListSize() {
|
||||
const MINIMUM_SIZE = 10;
|
||||
|
||||
if (typeof process.env.TIMING !== "string") {
|
||||
return MINIMUM_SIZE;
|
||||
}
|
||||
|
||||
if (process.env.TIMING.toLowerCase() === "all") {
|
||||
return Number.POSITIVE_INFINITY;
|
||||
}
|
||||
|
||||
const TIMING_ENV_VAR_AS_INTEGER = Number.parseInt(process.env.TIMING, 10);
|
||||
|
||||
return TIMING_ENV_VAR_AS_INTEGER > 10 ? TIMING_ENV_VAR_AS_INTEGER : MINIMUM_SIZE;
|
||||
}
|
||||
|
||||
/* istanbul ignore next */
|
||||
/**
|
||||
* display the data
|
||||
|
|
@ -61,7 +81,7 @@ function display(data) {
|
|||
return [key, time];
|
||||
})
|
||||
.sort((a, b) => b[1] - a[1])
|
||||
.slice(0, 10);
|
||||
.slice(0, getListSize());
|
||||
|
||||
rows.forEach(row => {
|
||||
row.push(`${(row[1] * 100 / total).toFixed(1)}%`);
|
||||
|
|
@ -133,7 +153,8 @@ module.exports = (function() {
|
|||
|
||||
return {
|
||||
time,
|
||||
enabled
|
||||
enabled,
|
||||
getListSize
|
||||
};
|
||||
|
||||
}());
|
||||
|
|
|
|||
55
node_modules/eslint/lib/options.js
generated
vendored
55
node_modules/eslint/lib/options.js
generated
vendored
|
|
@ -11,6 +11,53 @@
|
|||
|
||||
const optionator = require("optionator");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Typedefs
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* The options object parsed by Optionator.
|
||||
* @typedef {Object} ParsedCLIOptions
|
||||
* @property {boolean} cache Only check changed files
|
||||
* @property {string} cacheFile Path to the cache file. Deprecated: use --cache-location
|
||||
* @property {string} [cacheLocation] Path to the cache file or directory
|
||||
* @property {"metadata" | "content"} cacheStrategy Strategy to use for detecting changed files in the cache
|
||||
* @property {boolean} [color] Force enabling/disabling of color
|
||||
* @property {string} [config] Use this configuration, overriding .eslintrc.* config options if present
|
||||
* @property {boolean} debug Output debugging information
|
||||
* @property {string[]} [env] Specify environments
|
||||
* @property {boolean} envInfo Output execution environment information
|
||||
* @property {boolean} errorOnUnmatchedPattern Prevent errors when pattern is unmatched
|
||||
* @property {boolean} eslintrc Disable use of configuration from .eslintrc.*
|
||||
* @property {string[]} [ext] Specify JavaScript file extensions
|
||||
* @property {boolean} fix Automatically fix problems
|
||||
* @property {boolean} fixDryRun Automatically fix problems without saving the changes to the file system
|
||||
* @property {("problem" | "suggestion" | "layout")[]} [fixType] Specify the types of fixes to apply (problem, suggestion, layout)
|
||||
* @property {string} format Use a specific output format
|
||||
* @property {string[]} [global] Define global variables
|
||||
* @property {boolean} [help] Show help
|
||||
* @property {boolean} ignore Disable use of ignore files and patterns
|
||||
* @property {string} [ignorePath] Specify path of ignore file
|
||||
* @property {string[]} [ignorePattern] Pattern of files to ignore (in addition to those in .eslintignore)
|
||||
* @property {boolean} init Run config initialization wizard
|
||||
* @property {boolean} inlineConfig Prevent comments from changing config or rules
|
||||
* @property {number} maxWarnings Number of warnings to trigger nonzero exit code
|
||||
* @property {string} [outputFile] Specify file to write report to
|
||||
* @property {string} [parser] Specify the parser to be used
|
||||
* @property {Object} [parserOptions] Specify parser options
|
||||
* @property {string[]} [plugin] Specify plugins
|
||||
* @property {string} [printConfig] Print the configuration for the given file
|
||||
* @property {boolean | undefined} reportUnusedDisableDirectives Adds reported errors for unused eslint-disable directives
|
||||
* @property {string} [resolvePluginsRelativeTo] A folder where plugins should be resolved from, CWD by default
|
||||
* @property {Object} [rule] Specify rules
|
||||
* @property {string[]} [rulesdir] Use additional rules from this directory
|
||||
* @property {boolean} stdin Lint code provided on <STDIN>
|
||||
* @property {string} [stdinFilename] Specify filename to process STDIN as
|
||||
* @property {boolean} quiet Report errors only
|
||||
* @property {boolean} [version] Output the version number
|
||||
* @property {string[]} _ Positional filenames or patterns
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Initialization and Public Interface
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -214,6 +261,14 @@ module.exports = optionator({
|
|||
type: "path::String",
|
||||
description: "Path to the cache file or directory"
|
||||
},
|
||||
{
|
||||
option: "cache-strategy",
|
||||
dependsOn: ["cache"],
|
||||
type: "String",
|
||||
default: "metadata",
|
||||
enum: ["metadata", "content"],
|
||||
description: "Strategy to use for detecting changed files in the cache"
|
||||
},
|
||||
{
|
||||
heading: "Miscellaneous"
|
||||
},
|
||||
|
|
|
|||
116
node_modules/eslint/lib/rule-tester/rule-tester.js
generated
vendored
116
node_modules/eslint/lib/rule-tester/rule-tester.js
generated
vendored
|
|
@ -44,7 +44,8 @@ const
|
|||
assert = require("assert"),
|
||||
path = require("path"),
|
||||
util = require("util"),
|
||||
lodash = require("lodash"),
|
||||
merge = require("lodash.merge"),
|
||||
equal = require("fast-deep-equal"),
|
||||
Traverser = require("../../lib/shared/traverser"),
|
||||
{ getRuleOptionsSchema, validate } = require("../shared/config-validator"),
|
||||
{ Linter, SourceCodeFixer, interpolate } = require("../linter");
|
||||
|
|
@ -52,6 +53,7 @@ const
|
|||
const ajv = require("../shared/ajv")({ strictDefaults: true });
|
||||
|
||||
const espreePath = require.resolve("espree");
|
||||
const parserSymbol = Symbol.for("eslint.RuleTester.parser");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Typedefs
|
||||
|
|
@ -70,6 +72,7 @@ const espreePath = require.resolve("espree");
|
|||
* @property {{ [name: string]: any }} [parserOptions] Options for the parser.
|
||||
* @property {{ [name: string]: "readonly" | "writable" | "off" }} [globals] The additional global variables.
|
||||
* @property {{ [name: string]: boolean }} [env] Environments for the test case.
|
||||
* @property {boolean} [only] Run only this test case or the subset of test cases with this property.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
|
@ -85,6 +88,7 @@ const espreePath = require.resolve("espree");
|
|||
* @property {{ [name: string]: any }} [parserOptions] Options for the parser.
|
||||
* @property {{ [name: string]: "readonly" | "writable" | "off" }} [globals] The additional global variables.
|
||||
* @property {{ [name: string]: boolean }} [env] Environments for the test case.
|
||||
* @property {boolean} [only] Run only this test case or the subset of test cases with this property.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
|
@ -120,7 +124,8 @@ const RuleTesterParameters = [
|
|||
"filename",
|
||||
"options",
|
||||
"errors",
|
||||
"output"
|
||||
"output",
|
||||
"only"
|
||||
];
|
||||
|
||||
/*
|
||||
|
|
@ -235,6 +240,7 @@ function defineStartEndAsError(objName, node) {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Define `start`/`end` properties of all nodes of the given AST as throwing error.
|
||||
* @param {ASTNode} ast The root node to errorize `start`/`end` properties.
|
||||
|
|
@ -254,8 +260,10 @@ function defineStartEndAsErrorInTree(ast, visitorKeys) {
|
|||
* @returns {Parser} Wrapped parser object.
|
||||
*/
|
||||
function wrapParser(parser) {
|
||||
|
||||
if (typeof parser.parseForESLint === "function") {
|
||||
return {
|
||||
[parserSymbol]: parser,
|
||||
parseForESLint(...args) {
|
||||
const ret = parser.parseForESLint(...args);
|
||||
|
||||
|
|
@ -264,7 +272,9 @@ function wrapParser(parser) {
|
|||
}
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
[parserSymbol]: parser,
|
||||
parse(...args) {
|
||||
const ast = parser.parse(...args);
|
||||
|
||||
|
|
@ -281,6 +291,7 @@ function wrapParser(parser) {
|
|||
// default separators for testing
|
||||
const DESCRIBE = Symbol("describe");
|
||||
const IT = Symbol("it");
|
||||
const IT_ONLY = Symbol("itOnly");
|
||||
|
||||
/**
|
||||
* This is `it` default handler if `it` don't exist.
|
||||
|
|
@ -324,10 +335,9 @@ class RuleTester {
|
|||
* configuration and the default configuration.
|
||||
* @type {Object}
|
||||
*/
|
||||
this.testerConfig = lodash.merge(
|
||||
|
||||
// we have to clone because merge uses the first argument for recipient
|
||||
lodash.cloneDeep(defaultConfig),
|
||||
this.testerConfig = merge(
|
||||
{},
|
||||
defaultConfig,
|
||||
testerConfig,
|
||||
{ rules: { "rule-tester/validate-ast": "error" } }
|
||||
);
|
||||
|
|
@ -369,7 +379,7 @@ class RuleTester {
|
|||
* @returns {void}
|
||||
*/
|
||||
static resetDefaultConfig() {
|
||||
defaultConfig = lodash.cloneDeep(testerDefaultConfig);
|
||||
defaultConfig = merge({}, testerDefaultConfig);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -400,6 +410,46 @@ class RuleTester {
|
|||
this[IT] = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the `only` property to a test to run it in isolation.
|
||||
* @param {string | ValidTestCase | InvalidTestCase} item A single test to run by itself.
|
||||
* @returns {ValidTestCase | InvalidTestCase} The test with `only` set.
|
||||
*/
|
||||
static only(item) {
|
||||
if (typeof item === "string") {
|
||||
return { code: item, only: true };
|
||||
}
|
||||
|
||||
return { ...item, only: true };
|
||||
}
|
||||
|
||||
static get itOnly() {
|
||||
if (typeof this[IT_ONLY] === "function") {
|
||||
return this[IT_ONLY];
|
||||
}
|
||||
if (typeof this[IT] === "function" && typeof this[IT].only === "function") {
|
||||
return Function.bind.call(this[IT].only, this[IT]);
|
||||
}
|
||||
if (typeof it === "function" && typeof it.only === "function") {
|
||||
return Function.bind.call(it.only, it);
|
||||
}
|
||||
|
||||
if (typeof this[DESCRIBE] === "function" || typeof this[IT] === "function") {
|
||||
throw new Error(
|
||||
"Set `RuleTester.itOnly` to use `only` with a custom test framework.\n" +
|
||||
"See https://eslint.org/docs/developer-guide/nodejs-api#customizing-ruletester for more."
|
||||
);
|
||||
}
|
||||
if (typeof it === "function") {
|
||||
throw new Error("The current test framework does not support exclusive tests with `only`.");
|
||||
}
|
||||
throw new Error("To use `only`, use RuleTester with a test framework that provides `it.only()` like Mocha.");
|
||||
}
|
||||
|
||||
static set itOnly(value) {
|
||||
this[IT_ONLY] = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Define a rule for one particular run of tests.
|
||||
* @param {string} name The name of the rule to define.
|
||||
|
|
@ -427,12 +477,12 @@ class RuleTester {
|
|||
scenarioErrors = [],
|
||||
linter = this.linter;
|
||||
|
||||
if (lodash.isNil(test) || typeof test !== "object") {
|
||||
if (!test || typeof test !== "object") {
|
||||
throw new TypeError(`Test Scenarios for rule ${ruleName} : Could not find test scenario object`);
|
||||
}
|
||||
|
||||
requiredScenarios.forEach(scenarioType => {
|
||||
if (lodash.isNil(test[scenarioType])) {
|
||||
if (!test[scenarioType]) {
|
||||
scenarioErrors.push(`Could not find any ${scenarioType} test scenarios`);
|
||||
}
|
||||
});
|
||||
|
|
@ -465,7 +515,7 @@ class RuleTester {
|
|||
* @private
|
||||
*/
|
||||
function runRuleForItem(item) {
|
||||
let config = lodash.cloneDeep(testerConfig),
|
||||
let config = merge({}, testerConfig),
|
||||
code, filename, output, beforeAST, afterAST;
|
||||
|
||||
if (typeof item === "string") {
|
||||
|
|
@ -477,13 +527,17 @@ class RuleTester {
|
|||
* Assumes everything on the item is a config except for the
|
||||
* parameters used by this tester
|
||||
*/
|
||||
const itemConfig = lodash.omit(item, RuleTesterParameters);
|
||||
const itemConfig = { ...item };
|
||||
|
||||
for (const parameter of RuleTesterParameters) {
|
||||
delete itemConfig[parameter];
|
||||
}
|
||||
|
||||
/*
|
||||
* Create the config object from the tester config and this item
|
||||
* specific configurations.
|
||||
*/
|
||||
config = lodash.merge(
|
||||
config = merge(
|
||||
config,
|
||||
itemConfig
|
||||
);
|
||||
|
|
@ -589,7 +643,7 @@ class RuleTester {
|
|||
* @private
|
||||
*/
|
||||
function assertASTDidntChange(beforeAST, afterAST) {
|
||||
if (!lodash.isEqual(beforeAST, afterAST)) {
|
||||
if (!equal(beforeAST, afterAST)) {
|
||||
assert.fail("Rule should not modify AST.");
|
||||
}
|
||||
}
|
||||
|
|
@ -606,7 +660,8 @@ class RuleTester {
|
|||
const messages = result.messages;
|
||||
|
||||
assert.strictEqual(messages.length, 0, util.format("Should have no errors but had %d: %s",
|
||||
messages.length, util.inspect(messages)));
|
||||
messages.length,
|
||||
util.inspect(messages)));
|
||||
|
||||
assertASTDidntChange(result.beforeAST, result.afterAST);
|
||||
}
|
||||
|
|
@ -661,13 +716,18 @@ class RuleTester {
|
|||
}
|
||||
|
||||
assert.strictEqual(messages.length, item.errors, util.format("Should have %d error%s but had %d: %s",
|
||||
item.errors, item.errors === 1 ? "" : "s", messages.length, util.inspect(messages)));
|
||||
item.errors,
|
||||
item.errors === 1 ? "" : "s",
|
||||
messages.length,
|
||||
util.inspect(messages)));
|
||||
} else {
|
||||
assert.strictEqual(
|
||||
messages.length, item.errors.length,
|
||||
util.format(
|
||||
messages.length, item.errors.length, util.format(
|
||||
"Should have %d error%s but had %d: %s",
|
||||
item.errors.length, item.errors.length === 1 ? "" : "s", messages.length, util.inspect(messages)
|
||||
item.errors.length,
|
||||
item.errors.length === 1 ? "" : "s",
|
||||
messages.length,
|
||||
util.inspect(messages)
|
||||
)
|
||||
);
|
||||
|
||||
|
|
@ -881,23 +941,29 @@ class RuleTester {
|
|||
RuleTester.describe(ruleName, () => {
|
||||
RuleTester.describe("valid", () => {
|
||||
test.valid.forEach(valid => {
|
||||
RuleTester.it(sanitize(typeof valid === "object" ? valid.code : valid), () => {
|
||||
testValidTemplate(valid);
|
||||
});
|
||||
RuleTester[valid.only ? "itOnly" : "it"](
|
||||
sanitize(typeof valid === "object" ? valid.code : valid),
|
||||
() => {
|
||||
testValidTemplate(valid);
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
RuleTester.describe("invalid", () => {
|
||||
test.invalid.forEach(invalid => {
|
||||
RuleTester.it(sanitize(invalid.code), () => {
|
||||
testInvalidTemplate(invalid);
|
||||
});
|
||||
RuleTester[invalid.only ? "itOnly" : "it"](
|
||||
sanitize(invalid.code),
|
||||
() => {
|
||||
testInvalidTemplate(invalid);
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
RuleTester[DESCRIBE] = RuleTester[IT] = null;
|
||||
RuleTester[DESCRIBE] = RuleTester[IT] = RuleTester[IT_ONLY] = null;
|
||||
|
||||
module.exports = RuleTester;
|
||||
|
|
|
|||
34
node_modules/eslint/lib/rules/arrow-body-style.js
generated
vendored
34
node_modules/eslint/lib/rules/arrow-body-style.js
generated
vendored
|
|
@ -87,17 +87,17 @@ module.exports = {
|
|||
}
|
||||
|
||||
/**
|
||||
* Gets the closing parenthesis which is the pair of the given opening parenthesis.
|
||||
* @param {Token} token The opening parenthesis token to get.
|
||||
* Gets the closing parenthesis by the given node.
|
||||
* @param {ASTNode} node first node after an opening parenthesis.
|
||||
* @returns {Token} The found closing parenthesis token.
|
||||
*/
|
||||
function findClosingParen(token) {
|
||||
let node = sourceCode.getNodeByRangeIndex(token.range[0]);
|
||||
function findClosingParen(node) {
|
||||
let nodeToCheck = node;
|
||||
|
||||
while (!astUtils.isParenthesised(sourceCode, node)) {
|
||||
node = node.parent;
|
||||
while (!astUtils.isParenthesised(sourceCode, nodeToCheck)) {
|
||||
nodeToCheck = nodeToCheck.parent;
|
||||
}
|
||||
return sourceCode.getTokenAfter(node);
|
||||
return sourceCode.getTokenAfter(nodeToCheck);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -191,7 +191,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
/*
|
||||
* If the first token of the reutrn value is `{` or the return value is a sequence expression,
|
||||
* If the first token of the return value is `{` or the return value is a sequence expression,
|
||||
* enclose the return value by parentheses to avoid syntax error.
|
||||
*/
|
||||
if (astUtils.isOpeningBraceToken(firstValueToken) || blockBody[0].argument.type === "SequenceExpression" || (funcInfo.hasInOperator && isInsideForLoopInitializer(node))) {
|
||||
|
|
@ -226,12 +226,22 @@ module.exports = {
|
|||
const arrowToken = sourceCode.getTokenBefore(arrowBody, astUtils.isArrowToken);
|
||||
const [firstTokenAfterArrow, secondTokenAfterArrow] = sourceCode.getTokensAfter(arrowToken, { count: 2 });
|
||||
const lastToken = sourceCode.getLastToken(node);
|
||||
const isParenthesisedObjectLiteral =
|
||||
|
||||
let parenthesisedObjectLiteral = null;
|
||||
|
||||
if (
|
||||
astUtils.isOpeningParenToken(firstTokenAfterArrow) &&
|
||||
astUtils.isOpeningBraceToken(secondTokenAfterArrow);
|
||||
astUtils.isOpeningBraceToken(secondTokenAfterArrow)
|
||||
) {
|
||||
const braceNode = sourceCode.getNodeByRangeIndex(secondTokenAfterArrow.range[0]);
|
||||
|
||||
if (braceNode.type === "ObjectExpression") {
|
||||
parenthesisedObjectLiteral = braceNode;
|
||||
}
|
||||
}
|
||||
|
||||
// If the value is object literal, remove parentheses which were forced by syntax.
|
||||
if (isParenthesisedObjectLiteral) {
|
||||
if (parenthesisedObjectLiteral) {
|
||||
const openingParenToken = firstTokenAfterArrow;
|
||||
const openingBraceToken = secondTokenAfterArrow;
|
||||
|
||||
|
|
@ -247,7 +257,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
// Closing paren for the object doesn't have to be lastToken, e.g.: () => ({}).foo()
|
||||
fixes.push(fixer.remove(findClosingParen(openingBraceToken)));
|
||||
fixes.push(fixer.remove(findClosingParen(parenthesisedObjectLiteral)));
|
||||
fixes.push(fixer.insertTextAfter(lastToken, "}"));
|
||||
|
||||
} else {
|
||||
|
|
|
|||
4
node_modules/eslint/lib/rules/callback-return.js
generated
vendored
4
node_modules/eslint/lib/rules/callback-return.js
generated
vendored
|
|
@ -59,9 +59,9 @@ module.exports = {
|
|||
}
|
||||
|
||||
/**
|
||||
* Check to see if a node contains only identifers
|
||||
* Check to see if a node contains only identifiers
|
||||
* @param {ASTNode} node The node to check
|
||||
* @returns {boolean} Whether or not the node contains only identifers
|
||||
* @returns {boolean} Whether or not the node contains only identifiers
|
||||
*/
|
||||
function containsOnlyIdentifiers(node) {
|
||||
if (node.type === "Identifier") {
|
||||
|
|
|
|||
23
node_modules/eslint/lib/rules/comma-dangle.js
generated
vendored
23
node_modules/eslint/lib/rules/comma-dangle.js
generated
vendored
|
|
@ -9,7 +9,6 @@
|
|||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash");
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -144,23 +143,33 @@ module.exports = {
|
|||
* @returns {ASTNode|null} The last node or null.
|
||||
*/
|
||||
function getLastItem(node) {
|
||||
|
||||
/**
|
||||
* Returns the last element of an array
|
||||
* @param {any[]} array The input array
|
||||
* @returns {any} The last element
|
||||
*/
|
||||
function last(array) {
|
||||
return array[array.length - 1];
|
||||
}
|
||||
|
||||
switch (node.type) {
|
||||
case "ObjectExpression":
|
||||
case "ObjectPattern":
|
||||
return lodash.last(node.properties);
|
||||
return last(node.properties);
|
||||
case "ArrayExpression":
|
||||
case "ArrayPattern":
|
||||
return lodash.last(node.elements);
|
||||
return last(node.elements);
|
||||
case "ImportDeclaration":
|
||||
case "ExportNamedDeclaration":
|
||||
return lodash.last(node.specifiers);
|
||||
return last(node.specifiers);
|
||||
case "FunctionDeclaration":
|
||||
case "FunctionExpression":
|
||||
case "ArrowFunctionExpression":
|
||||
return lodash.last(node.params);
|
||||
return last(node.params);
|
||||
case "CallExpression":
|
||||
case "NewExpression":
|
||||
return lodash.last(node.arguments);
|
||||
return last(node.arguments);
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
|
@ -316,7 +325,7 @@ module.exports = {
|
|||
"always-multiline": forceTrailingCommaIfMultiline,
|
||||
"only-multiline": allowTrailingCommaIfMultiline,
|
||||
never: forbidTrailingComma,
|
||||
ignore: lodash.noop
|
||||
ignore: () => {}
|
||||
};
|
||||
|
||||
return {
|
||||
|
|
|
|||
2
node_modules/eslint/lib/rules/comma-spacing.js
generated
vendored
2
node_modules/eslint/lib/rules/comma-spacing.js
generated
vendored
|
|
@ -181,7 +181,7 @@ module.exports = {
|
|||
|
||||
validateCommaItemSpacing({
|
||||
comma: token,
|
||||
left: astUtils.isCommaToken(previousToken) || commaTokensToIgnore.indexOf(token) > -1 ? null : previousToken,
|
||||
left: astUtils.isCommaToken(previousToken) || commaTokensToIgnore.includes(token) ? null : previousToken,
|
||||
right: astUtils.isCommaToken(nextToken) ? null : nextToken
|
||||
}, token);
|
||||
});
|
||||
|
|
|
|||
3
node_modules/eslint/lib/rules/comma-style.js
generated
vendored
3
node_modules/eslint/lib/rules/comma-style.js
generated
vendored
|
|
@ -207,8 +207,7 @@ module.exports = {
|
|||
* they are always valid regardless of an undefined item.
|
||||
*/
|
||||
if (astUtils.isCommaToken(commaToken)) {
|
||||
validateCommaItemSpacing(previousItemToken, commaToken,
|
||||
currentItemToken, reportItem);
|
||||
validateCommaItemSpacing(previousItemToken, commaToken, currentItemToken, reportItem);
|
||||
}
|
||||
|
||||
if (item) {
|
||||
|
|
|
|||
13
node_modules/eslint/lib/rules/complexity.js
generated
vendored
13
node_modules/eslint/lib/rules/complexity.js
generated
vendored
|
|
@ -10,9 +10,8 @@
|
|||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash");
|
||||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
const { upperCaseFirst } = require("../shared/string-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
|
|
@ -95,7 +94,7 @@ module.exports = {
|
|||
* @private
|
||||
*/
|
||||
function endFunction(node) {
|
||||
const name = lodash.upperFirst(astUtils.getFunctionNameWithKind(node));
|
||||
const name = upperCaseFirst(astUtils.getFunctionNameWithKind(node));
|
||||
const complexity = fns.pop();
|
||||
|
||||
if (complexity > THRESHOLD) {
|
||||
|
|
@ -153,7 +152,13 @@ module.exports = {
|
|||
IfStatement: increaseComplexity,
|
||||
SwitchCase: increaseSwitchComplexity,
|
||||
WhileStatement: increaseComplexity,
|
||||
DoWhileStatement: increaseComplexity
|
||||
DoWhileStatement: increaseComplexity,
|
||||
|
||||
AssignmentExpression(node) {
|
||||
if (astUtils.isLogicalAssignmentOperator(node.operator)) {
|
||||
increaseComplexity();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
10
node_modules/eslint/lib/rules/consistent-return.js
generated
vendored
10
node_modules/eslint/lib/rules/consistent-return.js
generated
vendored
|
|
@ -8,8 +8,8 @@
|
|||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash");
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
const { upperCaseFirst } = require("../shared/string-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
|
|
@ -104,18 +104,18 @@ module.exports = {
|
|||
} else if (node.type === "ArrowFunctionExpression") {
|
||||
|
||||
// `=>` token
|
||||
loc = context.getSourceCode().getTokenBefore(node.body, astUtils.isArrowToken).loc.start;
|
||||
loc = context.getSourceCode().getTokenBefore(node.body, astUtils.isArrowToken).loc;
|
||||
} else if (
|
||||
node.parent.type === "MethodDefinition" ||
|
||||
(node.parent.type === "Property" && node.parent.method)
|
||||
) {
|
||||
|
||||
// Method name.
|
||||
loc = node.parent.key.loc.start;
|
||||
loc = node.parent.key.loc;
|
||||
} else {
|
||||
|
||||
// Function name or `function` keyword.
|
||||
loc = (node.id || node).loc.start;
|
||||
loc = (node.id || context.getSourceCode().getFirstToken(node)).loc;
|
||||
}
|
||||
|
||||
if (!name) {
|
||||
|
|
@ -164,7 +164,7 @@ module.exports = {
|
|||
funcInfo.data = {
|
||||
name: funcInfo.node.type === "Program"
|
||||
? "Program"
|
||||
: lodash.upperFirst(astUtils.getFunctionNameWithKind(funcInfo.node))
|
||||
: upperCaseFirst(astUtils.getFunctionNameWithKind(funcInfo.node))
|
||||
};
|
||||
} else if (funcInfo.hasReturnValue !== hasReturnValue) {
|
||||
context.report({
|
||||
|
|
|
|||
11
node_modules/eslint/lib/rules/constructor-super.js
generated
vendored
11
node_modules/eslint/lib/rules/constructor-super.js
generated
vendored
|
|
@ -79,6 +79,17 @@ function isPossibleConstructor(node) {
|
|||
return false;
|
||||
|
||||
case "LogicalExpression":
|
||||
|
||||
/*
|
||||
* If the && operator short-circuits, the left side was falsy and therefore not a constructor, and if
|
||||
* it doesn't short-circuit, it takes the value from the right side, so the right side must always be a
|
||||
* possible constructor. A future improvement could verify that the left side could be truthy by
|
||||
* excluding falsy literals.
|
||||
*/
|
||||
if (node.operator === "&&") {
|
||||
return isPossibleConstructor(node.right);
|
||||
}
|
||||
|
||||
return (
|
||||
isPossibleConstructor(node.left) ||
|
||||
isPossibleConstructor(node.right)
|
||||
|
|
|
|||
2
node_modules/eslint/lib/rules/dot-location.js
generated
vendored
2
node_modules/eslint/lib/rules/dot-location.js
generated
vendored
|
|
@ -46,7 +46,7 @@ module.exports = {
|
|||
const sourceCode = context.getSourceCode();
|
||||
|
||||
/**
|
||||
* Reports if the dot between object and property is on the correct loccation.
|
||||
* Reports if the dot between object and property is on the correct location.
|
||||
* @param {ASTNode} node The `MemberExpression` node.
|
||||
* @returns {void}
|
||||
*/
|
||||
|
|
|
|||
6
node_modules/eslint/lib/rules/dot-notation.js
generated
vendored
6
node_modules/eslint/lib/rules/dot-notation.js
generated
vendored
|
|
@ -94,7 +94,7 @@ module.exports = {
|
|||
|
||||
// Don't perform any fixes if there are comments inside the brackets.
|
||||
if (sourceCode.commentsExistBetween(leftBracket, rightBracket)) {
|
||||
return; // eslint-disable-line eslint-plugin/fixer-return -- false positive
|
||||
return;
|
||||
}
|
||||
|
||||
// Replace the brackets by an identifier.
|
||||
|
|
@ -154,12 +154,12 @@ module.exports = {
|
|||
|
||||
// A statement that starts with `let[` is parsed as a destructuring variable declaration, not a MemberExpression.
|
||||
if (node.object.type === "Identifier" && node.object.name === "let" && !node.optional) {
|
||||
return; // eslint-disable-line eslint-plugin/fixer-return -- false positive
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't perform any fixes if there are comments between the dot and the property name.
|
||||
if (sourceCode.commentsExistBetween(dotToken, node.property)) {
|
||||
return; // eslint-disable-line eslint-plugin/fixer-return -- false positive
|
||||
return;
|
||||
}
|
||||
|
||||
// Replace the identifier to brackets.
|
||||
|
|
|
|||
11
node_modules/eslint/lib/rules/eol-last.js
generated
vendored
11
node_modules/eslint/lib/rules/eol-last.js
generated
vendored
|
|
@ -4,12 +4,6 @@
|
|||
*/
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -48,13 +42,14 @@ module.exports = {
|
|||
Program: function checkBadEOF(node) {
|
||||
const sourceCode = context.getSourceCode(),
|
||||
src = sourceCode.getText(),
|
||||
lastLine = sourceCode.lines[sourceCode.lines.length - 1],
|
||||
location = {
|
||||
column: lodash.last(sourceCode.lines).length,
|
||||
column: lastLine.length,
|
||||
line: sourceCode.lines.length
|
||||
},
|
||||
LF = "\n",
|
||||
CRLF = `\r${LF}`,
|
||||
endsWithNewline = lodash.endsWith(src, LF);
|
||||
endsWithNewline = src.endsWith(LF);
|
||||
|
||||
/*
|
||||
* Empty source is always valid: No content in file so we don't
|
||||
|
|
|
|||
4
node_modules/eslint/lib/rules/func-call-spacing.js
generated
vendored
4
node_modules/eslint/lib/rules/func-call-spacing.js
generated
vendored
|
|
@ -131,7 +131,7 @@ module.exports = {
|
|||
return null;
|
||||
}
|
||||
|
||||
// If `?.` exsits, it doesn't hide no-undexpected-multiline errors
|
||||
// If `?.` exists, it doesn't hide no-unexpected-multiline errors
|
||||
if (node.optional) {
|
||||
return fixer.replaceTextRange([leftToken.range[1], rightToken.range[0]], "?.");
|
||||
}
|
||||
|
|
@ -177,7 +177,7 @@ module.exports = {
|
|||
/*
|
||||
* Only autofix if there is no newline
|
||||
* https://github.com/eslint/eslint/issues/7787
|
||||
* But if `?.` exsits, it doesn't hide no-undexpected-multiline errors
|
||||
* But if `?.` exists, it doesn't hide no-unexpected-multiline errors
|
||||
*/
|
||||
if (!node.optional) {
|
||||
return null;
|
||||
|
|
|
|||
2
node_modules/eslint/lib/rules/function-paren-newline.js
generated
vendored
2
node_modules/eslint/lib/rules/function-paren-newline.js
generated
vendored
|
|
@ -218,7 +218,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
case "ArrowFunctionExpression": {
|
||||
const firstToken = sourceCode.getFirstToken(node);
|
||||
const firstToken = sourceCode.getFirstToken(node, { skip: (node.async ? 1 : 0) });
|
||||
|
||||
if (!astUtils.isOpeningParenToken(firstToken)) {
|
||||
|
||||
|
|
|
|||
2
node_modules/eslint/lib/rules/indent-legacy.js
generated
vendored
2
node_modules/eslint/lib/rules/indent-legacy.js
generated
vendored
|
|
@ -954,7 +954,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
/**
|
||||
* Checks wether a return statement is wrapped in ()
|
||||
* Checks whether a return statement is wrapped in ()
|
||||
* @param {ASTNode} node node to examine
|
||||
* @returns {boolean} the result
|
||||
*/
|
||||
|
|
|
|||
22
node_modules/eslint/lib/rules/indent.js
generated
vendored
22
node_modules/eslint/lib/rules/indent.js
generated
vendored
|
|
@ -12,10 +12,10 @@
|
|||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash");
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
const createTree = require("functional-red-black-tree");
|
||||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -1068,7 +1068,7 @@ module.exports = {
|
|||
const baseOffsetListeners = {
|
||||
"ArrayExpression, ArrayPattern"(node) {
|
||||
const openingBracket = sourceCode.getFirstToken(node);
|
||||
const closingBracket = sourceCode.getTokenAfter(lodash.findLast(node.elements) || openingBracket, astUtils.isClosingBracketToken);
|
||||
const closingBracket = sourceCode.getTokenAfter([...node.elements].reverse().find(_ => _) || openingBracket, astUtils.isClosingBracketToken);
|
||||
|
||||
addElementListIndent(node.elements, openingBracket, closingBracket, options.ArrayExpression);
|
||||
},
|
||||
|
|
@ -1177,7 +1177,7 @@ module.exports = {
|
|||
offsets.setDesiredOffset(questionMarkToken, firstToken, 1);
|
||||
offsets.setDesiredOffset(colonToken, firstToken, 1);
|
||||
|
||||
offsets.setDesiredOffset(firstConsequentToken, firstToken,
|
||||
offsets.setDesiredOffset(firstConsequentToken, firstToken, firstConsequentToken.type === "Punctuator" &&
|
||||
options.offsetTernaryExpressions ? 2 : 1);
|
||||
|
||||
/*
|
||||
|
|
@ -1203,8 +1203,7 @@ module.exports = {
|
|||
* If `baz` were aligned with `bar` rather than being offset by 1 from `foo`, `baz` would end up
|
||||
* having no expected indentation.
|
||||
*/
|
||||
offsets.setDesiredOffset(firstAlternateToken, firstToken,
|
||||
firstAlternateToken.type === "Punctuator" &&
|
||||
offsets.setDesiredOffset(firstAlternateToken, firstToken, firstAlternateToken.type === "Punctuator" &&
|
||||
options.offsetTernaryExpressions ? 2 : 1);
|
||||
}
|
||||
}
|
||||
|
|
@ -1559,8 +1558,9 @@ module.exports = {
|
|||
* 2. Don't set any offsets against the first token of the node.
|
||||
* 3. Call `ignoreNode` on the node sometime after exiting it and before validating offsets.
|
||||
*/
|
||||
const offsetListeners = lodash.mapValues(
|
||||
baseOffsetListeners,
|
||||
const offsetListeners = {};
|
||||
|
||||
for (const [selector, listener] of Object.entries(baseOffsetListeners)) {
|
||||
|
||||
/*
|
||||
* Offset listener calls are deferred until traversal is finished, and are called as
|
||||
|
|
@ -1578,10 +1578,8 @@ module.exports = {
|
|||
* To avoid this, the `Identifier` listener isn't called until traversal finishes and all
|
||||
* ignored nodes are known.
|
||||
*/
|
||||
listener =>
|
||||
node =>
|
||||
listenerCallQueue.push({ listener, node })
|
||||
);
|
||||
offsetListeners[selector] = node => listenerCallQueue.push({ listener, node });
|
||||
}
|
||||
|
||||
// For each ignored node selector, set up a listener to collect it into the `ignoredNodes` set.
|
||||
const ignoredNodes = new Set();
|
||||
|
|
|
|||
2
node_modules/eslint/lib/rules/index.js
generated
vendored
2
node_modules/eslint/lib/rules/index.js
generated
vendored
|
|
@ -169,6 +169,7 @@ module.exports = new LazyLoadingRuleMap(Object.entries({
|
|||
"no-new-require": () => require("./no-new-require"),
|
||||
"no-new-symbol": () => require("./no-new-symbol"),
|
||||
"no-new-wrappers": () => require("./no-new-wrappers"),
|
||||
"no-nonoctal-decimal-escape": () => require("./no-nonoctal-decimal-escape"),
|
||||
"no-obj-calls": () => require("./no-obj-calls"),
|
||||
"no-octal": () => require("./no-octal"),
|
||||
"no-octal-escape": () => require("./no-octal-escape"),
|
||||
|
|
@ -217,6 +218,7 @@ module.exports = new LazyLoadingRuleMap(Object.entries({
|
|||
"no-unreachable-loop": () => require("./no-unreachable-loop"),
|
||||
"no-unsafe-finally": () => require("./no-unsafe-finally"),
|
||||
"no-unsafe-negation": () => require("./no-unsafe-negation"),
|
||||
"no-unsafe-optional-chaining": () => require("./no-unsafe-optional-chaining"),
|
||||
"no-unused-expressions": () => require("./no-unused-expressions"),
|
||||
"no-unused-labels": () => require("./no-unused-labels"),
|
||||
"no-unused-vars": () => require("./no-unused-vars"),
|
||||
|
|
|
|||
7
node_modules/eslint/lib/rules/lines-around-comment.js
generated
vendored
7
node_modules/eslint/lib/rules/lines-around-comment.js
generated
vendored
|
|
@ -8,8 +8,7 @@
|
|||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash"),
|
||||
astUtils = require("./utils/ast-utils");
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
|
|
@ -347,7 +346,7 @@ module.exports = {
|
|||
const nextTokenOrComment = sourceCode.getTokenAfter(token, { includeComments: true });
|
||||
|
||||
// check for newline before
|
||||
if (!exceptionStartAllowed && before && !lodash.includes(commentAndEmptyLines, prevLineNum) &&
|
||||
if (!exceptionStartAllowed && before && !commentAndEmptyLines.includes(prevLineNum) &&
|
||||
!(astUtils.isCommentToken(previousTokenOrComment) && astUtils.isTokenOnSameLine(previousTokenOrComment, token))) {
|
||||
const lineStart = token.range[0] - token.loc.start.column;
|
||||
const range = [lineStart, lineStart];
|
||||
|
|
@ -362,7 +361,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
// check for newline after
|
||||
if (!exceptionEndAllowed && after && !lodash.includes(commentAndEmptyLines, nextLineNum) &&
|
||||
if (!exceptionEndAllowed && after && !commentAndEmptyLines.includes(nextLineNum) &&
|
||||
!(astUtils.isCommentToken(nextTokenOrComment) && astUtils.isTokenOnSameLine(token, nextTokenOrComment))) {
|
||||
context.report({
|
||||
node: token,
|
||||
|
|
|
|||
7
node_modules/eslint/lib/rules/max-lines-per-function.js
generated
vendored
7
node_modules/eslint/lib/rules/max-lines-per-function.js
generated
vendored
|
|
@ -9,8 +9,7 @@
|
|||
//------------------------------------------------------------------------------
|
||||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
const lodash = require("lodash");
|
||||
const { upperCaseFirst } = require("../shared/string-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Constants
|
||||
|
|
@ -71,7 +70,7 @@ module.exports = {
|
|||
type: "suggestion",
|
||||
|
||||
docs: {
|
||||
description: "enforce a maximum number of line of code in a function",
|
||||
description: "enforce a maximum number of lines of code in a function",
|
||||
category: "Stylistic Issues",
|
||||
recommended: false,
|
||||
url: "https://eslint.org/docs/rules/max-lines-per-function"
|
||||
|
|
@ -191,7 +190,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
if (lineCount > maxLines) {
|
||||
const name = lodash.upperFirst(astUtils.getFunctionNameWithKind(funcNode));
|
||||
const name = upperCaseFirst(astUtils.getFunctionNameWithKind(funcNode));
|
||||
|
||||
context.report({
|
||||
node,
|
||||
|
|
|
|||
47
node_modules/eslint/lib/rules/max-lines.js
generated
vendored
47
node_modules/eslint/lib/rules/max-lines.js
generated
vendored
|
|
@ -8,9 +8,22 @@
|
|||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash");
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Creates an array of numbers from `start` up to, but not including, `end`
|
||||
* @param {number} start The start of the range
|
||||
* @param {number} end The end of the range
|
||||
* @returns {number[]} The range of numbers
|
||||
*/
|
||||
function range(start, end) {
|
||||
return [...Array(end - start).keys()].map(x => x + start);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -119,11 +132,25 @@ module.exports = {
|
|||
}
|
||||
|
||||
if (start <= end) {
|
||||
return lodash.range(start, end + 1);
|
||||
return range(start, end + 1);
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new array formed by applying a given callback function to each element of the array, and then flattening the result by one level.
|
||||
* TODO(stephenwade): Replace this with array.flatMap when we drop support for Node v10
|
||||
* @param {any[]} array The array to process
|
||||
* @param {Function} fn The function to use
|
||||
* @returns {any[]} The result array
|
||||
*/
|
||||
function flatMap(array, fn) {
|
||||
const mapped = array.map(fn);
|
||||
const flattened = [].concat(...mapped);
|
||||
|
||||
return flattened;
|
||||
}
|
||||
|
||||
return {
|
||||
"Program:exit"() {
|
||||
let lines = sourceCode.lines.map((text, i) => ({
|
||||
|
|
@ -131,6 +158,14 @@ module.exports = {
|
|||
text
|
||||
}));
|
||||
|
||||
/*
|
||||
* If file ends with a linebreak, `sourceCode.lines` will have one extra empty line at the end.
|
||||
* That isn't a real line, so we shouldn't count it.
|
||||
*/
|
||||
if (lines.length > 1 && lines[lines.length - 1].text === "") {
|
||||
lines.pop();
|
||||
}
|
||||
|
||||
if (skipBlankLines) {
|
||||
lines = lines.filter(l => l.text.trim() !== "");
|
||||
}
|
||||
|
|
@ -138,12 +173,10 @@ module.exports = {
|
|||
if (skipComments) {
|
||||
const comments = sourceCode.getAllComments();
|
||||
|
||||
const commentLines = lodash.flatten(
|
||||
comments.map(comment => getLinesWithoutCode(comment))
|
||||
);
|
||||
const commentLines = flatMap(comments, comment => getLinesWithoutCode(comment));
|
||||
|
||||
lines = lines.filter(
|
||||
l => !lodash.includes(commentLines, l.lineNumber)
|
||||
l => !commentLines.includes(l.lineNumber)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -155,7 +188,7 @@ module.exports = {
|
|||
},
|
||||
end: {
|
||||
line: sourceCode.lines.length,
|
||||
column: lodash.last(sourceCode.lines).length
|
||||
column: sourceCode.lines[sourceCode.lines.length - 1].length
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
5
node_modules/eslint/lib/rules/max-params.js
generated
vendored
5
node_modules/eslint/lib/rules/max-params.js
generated
vendored
|
|
@ -9,9 +9,8 @@
|
|||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash");
|
||||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
const { upperCaseFirst } = require("../shared/string-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
|
|
@ -85,7 +84,7 @@ module.exports = {
|
|||
node,
|
||||
messageId: "exceed",
|
||||
data: {
|
||||
name: lodash.upperFirst(astUtils.getFunctionNameWithKind(node)),
|
||||
name: upperCaseFirst(astUtils.getFunctionNameWithKind(node)),
|
||||
count: node.params.length,
|
||||
max: numParams
|
||||
}
|
||||
|
|
|
|||
5
node_modules/eslint/lib/rules/max-statements.js
generated
vendored
5
node_modules/eslint/lib/rules/max-statements.js
generated
vendored
|
|
@ -9,9 +9,8 @@
|
|||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash");
|
||||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
const { upperCaseFirst } = require("../shared/string-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
|
|
@ -97,7 +96,7 @@ module.exports = {
|
|||
*/
|
||||
function reportIfTooManyStatements(node, count, max) {
|
||||
if (count > max) {
|
||||
const name = lodash.upperFirst(astUtils.getFunctionNameWithKind(node));
|
||||
const name = upperCaseFirst(astUtils.getFunctionNameWithKind(node));
|
||||
|
||||
context.report({
|
||||
node,
|
||||
|
|
|
|||
69
node_modules/eslint/lib/rules/multiline-ternary.js
generated
vendored
69
node_modules/eslint/lib/rules/multiline-ternary.js
generated
vendored
|
|
@ -27,19 +27,22 @@ module.exports = {
|
|||
enum: ["always", "always-multiline", "never"]
|
||||
}
|
||||
],
|
||||
|
||||
messages: {
|
||||
expectedTestCons: "Expected newline between test and consequent of ternary expression.",
|
||||
expectedConsAlt: "Expected newline between consequent and alternate of ternary expression.",
|
||||
unexpectedTestCons: "Unexpected newline between test and consequent of ternary expression.",
|
||||
unexpectedConsAlt: "Unexpected newline between consequent and alternate of ternary expression."
|
||||
}
|
||||
},
|
||||
|
||||
fixable: "whitespace"
|
||||
},
|
||||
|
||||
create(context) {
|
||||
const sourceCode = context.getSourceCode();
|
||||
const option = context.options[0];
|
||||
const multiline = option !== "never";
|
||||
const allowSingleLine = option === "always-multiline";
|
||||
const sourceCode = context.getSourceCode();
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Public
|
||||
|
|
@ -59,6 +62,8 @@ module.exports = {
|
|||
const areTestAndConsequentOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfTest, firstTokenOfConsequent);
|
||||
const areConsequentAndAlternateOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfConsequent, firstTokenOfAlternate);
|
||||
|
||||
const hasComments = !!sourceCode.getCommentsInside(node).length;
|
||||
|
||||
if (!multiline) {
|
||||
if (!areTestAndConsequentOnSameLine) {
|
||||
context.report({
|
||||
|
|
@ -67,7 +72,24 @@ module.exports = {
|
|||
start: firstTokenOfTest.loc.start,
|
||||
end: lastTokenOfTest.loc.end
|
||||
},
|
||||
messageId: "unexpectedTestCons"
|
||||
messageId: "unexpectedTestCons",
|
||||
fix: fixer => {
|
||||
if (hasComments) {
|
||||
return null;
|
||||
}
|
||||
const fixers = [];
|
||||
const areTestAndQuestionOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfTest, questionToken);
|
||||
const areQuestionAndConsOnSameLine = astUtils.isTokenOnSameLine(questionToken, firstTokenOfConsequent);
|
||||
|
||||
if (!areTestAndQuestionOnSameLine) {
|
||||
fixers.push(fixer.removeRange([lastTokenOfTest.range[1], questionToken.range[0]]));
|
||||
}
|
||||
if (!areQuestionAndConsOnSameLine) {
|
||||
fixers.push(fixer.removeRange([questionToken.range[1], firstTokenOfConsequent.range[0]]));
|
||||
}
|
||||
|
||||
return fixers;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -78,7 +100,24 @@ module.exports = {
|
|||
start: firstTokenOfConsequent.loc.start,
|
||||
end: lastTokenOfConsequent.loc.end
|
||||
},
|
||||
messageId: "unexpectedConsAlt"
|
||||
messageId: "unexpectedConsAlt",
|
||||
fix: fixer => {
|
||||
if (hasComments) {
|
||||
return null;
|
||||
}
|
||||
const fixers = [];
|
||||
const areConsAndColonOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfConsequent, colonToken);
|
||||
const areColonAndAltOnSameLine = astUtils.isTokenOnSameLine(colonToken, firstTokenOfAlternate);
|
||||
|
||||
if (!areConsAndColonOnSameLine) {
|
||||
fixers.push(fixer.removeRange([lastTokenOfConsequent.range[1], colonToken.range[0]]));
|
||||
}
|
||||
if (!areColonAndAltOnSameLine) {
|
||||
fixers.push(fixer.removeRange([colonToken.range[1], firstTokenOfAlternate.range[0]]));
|
||||
}
|
||||
|
||||
return fixers;
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
|
|
@ -93,7 +132,16 @@ module.exports = {
|
|||
start: firstTokenOfTest.loc.start,
|
||||
end: lastTokenOfTest.loc.end
|
||||
},
|
||||
messageId: "expectedTestCons"
|
||||
messageId: "expectedTestCons",
|
||||
fix: fixer => (hasComments ? null : (
|
||||
fixer.replaceTextRange(
|
||||
[
|
||||
lastTokenOfTest.range[1],
|
||||
questionToken.range[0]
|
||||
],
|
||||
"\n"
|
||||
)
|
||||
))
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -104,7 +152,16 @@ module.exports = {
|
|||
start: firstTokenOfConsequent.loc.start,
|
||||
end: lastTokenOfConsequent.loc.end
|
||||
},
|
||||
messageId: "expectedConsAlt"
|
||||
messageId: "expectedConsAlt",
|
||||
fix: (fixer => (hasComments ? null : (
|
||||
fixer.replaceTextRange(
|
||||
[
|
||||
lastTokenOfConsequent.range[1],
|
||||
colonToken.range[0]
|
||||
],
|
||||
"\n"
|
||||
)
|
||||
)))
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
89
node_modules/eslint/lib/rules/no-constant-condition.js
generated
vendored
89
node_modules/eslint/lib/rules/no-constant-condition.js
generated
vendored
|
|
@ -9,9 +9,6 @@
|
|||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const EQUALITY_OPERATORS = ["===", "!==", "==", "!="];
|
||||
const RELATIONAL_OPERATORS = [">", "<", ">=", "<=", "in", "instanceof"];
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -56,6 +53,35 @@ module.exports = {
|
|||
// Helpers
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Returns literal's value converted to the Boolean type
|
||||
* @param {ASTNode} node any `Literal` node
|
||||
* @returns {boolean | null} `true` when node is truthy, `false` when node is falsy,
|
||||
* `null` when it cannot be determined.
|
||||
*/
|
||||
function getBooleanValue(node) {
|
||||
if (node.value === null) {
|
||||
|
||||
/*
|
||||
* it might be a null literal or bigint/regex literal in unsupported environments .
|
||||
* https://github.com/estree/estree/blob/14df8a024956ea289bd55b9c2226a1d5b8a473ee/es5.md#regexpliteral
|
||||
* https://github.com/estree/estree/blob/14df8a024956ea289bd55b9c2226a1d5b8a473ee/es2020.md#bigintliteral
|
||||
*/
|
||||
|
||||
if (node.raw === "null") {
|
||||
return false;
|
||||
}
|
||||
|
||||
// regex is always truthy
|
||||
if (typeof node.regex === "object") {
|
||||
return true;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
return !!node.value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a branch node of LogicalExpression short circuits the whole condition
|
||||
|
|
@ -66,15 +92,28 @@ module.exports = {
|
|||
function isLogicalIdentity(node, operator) {
|
||||
switch (node.type) {
|
||||
case "Literal":
|
||||
return (operator === "||" && node.value === true) ||
|
||||
(operator === "&&" && node.value === false);
|
||||
return (operator === "||" && getBooleanValue(node) === true) ||
|
||||
(operator === "&&" && getBooleanValue(node) === false);
|
||||
|
||||
case "UnaryExpression":
|
||||
return (operator === "&&" && node.operator === "void");
|
||||
|
||||
case "LogicalExpression":
|
||||
return isLogicalIdentity(node.left, node.operator) ||
|
||||
isLogicalIdentity(node.right, node.operator);
|
||||
|
||||
/*
|
||||
* handles `a && false || b`
|
||||
* `false` is an identity element of `&&` but not `||`
|
||||
*/
|
||||
return operator === node.operator &&
|
||||
(
|
||||
isLogicalIdentity(node.left, operator) ||
|
||||
isLogicalIdentity(node.right, operator)
|
||||
);
|
||||
|
||||
case "AssignmentExpression":
|
||||
return ["||=", "&&="].includes(node.operator) &&
|
||||
operator === node.operator.slice(0, -1) &&
|
||||
isLogicalIdentity(node.right, operator);
|
||||
|
||||
// no default
|
||||
}
|
||||
|
|
@ -113,12 +152,18 @@ module.exports = {
|
|||
}
|
||||
|
||||
case "UnaryExpression":
|
||||
if (node.operator === "void") {
|
||||
if (
|
||||
node.operator === "void" ||
|
||||
node.operator === "typeof" && inBooleanPosition
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return (node.operator === "typeof" && inBooleanPosition) ||
|
||||
isConstant(node.argument, true);
|
||||
if (node.operator === "!") {
|
||||
return isConstant(node.argument, true);
|
||||
}
|
||||
|
||||
return isConstant(node.argument, false);
|
||||
|
||||
case "BinaryExpression":
|
||||
return isConstant(node.left, false) &&
|
||||
|
|
@ -129,27 +174,23 @@ module.exports = {
|
|||
const isLeftConstant = isConstant(node.left, inBooleanPosition);
|
||||
const isRightConstant = isConstant(node.right, inBooleanPosition);
|
||||
const isLeftShortCircuit = (isLeftConstant && isLogicalIdentity(node.left, node.operator));
|
||||
const isRightShortCircuit = (isRightConstant && isLogicalIdentity(node.right, node.operator));
|
||||
const isRightShortCircuit = (inBooleanPosition && isRightConstant && isLogicalIdentity(node.right, node.operator));
|
||||
|
||||
return (isLeftConstant && isRightConstant) ||
|
||||
(
|
||||
|
||||
// in the case of an "OR", we need to know if the right constant value is truthy
|
||||
node.operator === "||" &&
|
||||
isRightConstant &&
|
||||
node.right.value &&
|
||||
(
|
||||
!node.parent ||
|
||||
node.parent.type !== "BinaryExpression" ||
|
||||
!(EQUALITY_OPERATORS.includes(node.parent.operator) || RELATIONAL_OPERATORS.includes(node.parent.operator))
|
||||
)
|
||||
) ||
|
||||
isLeftShortCircuit ||
|
||||
isRightShortCircuit;
|
||||
}
|
||||
|
||||
case "AssignmentExpression":
|
||||
return (node.operator === "=") && isConstant(node.right, inBooleanPosition);
|
||||
if (node.operator === "=") {
|
||||
return isConstant(node.right, inBooleanPosition);
|
||||
}
|
||||
|
||||
if (["||=", "&&="].includes(node.operator) && inBooleanPosition) {
|
||||
return isLogicalIdentity(node.right, node.operator.slice(0, -1));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
case "SequenceExpression":
|
||||
return isConstant(node.expressions[node.expressions.length - 1], inBooleanPosition);
|
||||
|
|
|
|||
1
node_modules/eslint/lib/rules/no-control-regex.js
generated
vendored
1
node_modules/eslint/lib/rules/no-control-regex.js
generated
vendored
|
|
@ -8,7 +8,6 @@
|
|||
const RegExpValidator = require("regexpp").RegExpValidator;
|
||||
const collector = new (class {
|
||||
constructor() {
|
||||
this.ecmaVersion = 2018;
|
||||
this._source = "";
|
||||
this._controlChars = [];
|
||||
this._validator = new RegExpValidator(this);
|
||||
|
|
|
|||
282
node_modules/eslint/lib/rules/no-duplicate-imports.js
generated
vendored
282
node_modules/eslint/lib/rules/no-duplicate-imports.js
generated
vendored
|
|
@ -4,42 +4,183 @@
|
|||
*/
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const NAMED_TYPES = ["ImportSpecifier", "ExportSpecifier"];
|
||||
const NAMESPACE_TYPES = [
|
||||
"ImportNamespaceSpecifier",
|
||||
"ExportNamespaceSpecifier"
|
||||
];
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Check if an import/export type belongs to (ImportSpecifier|ExportSpecifier) or (ImportNamespaceSpecifier|ExportNamespaceSpecifier).
|
||||
* @param {string} importExportType An import/export type to check.
|
||||
* @param {string} type Can be "named" or "namespace"
|
||||
* @returns {boolean} True if import/export type belongs to (ImportSpecifier|ExportSpecifier) or (ImportNamespaceSpecifier|ExportNamespaceSpecifier) and false if it doesn't.
|
||||
*/
|
||||
function isImportExportSpecifier(importExportType, type) {
|
||||
const arrayToCheck = type === "named" ? NAMED_TYPES : NAMESPACE_TYPES;
|
||||
|
||||
return arrayToCheck.includes(importExportType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the type of (import|export).
|
||||
* @param {ASTNode} node A node to get.
|
||||
* @returns {string} The type of the (import|export).
|
||||
*/
|
||||
function getImportExportType(node) {
|
||||
if (node.specifiers && node.specifiers.length > 0) {
|
||||
const nodeSpecifiers = node.specifiers;
|
||||
const index = nodeSpecifiers.findIndex(
|
||||
({ type }) =>
|
||||
isImportExportSpecifier(type, "named") ||
|
||||
isImportExportSpecifier(type, "namespace")
|
||||
);
|
||||
const i = index > -1 ? index : 0;
|
||||
|
||||
return nodeSpecifiers[i].type;
|
||||
}
|
||||
if (node.type === "ExportAllDeclaration") {
|
||||
if (node.exported) {
|
||||
return "ExportNamespaceSpecifier";
|
||||
}
|
||||
return "ExportAll";
|
||||
}
|
||||
return "SideEffectImport";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a boolean indicates if two (import|export) can be merged
|
||||
* @param {ASTNode} node1 A node to check.
|
||||
* @param {ASTNode} node2 A node to check.
|
||||
* @returns {boolean} True if two (import|export) can be merged, false if they can't.
|
||||
*/
|
||||
function isImportExportCanBeMerged(node1, node2) {
|
||||
const importExportType1 = getImportExportType(node1);
|
||||
const importExportType2 = getImportExportType(node2);
|
||||
|
||||
if (
|
||||
(importExportType1 === "ExportAll" &&
|
||||
importExportType2 !== "ExportAll" &&
|
||||
importExportType2 !== "SideEffectImport") ||
|
||||
(importExportType1 !== "ExportAll" &&
|
||||
importExportType1 !== "SideEffectImport" &&
|
||||
importExportType2 === "ExportAll")
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
if (
|
||||
(isImportExportSpecifier(importExportType1, "namespace") &&
|
||||
isImportExportSpecifier(importExportType2, "named")) ||
|
||||
(isImportExportSpecifier(importExportType2, "namespace") &&
|
||||
isImportExportSpecifier(importExportType1, "named"))
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a boolean if we should report (import|export).
|
||||
* @param {ASTNode} node A node to be reported or not.
|
||||
* @param {[ASTNode]} previousNodes An array contains previous nodes of the module imported or exported.
|
||||
* @returns {boolean} True if the (import|export) should be reported.
|
||||
*/
|
||||
function shouldReportImportExport(node, previousNodes) {
|
||||
let i = 0;
|
||||
|
||||
while (i < previousNodes.length) {
|
||||
if (isImportExportCanBeMerged(node, previousNodes[i])) {
|
||||
return true;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns array contains only nodes with declarations types equal to type.
|
||||
* @param {[{node: ASTNode, declarationType: string}]} nodes An array contains objects, each object contains a node and a declaration type.
|
||||
* @param {string} type Declaration type.
|
||||
* @returns {[ASTNode]} An array contains only nodes with declarations types equal to type.
|
||||
*/
|
||||
function getNodesByDeclarationType(nodes, type) {
|
||||
return nodes
|
||||
.filter(({ declarationType }) => declarationType === type)
|
||||
.map(({ node }) => node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the module imported or re-exported.
|
||||
* @param {ASTNode} node A node to get.
|
||||
* @returns {string} the name of the module, or empty string if no name.
|
||||
* @returns {string} The name of the module, or empty string if no name.
|
||||
*/
|
||||
function getValue(node) {
|
||||
function getModule(node) {
|
||||
if (node && node.source && node.source.value) {
|
||||
return node.source.value.trim();
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the name of the import or export exists in the given array, and reports if so.
|
||||
* Checks if the (import|export) can be merged with at least one import or one export, and reports if so.
|
||||
* @param {RuleContext} context The ESLint rule context object.
|
||||
* @param {ASTNode} node A node to get.
|
||||
* @param {string} value The name of the imported or exported module.
|
||||
* @param {string[]} array The array containing other imports or exports in the file.
|
||||
* @param {string} messageId A messageId to be reported after the name of the module
|
||||
*
|
||||
* @returns {void} No return value
|
||||
* @param {Map} modules A Map object contains as a key a module name and as value an array contains objects, each object contains a node and a declaration type.
|
||||
* @param {string} declarationType A declaration type can be an import or export.
|
||||
* @param {boolean} includeExports Whether or not to check for exports in addition to imports.
|
||||
* @returns {void} No return value.
|
||||
*/
|
||||
function checkAndReport(context, node, value, array, messageId) {
|
||||
if (array.indexOf(value) !== -1) {
|
||||
context.report({
|
||||
node,
|
||||
messageId,
|
||||
data: {
|
||||
module: value
|
||||
function checkAndReport(
|
||||
context,
|
||||
node,
|
||||
modules,
|
||||
declarationType,
|
||||
includeExports
|
||||
) {
|
||||
const module = getModule(node);
|
||||
|
||||
if (modules.has(module)) {
|
||||
const previousNodes = modules.get(module);
|
||||
const messagesIds = [];
|
||||
const importNodes = getNodesByDeclarationType(previousNodes, "import");
|
||||
let exportNodes;
|
||||
|
||||
if (includeExports) {
|
||||
exportNodes = getNodesByDeclarationType(previousNodes, "export");
|
||||
}
|
||||
if (declarationType === "import") {
|
||||
if (shouldReportImportExport(node, importNodes)) {
|
||||
messagesIds.push("import");
|
||||
}
|
||||
});
|
||||
if (includeExports) {
|
||||
if (shouldReportImportExport(node, exportNodes)) {
|
||||
messagesIds.push("importAs");
|
||||
}
|
||||
}
|
||||
} else if (declarationType === "export") {
|
||||
if (shouldReportImportExport(node, exportNodes)) {
|
||||
messagesIds.push("export");
|
||||
}
|
||||
if (shouldReportImportExport(node, importNodes)) {
|
||||
messagesIds.push("exportAs");
|
||||
}
|
||||
}
|
||||
messagesIds.forEach(messageId =>
|
||||
context.report({
|
||||
node,
|
||||
messageId,
|
||||
data: {
|
||||
module
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -49,47 +190,39 @@ function checkAndReport(context, node, value, array, messageId) {
|
|||
*/
|
||||
|
||||
/**
|
||||
* Returns a function handling the imports of a given file
|
||||
* Returns a function handling the (imports|exports) of a given file
|
||||
* @param {RuleContext} context The ESLint rule context object.
|
||||
* @param {Map} modules A Map object contains as a key a module name and as value an array contains objects, each object contains a node and a declaration type.
|
||||
* @param {string} declarationType A declaration type can be an import or export.
|
||||
* @param {boolean} includeExports Whether or not to check for exports in addition to imports.
|
||||
* @param {string[]} importsInFile The array containing other imports in the file.
|
||||
* @param {string[]} exportsInFile The array containing other exports in the file.
|
||||
*
|
||||
* @returns {nodeCallback} A function passed to ESLint to handle the statement.
|
||||
*/
|
||||
function handleImports(context, includeExports, importsInFile, exportsInFile) {
|
||||
function handleImportsExports(
|
||||
context,
|
||||
modules,
|
||||
declarationType,
|
||||
includeExports
|
||||
) {
|
||||
return function(node) {
|
||||
const value = getValue(node);
|
||||
const module = getModule(node);
|
||||
|
||||
if (value) {
|
||||
checkAndReport(context, node, value, importsInFile, "import");
|
||||
if (module) {
|
||||
checkAndReport(
|
||||
context,
|
||||
node,
|
||||
modules,
|
||||
declarationType,
|
||||
includeExports
|
||||
);
|
||||
const currentNode = { node, declarationType };
|
||||
let nodes = [currentNode];
|
||||
|
||||
if (includeExports) {
|
||||
checkAndReport(context, node, value, exportsInFile, "importAs");
|
||||
if (modules.has(module)) {
|
||||
const previousNodes = modules.get(module);
|
||||
|
||||
nodes = [...previousNodes, currentNode];
|
||||
}
|
||||
|
||||
importsInFile.push(value);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a function handling the exports of a given file
|
||||
* @param {RuleContext} context The ESLint rule context object.
|
||||
* @param {string[]} importsInFile The array containing other imports in the file.
|
||||
* @param {string[]} exportsInFile The array containing other exports in the file.
|
||||
*
|
||||
* @returns {nodeCallback} A function passed to ESLint to handle the statement.
|
||||
*/
|
||||
function handleExports(context, importsInFile, exportsInFile) {
|
||||
return function(node) {
|
||||
const value = getValue(node);
|
||||
|
||||
if (value) {
|
||||
checkAndReport(context, node, value, exportsInFile, "export");
|
||||
checkAndReport(context, node, value, importsInFile, "exportAs");
|
||||
|
||||
exportsInFile.push(value);
|
||||
modules.set(module, nodes);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -105,16 +238,19 @@ module.exports = {
|
|||
url: "https://eslint.org/docs/rules/no-duplicate-imports"
|
||||
},
|
||||
|
||||
schema: [{
|
||||
type: "object",
|
||||
properties: {
|
||||
includeExports: {
|
||||
type: "boolean",
|
||||
default: false
|
||||
}
|
||||
},
|
||||
additionalProperties: false
|
||||
}],
|
||||
schema: [
|
||||
{
|
||||
type: "object",
|
||||
properties: {
|
||||
includeExports: {
|
||||
type: "boolean",
|
||||
default: false
|
||||
}
|
||||
},
|
||||
additionalProperties: false
|
||||
}
|
||||
],
|
||||
|
||||
messages: {
|
||||
import: "'{{module}}' import is duplicated.",
|
||||
importAs: "'{{module}}' import is duplicated as export.",
|
||||
|
|
@ -125,18 +261,30 @@ module.exports = {
|
|||
|
||||
create(context) {
|
||||
const includeExports = (context.options[0] || {}).includeExports,
|
||||
importsInFile = [],
|
||||
exportsInFile = [];
|
||||
|
||||
modules = new Map();
|
||||
const handlers = {
|
||||
ImportDeclaration: handleImports(context, includeExports, importsInFile, exportsInFile)
|
||||
ImportDeclaration: handleImportsExports(
|
||||
context,
|
||||
modules,
|
||||
"import",
|
||||
includeExports
|
||||
)
|
||||
};
|
||||
|
||||
if (includeExports) {
|
||||
handlers.ExportNamedDeclaration = handleExports(context, importsInFile, exportsInFile);
|
||||
handlers.ExportAllDeclaration = handleExports(context, importsInFile, exportsInFile);
|
||||
handlers.ExportNamedDeclaration = handleImportsExports(
|
||||
context,
|
||||
modules,
|
||||
"export",
|
||||
includeExports
|
||||
);
|
||||
handlers.ExportAllDeclaration = handleImportsExports(
|
||||
context,
|
||||
modules,
|
||||
"export",
|
||||
includeExports
|
||||
);
|
||||
}
|
||||
|
||||
return handlers;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
2
node_modules/eslint/lib/rules/no-extend-native.js
generated
vendored
2
node_modules/eslint/lib/rules/no-extend-native.js
generated
vendored
|
|
@ -138,7 +138,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
/*
|
||||
* `identifierNode.parent` is a MamberExpression `*.prototype`.
|
||||
* `identifierNode.parent` is a MemberExpression `*.prototype`.
|
||||
* If it's an optional member access, it may be wrapped by a `ChainExpression` node.
|
||||
*/
|
||||
const prototypeNode =
|
||||
|
|
|
|||
119
node_modules/eslint/lib/rules/no-extra-parens.js
generated
vendored
119
node_modules/eslint/lib/rules/no-extra-parens.js
generated
vendored
|
|
@ -472,20 +472,34 @@ module.exports = {
|
|||
const callee = node.callee;
|
||||
|
||||
if (hasExcessParensWithPrecedence(callee, precedence(node))) {
|
||||
const hasNewParensException = callee.type === "NewExpression" && !isNewExpressionWithParens(callee);
|
||||
|
||||
if (
|
||||
hasDoubleExcessParens(callee) ||
|
||||
!isIIFE(node) &&
|
||||
!hasNewParensException &&
|
||||
!(
|
||||
isIIFE(node) ||
|
||||
|
||||
// Allow extra parens around a new expression if they are intervening parentheses.
|
||||
node.type === "NewExpression" &&
|
||||
callee.type === "MemberExpression" &&
|
||||
doesMemberExpressionContainCallExpression(callee)
|
||||
) &&
|
||||
!(!node.optional && callee.type === "ChainExpression")
|
||||
// (new A)(); new (new A)();
|
||||
(
|
||||
callee.type === "NewExpression" &&
|
||||
!isNewExpressionWithParens(callee) &&
|
||||
!(
|
||||
node.type === "NewExpression" &&
|
||||
!isNewExpressionWithParens(node)
|
||||
)
|
||||
) ||
|
||||
|
||||
// new (a().b)(); new (a.b().c);
|
||||
(
|
||||
node.type === "NewExpression" &&
|
||||
callee.type === "MemberExpression" &&
|
||||
doesMemberExpressionContainCallExpression(callee)
|
||||
) ||
|
||||
|
||||
// (a?.b)(); (a?.())();
|
||||
(
|
||||
!node.optional &&
|
||||
callee.type === "ChainExpression"
|
||||
)
|
||||
)
|
||||
) {
|
||||
report(node.callee);
|
||||
}
|
||||
|
|
@ -511,7 +525,7 @@ module.exports = {
|
|||
|
||||
if (!shouldSkipLeft && hasExcessParens(node.left)) {
|
||||
if (
|
||||
!(node.left.type === "UnaryExpression" && isExponentiation) &&
|
||||
!(["AwaitExpression", "UnaryExpression"].includes(node.left.type) && isExponentiation) &&
|
||||
!astUtils.isMixedLogicalAndCoalesceExpressions(node.left, node) &&
|
||||
(leftPrecedence > prec || (leftPrecedence === prec && !isExponentiation)) ||
|
||||
isParenthesisedTwice(node.left)
|
||||
|
|
@ -830,45 +844,49 @@ module.exports = {
|
|||
ExportDefaultDeclaration: node => checkExpressionOrExportStatement(node.declaration),
|
||||
ExpressionStatement: node => checkExpressionOrExportStatement(node.expression),
|
||||
|
||||
"ForInStatement, ForOfStatement"(node) {
|
||||
if (node.left.type !== "VariableDeclarator") {
|
||||
ForInStatement(node) {
|
||||
if (node.left.type !== "VariableDeclaration") {
|
||||
const firstLeftToken = sourceCode.getFirstToken(node.left, astUtils.isNotOpeningParenToken);
|
||||
|
||||
if (
|
||||
firstLeftToken.value === "let" && (
|
||||
|
||||
/*
|
||||
* If `let` is the only thing on the left side of the loop, it's the loop variable: `for ((let) of foo);`
|
||||
* Removing it will cause a syntax error, because it will be parsed as the start of a VariableDeclarator.
|
||||
*/
|
||||
(firstLeftToken.range[1] === node.left.range[1] || /*
|
||||
* If `let` is followed by a `[` token, it's a property access on the `let` value: `for ((let[foo]) of bar);`
|
||||
* Removing it will cause the property access to be parsed as a destructuring declaration of `foo` instead.
|
||||
*/
|
||||
astUtils.isOpeningBracketToken(
|
||||
sourceCode.getTokenAfter(firstLeftToken, astUtils.isNotClosingParenToken)
|
||||
))
|
||||
firstLeftToken.value === "let" &&
|
||||
astUtils.isOpeningBracketToken(
|
||||
sourceCode.getTokenAfter(firstLeftToken, astUtils.isNotClosingParenToken)
|
||||
)
|
||||
) {
|
||||
|
||||
// ForInStatement#left expression cannot start with `let[`.
|
||||
tokensToIgnore.add(firstLeftToken);
|
||||
}
|
||||
}
|
||||
|
||||
if (node.type === "ForOfStatement") {
|
||||
const hasExtraParens = node.right.type === "SequenceExpression"
|
||||
? hasDoubleExcessParens(node.right)
|
||||
: hasExcessParens(node.right);
|
||||
if (hasExcessParens(node.left)) {
|
||||
report(node.left);
|
||||
}
|
||||
|
||||
if (hasExtraParens) {
|
||||
report(node.right);
|
||||
}
|
||||
} else if (hasExcessParens(node.right)) {
|
||||
if (hasExcessParens(node.right)) {
|
||||
report(node.right);
|
||||
}
|
||||
},
|
||||
|
||||
ForOfStatement(node) {
|
||||
if (node.left.type !== "VariableDeclaration") {
|
||||
const firstLeftToken = sourceCode.getFirstToken(node.left, astUtils.isNotOpeningParenToken);
|
||||
|
||||
if (firstLeftToken.value === "let") {
|
||||
|
||||
// ForOfStatement#left expression cannot start with `let`.
|
||||
tokensToIgnore.add(firstLeftToken);
|
||||
}
|
||||
}
|
||||
|
||||
if (hasExcessParens(node.left)) {
|
||||
report(node.left);
|
||||
}
|
||||
|
||||
if (hasExcessParensWithPrecedence(node.right, PRECEDENCE_OF_ASSIGNMENT_EXPR)) {
|
||||
report(node.right);
|
||||
}
|
||||
},
|
||||
|
||||
ForStatement(node) {
|
||||
|
|
@ -881,6 +899,22 @@ module.exports = {
|
|||
}
|
||||
|
||||
if (node.init) {
|
||||
|
||||
if (node.init.type !== "VariableDeclaration") {
|
||||
const firstToken = sourceCode.getFirstToken(node.init, astUtils.isNotOpeningParenToken);
|
||||
|
||||
if (
|
||||
firstToken.value === "let" &&
|
||||
astUtils.isOpeningBracketToken(
|
||||
sourceCode.getTokenAfter(firstToken, astUtils.isNotClosingParenToken)
|
||||
)
|
||||
) {
|
||||
|
||||
// ForStatement#init expression cannot start with `let[`.
|
||||
tokensToIgnore.add(firstToken);
|
||||
}
|
||||
}
|
||||
|
||||
startNewReportsBuffering();
|
||||
|
||||
if (hasExcessParens(node.init)) {
|
||||
|
|
@ -1109,7 +1143,22 @@ module.exports = {
|
|||
},
|
||||
|
||||
UnaryExpression: checkArgumentWithPrecedence,
|
||||
UpdateExpression: checkArgumentWithPrecedence,
|
||||
UpdateExpression(node) {
|
||||
if (node.prefix) {
|
||||
checkArgumentWithPrecedence(node);
|
||||
} else {
|
||||
const { argument } = node;
|
||||
const operatorToken = sourceCode.getLastToken(node);
|
||||
|
||||
if (argument.loc.end.line === operatorToken.loc.start.line) {
|
||||
checkArgumentWithPrecedence(node);
|
||||
} else {
|
||||
if (hasDoubleExcessParens(argument)) {
|
||||
report(argument);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
AwaitExpression: checkArgumentWithPrecedence,
|
||||
|
||||
VariableDeclarator(node) {
|
||||
|
|
|
|||
31
node_modules/eslint/lib/rules/no-fallthrough.js
generated
vendored
31
node_modules/eslint/lib/rules/no-fallthrough.js
generated
vendored
|
|
@ -4,12 +4,6 @@
|
|||
*/
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -17,15 +11,26 @@ const lodash = require("lodash");
|
|||
const DEFAULT_FALLTHROUGH_COMMENT = /falls?\s?through/iu;
|
||||
|
||||
/**
|
||||
* Checks whether or not a given node has a fallthrough comment.
|
||||
* @param {ASTNode} node A SwitchCase node to get comments.
|
||||
* Checks whether or not a given case has a fallthrough comment.
|
||||
* @param {ASTNode} caseWhichFallsThrough SwitchCase node which falls through.
|
||||
* @param {ASTNode} subsequentCase The case after caseWhichFallsThrough.
|
||||
* @param {RuleContext} context A rule context which stores comments.
|
||||
* @param {RegExp} fallthroughCommentPattern A pattern to match comment to.
|
||||
* @returns {boolean} `true` if the node has a valid fallthrough comment.
|
||||
* @returns {boolean} `true` if the case has a valid fallthrough comment.
|
||||
*/
|
||||
function hasFallthroughComment(node, context, fallthroughCommentPattern) {
|
||||
function hasFallthroughComment(caseWhichFallsThrough, subsequentCase, context, fallthroughCommentPattern) {
|
||||
const sourceCode = context.getSourceCode();
|
||||
const comment = lodash.last(sourceCode.getCommentsBefore(node));
|
||||
|
||||
if (caseWhichFallsThrough.consequent.length === 1 && caseWhichFallsThrough.consequent[0].type === "BlockStatement") {
|
||||
const trailingCloseBrace = sourceCode.getLastToken(caseWhichFallsThrough.consequent[0]);
|
||||
const commentInBlock = sourceCode.getCommentsBefore(trailingCloseBrace).pop();
|
||||
|
||||
if (commentInBlock && fallthroughCommentPattern.test(commentInBlock.value)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
const comment = sourceCode.getCommentsBefore(subsequentCase).pop();
|
||||
|
||||
return Boolean(comment && fallthroughCommentPattern.test(comment.value));
|
||||
}
|
||||
|
|
@ -114,7 +119,7 @@ module.exports = {
|
|||
* Checks whether or not there is a fallthrough comment.
|
||||
* And reports the previous fallthrough node if that does not exist.
|
||||
*/
|
||||
if (fallthroughCase && !hasFallthroughComment(node, context, fallthroughCommentPattern)) {
|
||||
if (fallthroughCase && !hasFallthroughComment(fallthroughCase, node, context, fallthroughCommentPattern)) {
|
||||
context.report({
|
||||
messageId: node.test ? "case" : "default",
|
||||
node
|
||||
|
|
@ -133,7 +138,7 @@ module.exports = {
|
|||
*/
|
||||
if (currentCodePath.currentSegments.some(isReachable) &&
|
||||
(node.consequent.length > 0 || hasBlankLinesBetween(node, nextToken)) &&
|
||||
lodash.last(node.parent.cases) !== node) {
|
||||
node.parent.cases[node.parent.cases.length - 1] !== node) {
|
||||
fallthroughCase = node;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
60
node_modules/eslint/lib/rules/no-implicit-coercion.js
generated
vendored
60
node_modules/eslint/lib/rules/no-implicit-coercion.js
generated
vendored
|
|
@ -24,6 +24,7 @@ function parseOptions(options) {
|
|||
boolean: "boolean" in options ? options.boolean : true,
|
||||
number: "number" in options ? options.number : true,
|
||||
string: "string" in options ? options.string : true,
|
||||
disallowTemplateShorthand: "disallowTemplateShorthand" in options ? options.disallowTemplateShorthand : false,
|
||||
allow: options.allow || []
|
||||
};
|
||||
}
|
||||
|
|
@ -108,6 +109,20 @@ function getNonNumericOperand(node) {
|
|||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether an expression evaluates to a string.
|
||||
* @param {ASTNode} node node that represents the expression to check.
|
||||
* @returns {boolean} Whether or not the expression evaluates to a string.
|
||||
*/
|
||||
function isStringType(node) {
|
||||
return astUtils.isStringLiteral(node) ||
|
||||
(
|
||||
node.type === "CallExpression" &&
|
||||
node.callee.type === "Identifier" &&
|
||||
node.callee.name === "String"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a node is an empty string literal or not.
|
||||
* @param {ASTNode} node The node to check.
|
||||
|
|
@ -125,8 +140,8 @@ function isEmptyString(node) {
|
|||
*/
|
||||
function isConcatWithEmptyString(node) {
|
||||
return node.operator === "+" && (
|
||||
(isEmptyString(node.left) && !astUtils.isStringLiteral(node.right)) ||
|
||||
(isEmptyString(node.right) && !astUtils.isStringLiteral(node.left))
|
||||
(isEmptyString(node.left) && !isStringType(node.right)) ||
|
||||
(isEmptyString(node.right) && !isStringType(node.left))
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -180,6 +195,10 @@ module.exports = {
|
|||
type: "boolean",
|
||||
default: true
|
||||
},
|
||||
disallowTemplateShorthand: {
|
||||
type: "boolean",
|
||||
default: false
|
||||
},
|
||||
allow: {
|
||||
type: "array",
|
||||
items: {
|
||||
|
|
@ -299,6 +318,43 @@ module.exports = {
|
|||
|
||||
report(node, recommendation, true);
|
||||
}
|
||||
},
|
||||
|
||||
TemplateLiteral(node) {
|
||||
if (!options.disallowTemplateShorthand) {
|
||||
return;
|
||||
}
|
||||
|
||||
// tag`${foo}`
|
||||
if (node.parent.type === "TaggedTemplateExpression") {
|
||||
return;
|
||||
}
|
||||
|
||||
// `` or `${foo}${bar}`
|
||||
if (node.expressions.length !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// `prefix${foo}`
|
||||
if (node.quasis[0].value.cooked !== "") {
|
||||
return;
|
||||
}
|
||||
|
||||
// `${foo}postfix`
|
||||
if (node.quasis[1].value.cooked !== "") {
|
||||
return;
|
||||
}
|
||||
|
||||
// if the expression is already a string, then this isn't a coercion
|
||||
if (isStringType(node.expressions[0])) {
|
||||
return;
|
||||
}
|
||||
|
||||
const code = sourceCode.getText(node.expressions[0]);
|
||||
const recommendation = `String(${code})`;
|
||||
|
||||
report(node, recommendation, true);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
8
node_modules/eslint/lib/rules/no-import-assign.js
generated
vendored
8
node_modules/eslint/lib/rules/no-import-assign.js
generated
vendored
|
|
@ -97,10 +97,10 @@ function isIterationVariable(node) {
|
|||
* - `Object.defineProperties`
|
||||
* - `Object.freeze`
|
||||
* - `Object.setPrototypeOf`
|
||||
* - `Refrect.defineProperty`
|
||||
* - `Refrect.deleteProperty`
|
||||
* - `Refrect.set`
|
||||
* - `Refrect.setPrototypeOf`
|
||||
* - `Reflect.defineProperty`
|
||||
* - `Reflect.deleteProperty`
|
||||
* - `Reflect.set`
|
||||
* - `Reflect.setPrototypeOf`
|
||||
* @param {ASTNode} node The node to check.
|
||||
* @param {Scope} scope A `escope.Scope` object to find variable (whichever).
|
||||
* @returns {boolean} `true` if the node is at the first argument of a well-known mutation function.
|
||||
|
|
|
|||
29
node_modules/eslint/lib/rules/no-inline-comments.js
generated
vendored
29
node_modules/eslint/lib/rules/no-inline-comments.js
generated
vendored
|
|
@ -21,7 +21,17 @@ module.exports = {
|
|||
url: "https://eslint.org/docs/rules/no-inline-comments"
|
||||
},
|
||||
|
||||
schema: [],
|
||||
schema: [
|
||||
{
|
||||
type: "object",
|
||||
properties: {
|
||||
ignorePattern: {
|
||||
type: "string"
|
||||
}
|
||||
},
|
||||
additionalProperties: false
|
||||
}
|
||||
],
|
||||
|
||||
messages: {
|
||||
unexpectedInlineComment: "Unexpected comment inline with code."
|
||||
|
|
@ -30,6 +40,12 @@ module.exports = {
|
|||
|
||||
create(context) {
|
||||
const sourceCode = context.getSourceCode();
|
||||
const options = context.options[0];
|
||||
let customIgnoreRegExp;
|
||||
|
||||
if (options && options.ignorePattern) {
|
||||
customIgnoreRegExp = new RegExp(options.ignorePattern, "u");
|
||||
}
|
||||
|
||||
/**
|
||||
* Will check that comments are not on lines starting with or ending with code
|
||||
|
|
@ -51,6 +67,11 @@ module.exports = {
|
|||
return;
|
||||
}
|
||||
|
||||
// Matches the ignore pattern
|
||||
if (customIgnoreRegExp && customIgnoreRegExp.test(node.value)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// JSX Exception
|
||||
if (
|
||||
(isPreambleEmpty || preamble === "{") &&
|
||||
|
|
@ -80,9 +101,9 @@ module.exports = {
|
|||
|
||||
return {
|
||||
Program() {
|
||||
const comments = sourceCode.getAllComments();
|
||||
|
||||
comments.filter(token => token.type !== "Shebang").forEach(testCodeAroundComment);
|
||||
sourceCode.getAllComments()
|
||||
.filter(token => token.type !== "Shebang")
|
||||
.forEach(testCodeAroundComment);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
45
node_modules/eslint/lib/rules/no-invalid-regexp.js
generated
vendored
45
node_modules/eslint/lib/rules/no-invalid-regexp.js
generated
vendored
|
|
@ -9,7 +9,7 @@
|
|||
//------------------------------------------------------------------------------
|
||||
|
||||
const RegExpValidator = require("regexpp").RegExpValidator;
|
||||
const validator = new RegExpValidator({ ecmaVersion: 2018 });
|
||||
const validator = new RegExpValidator();
|
||||
const validFlags = /[gimuys]/gu;
|
||||
const undefined1 = void 0;
|
||||
|
||||
|
|
@ -69,6 +69,28 @@ module.exports = {
|
|||
return node && node.type === "Literal" && typeof node.value === "string";
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets flags of a regular expression created by the given `RegExp()` or `new RegExp()` call
|
||||
* Examples:
|
||||
* new RegExp(".") // => ""
|
||||
* new RegExp(".", "gu") // => "gu"
|
||||
* new RegExp(".", flags) // => null
|
||||
* @param {ASTNode} node `CallExpression` or `NewExpression` node
|
||||
* @returns {string|null} flags if they can be determined, `null` otherwise
|
||||
* @private
|
||||
*/
|
||||
function getFlags(node) {
|
||||
if (node.arguments.length < 2) {
|
||||
return "";
|
||||
}
|
||||
|
||||
if (isString(node.arguments[1])) {
|
||||
return node.arguments[1].value;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check syntax error in a given pattern.
|
||||
* @param {string} pattern The RegExp pattern to validate.
|
||||
|
|
@ -104,18 +126,23 @@ module.exports = {
|
|||
return;
|
||||
}
|
||||
const pattern = node.arguments[0].value;
|
||||
let flags = isString(node.arguments[1]) ? node.arguments[1].value : "";
|
||||
let flags = getFlags(node);
|
||||
|
||||
if (allowedFlags) {
|
||||
if (flags && allowedFlags) {
|
||||
flags = flags.replace(allowedFlags, "");
|
||||
}
|
||||
|
||||
// If flags are unknown, check both are errored or not.
|
||||
const message = validateRegExpFlags(flags) || (
|
||||
flags
|
||||
? validateRegExpPattern(pattern, flags.indexOf("u") !== -1)
|
||||
: validateRegExpPattern(pattern, true) && validateRegExpPattern(pattern, false)
|
||||
);
|
||||
const message =
|
||||
(
|
||||
flags && validateRegExpFlags(flags)
|
||||
) ||
|
||||
(
|
||||
|
||||
// If flags are unknown, report the regex only if its pattern is invalid both with and without the "u" flag
|
||||
flags === null
|
||||
? validateRegExpPattern(pattern, true) && validateRegExpPattern(pattern, false)
|
||||
: validateRegExpPattern(pattern, flags.includes("u"))
|
||||
);
|
||||
|
||||
if (message) {
|
||||
context.report({
|
||||
|
|
|
|||
16
node_modules/eslint/lib/rules/no-irregular-whitespace.js
generated
vendored
16
node_modules/eslint/lib/rules/no-irregular-whitespace.js
generated
vendored
|
|
@ -82,7 +82,7 @@ module.exports = {
|
|||
const commentNodes = sourceCode.getAllComments();
|
||||
|
||||
/**
|
||||
* Removes errors that occur inside a string node
|
||||
* Removes errors that occur inside the given node
|
||||
* @param {ASTNode} node to check for matching errors.
|
||||
* @returns {void}
|
||||
* @private
|
||||
|
|
@ -91,14 +91,12 @@ module.exports = {
|
|||
const locStart = node.loc.start;
|
||||
const locEnd = node.loc.end;
|
||||
|
||||
errors = errors.filter(({ loc: { start: errorLoc } }) => {
|
||||
if (errorLoc.line >= locStart.line && errorLoc.line <= locEnd.line) {
|
||||
if (errorLoc.column >= locStart.column && (errorLoc.column <= locEnd.column || errorLoc.line < locEnd.line)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
||||
errors = errors.filter(({ loc: { start: errorLocStart } }) => (
|
||||
errorLocStart.line < locStart.line ||
|
||||
errorLocStart.line === locStart.line && errorLocStart.column < locStart.column ||
|
||||
errorLocStart.line === locEnd.line && errorLocStart.column >= locEnd.column ||
|
||||
errorLocStart.line > locEnd.line
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
8
node_modules/eslint/lib/rules/no-loss-of-precision.js
generated
vendored
8
node_modules/eslint/lib/rules/no-loss-of-precision.js
generated
vendored
|
|
@ -105,9 +105,9 @@ module.exports = {
|
|||
}
|
||||
|
||||
/**
|
||||
* Converts an integer to to an object containing the the integer's coefficient and order of magnitude
|
||||
* Converts an integer to to an object containing the integer's coefficient and order of magnitude
|
||||
* @param {string} stringInteger the string representation of the integer being converted
|
||||
* @returns {Object} the object containing the the integer's coefficient and order of magnitude
|
||||
* @returns {Object} the object containing the integer's coefficient and order of magnitude
|
||||
*/
|
||||
function normalizeInteger(stringInteger) {
|
||||
const significantDigits = removeTrailingZeros(removeLeadingZeros(stringInteger));
|
||||
|
|
@ -120,9 +120,9 @@ module.exports = {
|
|||
|
||||
/**
|
||||
*
|
||||
* Converts a float to to an object containing the the floats's coefficient and order of magnitude
|
||||
* Converts a float to to an object containing the floats's coefficient and order of magnitude
|
||||
* @param {string} stringFloat the string representation of the float being converted
|
||||
* @returns {Object} the object containing the the integer's coefficient and order of magnitude
|
||||
* @returns {Object} the object containing the integer's coefficient and order of magnitude
|
||||
*/
|
||||
function normalizeFloat(stringFloat) {
|
||||
const trimmedFloat = removeLeadingZeros(stringFloat);
|
||||
|
|
|
|||
31
node_modules/eslint/lib/rules/no-mixed-operators.js
generated
vendored
31
node_modules/eslint/lib/rules/no-mixed-operators.js
generated
vendored
|
|
@ -117,7 +117,7 @@ module.exports = {
|
|||
],
|
||||
|
||||
messages: {
|
||||
unexpectedMixedOperator: "Unexpected mix of '{{leftOperator}}' and '{{rightOperator}}'."
|
||||
unexpectedMixedOperator: "Unexpected mix of '{{leftOperator}}' and '{{rightOperator}}'. Use parentheses to clarify the intended order of operations."
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -161,17 +161,6 @@ module.exports = {
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the operator of a given node is mixed with a
|
||||
* conditional expression.
|
||||
* @param {ASTNode} node A node to check. This is a conditional
|
||||
* expression node
|
||||
* @returns {boolean} `true` if the node was mixed.
|
||||
*/
|
||||
function isMixedWithConditionalParent(node) {
|
||||
return !astUtils.isParenthesised(sourceCode, node) && !astUtils.isParenthesised(sourceCode, node.test);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the operator token of a given node.
|
||||
* @param {ASTNode} node A node to check. This is a BinaryExpression
|
||||
|
|
@ -220,19 +209,13 @@ module.exports = {
|
|||
* @returns {void}
|
||||
*/
|
||||
function check(node) {
|
||||
if (TARGET_NODE_TYPE.test(node.parent.type)) {
|
||||
if (node.parent.type === "ConditionalExpression" && !shouldIgnore(node) && isMixedWithConditionalParent(node.parent)) {
|
||||
reportBothOperators(node);
|
||||
} else {
|
||||
if (TARGET_NODE_TYPE.test(node.parent.type) &&
|
||||
isMixedWithParent(node) &&
|
||||
!shouldIgnore(node)
|
||||
) {
|
||||
reportBothOperators(node);
|
||||
}
|
||||
}
|
||||
if (
|
||||
TARGET_NODE_TYPE.test(node.parent.type) &&
|
||||
isMixedWithParent(node) &&
|
||||
!shouldIgnore(node)
|
||||
) {
|
||||
reportBothOperators(node);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
|
|||
17
node_modules/eslint/lib/rules/no-multi-assign.js
generated
vendored
17
node_modules/eslint/lib/rules/no-multi-assign.js
generated
vendored
|
|
@ -21,7 +21,16 @@ module.exports = {
|
|||
url: "https://eslint.org/docs/rules/no-multi-assign"
|
||||
},
|
||||
|
||||
schema: [],
|
||||
schema: [{
|
||||
type: "object",
|
||||
properties: {
|
||||
ignoreNonDeclaration: {
|
||||
type: "boolean",
|
||||
default: false
|
||||
}
|
||||
},
|
||||
additionalProperties: false
|
||||
}],
|
||||
|
||||
messages: {
|
||||
unexpectedChain: "Unexpected chained assignment."
|
||||
|
|
@ -33,10 +42,14 @@ module.exports = {
|
|||
//--------------------------------------------------------------------------
|
||||
// Public
|
||||
//--------------------------------------------------------------------------
|
||||
const options = context.options[0] || {
|
||||
ignoreNonDeclaration: false
|
||||
};
|
||||
const targetParent = options.ignoreNonDeclaration ? ["VariableDeclarator"] : ["AssignmentExpression", "VariableDeclarator"];
|
||||
|
||||
return {
|
||||
AssignmentExpression(node) {
|
||||
if (["AssignmentExpression", "VariableDeclarator"].indexOf(node.parent.type) !== -1) {
|
||||
if (targetParent.indexOf(node.parent.type) !== -1) {
|
||||
context.report({
|
||||
node,
|
||||
messageId: "unexpectedChain"
|
||||
|
|
|
|||
147
node_modules/eslint/lib/rules/no-nonoctal-decimal-escape.js
generated
vendored
Normal file
147
node_modules/eslint/lib/rules/no-nonoctal-decimal-escape.js
generated
vendored
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
/**
|
||||
* @fileoverview Rule to disallow `\8` and `\9` escape sequences in string literals.
|
||||
* @author Milos Djermanovic
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const QUICK_TEST_REGEX = /\\[89]/u;
|
||||
|
||||
/**
|
||||
* Returns unicode escape sequence that represents the given character.
|
||||
* @param {string} character A single code unit.
|
||||
* @returns {string} "\uXXXX" sequence.
|
||||
*/
|
||||
function getUnicodeEscape(character) {
|
||||
return `\\u${character.charCodeAt(0).toString(16).padStart(4, "0")}`;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
module.exports = {
|
||||
meta: {
|
||||
type: "suggestion",
|
||||
|
||||
docs: {
|
||||
description: "disallow `\\8` and `\\9` escape sequences in string literals",
|
||||
category: "Best Practices",
|
||||
recommended: false,
|
||||
url: "https://eslint.org/docs/rules/no-nonoctal-decimal-escape",
|
||||
suggestion: true
|
||||
},
|
||||
|
||||
schema: [],
|
||||
|
||||
messages: {
|
||||
decimalEscape: "Don't use '{{decimalEscape}}' escape sequence.",
|
||||
|
||||
// suggestions
|
||||
refactor: "Replace '{{original}}' with '{{replacement}}'. This maintains the current functionality.",
|
||||
escapeBackslash: "Replace '{{original}}' with '{{replacement}}' to include the actual backslash character."
|
||||
}
|
||||
},
|
||||
|
||||
create(context) {
|
||||
const sourceCode = context.getSourceCode();
|
||||
|
||||
/**
|
||||
* Creates a new Suggestion object.
|
||||
* @param {string} messageId "refactor" or "escapeBackslash".
|
||||
* @param {int[]} range The range to replace.
|
||||
* @param {string} replacement New text for the range.
|
||||
* @returns {Object} Suggestion
|
||||
*/
|
||||
function createSuggestion(messageId, range, replacement) {
|
||||
return {
|
||||
messageId,
|
||||
data: {
|
||||
original: sourceCode.getText().slice(...range),
|
||||
replacement
|
||||
},
|
||||
fix(fixer) {
|
||||
return fixer.replaceTextRange(range, replacement);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
Literal(node) {
|
||||
if (typeof node.value !== "string") {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!QUICK_TEST_REGEX.test(node.raw)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const regex = /(?:[^\\]|(?<previousEscape>\\.))*?(?<decimalEscape>\\[89])/suy;
|
||||
let match;
|
||||
|
||||
while ((match = regex.exec(node.raw))) {
|
||||
const { previousEscape, decimalEscape } = match.groups;
|
||||
const decimalEscapeRangeEnd = node.range[0] + match.index + match[0].length;
|
||||
const decimalEscapeRangeStart = decimalEscapeRangeEnd - decimalEscape.length;
|
||||
const decimalEscapeRange = [decimalEscapeRangeStart, decimalEscapeRangeEnd];
|
||||
const suggest = [];
|
||||
|
||||
// When `regex` is matched, `previousEscape` can only capture characters adjacent to `decimalEscape`
|
||||
if (previousEscape === "\\0") {
|
||||
|
||||
/*
|
||||
* Now we have a NULL escape "\0" immediately followed by a decimal escape, e.g.: "\0\8".
|
||||
* Fixing this to "\08" would turn "\0" into a legacy octal escape. To avoid producing
|
||||
* an octal escape while fixing a decimal escape, we provide different suggestions.
|
||||
*/
|
||||
suggest.push(
|
||||
createSuggestion( // "\0\8" -> "\u00008"
|
||||
"refactor",
|
||||
[decimalEscapeRangeStart - previousEscape.length, decimalEscapeRangeEnd],
|
||||
`${getUnicodeEscape("\0")}${decimalEscape[1]}`
|
||||
),
|
||||
createSuggestion( // "\8" -> "\u0038"
|
||||
"refactor",
|
||||
decimalEscapeRange,
|
||||
getUnicodeEscape(decimalEscape[1])
|
||||
)
|
||||
);
|
||||
} else {
|
||||
suggest.push(
|
||||
createSuggestion( // "\8" -> "8"
|
||||
"refactor",
|
||||
decimalEscapeRange,
|
||||
decimalEscape[1]
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
suggest.push(
|
||||
createSuggestion( // "\8" -> "\\8"
|
||||
"escapeBackslash",
|
||||
decimalEscapeRange,
|
||||
`\\${decimalEscape}`
|
||||
)
|
||||
);
|
||||
|
||||
context.report({
|
||||
node,
|
||||
loc: {
|
||||
start: sourceCode.getLocFromIndex(decimalEscapeRangeStart),
|
||||
end: sourceCode.getLocFromIndex(decimalEscapeRangeEnd)
|
||||
},
|
||||
messageId: "decimalEscape",
|
||||
data: {
|
||||
decimalEscape
|
||||
},
|
||||
suggest
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
8
node_modules/eslint/lib/rules/no-prototype-builtins.js
generated
vendored
8
node_modules/eslint/lib/rules/no-prototype-builtins.js
generated
vendored
|
|
@ -46,15 +46,15 @@ module.exports = {
|
|||
*/
|
||||
function disallowBuiltIns(node) {
|
||||
|
||||
// TODO: just use `astUtils.getStaticPropertyName(node.callee)`
|
||||
const callee = astUtils.skipChainExpression(node.callee);
|
||||
|
||||
if (callee.type !== "MemberExpression" || callee.computed) {
|
||||
if (callee.type !== "MemberExpression") {
|
||||
return;
|
||||
}
|
||||
const propName = callee.property.name;
|
||||
|
||||
if (DISALLOWED_PROPS.indexOf(propName) > -1) {
|
||||
const propName = astUtils.getStaticPropertyName(callee);
|
||||
|
||||
if (propName !== null && DISALLOWED_PROPS.indexOf(propName) > -1) {
|
||||
context.report({
|
||||
messageId: "prototypeBuildIn",
|
||||
loc: callee.property.loc,
|
||||
|
|
|
|||
2
node_modules/eslint/lib/rules/no-restricted-exports.js
generated
vendored
2
node_modules/eslint/lib/rules/no-restricted-exports.js
generated
vendored
|
|
@ -45,7 +45,7 @@ module.exports = {
|
|||
|
||||
/**
|
||||
* Checks and reports given exported identifier.
|
||||
* @param {ASTNode} node exported `Identifer` node to check.
|
||||
* @param {ASTNode} node exported `Identifier` node to check.
|
||||
* @returns {void}
|
||||
*/
|
||||
function checkExportedName(node) {
|
||||
|
|
|
|||
85
node_modules/eslint/lib/rules/no-restricted-imports.js
generated
vendored
85
node_modules/eslint/lib/rules/no-restricted-imports.js
generated
vendored
|
|
@ -10,12 +10,6 @@
|
|||
|
||||
const ignore = require("ignore");
|
||||
|
||||
const arrayOfStrings = {
|
||||
type: "array",
|
||||
items: { type: "string" },
|
||||
uniqueItems: true
|
||||
};
|
||||
|
||||
const arrayOfStringsOrObjects = {
|
||||
type: "array",
|
||||
items: {
|
||||
|
|
@ -44,6 +38,41 @@ const arrayOfStringsOrObjects = {
|
|||
uniqueItems: true
|
||||
};
|
||||
|
||||
const arrayOfStringsOrObjectPatterns = {
|
||||
anyOf: [
|
||||
{
|
||||
type: "array",
|
||||
items: {
|
||||
type: "string"
|
||||
},
|
||||
uniqueItems: true
|
||||
},
|
||||
{
|
||||
type: "array",
|
||||
items: {
|
||||
type: "object",
|
||||
properties: {
|
||||
group: {
|
||||
type: "array",
|
||||
items: {
|
||||
type: "string"
|
||||
},
|
||||
minItems: 1,
|
||||
uniqueItems: true
|
||||
},
|
||||
message: {
|
||||
type: "string",
|
||||
minLength: 1
|
||||
}
|
||||
},
|
||||
additionalProperties: false,
|
||||
required: ["group"]
|
||||
},
|
||||
uniqueItems: true
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
meta: {
|
||||
type: "suggestion",
|
||||
|
|
@ -61,6 +90,8 @@ module.exports = {
|
|||
pathWithCustomMessage: "'{{importSource}}' import is restricted from being used. {{customMessage}}",
|
||||
|
||||
patterns: "'{{importSource}}' import is restricted from being used by a pattern.",
|
||||
// eslint-disable-next-line eslint-plugin/report-message-format
|
||||
patternWithCustomMessage: "'{{importSource}}' import is restricted from being used by a pattern. {{customMessage}}",
|
||||
|
||||
everything: "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted.",
|
||||
// eslint-disable-next-line eslint-plugin/report-message-format
|
||||
|
|
@ -80,7 +111,7 @@ module.exports = {
|
|||
type: "object",
|
||||
properties: {
|
||||
paths: arrayOfStringsOrObjects,
|
||||
patterns: arrayOfStrings
|
||||
patterns: arrayOfStringsOrObjectPatterns
|
||||
},
|
||||
additionalProperties: false
|
||||
}],
|
||||
|
|
@ -98,13 +129,6 @@ module.exports = {
|
|||
(Object.prototype.hasOwnProperty.call(options[0], "paths") || Object.prototype.hasOwnProperty.call(options[0], "patterns"));
|
||||
|
||||
const restrictedPaths = (isPathAndPatternsObject ? options[0].paths : context.options) || [];
|
||||
const restrictedPatterns = (isPathAndPatternsObject ? options[0].patterns : []) || [];
|
||||
|
||||
// if no imports are restricted we don"t need to check
|
||||
if (Object.keys(restrictedPaths).length === 0 && restrictedPatterns.length === 0) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const restrictedPathMessages = restrictedPaths.reduce((memo, importSource) => {
|
||||
if (typeof importSource === "string") {
|
||||
memo[importSource] = { message: null };
|
||||
|
|
@ -117,7 +141,16 @@ module.exports = {
|
|||
return memo;
|
||||
}, {});
|
||||
|
||||
const restrictedPatternsMatcher = ignore().add(restrictedPatterns);
|
||||
// Handle patterns too, either as strings or groups
|
||||
const restrictedPatterns = (isPathAndPatternsObject ? options[0].patterns : []) || [];
|
||||
const restrictedPatternGroups = restrictedPatterns.length > 0 && typeof restrictedPatterns[0] === "string"
|
||||
? [{ matcher: ignore().add(restrictedPatterns) }]
|
||||
: restrictedPatterns.map(({ group, message }) => ({ matcher: ignore().add(group), customMessage: message }));
|
||||
|
||||
// if no imports are restricted we don"t need to check
|
||||
if (Object.keys(restrictedPaths).length === 0 && restrictedPatternGroups.length === 0) {
|
||||
return {};
|
||||
}
|
||||
|
||||
/**
|
||||
* Report a restricted path.
|
||||
|
|
@ -184,17 +217,19 @@ module.exports = {
|
|||
/**
|
||||
* Report a restricted path specifically for patterns.
|
||||
* @param {node} node representing the restricted path reference
|
||||
* @param {Object} group contains a Ignore instance for paths, and the customMessage to show if it fails
|
||||
* @returns {void}
|
||||
* @private
|
||||
*/
|
||||
function reportPathForPatterns(node) {
|
||||
function reportPathForPatterns(node, group) {
|
||||
const importSource = node.source.value.trim();
|
||||
|
||||
context.report({
|
||||
node,
|
||||
messageId: "patterns",
|
||||
messageId: group.customMessage ? "patternWithCustomMessage" : "patterns",
|
||||
data: {
|
||||
importSource
|
||||
importSource,
|
||||
customMessage: group.customMessage
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -202,11 +237,12 @@ module.exports = {
|
|||
/**
|
||||
* Check if the given importSource is restricted by a pattern.
|
||||
* @param {string} importSource path of the import
|
||||
* @param {Object} group contains a Ignore instance for paths, and the customMessage to show if it fails
|
||||
* @returns {boolean} whether the variable is a restricted pattern or not
|
||||
* @private
|
||||
*/
|
||||
function isRestrictedPattern(importSource) {
|
||||
return restrictedPatterns.length > 0 && restrictedPatternsMatcher.ignores(importSource);
|
||||
function isRestrictedPattern(importSource, group) {
|
||||
return group.matcher.ignores(importSource);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -249,10 +285,11 @@ module.exports = {
|
|||
}
|
||||
|
||||
checkRestrictedPathAndReport(importSource, importNames, node);
|
||||
|
||||
if (isRestrictedPattern(importSource)) {
|
||||
reportPathForPatterns(node);
|
||||
}
|
||||
restrictedPatternGroups.forEach(group => {
|
||||
if (isRestrictedPattern(importSource, group)) {
|
||||
reportPathForPatterns(node, group);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
|
|||
28
node_modules/eslint/lib/rules/no-script-url.js
generated
vendored
28
node_modules/eslint/lib/rules/no-script-url.js
generated
vendored
|
|
@ -7,6 +7,8 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -31,18 +33,30 @@ module.exports = {
|
|||
|
||||
create(context) {
|
||||
|
||||
return {
|
||||
/**
|
||||
* Check whether a node's static value starts with "javascript:" or not.
|
||||
* And report an error for unexpected script URL.
|
||||
* @param {ASTNode} node node to check
|
||||
* @returns {void}
|
||||
*/
|
||||
function check(node) {
|
||||
const value = astUtils.getStaticStringValue(node);
|
||||
|
||||
if (typeof value === "string" && value.toLowerCase().indexOf("javascript:") === 0) {
|
||||
context.report({ node, messageId: "unexpectedScriptURL" });
|
||||
}
|
||||
}
|
||||
return {
|
||||
Literal(node) {
|
||||
if (node.value && typeof node.value === "string") {
|
||||
const value = node.value.toLowerCase();
|
||||
|
||||
if (value.indexOf("javascript:") === 0) {
|
||||
context.report({ node, messageId: "unexpectedScriptURL" });
|
||||
}
|
||||
check(node);
|
||||
}
|
||||
},
|
||||
TemplateLiteral(node) {
|
||||
if (!(node.parent && node.parent.type === "TaggedTemplateExpression")) {
|
||||
check(node);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
|||
35
node_modules/eslint/lib/rules/no-sequences.js
generated
vendored
35
node_modules/eslint/lib/rules/no-sequences.js
generated
vendored
|
|
@ -11,6 +11,14 @@
|
|||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const DEFAULT_OPTIONS = {
|
||||
allowInParentheses: true
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -26,7 +34,15 @@ module.exports = {
|
|||
url: "https://eslint.org/docs/rules/no-sequences"
|
||||
},
|
||||
|
||||
schema: [],
|
||||
schema: [{
|
||||
properties: {
|
||||
allowInParentheses: {
|
||||
type: "boolean",
|
||||
default: true
|
||||
}
|
||||
},
|
||||
additionalProperties: false
|
||||
}],
|
||||
|
||||
messages: {
|
||||
unexpectedCommaExpression: "Unexpected use of comma operator."
|
||||
|
|
@ -34,6 +50,7 @@ module.exports = {
|
|||
},
|
||||
|
||||
create(context) {
|
||||
const options = Object.assign({}, DEFAULT_OPTIONS, context.options[0]);
|
||||
const sourceCode = context.getSourceCode();
|
||||
|
||||
/**
|
||||
|
|
@ -99,13 +116,15 @@ module.exports = {
|
|||
}
|
||||
|
||||
// Wrapping a sequence in extra parens indicates intent
|
||||
if (requiresExtraParens(node)) {
|
||||
if (isParenthesisedTwice(node)) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (isParenthesised(node)) {
|
||||
return;
|
||||
if (options.allowInParentheses) {
|
||||
if (requiresExtraParens(node)) {
|
||||
if (isParenthesisedTwice(node)) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (isParenthesised(node)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
38
node_modules/eslint/lib/rules/no-shadow.js
generated
vendored
38
node_modules/eslint/lib/rules/no-shadow.js
generated
vendored
|
|
@ -44,7 +44,8 @@ module.exports = {
|
|||
],
|
||||
|
||||
messages: {
|
||||
noShadow: "'{{name}}' is already declared in the upper scope."
|
||||
noShadow: "'{{name}}' is already declared in the upper scope on line {{shadowedLine}} column {{shadowedColumn}}.",
|
||||
noShadowGlobal: "'{{name}}' is already a global variable."
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -117,6 +118,29 @@ module.exports = {
|
|||
return def && def.name.range;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get declared line and column of a variable.
|
||||
* @param {eslint-scope.Variable} variable The variable to get.
|
||||
* @returns {Object} The declared line and column of the variable.
|
||||
*/
|
||||
function getDeclaredLocation(variable) {
|
||||
const identifier = variable.identifiers[0];
|
||||
let obj;
|
||||
|
||||
if (identifier) {
|
||||
obj = {
|
||||
global: false,
|
||||
line: identifier.loc.start.line,
|
||||
column: identifier.loc.start.column + 1
|
||||
};
|
||||
} else {
|
||||
obj = {
|
||||
global: true
|
||||
};
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a variable is in TDZ of scopeVar.
|
||||
* @param {Object} variable The variable to check.
|
||||
|
|
@ -165,10 +189,18 @@ module.exports = {
|
|||
!isOnInitializer(variable, shadowed) &&
|
||||
!(options.hoist !== "all" && isInTdz(variable, shadowed))
|
||||
) {
|
||||
const location = getDeclaredLocation(shadowed);
|
||||
const messageId = location.global ? "noShadowGlobal" : "noShadow";
|
||||
const data = { name: variable.name };
|
||||
|
||||
if (!location.global) {
|
||||
data.shadowedLine = location.line;
|
||||
data.shadowedColumn = location.column;
|
||||
}
|
||||
context.report({
|
||||
node: variable.identifiers[0],
|
||||
messageId: "noShadow",
|
||||
data: variable
|
||||
messageId,
|
||||
data
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
2
node_modules/eslint/lib/rules/no-this-before-super.js
generated
vendored
2
node_modules/eslint/lib/rules/no-this-before-super.js
generated
vendored
|
|
@ -171,7 +171,7 @@ module.exports = {
|
|||
/**
|
||||
* Removes the top of stack item.
|
||||
*
|
||||
* And this treverses all segments of this code path then reports every
|
||||
* And this traverses all segments of this code path then reports every
|
||||
* invalid node.
|
||||
* @param {CodePath} codePath A code path which was ended.
|
||||
* @returns {void}
|
||||
|
|
|
|||
205
node_modules/eslint/lib/rules/no-unsafe-optional-chaining.js
generated
vendored
Normal file
205
node_modules/eslint/lib/rules/no-unsafe-optional-chaining.js
generated
vendored
Normal file
|
|
@ -0,0 +1,205 @@
|
|||
/**
|
||||
* @fileoverview Rule to disallow unsafe optional chaining
|
||||
* @author Yeon JuAn
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const UNSAFE_ARITHMETIC_OPERATORS = new Set(["+", "-", "/", "*", "%", "**"]);
|
||||
const UNSAFE_ASSIGNMENT_OPERATORS = new Set(["+=", "-=", "/=", "*=", "%=", "**="]);
|
||||
const UNSAFE_RELATIONAL_OPERATORS = new Set(["in", "instanceof"]);
|
||||
|
||||
/**
|
||||
* Checks whether a node is a destructuring pattern or not
|
||||
* @param {ASTNode} node node to check
|
||||
* @returns {boolean} `true` if a node is a destructuring pattern, otherwise `false`
|
||||
*/
|
||||
function isDestructuringPattern(node) {
|
||||
return node.type === "ObjectPattern" || node.type === "ArrayPattern";
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
meta: {
|
||||
type: "problem",
|
||||
|
||||
docs: {
|
||||
description: "disallow use of optional chaining in contexts where the `undefined` value is not allowed",
|
||||
category: "Possible Errors",
|
||||
recommended: false,
|
||||
url: "https://eslint.org/docs/rules/no-unsafe-optional-chaining"
|
||||
},
|
||||
schema: [{
|
||||
type: "object",
|
||||
properties: {
|
||||
disallowArithmeticOperators: {
|
||||
type: "boolean",
|
||||
default: false
|
||||
}
|
||||
},
|
||||
additionalProperties: false
|
||||
}],
|
||||
fixable: null,
|
||||
messages: {
|
||||
unsafeOptionalChain: "Unsafe usage of optional chaining. If it short-circuits with 'undefined' the evaluation will throw TypeError.",
|
||||
unsafeArithmetic: "Unsafe arithmetic operation on optional chaining. It can result in NaN."
|
||||
}
|
||||
},
|
||||
|
||||
create(context) {
|
||||
const options = context.options[0] || {};
|
||||
const disallowArithmeticOperators = (options.disallowArithmeticOperators) || false;
|
||||
|
||||
/**
|
||||
* Reports unsafe usage of optional chaining
|
||||
* @param {ASTNode} node node to report
|
||||
* @returns {void}
|
||||
*/
|
||||
function reportUnsafeUsage(node) {
|
||||
context.report({
|
||||
messageId: "unsafeOptionalChain",
|
||||
node
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports unsafe arithmetic operation on optional chaining
|
||||
* @param {ASTNode} node node to report
|
||||
* @returns {void}
|
||||
*/
|
||||
function reportUnsafeArithmetic(node) {
|
||||
context.report({
|
||||
messageId: "unsafeArithmetic",
|
||||
node
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks and reports if a node can short-circuit with `undefined` by optional chaining.
|
||||
* @param {ASTNode} [node] node to check
|
||||
* @param {Function} reportFunc report function
|
||||
* @returns {void}
|
||||
*/
|
||||
function checkUndefinedShortCircuit(node, reportFunc) {
|
||||
if (!node) {
|
||||
return;
|
||||
}
|
||||
switch (node.type) {
|
||||
case "LogicalExpression":
|
||||
if (node.operator === "||" || node.operator === "??") {
|
||||
checkUndefinedShortCircuit(node.right, reportFunc);
|
||||
} else if (node.operator === "&&") {
|
||||
checkUndefinedShortCircuit(node.left, reportFunc);
|
||||
checkUndefinedShortCircuit(node.right, reportFunc);
|
||||
}
|
||||
break;
|
||||
case "SequenceExpression":
|
||||
checkUndefinedShortCircuit(
|
||||
node.expressions[node.expressions.length - 1],
|
||||
reportFunc
|
||||
);
|
||||
break;
|
||||
case "ConditionalExpression":
|
||||
checkUndefinedShortCircuit(node.consequent, reportFunc);
|
||||
checkUndefinedShortCircuit(node.alternate, reportFunc);
|
||||
break;
|
||||
case "AwaitExpression":
|
||||
checkUndefinedShortCircuit(node.argument, reportFunc);
|
||||
break;
|
||||
case "ChainExpression":
|
||||
reportFunc(node);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks unsafe usage of optional chaining
|
||||
* @param {ASTNode} node node to check
|
||||
* @returns {void}
|
||||
*/
|
||||
function checkUnsafeUsage(node) {
|
||||
checkUndefinedShortCircuit(node, reportUnsafeUsage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks unsafe arithmetic operations on optional chaining
|
||||
* @param {ASTNode} node node to check
|
||||
* @returns {void}
|
||||
*/
|
||||
function checkUnsafeArithmetic(node) {
|
||||
checkUndefinedShortCircuit(node, reportUnsafeArithmetic);
|
||||
}
|
||||
|
||||
return {
|
||||
"AssignmentExpression, AssignmentPattern"(node) {
|
||||
if (isDestructuringPattern(node.left)) {
|
||||
checkUnsafeUsage(node.right);
|
||||
}
|
||||
},
|
||||
"ClassDeclaration, ClassExpression"(node) {
|
||||
checkUnsafeUsage(node.superClass);
|
||||
},
|
||||
CallExpression(node) {
|
||||
if (!node.optional) {
|
||||
checkUnsafeUsage(node.callee);
|
||||
}
|
||||
},
|
||||
NewExpression(node) {
|
||||
checkUnsafeUsage(node.callee);
|
||||
},
|
||||
VariableDeclarator(node) {
|
||||
if (isDestructuringPattern(node.id)) {
|
||||
checkUnsafeUsage(node.init);
|
||||
}
|
||||
},
|
||||
MemberExpression(node) {
|
||||
if (!node.optional) {
|
||||
checkUnsafeUsage(node.object);
|
||||
}
|
||||
},
|
||||
TaggedTemplateExpression(node) {
|
||||
checkUnsafeUsage(node.tag);
|
||||
},
|
||||
ForOfStatement(node) {
|
||||
checkUnsafeUsage(node.right);
|
||||
},
|
||||
SpreadElement(node) {
|
||||
if (node.parent && node.parent.type !== "ObjectExpression") {
|
||||
checkUnsafeUsage(node.argument);
|
||||
}
|
||||
},
|
||||
BinaryExpression(node) {
|
||||
if (UNSAFE_RELATIONAL_OPERATORS.has(node.operator)) {
|
||||
checkUnsafeUsage(node.right);
|
||||
}
|
||||
if (
|
||||
disallowArithmeticOperators &&
|
||||
UNSAFE_ARITHMETIC_OPERATORS.has(node.operator)
|
||||
) {
|
||||
checkUnsafeArithmetic(node.right);
|
||||
checkUnsafeArithmetic(node.left);
|
||||
}
|
||||
},
|
||||
WithStatement(node) {
|
||||
checkUnsafeUsage(node.object);
|
||||
},
|
||||
UnaryExpression(node) {
|
||||
if (
|
||||
disallowArithmeticOperators &&
|
||||
UNSAFE_ARITHMETIC_OPERATORS.has(node.operator)
|
||||
) {
|
||||
checkUnsafeArithmetic(node.argument);
|
||||
}
|
||||
},
|
||||
AssignmentExpression(node) {
|
||||
if (
|
||||
disallowArithmeticOperators &&
|
||||
UNSAFE_ASSIGNMENT_OPERATORS.has(node.operator)
|
||||
) {
|
||||
checkUnsafeArithmetic(node.right);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
13
node_modules/eslint/lib/rules/no-unused-expressions.js
generated
vendored
13
node_modules/eslint/lib/rules/no-unused-expressions.js
generated
vendored
|
|
@ -50,6 +50,10 @@ module.exports = {
|
|||
allowTaggedTemplates: {
|
||||
type: "boolean",
|
||||
default: false
|
||||
},
|
||||
enforceForJSX: {
|
||||
type: "boolean",
|
||||
default: false
|
||||
}
|
||||
},
|
||||
additionalProperties: false
|
||||
|
|
@ -65,7 +69,8 @@ module.exports = {
|
|||
const config = context.options[0] || {},
|
||||
allowShortCircuit = config.allowShortCircuit || false,
|
||||
allowTernary = config.allowTernary || false,
|
||||
allowTaggedTemplates = config.allowTaggedTemplates || false;
|
||||
allowTaggedTemplates = config.allowTaggedTemplates || false,
|
||||
enforceForJSX = config.enforceForJSX || false;
|
||||
|
||||
// eslint-disable-next-line jsdoc/require-description
|
||||
/**
|
||||
|
|
@ -140,6 +145,12 @@ module.exports = {
|
|||
},
|
||||
FunctionExpression: alwaysTrue,
|
||||
Identifier: alwaysTrue,
|
||||
JSXElement() {
|
||||
return enforceForJSX;
|
||||
},
|
||||
JSXFragment() {
|
||||
return enforceForJSX;
|
||||
},
|
||||
Literal: alwaysTrue,
|
||||
LogicalExpression(node) {
|
||||
if (allowShortCircuit) {
|
||||
|
|
|
|||
91
node_modules/eslint/lib/rules/no-unused-vars.js
generated
vendored
91
node_modules/eslint/lib/rules/no-unused-vars.js
generated
vendored
|
|
@ -196,6 +196,17 @@ module.exports = {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a node is a sibling of the rest property or not.
|
||||
* @param {ASTNode} node a node to check
|
||||
* @returns {boolean} True if the node is a sibling of the rest property, otherwise false.
|
||||
*/
|
||||
function hasRestSibling(node) {
|
||||
return node.type === "Property" &&
|
||||
node.parent.type === "ObjectPattern" &&
|
||||
REST_PROPERTY_TYPE.test(node.parent.properties[node.parent.properties.length - 1].type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if a variable has a sibling rest property
|
||||
* @param {Variable} variable eslint-scope variable object.
|
||||
|
|
@ -204,16 +215,10 @@ module.exports = {
|
|||
*/
|
||||
function hasRestSpreadSibling(variable) {
|
||||
if (config.ignoreRestSiblings) {
|
||||
return variable.defs.some(def => {
|
||||
const propertyNode = def.name.parent;
|
||||
const patternNode = propertyNode.parent;
|
||||
const hasRestSiblingDefinition = variable.defs.some(def => hasRestSibling(def.name.parent));
|
||||
const hasRestSiblingReference = variable.references.some(ref => hasRestSibling(ref.identifier.parent));
|
||||
|
||||
return (
|
||||
propertyNode.type === "Property" &&
|
||||
patternNode.type === "ObjectPattern" &&
|
||||
REST_PROPERTY_TYPE.test(patternNode.properties[patternNode.properties.length - 1].type)
|
||||
);
|
||||
});
|
||||
return hasRestSiblingDefinition || hasRestSiblingReference;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
@ -405,6 +410,31 @@ module.exports = {
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a given node is unused expression or not.
|
||||
* @param {ASTNode} node The node itself
|
||||
* @returns {boolean} The node is an unused expression.
|
||||
* @private
|
||||
*/
|
||||
function isUnusedExpression(node) {
|
||||
const parent = node.parent;
|
||||
|
||||
if (parent.type === "ExpressionStatement") {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (parent.type === "SequenceExpression") {
|
||||
const isLastExpression = parent.expressions[parent.expressions.length - 1] === node;
|
||||
|
||||
if (!isLastExpression) {
|
||||
return true;
|
||||
}
|
||||
return isUnusedExpression(parent);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a given reference is a read to update itself or not.
|
||||
* @param {eslint-scope.Reference} ref A reference to check.
|
||||
|
|
@ -415,23 +445,28 @@ module.exports = {
|
|||
function isReadForItself(ref, rhsNode) {
|
||||
const id = ref.identifier;
|
||||
const parent = id.parent;
|
||||
const grandparent = parent.parent;
|
||||
|
||||
return ref.isRead() && (
|
||||
|
||||
// self update. e.g. `a += 1`, `a++`
|
||||
(// in RHS of an assignment for itself. e.g. `a = a + 1`
|
||||
((
|
||||
parent.type === "AssignmentExpression" &&
|
||||
grandparent.type === "ExpressionStatement" &&
|
||||
parent.left === id
|
||||
) ||
|
||||
(
|
||||
parent.type === "UpdateExpression" &&
|
||||
grandparent.type === "ExpressionStatement"
|
||||
) || rhsNode &&
|
||||
isInside(id, rhsNode) &&
|
||||
!isInsideOfStorableFunction(id, rhsNode)))
|
||||
(
|
||||
parent.type === "AssignmentExpression" &&
|
||||
parent.left === id &&
|
||||
isUnusedExpression(parent)
|
||||
) ||
|
||||
(
|
||||
parent.type === "UpdateExpression" &&
|
||||
isUnusedExpression(parent)
|
||||
)
|
||||
) ||
|
||||
|
||||
// in RHS of an assignment for itself. e.g. `a = a + 1`
|
||||
(
|
||||
rhsNode &&
|
||||
isInside(id, rhsNode) &&
|
||||
!isInsideOfStorableFunction(id, rhsNode)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -619,10 +654,18 @@ module.exports = {
|
|||
|
||||
// Report the first declaration.
|
||||
if (unusedVar.defs.length > 0) {
|
||||
|
||||
// report last write reference, https://github.com/eslint/eslint/issues/14324
|
||||
const writeReferences = unusedVar.references.filter(ref => ref.isWrite() && ref.from.variableScope === unusedVar.scope.variableScope);
|
||||
|
||||
let referenceToReport;
|
||||
|
||||
if (writeReferences.length > 0) {
|
||||
referenceToReport = writeReferences[writeReferences.length - 1];
|
||||
}
|
||||
|
||||
context.report({
|
||||
node: unusedVar.references.length ? unusedVar.references[
|
||||
unusedVar.references.length - 1
|
||||
].identifier : unusedVar.identifiers[0],
|
||||
node: referenceToReport ? referenceToReport.identifier : unusedVar.identifiers[0],
|
||||
messageId: "unusedVar",
|
||||
data: unusedVar.references.some(ref => ref.isWrite())
|
||||
? getAssignedMessageData(unusedVar)
|
||||
|
|
|
|||
3
node_modules/eslint/lib/rules/no-useless-backreference.js
generated
vendored
3
node_modules/eslint/lib/rules/no-useless-backreference.js
generated
vendored
|
|
@ -11,7 +11,6 @@
|
|||
|
||||
const { CALL, CONSTRUCT, ReferenceTracker, getStringIfConstant } = require("eslint-utils");
|
||||
const { RegExpParser, visitRegExpAST } = require("regexpp");
|
||||
const lodash = require("lodash");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
|
|
@ -137,7 +136,7 @@ module.exports = {
|
|||
|
||||
// the opposite of the previous when the regex is matching backward in a lookbehind context.
|
||||
messageId = "backward";
|
||||
} else if (lodash.last(groupCut).type === "Alternative") {
|
||||
} else if (groupCut[groupCut.length - 1].type === "Alternative") {
|
||||
|
||||
// group's and bref's ancestor nodes below the lowest common ancestor are sibling alternatives => they're disjunctive.
|
||||
messageId = "disjunctive";
|
||||
|
|
|
|||
10
node_modules/eslint/lib/rules/no-useless-computed-key.js
generated
vendored
10
node_modules/eslint/lib/rules/no-useless-computed-key.js
generated
vendored
|
|
@ -8,7 +8,6 @@
|
|||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const lodash = require("lodash");
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -95,9 +94,16 @@ module.exports = {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A no-op function to act as placeholder for checking a node when the `enforceForClassMembers` option is `false`.
|
||||
* @returns {void}
|
||||
* @private
|
||||
*/
|
||||
function noop() {}
|
||||
|
||||
return {
|
||||
Property: check,
|
||||
MethodDefinition: enforceForClassMembers ? check : lodash.noop
|
||||
MethodDefinition: enforceForClassMembers ? check : noop
|
||||
};
|
||||
}
|
||||
};
|
||||
|
|
|
|||
8
node_modules/eslint/lib/rules/no-useless-constructor.js
generated
vendored
8
node_modules/eslint/lib/rules/no-useless-constructor.js
generated
vendored
|
|
@ -162,6 +162,14 @@ module.exports = {
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prevent crashing on parsers which do not require class constructor
|
||||
* to have a body, e.g. typescript and flow
|
||||
*/
|
||||
if (!node.value.body) {
|
||||
return;
|
||||
}
|
||||
|
||||
const body = node.value.body.body;
|
||||
const ctorParams = node.value.params;
|
||||
const superClass = node.parent.parent.superClass;
|
||||
|
|
|
|||
8
node_modules/eslint/lib/rules/no-useless-escape.js
generated
vendored
8
node_modules/eslint/lib/rules/no-useless-escape.js
generated
vendored
|
|
@ -109,9 +109,9 @@ module.exports = {
|
|||
* @returns {void}
|
||||
*/
|
||||
function report(node, startOffset, character) {
|
||||
const start = sourceCode.getLocFromIndex(sourceCode.getIndexFromLoc(node.loc.start) + startOffset);
|
||||
const rangeStart = sourceCode.getIndexFromLoc(node.loc.start) + startOffset;
|
||||
const rangeStart = node.range[0] + startOffset;
|
||||
const range = [rangeStart, rangeStart + 1];
|
||||
const start = sourceCode.getLocFromIndex(rangeStart);
|
||||
|
||||
context.report({
|
||||
node,
|
||||
|
|
@ -172,7 +172,7 @@ module.exports = {
|
|||
}
|
||||
|
||||
if (isUnnecessaryEscape && !isQuoteEscape) {
|
||||
report(node, match.index + 1, match[0].slice(1));
|
||||
report(node, match.index, match[0].slice(1));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -206,7 +206,7 @@ module.exports = {
|
|||
return;
|
||||
}
|
||||
|
||||
const value = isTemplateElement ? node.value.raw : node.raw.slice(1, -1);
|
||||
const value = isTemplateElement ? sourceCode.getText(node) : node.raw;
|
||||
const pattern = /\\[^\d]/gu;
|
||||
let match;
|
||||
|
||||
|
|
|
|||
44
node_modules/eslint/lib/rules/no-useless-rename.js
generated
vendored
44
node_modules/eslint/lib/rules/no-useless-rename.js
generated
vendored
|
|
@ -5,6 +5,12 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -54,11 +60,10 @@ module.exports = {
|
|||
* Reports error for unnecessarily renamed assignments
|
||||
* @param {ASTNode} node node to report
|
||||
* @param {ASTNode} initial node with initial name value
|
||||
* @param {ASTNode} result node with new name value
|
||||
* @param {string} type the type of the offending node
|
||||
* @returns {void}
|
||||
*/
|
||||
function reportError(node, initial, result, type) {
|
||||
function reportError(node, initial, type) {
|
||||
const name = initial.type === "Identifier" ? initial.name : initial.value;
|
||||
|
||||
return context.report({
|
||||
|
|
@ -69,18 +74,21 @@ module.exports = {
|
|||
type
|
||||
},
|
||||
fix(fixer) {
|
||||
if (sourceCode.commentsExistBetween(initial, result)) {
|
||||
const replacementNode = node.type === "Property" ? node.value : node.local;
|
||||
|
||||
if (sourceCode.getCommentsInside(node).length > sourceCode.getCommentsInside(replacementNode).length) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const replacementText = result.type === "AssignmentPattern"
|
||||
? sourceCode.getText(result)
|
||||
: name;
|
||||
// Don't autofix code such as `({foo: (foo) = a} = obj);`, parens are not allowed in shorthand properties.
|
||||
if (
|
||||
replacementNode.type === "AssignmentPattern" &&
|
||||
astUtils.isParenthesised(sourceCode, replacementNode.left)
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return fixer.replaceTextRange([
|
||||
initial.range[0],
|
||||
result.range[1]
|
||||
], replacementText);
|
||||
return fixer.replaceText(node, sourceCode.getText(replacementNode));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -97,19 +105,11 @@ module.exports = {
|
|||
|
||||
for (const property of node.properties) {
|
||||
|
||||
/*
|
||||
* TODO: Remove after babel-eslint removes ExperimentalRestProperty
|
||||
* https://github.com/eslint/eslint/issues/12335
|
||||
*/
|
||||
if (property.type === "ExperimentalRestProperty") {
|
||||
continue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Properties using shorthand syntax and rest elements can not be renamed.
|
||||
* If the property is computed, we have no idea if a rename is useless or not.
|
||||
*/
|
||||
if (property.shorthand || property.type === "RestElement" || property.computed) {
|
||||
if (property.type !== "Property" || property.shorthand || property.computed) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -117,7 +117,7 @@ module.exports = {
|
|||
const renamedKey = property.value.type === "AssignmentPattern" ? property.value.left.name : property.value.name;
|
||||
|
||||
if (key === renamedKey) {
|
||||
reportError(property, property.key, property.value, "Destructuring assignment");
|
||||
reportError(property, property.key, "Destructuring assignment");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -134,7 +134,7 @@ module.exports = {
|
|||
|
||||
if (node.imported.name === node.local.name &&
|
||||
node.imported.range[0] !== node.local.range[0]) {
|
||||
reportError(node, node.imported, node.local, "Import");
|
||||
reportError(node, node.imported, "Import");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -150,7 +150,7 @@ module.exports = {
|
|||
|
||||
if (node.local.name === node.exported.name &&
|
||||
node.local.range[0] !== node.exported.range[0]) {
|
||||
reportError(node, node.local, node.exported, "Export");
|
||||
reportError(node, node.local, "Export");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
2
node_modules/eslint/lib/rules/no-warning-comments.js
generated
vendored
2
node_modules/eslint/lib/rules/no-warning-comments.js
generated
vendored
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const { escapeRegExp } = require("lodash");
|
||||
const escapeRegExp = require("escape-string-regexp");
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
const CHAR_LIMIT = 40;
|
||||
|
|
|
|||
25
node_modules/eslint/lib/rules/object-curly-newline.js
generated
vendored
25
node_modules/eslint/lib/rules/object-curly-newline.js
generated
vendored
|
|
@ -10,7 +10,6 @@
|
|||
//------------------------------------------------------------------------------
|
||||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
const lodash = require("lodash");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
|
|
@ -69,6 +68,24 @@ function normalizeOptionValue(value) {
|
|||
return { multiline, minProperties, consistent };
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a value is an object.
|
||||
* @param {any} value The value to check
|
||||
* @returns {boolean} `true` if the value is an object, otherwise `false`
|
||||
*/
|
||||
function isObject(value) {
|
||||
return typeof value === "object" && value !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an option is a node-specific option
|
||||
* @param {any} option The option to check
|
||||
* @returns {boolean} `true` if the option is node-specific, otherwise `false`
|
||||
*/
|
||||
function isNodeSpecificOption(option) {
|
||||
return isObject(option) || typeof option === "string";
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalizes a given option value.
|
||||
* @param {string|Object|undefined} options An option value to parse.
|
||||
|
|
@ -80,9 +97,7 @@ function normalizeOptionValue(value) {
|
|||
* }} Normalized option object.
|
||||
*/
|
||||
function normalizeOptions(options) {
|
||||
const isNodeSpecificOption = lodash.overSome([lodash.isPlainObject, lodash.isString]);
|
||||
|
||||
if (lodash.isPlainObject(options) && lodash.some(options, isNodeSpecificOption)) {
|
||||
if (isObject(options) && Object.values(options).some(isNodeSpecificOption)) {
|
||||
return {
|
||||
ObjectExpression: normalizeOptionValue(options.ObjectExpression),
|
||||
ObjectPattern: normalizeOptionValue(options.ObjectPattern),
|
||||
|
|
@ -134,7 +149,7 @@ module.exports = {
|
|||
type: "layout",
|
||||
|
||||
docs: {
|
||||
description: "enforce consistent line breaks inside braces",
|
||||
description: "enforce consistent line breaks after opening and before closing braces",
|
||||
category: "Stylistic Issues",
|
||||
recommended: false,
|
||||
url: "https://eslint.org/docs/rules/object-curly-newline"
|
||||
|
|
|
|||
42
node_modules/eslint/lib/rules/one-var.js
generated
vendored
42
node_modules/eslint/lib/rules/one-var.js
generated
vendored
|
|
@ -5,6 +5,25 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Determines whether the given node is in a statement list.
|
||||
* @param {ASTNode} node node to check
|
||||
* @returns {boolean} `true` if the given node is in a statement list
|
||||
*/
|
||||
function isInStatementList(node) {
|
||||
return astUtils.STATEMENT_LIST_PARENTS.has(node.parent.type);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -268,8 +287,8 @@ module.exports = {
|
|||
|
||||
/**
|
||||
* Fixer to join VariableDeclaration's into a single declaration
|
||||
* @param {VariableDeclarator[]} declarations The `VariableDeclaration` to join
|
||||
* @returns {Function} The fixer function
|
||||
* @param {VariableDeclarator[]} declarations The `VariableDeclaration` to join
|
||||
* @returns {Function} The fixer function
|
||||
*/
|
||||
function joinDeclarations(declarations) {
|
||||
const declaration = declarations[0];
|
||||
|
|
@ -297,10 +316,17 @@ module.exports = {
|
|||
|
||||
/**
|
||||
* Fixer to split a VariableDeclaration into individual declarations
|
||||
* @param {VariableDeclaration} declaration The `VariableDeclaration` to split
|
||||
* @returns {Function} The fixer function
|
||||
* @param {VariableDeclaration} declaration The `VariableDeclaration` to split
|
||||
* @returns {Function|null} The fixer function
|
||||
*/
|
||||
function splitDeclarations(declaration) {
|
||||
const { parent } = declaration;
|
||||
|
||||
// don't autofix code such as: if (foo) var x, y;
|
||||
if (!isInStatementList(parent.type === "ExportNamedDeclaration" ? parent : declaration)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return fixer => declaration.declarations.map(declarator => {
|
||||
const tokenAfterDeclarator = sourceCode.getTokenAfter(declarator);
|
||||
|
||||
|
|
@ -314,12 +340,14 @@ module.exports = {
|
|||
return null;
|
||||
}
|
||||
|
||||
const exportPlacement = declaration.parent.type === "ExportNamedDeclaration" ? "export " : "";
|
||||
|
||||
/*
|
||||
* `var x,y`
|
||||
* tokenAfterDeclarator ^^ afterComma
|
||||
*/
|
||||
if (afterComma.range[0] === tokenAfterDeclarator.range[1]) {
|
||||
return fixer.replaceText(tokenAfterDeclarator, `; ${declaration.kind} `);
|
||||
return fixer.replaceText(tokenAfterDeclarator, `; ${exportPlacement}${declaration.kind} `);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -341,11 +369,11 @@ module.exports = {
|
|||
|
||||
return fixer.replaceTextRange(
|
||||
[tokenAfterDeclarator.range[0], lastComment.range[0]],
|
||||
`;${sourceCode.text.slice(tokenAfterDeclarator.range[1], lastComment.range[0])}${declaration.kind} `
|
||||
`;${sourceCode.text.slice(tokenAfterDeclarator.range[1], lastComment.range[0])}${exportPlacement}${declaration.kind} `
|
||||
);
|
||||
}
|
||||
|
||||
return fixer.replaceText(tokenAfterDeclarator, `; ${declaration.kind}`);
|
||||
return fixer.replaceText(tokenAfterDeclarator, `; ${exportPlacement}${declaration.kind}`);
|
||||
}).filter(x => x);
|
||||
}
|
||||
|
||||
|
|
|
|||
9
node_modules/eslint/lib/rules/operator-assignment.js
generated
vendored
9
node_modules/eslint/lib/rules/operator-assignment.js
generated
vendored
|
|
@ -76,8 +76,8 @@ module.exports = {
|
|||
|
||||
fixable: "code",
|
||||
messages: {
|
||||
replaced: "Assignment can be replaced with operator assignment.",
|
||||
unexpected: "Unexpected operator assignment shorthand."
|
||||
replaced: "Assignment (=) can be replaced with operator assignment ({{operator}}=).",
|
||||
unexpected: "Unexpected operator assignment ({{operator}}=) shorthand."
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -113,6 +113,7 @@ module.exports = {
|
|||
context.report({
|
||||
node,
|
||||
messageId: "replaced",
|
||||
data: { operator },
|
||||
fix(fixer) {
|
||||
if (canBeFixed(left) && canBeFixed(expr.left)) {
|
||||
const equalsToken = getOperatorToken(node);
|
||||
|
|
@ -139,7 +140,8 @@ module.exports = {
|
|||
*/
|
||||
context.report({
|
||||
node,
|
||||
messageId: "replaced"
|
||||
messageId: "replaced",
|
||||
data: { operator }
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -155,6 +157,7 @@ module.exports = {
|
|||
context.report({
|
||||
node,
|
||||
messageId: "unexpected",
|
||||
data: { operator: node.operator },
|
||||
fix(fixer) {
|
||||
if (canBeFixed(node.left)) {
|
||||
const firstToken = sourceCode.getFirstToken(node);
|
||||
|
|
|
|||
8
node_modules/eslint/lib/rules/prefer-arrow-callback.js
generated
vendored
8
node_modules/eslint/lib/rules/prefer-arrow-callback.js
generated
vendored
|
|
@ -295,7 +295,7 @@ module.exports = {
|
|||
* If the callback function has duplicates in its list of parameters (possible in sloppy mode),
|
||||
* don't replace it with an arrow function, because this is a SyntaxError with arrow functions.
|
||||
*/
|
||||
return; // eslint-disable-line eslint-plugin/fixer-return -- false positive
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove `.bind(this)` if exists.
|
||||
|
|
@ -307,7 +307,7 @@ module.exports = {
|
|||
* E.g. `(foo || function(){}).bind(this)`
|
||||
*/
|
||||
if (memberNode.type !== "MemberExpression") {
|
||||
return; // eslint-disable-line eslint-plugin/fixer-return -- false positive
|
||||
return;
|
||||
}
|
||||
|
||||
const callNode = memberNode.parent;
|
||||
|
|
@ -320,12 +320,12 @@ module.exports = {
|
|||
* ^^^^^^^^^^^^
|
||||
*/
|
||||
if (astUtils.isParenthesised(sourceCode, memberNode)) {
|
||||
return; // eslint-disable-line eslint-plugin/fixer-return -- false positive
|
||||
return;
|
||||
}
|
||||
|
||||
// If comments exist in the `.bind(this)`, don't remove those.
|
||||
if (sourceCode.commentsExistBetween(firstTokenToRemove, lastTokenToRemove)) {
|
||||
return; // eslint-disable-line eslint-plugin/fixer-return -- false positive
|
||||
return;
|
||||
}
|
||||
|
||||
yield fixer.removeRange([firstTokenToRemove.range[0], lastTokenToRemove.range[1]]);
|
||||
|
|
|
|||
21
node_modules/eslint/lib/rules/prefer-const.js
generated
vendored
21
node_modules/eslint/lib/rules/prefer-const.js
generated
vendored
|
|
@ -5,6 +5,11 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const FixTracker = require("./utils/fix-tracker");
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -451,10 +456,18 @@ module.exports = {
|
|||
messageId: "useConst",
|
||||
data: node,
|
||||
fix: shouldFix
|
||||
? fixer => fixer.replaceText(
|
||||
sourceCode.getFirstToken(varDeclParent, t => t.value === varDeclParent.kind),
|
||||
"const"
|
||||
)
|
||||
? fixer => {
|
||||
const letKeywordToken = sourceCode.getFirstToken(varDeclParent, t => t.value === varDeclParent.kind);
|
||||
|
||||
/**
|
||||
* Extend the replacement range to the whole declaration,
|
||||
* in order to prevent other fixes in the same pass
|
||||
* https://github.com/eslint/eslint/issues/13899
|
||||
*/
|
||||
return new FixTracker(fixer, sourceCode)
|
||||
.retainRange(varDeclParent.range)
|
||||
.replaceTextRange(letKeywordToken.range, "const");
|
||||
}
|
||||
: null
|
||||
});
|
||||
});
|
||||
|
|
|
|||
28
node_modules/eslint/lib/rules/prefer-destructuring.js
generated
vendored
28
node_modules/eslint/lib/rules/prefer-destructuring.js
generated
vendored
|
|
@ -4,6 +4,18 @@
|
|||
*/
|
||||
"use strict";
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const astUtils = require("./utils/ast-utils");
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
const PRECEDENCE_OF_ASSIGNMENT_EXPR = astUtils.getPrecedence({ type: "AssignmentExpression" });
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -156,13 +168,15 @@ module.exports = {
|
|||
* Assignment expression is not fixed.
|
||||
* Array destructuring is not fixed.
|
||||
* Renamed property is not fixed.
|
||||
* @param {ASTNode} node the the node to evaluate
|
||||
* @param {ASTNode} node the node to evaluate
|
||||
* @returns {boolean} whether or not the node should be fixed
|
||||
*/
|
||||
function shouldFix(node) {
|
||||
return node.type === "VariableDeclarator" &&
|
||||
node.id.type === "Identifier" &&
|
||||
node.init.type === "MemberExpression" &&
|
||||
!node.init.computed &&
|
||||
node.init.property.type === "Identifier" &&
|
||||
node.id.name === node.init.property.name;
|
||||
}
|
||||
|
||||
|
|
@ -183,9 +197,15 @@ module.exports = {
|
|||
return null;
|
||||
}
|
||||
|
||||
let objectText = sourceCode.getText(rightNode.object);
|
||||
|
||||
if (astUtils.getPrecedence(rightNode.object) < PRECEDENCE_OF_ASSIGNMENT_EXPR) {
|
||||
objectText = `(${objectText})`;
|
||||
}
|
||||
|
||||
return fixer.replaceText(
|
||||
node,
|
||||
`{${rightNode.property.name}} = ${sourceCode.getText(rightNode.object)}`
|
||||
`{${rightNode.property.name}} = ${objectText}`
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -259,7 +279,7 @@ module.exports = {
|
|||
* @param {ASTNode} node the AssignmentExpression node
|
||||
* @returns {void}
|
||||
*/
|
||||
function checkAssigmentExpression(node) {
|
||||
function checkAssignmentExpression(node) {
|
||||
if (node.operator === "=") {
|
||||
performCheck(node.left, node.right, node);
|
||||
}
|
||||
|
|
@ -271,7 +291,7 @@ module.exports = {
|
|||
|
||||
return {
|
||||
VariableDeclarator: checkVariableDeclarator,
|
||||
AssignmentExpression: checkAssigmentExpression
|
||||
AssignmentExpression: checkAssignmentExpression
|
||||
};
|
||||
}
|
||||
};
|
||||
|
|
|
|||
1
node_modules/eslint/lib/rules/prefer-exponentiation-operator.js
generated
vendored
1
node_modules/eslint/lib/rules/prefer-exponentiation-operator.js
generated
vendored
|
|
@ -30,6 +30,7 @@ function doesBaseNeedParens(base) {
|
|||
astUtils.getPrecedence(base) <= PRECEDENCE_OF_EXPONENTIATION_EXPR ||
|
||||
|
||||
// An unary operator cannot be used immediately before an exponentiation expression
|
||||
base.type === "AwaitExpression" ||
|
||||
base.type === "UnaryExpression"
|
||||
);
|
||||
}
|
||||
|
|
|
|||
4
node_modules/eslint/lib/rules/prefer-reflect.js
generated
vendored
4
node_modules/eslint/lib/rules/prefer-reflect.js
generated
vendored
|
|
@ -105,10 +105,10 @@ module.exports = {
|
|||
CallExpression(node) {
|
||||
const methodName = (node.callee.property || {}).name;
|
||||
const isReflectCall = (node.callee.object || {}).name === "Reflect";
|
||||
const hasReflectSubsitute = Object.prototype.hasOwnProperty.call(reflectSubstitutes, methodName);
|
||||
const hasReflectSubstitute = Object.prototype.hasOwnProperty.call(reflectSubstitutes, methodName);
|
||||
const userConfiguredException = exceptions.indexOf(methodName) !== -1;
|
||||
|
||||
if (hasReflectSubsitute && !isReflectCall && !userConfiguredException) {
|
||||
if (hasReflectSubstitute && !isReflectCall && !userConfiguredException) {
|
||||
report(node, existingNames[methodName], reflectSubstitutes[methodName]);
|
||||
}
|
||||
},
|
||||
|
|
|
|||
38
node_modules/eslint/lib/rules/prefer-template.js
generated
vendored
38
node_modules/eslint/lib/rules/prefer-template.js
generated
vendored
|
|
@ -39,33 +39,25 @@ function getTopConcatBinaryExpression(node) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Determines whether a given node is a octal escape sequence
|
||||
* Checks whether or not a node contains a string literal with an octal or non-octal decimal escape sequence
|
||||
* @param {ASTNode} node A node to check
|
||||
* @returns {boolean} `true` if the node is an octal escape sequence
|
||||
* @returns {boolean} `true` if at least one string literal within the node contains
|
||||
* an octal or non-octal decimal escape sequence
|
||||
*/
|
||||
function isOctalEscapeSequence(node) {
|
||||
|
||||
// No need to check TemplateLiterals – would throw error with octal escape
|
||||
const isStringLiteral = node.type === "Literal" && typeof node.value === "string";
|
||||
|
||||
if (!isStringLiteral) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return astUtils.hasOctalEscapeSequence(node.raw);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether or not a node contains a octal escape sequence
|
||||
* @param {ASTNode} node A node to check
|
||||
* @returns {boolean} `true` if the node contains an octal escape sequence
|
||||
*/
|
||||
function hasOctalEscapeSequence(node) {
|
||||
function hasOctalOrNonOctalDecimalEscapeSequence(node) {
|
||||
if (isConcatenation(node)) {
|
||||
return hasOctalEscapeSequence(node.left) || hasOctalEscapeSequence(node.right);
|
||||
return (
|
||||
hasOctalOrNonOctalDecimalEscapeSequence(node.left) ||
|
||||
hasOctalOrNonOctalDecimalEscapeSequence(node.right)
|
||||
);
|
||||
}
|
||||
|
||||
return isOctalEscapeSequence(node);
|
||||
// No need to check TemplateLiterals – would throw parsing error
|
||||
if (node.type === "Literal" && typeof node.value === "string") {
|
||||
return astUtils.hasOctalOrNonOctalDecimalEscapeSequence(node.raw);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -237,7 +229,7 @@ module.exports = {
|
|||
function fixNonStringBinaryExpression(fixer, node) {
|
||||
const topBinaryExpr = getTopConcatBinaryExpression(node.parent);
|
||||
|
||||
if (hasOctalEscapeSequence(topBinaryExpr)) {
|
||||
if (hasOctalOrNonOctalDecimalEscapeSequence(topBinaryExpr)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
|||
7
node_modules/eslint/lib/rules/quotes.js
generated
vendored
7
node_modules/eslint/lib/rules/quotes.js
generated
vendored
|
|
@ -282,9 +282,12 @@ module.exports = {
|
|||
description: settings.description
|
||||
},
|
||||
fix(fixer) {
|
||||
if (quoteOption === "backtick" && astUtils.hasOctalEscapeSequence(rawVal)) {
|
||||
if (quoteOption === "backtick" && astUtils.hasOctalOrNonOctalDecimalEscapeSequence(rawVal)) {
|
||||
|
||||
// An octal escape sequence in a template literal would produce syntax error, even in non-strict mode.
|
||||
/*
|
||||
* An octal or non-octal decimal escape sequence in a template literal would
|
||||
* produce syntax error, even in non-strict mode.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
|||
22
node_modules/eslint/lib/rules/radix.js
generated
vendored
22
node_modules/eslint/lib/rules/radix.js
generated
vendored
|
|
@ -82,7 +82,8 @@ module.exports = {
|
|||
description: "enforce the consistent use of the radix argument when using `parseInt()`",
|
||||
category: "Best Practices",
|
||||
recommended: false,
|
||||
url: "https://eslint.org/docs/rules/radix"
|
||||
url: "https://eslint.org/docs/rules/radix",
|
||||
suggestion: true
|
||||
},
|
||||
|
||||
schema: [
|
||||
|
|
@ -95,7 +96,8 @@ module.exports = {
|
|||
missingParameters: "Missing parameters.",
|
||||
redundantRadix: "Redundant radix parameter.",
|
||||
missingRadix: "Missing radix parameter.",
|
||||
invalidRadix: "Invalid radix parameter, must be an integer between 2 and 36."
|
||||
invalidRadix: "Invalid radix parameter, must be an integer between 2 and 36.",
|
||||
addRadixParameter10: "Add radix parameter `10` for parsing decimal numbers."
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -123,7 +125,21 @@ module.exports = {
|
|||
if (mode === MODE_ALWAYS) {
|
||||
context.report({
|
||||
node,
|
||||
messageId: "missingRadix"
|
||||
messageId: "missingRadix",
|
||||
suggest: [
|
||||
{
|
||||
messageId: "addRadixParameter10",
|
||||
fix(fixer) {
|
||||
const sourceCode = context.getSourceCode();
|
||||
const tokens = sourceCode.getTokens(node);
|
||||
const lastToken = tokens[tokens.length - 1]; // Parenthesis.
|
||||
const secondToLastToken = tokens[tokens.length - 2]; // May or may not be a comma.
|
||||
const hasTrailingComma = secondToLastToken.type === "Punctuator" && secondToLastToken.value === ",";
|
||||
|
||||
return fixer.insertTextBefore(lastToken, hasTrailingComma ? " 10," : ", 10");
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue