# babel-plugin-const-enum · [![npm version](https://img.shields.io/npm/v/babel-plugin-const-enum.svg?style=flat)](https://www.npmjs.com/package/babel-plugin-const-enum) [![npm downloads](https://img.shields.io/npm/dm/babel-plugin-const-enum.svg?style=flat)](https://www.npmjs.com/package/babel-plugin-const-enum)
> Transform TypeScript `const` enums
## Install
Using npm:
```sh
npm install --save-dev babel-plugin-const-enum
```
or using yarn:
```sh
yarn add babel-plugin-const-enum --dev
```
## Usage
You are most likely using
[`@babel/preset-typescript`](https://babeljs.io/docs/en/babel-preset-typescript)
or
[`@babel/plugin-transform-typescript`](https://babeljs.io/docs/en/babel-plugin-transform-typescript)
along with this plugin.
If you are using `@babel/preset-typescript`, then nothing special needs to be
done since
[plugins run before presets](https://babeljs.io/docs/en/plugins/#plugin-ordering).
If you are using `@babel/plugin-transform-typescript`, then make sure that
`babel-plugin-const-enum` comes before
`@babel/plugin-transform-typescript` in the plugin array so that
`babel-plugin-const-enum` [runs first](https://babeljs.io/docs/en/plugins/#plugin-ordering).
This plugin needs to run first to transform the `const enum`s into code that
`@babel/plugin-transform-typescript` allows.
`.babelrc`
```json
{
"plugins": ["const-enum", "@babel/transform-typescript"]
}
```
### `transform: removeConst` (default)
Removes the `const` keyword to use regular `enum`.
Can be used in a slower dev build to allow `const`, while prod still uses `tsc`.
See [babel#6476](https://github.com/babel/babel/issues/6476).
```ts
// Before:
const enum MyEnum {
A = 1,
B = A,
C,
D = C,
E = 1,
F,
G = A * E,
H = A ** B ** C,
I = A << 20
}
// After:
enum MyEnum {
A = 1,
B = A,
C,
D = C,
E = 1,
F,
G = A * E,
H = A ** B ** C,
I = A << 20
}
```
`.babelrc`
```json
{
"plugins": [
"const-enum"
]
}
```
Or Explicitly:
`.babelrc`
```json
{
"plugins": [
[
"const-enum",
{
"transform": "removeConst"
}
]
]
}
```
### `transform: constObject`
Transforms into a `const` object literal.
Can be further compressed using Uglify/Terser to inline `enum` access.
See [babel#8741](https://github.com/babel/babel/issues/8741).
```ts
// Before:
const enum MyEnum {
A = 1,
B = A,
C,
D = C,
E = 1,
F,
G = A * E,
H = A ** B ** C,
I = A << 20
}
// After:
const MyEnum = {
A: 1,
B: 1,
C: 2,
D: 2,
E: 1,
F: 2,
G: 1,
H: 1,
I: 1048576
};
```
`.babelrc`
```json
{
"plugins": [
[
"const-enum",
{
"transform": "constObject"
}
]
]
}
```
## Troubleshooting
### `SyntaxError`
You may be getting a `SyntaxError` because you are running this plugin on
non-TypeScript source. You might have run into this problem in `react-native`,
see:
[babel-plugin-const-enum#2](https://github.com/dosentmatter/babel-plugin-const-enum/issues/2)
[babel-plugin-const-enum#3](https://github.com/dosentmatter/babel-plugin-const-enum/issues/3)
This seems to be caused by `react-native` transpiling
[`flow`](https://flow.org/) code in `node_modules`.
To fix this issue, please use
[`babel-preset-const-enum`](https://github.com/dosentmatter/babel-preset-const-enum)
to only run `babel-plugin-const-enum` on TypeScript files.
If you wish to fix the issue manually, check out the
[solution in babel-plugin-const-enum#2](https://github.com/dosentmatter/babel-plugin-const-enum/issues/2#issuecomment-542859348).