@babel/plugin-syntax-optional-chaining is a Babel syntax plugin that enables the parser to understand optional chaining syntax (?.) in JavaScript code. As a syntax-only plugin, it does not transform the code but allows Babel to parse optional chaining expressions without throwing syntax errors.
npm install --save-dev @babel/plugin-syntax-optional-chaining// Default export - the plugin function
const plugin = require("@babel/plugin-syntax-optional-chaining");For ES modules (when available):
import plugin from "@babel/plugin-syntax-optional-chaining";// babel.config.js
module.exports = {
plugins: ["@babel/plugin-syntax-optional-chaining"]
};// .babelrc
{
"plugins": ["@babel/plugin-syntax-optional-chaining"]
}const babel = require("@babel/core");
const plugin = require("@babel/plugin-syntax-optional-chaining");
const result = babel.transformSync(code, {
plugins: [plugin]
});The main export is a Babel plugin function that enables optional chaining syntax parsing.
/**
* Babel syntax plugin for optional chaining
* Created using @babel/helper-plugin-utils.declare()
* @param {Object} api - Babel API object with version assertion
* @param {Object} options - Plugin options (unused for syntax plugins)
* @returns {Object} Plugin object with name and manipulateOptions method
*/
function plugin(api, options): BabelPlugin;
interface BabelPlugin {
/** Plugin identifier name */
name: string;
/** Method to manipulate parser options */
manipulateOptions(opts: BabelOptions, parserOpts: ParserOptions): void;
}
interface BabelOptions {
// Babel transformation options
[key: string]: any;
}
interface ParserOptions {
/** Array of parser plugins to enable */
plugins: string[];
[key: string]: any;
}Plugin Object Properties:
"syntax-optional-chaining" - Plugin identifier"optionalChaining" to the parser plugins array, enabling the Babel parser to understand optional chaining syntax without throwing errorsUsage Example:
// When this plugin is applied, it enables parsing of:
const value = obj?.property?.method?.();
const arrayItem = arr?.[index];
const result = func?.();
// Without syntax errors, even though the code is not transformedThis syntax plugin is designed to work with @babel/plugin-proposal-optional-chaining. The transform plugin automatically inherits this syntax plugin, so in most cases you don't need to add this plugin manually:
// The proposal plugin inherits from the syntax plugin
import syntaxOptionalChaining from "@babel/plugin-syntax-optional-chaining";
export default declare((api, options) => {
return {
name: "proposal-optional-chaining",
inherits: syntaxOptionalChaining, // Automatically includes syntax parsing
visitor: {
// Transform logic here
}
};
});The plugin enables Babel's parser to recognize these optional chaining patterns:
obj?.propertyobj?.[expression]func?.(args)obj?.prop?.method?.()/**
* Manipulates parser options to enable optional chaining syntax
* @param {BabelOptions} opts - Babel transformation options object (unused by syntax plugins)
* @param {ParserOptions} parserOpts - Parser options to modify
*/
manipulateOptions(opts: BabelOptions, parserOpts: ParserOptions): void;The manipulateOptions method:
"optionalChaining" string to the parserOpts.plugins array?.) without throwing syntax errorsapi.assertVersion(7))@babel/core ^7.0.0-0 as peer dependency/**
* @babel/helper-plugin-utils dependency
* Used for plugin declaration and utilities
*/
const { declare } = require("@babel/helper-plugin-utils");^7.8.0 - Plugin utilities and declaration helper^7.0.0-0 - Babel transformation core (required for plugin system)This syntax plugin is typically used alongside transform plugins, often automatically:
// babel.config.js - Transform plugin automatically includes syntax plugin
module.exports = {
plugins: [
"@babel/plugin-proposal-optional-chaining" // Automatically inherits syntax plugin
]
};
// Manual setup (rarely needed)
module.exports = {
plugins: [
"@babel/plugin-syntax-optional-chaining", // Enable syntax parsing
"@babel/plugin-proposal-optional-chaining" // Transform to compatible code
]
};// For TypeScript projects
module.exports = {
presets: [
"@babel/preset-typescript"
],
plugins: [
"@babel/plugin-syntax-optional-chaining"
]
};// Development: Parse modern syntax
{
"plugins": ["@babel/plugin-syntax-optional-chaining"]
}
// Production: Parse and transform
{
"plugins": [
"@babel/plugin-syntax-optional-chaining",
"@babel/plugin-proposal-optional-chaining"
]
}The plugin enables syntax parsing but does not handle runtime errors. Optional chaining runtime behavior depends on:
@babel/plugin-proposal-optional-chaining for compatibilityWithout proper transformation or native support, parsed optional chaining syntax may cause runtime errors in older JavaScript environments.