AST helper to transform source code.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
example fix(example): update example Mar 6, 2016
src feat(esprima): support sourceType option Jun 15, 2016
test
.babelrc breaking change: update dependencies Mar 6, 2016
.gitignore initial commit Aug 8, 2015
.travis.yml
LICENSE
README.md Update README.md Mar 6, 2016
package.json

README.md

ast-source Build Status

AST helper to transform source code.

On purpose make you focus to develop AST transforming function.

Installation

npm install ast-source

Feature

  • Automatically select JavaScript parser like esprima or babel(babylon)
    • It make you focus to develop AST transforming function.
  • SourceMap support is first class.
  • Always get clean AST if you want.
    • AST transforming function pollute AST's meta info(range, loc etc..).
    • ASTSource#transformStrict provide always clean AST by options.

Example

Usage

API

ASTSource(code, options)

ASTSource's input is source code, output is ASTOutput.

var source = new ASTSource(code, options)

All options are optional. often set filePath as options.

/**
 * @namespace
 * @type {Object} ASTSourceOptions
 * @property {string} ASTSourceOptions.filePath? path to source code
 * @property {string} ASTSourceOptions.sourceRoot? source root path to source code
 * @property {parserType} ASTSourceOptions.parserType? what parser is used
 * @property {boolean} ASTSourceOptions.esprimaTokens? tokens
 * @property {boolean} ASTSourceOptions.range? range
 * @property {boolean} ASTSourceOptions.loc? location
 * @property {boolean} ASTSourceOptions.comment?
 */
const defaultOptions = {
    filePath: null,
    disableSourceMap: false,
    parserType: null,
    esprimaTokens: true,
    loc: true,
    range: true,
    comment: true
};
value(): AST

Returns current AST

cloneValue(): AST

Return current AST that is espurifyed.

transform(fn)

Transform current AST by fn.

function transformFn(AST){
   return modify(AST)
}
var source = new ASTSource(code, options)
source.transform(transformFn);
transformStrict(fn)

Transform AST by fn after healing the AST.

re-calculate range, loc, comment the AST and transform.

output(): ASTOutput

Returns ASTOutput

ASTOutput

ASTOutput's input is source code, output are source code and source-map.

code: string

Returns source code of the results.

map: Object

Returns source map of the results.

codeWithMap: string

Returns source code that include base64ed comment of source map.

Example

See example.

Run npm test on example/

import ASTSource from "ast-source"
import estraverse from "estraverse"
import fs from "fs"

function transform(AST) {
    var replaced = {
        "type": "Literal",
        "value": 42,
        "raw": "42"
    };
    return estraverse.replace(AST, {
        enter: function (node) {
            if (node.type === estraverse.Syntax.Literal) {
                return replaced;
            }
        }
    });
}

var source = new ASTSource(fs.readFileSync("./input.js", "utf-8"), {
    filePath: "./input.js"
});
var output = source.transform(transform).output();
console.log(output.code);// => "var a = 42;"
console.dir(output.map.toString()); // => source map
fs.writeFileSync("./output.js", output.codeWithMap, "utf-8");

Tests

npm test

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

License

MIT