From ee5b79d75d34aebc11201ed4ab953741742f1a93 Mon Sep 17 00:00:00 2001 From: Kai Cataldo Date: Tue, 24 Dec 2019 12:28:57 -0500 Subject: [PATCH] @babel-core: parse should parse only (#10914) * @babel/core: parse methods should parse only * Update Flow types --- packages/babel-core/src/parse.js | 13 ++-- packages/babel-core/src/parser/index.js | 74 +++++++++++++++++++ .../util/missing-plugin-helper.js | 0 .../src/transformation/normalize-file.js | 74 +------------------ 4 files changed, 80 insertions(+), 81 deletions(-) create mode 100644 packages/babel-core/src/parser/index.js rename packages/babel-core/src/{transformation => parser}/util/missing-plugin-helper.js (100%) diff --git a/packages/babel-core/src/parse.js b/packages/babel-core/src/parse.js index b3397a1a2e23..6c82fe75ad5f 100644 --- a/packages/babel-core/src/parse.js +++ b/packages/babel-core/src/parse.js @@ -1,14 +1,11 @@ // @flow import loadConfig, { type InputOptions } from "./config"; -import normalizeFile from "./transformation/normalize-file"; +import parser from "./parser"; +import type { ParseResult } from "./parser"; import normalizeOptions from "./transformation/normalize-opts"; -type AstRoot = BabelNodeFile | BabelNodeProgram; - -export type ParseResult = AstRoot; - -export type FileParseCallback = { +type FileParseCallback = { (Error, null): any, (null, ParseResult | null): any, }; @@ -49,7 +46,7 @@ export const parse: Parse = (function parse(code, opts, callback) { const cfg = loadConfig(opts); if (cfg === null) return cb(null, null); - ast = normalizeFile(cfg.passes, normalizeOptions(cfg), code).ast; + ast = parser(cfg.passes, normalizeOptions(cfg), code); } catch (err) { return cb(err); } @@ -68,7 +65,7 @@ export function parseSync( return null; } - return normalizeFile(config.passes, normalizeOptions(config), code).ast; + return parser(config.passes, normalizeOptions(config), code); } export function parseAsync( diff --git a/packages/babel-core/src/parser/index.js b/packages/babel-core/src/parser/index.js new file mode 100644 index 000000000000..499d465ea585 --- /dev/null +++ b/packages/babel-core/src/parser/index.js @@ -0,0 +1,74 @@ +import { parse } from "@babel/parser"; +import { codeFrameColumns } from "@babel/code-frame"; +import generateMissingPluginMessage from "./util/missing-plugin-helper"; + +type AstRoot = BabelNodeFile | BabelNodeProgram; + +export type ParseResult = AstRoot; + +export default function parser( + pluginPasses: PluginPasses, + { parserOpts, highlightCode = true, filename = "unknown" }: Object, + code: string, +): ParseResult { + try { + const results = []; + for (const plugins of pluginPasses) { + for (const plugin of plugins) { + const { parserOverride } = plugin; + if (parserOverride) { + const ast = parserOverride(code, parserOpts, parse); + + if (ast !== undefined) results.push(ast); + } + } + } + + if (results.length === 0) { + return parse(code, parserOpts); + } else if (results.length === 1) { + if (typeof results[0].then === "function") { + throw new Error( + `You appear to be using an async parser plugin, ` + + `which your current version of Babel does not support. ` + + `If you're using a published plugin, you may need to upgrade ` + + `your @babel/core version.`, + ); + } + return results[0]; + } + throw new Error("More than one plugin attempted to override parsing."); + } catch (err) { + if (err.code === "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED") { + err.message += + "\nConsider renaming the file to '.mjs', or setting sourceType:module " + + "or sourceType:unambiguous in your Babel config for this file."; + // err.code will be changed to BABEL_PARSE_ERROR later. + } + + const { loc, missingPlugin } = err; + if (loc) { + const codeFrame = codeFrameColumns( + code, + { + start: { + line: loc.line, + column: loc.column + 1, + }, + }, + { + highlightCode, + }, + ); + if (missingPlugin) { + err.message = + `${filename}: ` + + generateMissingPluginMessage(missingPlugin[0], loc, codeFrame); + } else { + err.message = `${filename}: ${err.message}\n\n` + codeFrame; + } + err.code = "BABEL_PARSE_ERROR"; + } + throw err; + } +} diff --git a/packages/babel-core/src/transformation/util/missing-plugin-helper.js b/packages/babel-core/src/parser/util/missing-plugin-helper.js similarity index 100% rename from packages/babel-core/src/transformation/util/missing-plugin-helper.js rename to packages/babel-core/src/parser/util/missing-plugin-helper.js diff --git a/packages/babel-core/src/transformation/normalize-file.js b/packages/babel-core/src/transformation/normalize-file.js index 41c1bb99caa0..baad5de2df50 100644 --- a/packages/babel-core/src/transformation/normalize-file.js +++ b/packages/babel-core/src/transformation/normalize-file.js @@ -7,10 +7,8 @@ import cloneDeep from "lodash/cloneDeep"; import * as t from "@babel/types"; import type { PluginPasses } from "../config"; import convertSourceMap, { typeof Converter } from "convert-source-map"; -import { parse } from "@babel/parser"; -import { codeFrameColumns } from "@babel/code-frame"; import File from "./file/file"; -import generateMissingPluginMessage from "./util/missing-plugin-helper"; +import parser from "../parser"; const debug = buildDebug("babel:transform:file"); const LARGE_INPUT_SOURCEMAP_THRESHOLD = 1_000_000; @@ -37,9 +35,6 @@ export default function normalizeFile( } ast = cloneDeep(ast); } else { - // The parser's AST types aren't fully compatible with the types generated - // by the logic in babel-types. - // $FlowFixMe ast = parser(pluginPasses, options, code); } @@ -94,73 +89,6 @@ export default function normalizeFile( }); } -function parser( - pluginPasses: PluginPasses, - { parserOpts, highlightCode = true, filename = "unknown" }: Object, - code: string, -) { - try { - const results = []; - for (const plugins of pluginPasses) { - for (const plugin of plugins) { - const { parserOverride } = plugin; - if (parserOverride) { - const ast = parserOverride(code, parserOpts, parse); - - if (ast !== undefined) results.push(ast); - } - } - } - - if (results.length === 0) { - return parse(code, parserOpts); - } else if (results.length === 1) { - if (typeof results[0].then === "function") { - throw new Error( - `You appear to be using an async parser plugin, ` + - `which your current version of Babel does not support. ` + - `If you're using a published plugin, you may need to upgrade ` + - `your @babel/core version.`, - ); - } - return results[0]; - } - throw new Error("More than one plugin attempted to override parsing."); - } catch (err) { - if (err.code === "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED") { - err.message += - "\nConsider renaming the file to '.mjs', or setting sourceType:module " + - "or sourceType:unambiguous in your Babel config for this file."; - // err.code will be changed to BABEL_PARSE_ERROR later. - } - - const { loc, missingPlugin } = err; - if (loc) { - const codeFrame = codeFrameColumns( - code, - { - start: { - line: loc.line, - column: loc.column + 1, - }, - }, - { - highlightCode, - }, - ); - if (missingPlugin) { - err.message = - `${filename}: ` + - generateMissingPluginMessage(missingPlugin[0], loc, codeFrame); - } else { - err.message = `${filename}: ${err.message}\n\n` + codeFrame; - } - err.code = "BABEL_PARSE_ERROR"; - } - throw err; - } -} - // These regexps are copied from the convert-source-map package, // but without // or /* at the beginning of the comment.