feature: babel-eslint-parser passes through config options (#11639)
* Refactor * feature: babel-eslint-plugin passes through config options * Address feedback * Remove unnecessary temporary variable
This commit is contained in:
parent
6b7a6dccd2
commit
69198beee6
@ -56,7 +56,7 @@ Additional configuration options can be set in your ESLint configuration under t
|
||||
- `sourceType` can be set to `"module"`(default) or `"script"` if your code isn't using ECMAScript modules.
|
||||
- `allowImportExportEverywhere` (default `false`) can be set to `true` to allow import and export declarations to appear anywhere a statement is allowed if your build environment supports that. Otherwise import and export declarations can only appear at a program's top level.
|
||||
- `ecmaFeatures.globalReturn` (default `false`) allow return statements in the global scope when used with `sourceType: "script"`.
|
||||
- `babelOptions` passes through Babel's configuration [loading](https://babeljs.io/docs/en/options#config-loading-options) and [merging](https://babeljs.io/docs/en/options#config-merging-options) options (for instance, in case of a monorepo). When not defined, @babel/eslint-parser will use Babel's default configuration file resolution logic.
|
||||
- `babelOptions` is an object containing Babel configuration [options](https://babeljs.io/docs/en/options) that are passed to Babel's parser at runtime. For cases where users might not want to use a Babel configuration file or are running Babel through another tool (such as Webpack with `babel-loader`).
|
||||
|
||||
**.eslintrc.js**
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@ export function normalizeESLintConfig(options) {
|
||||
ecmaVersion: 2020,
|
||||
sourceType: "module",
|
||||
allowImportExportEverywhere: false,
|
||||
requireConfigFile: true,
|
||||
};
|
||||
|
||||
return Object.assign(defaultOptions, options);
|
||||
@ -15,31 +16,19 @@ export function normalizeBabelParseConfig(options) {
|
||||
const parseOptions = {
|
||||
sourceType: options.sourceType,
|
||||
filename: options.filePath,
|
||||
cwd: options.babelOptions.cwd,
|
||||
root: options.babelOptions.root,
|
||||
rootMode: options.babelOptions.rootMode,
|
||||
envName: options.babelOptions.envName,
|
||||
configFile: options.babelOptions.configFile,
|
||||
babelrc: options.babelOptions.babelrc,
|
||||
babelrcRoots: options.babelOptions.babelrcRoots,
|
||||
extends: options.babelOptions.extends,
|
||||
env: options.babelOptions.env,
|
||||
overrides: options.babelOptions.overrides,
|
||||
test: options.babelOptions.test,
|
||||
include: options.babelOptions.include,
|
||||
exclude: options.babelOptions.exclude,
|
||||
ignore: options.babelOptions.ignore,
|
||||
only: options.babelOptions.only,
|
||||
...options.babelOptions,
|
||||
parserOpts: {
|
||||
allowImportExportEverywhere: options.allowImportExportEverywhere,
|
||||
allowReturnOutsideFunction: true,
|
||||
allowSuperOutsideMethod: true,
|
||||
...options.babelOptions.parserOpts,
|
||||
plugins: ["estree", ...(options.babelOptions.parserOpts?.plugins ?? [])],
|
||||
ranges: true,
|
||||
tokens: true,
|
||||
plugins: ["estree"],
|
||||
},
|
||||
caller: {
|
||||
name: "@babel/eslint-parser",
|
||||
...options.babelOptions.caller,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@ -1,8 +1,16 @@
|
||||
import semver from "semver";
|
||||
import { version as CURRENT_BABEL_VERSION } from "@babel/core";
|
||||
import parseWithScope from "./parse-with-scope";
|
||||
import { normalizeESLintConfig } from "./configuration";
|
||||
import {
|
||||
version as CURRENT_BABEL_VERSION,
|
||||
parseSync as babelParse,
|
||||
} from "@babel/core";
|
||||
import packageJson from "../package.json";
|
||||
import {
|
||||
normalizeBabelParseConfig,
|
||||
normalizeESLintConfig,
|
||||
} from "./configuration";
|
||||
import convert from "./convert";
|
||||
import analyzeScope from "./analyze-scope";
|
||||
import visitorKeys from "./visitor-keys";
|
||||
|
||||
const SUPPORTED_BABEL_VERSION_RANGE =
|
||||
packageJson.peerDependencies["@babel/core"];
|
||||
@ -11,16 +19,39 @@ const IS_RUNNING_SUPPORTED_VERSION = semver.satisfies(
|
||||
SUPPORTED_BABEL_VERSION_RANGE,
|
||||
);
|
||||
|
||||
export function parse(code, options) {
|
||||
return parseForESLint(code, options).ast;
|
||||
}
|
||||
|
||||
export function parseForESLint(code, options = {}) {
|
||||
function baseParse(code, options) {
|
||||
if (!IS_RUNNING_SUPPORTED_VERSION) {
|
||||
throw new Error(
|
||||
`babel-eslint@${packageJson.version} does not support @babel/core@${CURRENT_BABEL_VERSION}. Please downgrade to babel-eslint@^10 or upgrade to @babel/core@${SUPPORTED_BABEL_VERSION_RANGE}`,
|
||||
);
|
||||
}
|
||||
|
||||
return parseWithScope(code, normalizeESLintConfig(options));
|
||||
let ast;
|
||||
|
||||
try {
|
||||
ast = babelParse(code, normalizeBabelParseConfig(options));
|
||||
} catch (err) {
|
||||
if (err instanceof SyntaxError) {
|
||||
err.lineNumber = err.loc.line;
|
||||
err.column = err.loc.column;
|
||||
}
|
||||
|
||||
throw err;
|
||||
}
|
||||
|
||||
convert(ast, code);
|
||||
|
||||
return ast;
|
||||
}
|
||||
|
||||
export function parse(code, options = {}) {
|
||||
return baseParse(code, normalizeESLintConfig(options));
|
||||
}
|
||||
|
||||
export function parseForESLint(code, options = {}) {
|
||||
const normalizedOptions = normalizeESLintConfig(options);
|
||||
const ast = baseParse(code, normalizedOptions);
|
||||
const scopeManager = analyzeScope(ast, normalizedOptions);
|
||||
|
||||
return { ast, scopeManager, visitorKeys };
|
||||
}
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
import visitorKeys from "./visitor-keys";
|
||||
import analyzeScope from "./analyze-scope";
|
||||
import parse from "./parse";
|
||||
|
||||
export default function parseWithScope(code, options) {
|
||||
const ast = parse(code, options);
|
||||
const scopeManager = analyzeScope(ast, options);
|
||||
|
||||
return { ast, scopeManager, visitorKeys };
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
import { parseSync as babelParse } from "@babel/core";
|
||||
import convert from "./convert";
|
||||
import { normalizeBabelParseConfig } from "./configuration";
|
||||
|
||||
export default function parse(code, options) {
|
||||
const parseOptions = normalizeBabelParseConfig(options);
|
||||
let ast;
|
||||
|
||||
try {
|
||||
ast = babelParse(code, parseOptions);
|
||||
} catch (err) {
|
||||
if (err instanceof SyntaxError) {
|
||||
err.lineNumber = err.loc.line;
|
||||
err.column = err.loc.column;
|
||||
}
|
||||
|
||||
throw err;
|
||||
}
|
||||
|
||||
convert(ast, code);
|
||||
|
||||
return ast;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user