babel/packages/babel-generator
Sam Goldman f0283572a5 Support Flow's proto modifier syntax for declared classes (#7978)
<!--
Before making a PR please make sure to read our contributing guidelines
https://github.com/babel/babel/blob/master/CONTRIBUTING.md

For issue references: Add a comma-separated list of a [closing word](https://help.github.com/articles/closing-issues-via-commit-messages/) followed by the ticket number fixed by the PR. It should be underlined in the preview if done correctly.
-->

| Q                        | A <!--(Can use an emoji 👍) -->
| ------------------------ | ---
| Fixed Issues?            | <!-- remove the (`) quotes to link the issues -->
| Patch: Bug Fix?          |
| Major: Breaking Change?  | No
| Minor: New Feature?      | Yes
| Tests Added + Pass?      | Yes
| Documentation PR         | <!-- If so, add `[skip ci]` to your commit message to skip CI -->
| Any Dependency Changes?  |
| License                  | MIT

See eb815be907 for more information about this feature.
    
The proto modifier indicates that a property declared using `x: T` syntax is actually present on the prototype object of the class, rather than an own property.
    
The proto and static modifiers are mutually exclusive, as class declarations don't simultaneously define the static prototype object, as they do the instance prototype.
    
This syntax is only supported on declared classes, not object types, interfaces, or runtime class declarations, and as such should only appear in library definitions.
2018-05-25 15:40:56 -05:00
..
2017-03-25 21:46:16 -04:00
2018-05-25 09:00:02 -07:00
2018-05-19 00:12:26 -04:00

@babel/generator

Turns the babel AST into code.

Install

npm install --save-dev @babel/generator

Usage

import {parse} from '@babel/parser';
import generate from '@babel/generator';

const code = 'class Example {}';
const ast = parse(code);

const output = generate(ast, { /* options */ }, code);

Options

Options for formatting output:

name type default description
auxiliaryCommentBefore string Optional string to add as a block comment at the start of the output file
auxiliaryCommentAfter string Optional string to add as a block comment at the end of the output file
shouldPrintComment function opts.comments Function that takes a comment (as a string) and returns true if the comment should be included in the output. By default, comments are included if opts.comments is true or if opts.minifed is false and the comment contains @preserve or @license
retainLines boolean false Attempt to use the same line numbers in the output code as in the source code (helps preserve stack traces)
retainFunctionParens boolean false Retain parens around function expressions (could be used to change engine parsing behavior)
comments boolean true Should comments be included in output
compact boolean or 'auto' opts.minified Set to true to avoid adding whitespace for formatting
minified boolean false Should the output be minified
concise boolean false Set to true to reduce whitespace (but not as much as opts.compact)
filename string Used in warning messages
jsonCompatibleStrings boolean false Set to true to run jsesc with "json": true to print "\u00A9" vs. "©";

Options for source maps:

name type default description
sourceMaps boolean false Enable generating source maps
sourceRoot string A root for all relative URLs in the source map
sourceFileName string The filename for the source code (i.e. the code in the code argument). This will only be used if code is a string.

AST from Multiple Sources

In most cases, Babel does a 1:1 transformation of input-file to output-file. However, you may be dealing with AST constructed from multiple sources - JS files, templates, etc. If this is the case, and you want the sourcemaps to reflect the correct sources, you'll need to pass an object to generate as the code parameter. Keys should be the source filenames, and values should be the source content.

Here's an example of what that might look like:

import {parse} from '@babel/parser';
import generate from '@babel/generator';

const a = 'var a = 1;';
const b = 'var b = 2;';
const astA = parse(a, { sourceFilename: 'a.js' });
const astB = parse(b, { sourceFilename: 'b.js' });
const ast = {
  type: 'Program',
  body: [].concat(astA.program.body, astB.program.body)
};

const { code, map } = generate(ast, { sourceMaps: true }, {
  'a.js': a,
  'b.js': b
});

// Sourcemap will point to both a.js and b.js where appropriate.