Babel Preset Latest is a meta-preset that combines es2015, es2016, and es2017 presets to provide a convenient way to transpile modern JavaScript features for compatibility with older environments. It allows developers to use the latest standardized JavaScript language features while maintaining backward compatibility through Babel's transpilation process.
npm install --save-dev babel-preset-latest// The preset is imported by Babel automatically when specified in configuration
// No direct imports are needed in your code{
"presets": ["latest"]
}babel script.js --presets latestrequire("babel-core").transform("code", {
presets: ["latest"]
});Babel Preset Latest works as a factory function that:
presetES2015.buildPreset for es2015 to enable option forwarding, while es2016 and es2017 are used directlyThe main and only export is a preset factory function that Babel calls to generate the preset configuration.
/**
* Babel preset factory function that combines es2015, es2016, and es2017 presets
* @param {Object} context - Babel context object (passed by Babel internally)
* @param {PresetOptions} opts - Configuration options for the preset
* @returns {PresetConfig} Babel preset configuration with presets array
*/
function presetFactory(context, opts = {}): PresetConfig;
interface PresetConfig {
/** Array of preset configurations, filtered to remove disabled presets */
presets: (string | [string, object])[];
}
interface PresetOptions {
/** Controls inclusion of es2015 preset. Can be boolean or options object for es2015 */
es2015?: boolean | object;
/** Controls inclusion of es2016 preset */
es2016?: boolean;
/** Controls inclusion of es2017 preset */
es2017?: boolean;
}Configure which year-based presets to include and pass options to individual presets.
Disable specific presets:
{
"presets": [
["latest", {
"es2015": false,
"es2016": false
}]
]
}Pass options to nested presets (es2015 only):
{
"presets": [
["latest", {
"es2015": {
"modules": false,
"loose": true
}
}]
]
}Note: Option forwarding only works for the es2015 preset because it uses presetES2015.buildPreset to accept configuration options. The es2016 and es2017 presets are used directly and can only be enabled/disabled via boolean values.
Full configuration example:
{
"presets": [
["latest", {
"es2015": {
"modules": false,
"loose": true
},
"es2016": true,
"es2017": false
}]
]
}interface PresetOptions {
/**
* Controls inclusion of babel-preset-es2015
* - true (default): Include es2015 preset with default options
* - false: Exclude es2015 preset entirely
* - object: Include es2015 preset with specified options
*/
es2015?: boolean | Es2015Options;
/**
* Controls inclusion of babel-preset-es2016
* - true (default): Include es2016 preset
* - false: Exclude es2016 preset
*/
es2016?: boolean;
/**
* Controls inclusion of babel-preset-es2017
* - true (default): Include es2017 preset
* - false: Exclude es2017 preset
*/
es2017?: boolean;
}
interface Es2015Options {
/** Whether to compile ES6 modules to another module type */
modules?: "amd" | "umd" | "systemjs" | "commonjs" | false;
/** Enable loose mode transformations for more readable output */
loose?: boolean;
/** Additional options as supported by babel-preset-es2015 */
[key: string]: any;
}The preset factory function handles invalid configurations gracefully:
filter(Boolean)