babel-plugin-transform-export-default-name
Version:
Babel plugin that transforms default exports to named exports.
120 lines (78 loc) • 2.94 kB
Markdown
# babel-plugin-transform-export-default-name
[](https://www.npmjs.org/package/babel-plugin-transform-export-default-name)
[](https://travis-ci.org/gajus/babel-plugin-transform-export-default-name)
[](https://github.com/gajus/canonical)
Babel plugin that transforms `export default` of anonymous functions to named function export.
Plugin uses the name of the target file to create a temporary variable. Target resource (arrow function or an anonymous function) is assigned to the latter temporary variable. Temporary value is used in place of function in the export declaration.
## Implementation
Values that are affected:
* anonymous function
* arrow function
* anonymous class
Named function, named class and other object as well as literal values are not transformed.
### Export Name
The name used for a temporary variable is derived from the name of the file (excluding `.js` extension). [`_.camelCase`](https://lodash.com/docs#camelCase) is used to sanitize file name (i.e. `foo-bar.js` becomes `fooBar`).
## Problem
Executing a function without a name (arrow function or an anonymous function) appears as an `(anonymous function)` in the stack trace, e.g.
```js
(() => {
throw new Error('Hello, World!');
})();
```

However, if an arrow function is defined on the right-hand-side of an assignment expression, the engine will take the name on the left-hand-side and use it to set the arrow function's `.name`, e.g.
```js
let test;
test = () => {
throw new Error('Hello, World!');
};
test();
```

When you export an anonymous function using `export default`, this function will appear as an `(anonymous function)` the stack trace. `babel-plugin-transform-export-default-name` plugin transforms the code to assign function a name before it is exported.
`./index.js`
```js
import foo from './foo';
foo();
```
`./foo.js`
```js
import bar from './bar';
export default () => {
bar();
};
```
`./bar.js`
```js
import baz from './baz';
export default () => {
baz();
};
```
`./baz.js`
```js
export default () => {
throw new Error('test');
};
```

## Example
Input file is `./foo.js`.
Input code:
```js
export default () => {};
```
Output code:
```js
let foo = () => {};
export default foo;
```
## Usage
Add to `.babelrc`:
```js
{
"plugins": [
"transform-export-default-name"
]
}
```