@babel/parser · Babel (original) (raw)

The Babel parser (previously Babylon) is a JavaScript parser used in Babel.

Credits

Heavily based on acorn and acorn-jsx, thanks to the awesome work of @RReverser and @marijnh.

API

babelParser.parse(code, [options])

babelParser.parseExpression(code, [options])

parse() parses the provided code as an entire ECMAScript program, whileparseExpression() tries to parse a single Expression with performance in mind. When in doubt, use .parse().

Options

History

Version Changes
v7.27.0 Added allowYieldOutsideFunction
v7.26.0 Added startIndex
v7.23.0 Added createImportExpressions
v7.21.0 Added allowNewTargetOutsideFunction and annexB
v7.16.0 Added startColumn
v7.15.0 Added attachComment
v7.7.0 Added errorRecovery
v7.5.0 Added allowUndeclaredExports
v7.2.0 Added createParenthesizedExpressions

Output

The Babel parser generates AST according to Babel AST format. It is based on ESTree spec with the following deviations:

note

The estree plugin can revert these deviations. Use it only if you are passing Babel AST to other ESTree-compliant tools.

AST for JSX code is based on Facebook JSX AST.

Semver

The Babel Parser follows semver in most situations. The only thing to note is that some spec-compliancy bug fixes may be released under patch versions.

For example: We push a fix to early error on something like #107 - multiple default exports per file. That would be considered a bug fix even though it would cause a build to fail.

Example

JavaScript

require("@babel/parser").parse("code", {
  // parse in strict mode and allow module declarations
  sourceType: "module",

  plugins: [
    // enable jsx and flow syntax
    "jsx",
    "flow",
  ],
});

Plugins

Miscellaneous

Name Code Example
estree (repo) n/a

Language extensions

History

Version Changes
v7.6.0 Added v8intrinsic
Name Code Example
flow (repo) var a: string = "";
flowComments (docs) /*:: type Foo = {...}; */
jsx (repo) {s}
typescript (repo) var a: string = "";
v8intrinsic %DebugPrint(foo);

ECMAScript proposals

History

Version Changes
v7.23.0 Added sourcePhaseImports, deferredImportEvaluation, optionalChainingAssign
v7.22.0 Enabled regexpUnicodeSets by default, added importAttributes
v7.20.0 Added explicitResourceManagement, importReflection
v7.17.0 Added regexpUnicodeSets, destructuringPrivate, decoratorAutoAccessors
v7.15.0 Added hack to the proposal option of pipelineOperator. Moved topLevelAwait, privateIn to Latest ECMAScript features
v7.14.0 Added asyncDoExpressions. Moved classProperties, classPrivateProperties, classPrivateMethods, moduleStringNames to Latest ECMAScript features
v7.13.0 Added moduleBlocks
v7.12.0 Added classStaticBlock, moduleStringNames
v7.11.0 Added decimal
v7.10.0 Added privateIn
v7.9.0 Added recordAndTuple
v7.7.0 Added topLevelAwait
v7.4.0 Added partialApplication
v7.2.0 Added classPrivateMethods
Name Code Example
asyncDoExpressions (proposal) async do { await requestAPI().json() }
decimal (proposal) 0.3m
decorators (proposal) decorators-legacy @a class A {}
decoratorAutoAccessors (proposal) class Example { @reactive accessor myBool = false; }
deferredImportEvaluation (proposal) import defer * as ns from "dep";
deprecatedImportAssert (legacy syntax of import attributes) importAssertions (⚠️ deprecated) import json from "./foo.json" assert { type: "json" };
destructuringPrivate (proposal) class Example { #x = 1; method() { const { #x: x } = this; } }
doExpressions (proposal) var a = do { if (true) { 'hi'; } };
explicitResourceManagement (proposal) using reader = getReader()
exportDefaultFrom (proposal) export v from "mod"
functionBind (proposal) a::b, ::console.log
functionSent (proposal) function.sent
importReflection (proposal) import module foo from "./foo.wasm";
moduleBlocks (proposal) let m = module { export let y = 1; };
optionalChainingAssign (proposal) x?.prop = 2
partialApplication (proposal) f(?, a)
pipelineOperator (proposal) a |> b
recordAndTuple (proposal) #{x: 1}, #[1, 2]
sourcePhaseImports (proposal) import source x from "./x"
throwExpressions (proposal) () => throw new Error("")

Latest ECMAScript features

The following features are already enabled on the latest version of @babel/parser, and cannot be disabled because they are part of the language. You should enable these features only if you are using an older version.

Name Code Example
asyncGenerators (proposal) async function*() {}, for await (let a of b) {}
bigInt (proposal) 100n
classProperties (proposal) class A { b = 1; }
classPrivateProperties (proposal) class A { #b = 1; }
classPrivateMethods (proposal) class A { #c() {} }
classStaticBlock (proposal) class A { static {} }
dynamicImport (proposal) import('./guy').then(a)
exportNamespaceFrom (proposal) export * as ns from "mod"
logicalAssignment (proposal) a &&= b
moduleStringNames (proposal) import { "😄" as smile } from "emoji";
nullishCoalescingOperator (proposal) a ?? b
numericSeparator (proposal) 1_000_000
objectRestSpread (proposal) var a = { b, ...c };
optionalCatchBinding (proposal) try {throw 0;} catch{do();}
optionalChaining (proposal) a?.b
privateIn (proposal) #p in obj
regexpUnicodeSets (proposal) /[\p{Decimal_Number}--[0-9]]/v;
topLevelAwait (proposal) await promise in modules
importAttributes (proposal) import json from "./foo.json" with { type: "json" };

Plugins options

History

Version Changes
7.21.0 The default behavior of the decorators' decoratorsBeforeExport option is to allow decorators either before or after the export keyword.
7.19.0 The syntaxType option of the recordAndTuple plugin defaults to hash; added allowCallParenthesized option for the decorators plugin.
7.17.0 Added @@ and ^^ to the topicToken option of the hack pipeline operator
7.16.0 Added disallowAmbiguousJSXLike for typescript plugin. Added ^ to the topicToken option of the hack pipeline operators
7.14.0 Added dts for typescript plugin

note

When a plugin is specified multiple times, only the first options are considered.

Error codes

History

Version Changes
v7.14.0 Added error codes

Error codes are useful for handling the errors thrown by @babel/parser.

There are two error codes, code and reasonCode.

Example of using error codes with errorRecovery:

JavaScript

const { parse } = require("@babel/parser");

const ast = parse(`a b`, { errorRecovery: true });

console.log(ast.errors[0].code); // BABEL_PARSER_SYNTAX_ERROR
console.log(ast.errors[0].reasonCode); // MissingSemicolon

FAQ

Will the Babel parser support a plugin system?

Previous issues: #1351, #6694.

We currently aren't willing to commit to supporting the API for plugins or the resulting ecosystem (there is already enough work maintaining Babel's own plugin system). It's not clear how to make that API effective, and it would limit our ability to refactor and optimize the codebase.

Our current recommendation for those that want to create their own custom syntax is for users to fork the parser.

To consume your custom parser, you can add a plugin to your options to call the parser via its npm package name or require it if using JavaScript,

JavaScript

const parse = require("custom-fork-of-babel-parser-on-npm-here");

module.exports = {
  plugins: [
    {
      parserOverride(code, opts) {
        return parse(code, opts);
      },
    },
  ],
};