11import type { ParserOptions } from "../common/parser-options"
2- import { getLinterRequire } from "./linter-require"
32// @ts -expect-error -- ignore
43import * as dependencyEspree from "espree"
5- import { lte , lt } from "semver"
4+ import { lte } from "semver"
65import { createRequire } from "./create-require"
76import path from "path"
87import type { BasicParserObject } from "./parser-object"
98
109type Espree = BasicParserObject & {
11- latestEcmaVersion ? : number
10+ latestEcmaVersion : number
1211 version : string
1312}
1413let espreeCache : Espree | null = null
1514
1615/**
1716 * Gets the espree that the given ecmaVersion can parse.
1817 */
19- export function getEspreeFromEcmaVersion (
20- ecmaVersion : ParserOptions [ "ecmaVersion" ] ,
21- ) : Espree {
22- const linterEspree = getEspreeFromLinter ( )
23- if ( ecmaVersion == null ) {
24- return linterEspree
25- }
26- if ( ecmaVersion === "latest" ) {
27- return getNewestEspree ( )
28- }
29- if (
30- normalizeEcmaVersion ( ecmaVersion ) <= getLatestEcmaVersion ( linterEspree )
31- ) {
32- return linterEspree
33- }
34- const userEspree = getEspreeFromUser ( )
35- if ( normalizeEcmaVersion ( ecmaVersion ) <= getLatestEcmaVersion ( userEspree ) ) {
36- return userEspree
37- }
38- return linterEspree
18+ export function getEspree ( ) : Espree {
19+ return espreeCache || ( espreeCache = getNewestEspree ( ) )
3920}
4021
4122/**
4223 * Load `espree` from the user dir.
4324 */
44- export function getEspreeFromUser ( ) : Espree {
25+ function getEspreeFromUser ( ) : Espree {
4526 try {
4627 const cwd = process . cwd ( )
4728 const relativeTo = path . join ( cwd , "__placeholder__.js" )
4829 return createRequire ( relativeTo ) ( "espree" )
4930 } catch {
50- return getEspreeFromLinter ( )
51- }
52- }
53-
54- /**
55- * Load `espree` from the loaded ESLint.
56- * If the loaded ESLint was not found, just returns `require("espree")`.
57- */
58- export function getEspreeFromLinter ( ) : Espree {
59- if ( ! espreeCache ) {
60- espreeCache = getLinterRequire ( ) ?.( "espree" )
61- if ( ! espreeCache ) {
62- espreeCache = dependencyEspree
63- }
31+ return dependencyEspree
6432 }
65-
66- return espreeCache !
6733}
6834
6935/**
70- * Load the newest `espree` from the loaded ESLint or dependency.
36+ * Load the newest `espree` from the dependency.
7137 */
7238function getNewestEspree ( ) : Espree {
7339 let newest = dependencyEspree
74- const linterEspree = getEspreeFromLinter ( )
75- if (
76- linterEspree . version != null &&
77- lte ( newest . version , linterEspree . version )
78- ) {
79- newest = linterEspree
80- }
8140 const userEspree = getEspreeFromUser ( )
8241 if ( userEspree . version != null && lte ( newest . version , userEspree . version ) ) {
8342 newest = userEspree
@@ -94,7 +53,7 @@ export function getEcmaVersionIfUseEspree(
9453 }
9554
9655 if ( parserOptions . ecmaVersion === "latest" ) {
97- return normalizeEcmaVersion ( getLatestEcmaVersion ( getNewestEspree ( ) ) )
56+ return getDefaultEcmaVersion ( )
9857 }
9958 if ( parserOptions . ecmaVersion == null ) {
10059 const defVer = getDefaultEcmaVersion ( )
@@ -104,10 +63,6 @@ export function getEcmaVersionIfUseEspree(
10463}
10564
10665function getDefaultEcmaVersion ( ) : number {
107- if ( lt ( getEspreeFromLinter ( ) . version , "9.0.0" ) ) {
108- return 5
109- }
110- // Perhaps the version 9 will change the default to "latest".
11166 return normalizeEcmaVersion ( getLatestEcmaVersion ( getNewestEspree ( ) ) )
11267}
11368
@@ -122,16 +77,5 @@ function normalizeEcmaVersion(version: number) {
12277}
12378
12479function getLatestEcmaVersion ( espree : Espree ) {
125- if ( espree . latestEcmaVersion == null ) {
126- for ( const { v, latest } of [
127- { v : "6.1.0" , latest : 2020 } ,
128- { v : "4.0.0" , latest : 2019 } ,
129- ] ) {
130- if ( lte ( v , espree . version ) ) {
131- return latest
132- }
133- }
134- return 2018
135- }
13680 return normalizeEcmaVersion ( espree . latestEcmaVersion )
13781}
0 commit comments