node-burrito

Walk and transform the javascript AST with rice and beans on the side

  • 所有者: substack/node-burrito
  • 平台:
  • 许可证:
  • 分类:
  • 主题:
  • 喜欢:
    0
      比较:

Github星跟踪图

burrito

Burrito makes it easy to do crazy stuff with the javascript AST.

This is super useful if you want to roll your own stack traces or build a code
coverage tool.

build status

node.wrap("burrito")

examples

microwave

examples/microwave.js

var burrito = require('burrito');

var res = burrito.microwave('Math.sin(2)', function (node) {
    if (node.name === 'num') node.wrap('Math.PI / %s');
});

console.log(res); // sin(pi / 2) == 1

output:

1

wrap

examples/wrap.js

var burrito = require('burrito');

var src = burrito('f() && g(h())\nfoo()', function (node) {
    if (node.name === 'call') node.wrap('qqq(%s)');
});

console.log(src);

output:

qqq(f()) && qqq(g(qqq(h())));

qqq(foo());

methods

var burrito = require('burrito');

burrito(code, cb)

Given some source code and a function trace, walk the ast by expression.

The cb gets called with a node object described below.

If code is an Array then it is assumbed to be an AST which you can generate
yourself with burrito.parse(). The AST must be annotated, so make sure to
burrito.parse(src, false, true).

burrito.microwave(code, context={}, cb)

Like burrito() except the result is run using
vm.runInNewContext(res, context).

node object

node.name

Name is a string that contains the type of the expression as named by uglify.

node.wrap(s)

Wrap the current expression in s.

If s is a string, "%s" will be replaced with the stringified current
expression.

If s is a function, it is called with the stringified current expression and
should return a new stringified expression.

If the node.name === "binary", you get the subterms "%a" and "%b" to play with
too. These subterms are applied if s is a function too: s(expr, a, b).

Protip: to insert multiple statements you can use javascript's lesser-known block
syntax that it gets from C:

if (node.name === 'stat') node.wrap('{ foo(); %s }')

node.node

raw ast data generated by uglify

node.value

node.node.slice(1) to skip the annotations

node.start

The start location of the expression, like this:

{ type: 'name',
  value: 'b',
  line: 0,
  col: 3,
  pos: 3,
  nlb: false,
  comments_before: [] }

node.end

The end location of the expression, formatted the same as node.start.

node.state

The state of the traversal using traverse.

node.source()

Returns a stringified version of the expression.

node.parent()

Returns the parent node or null if the node is the root element.

node.label()

Return the label of the present node or null if there is no label.

Labels are returned for "call", "var", "defun", and "function" nodes.

Returns an array for "var" nodes since var statements can
contain multiple labels in assignment.

install

With npm you can just:

npm install burrito

in the browser

Burrito works in browser with
browserify.

It has been tested against:

  • Internet Explorer 5.5, 6.0, 7.0, 8.0, 9.0
  • Firefox 3.5
  • Chrome 6.0
  • Opera 10.6
  • Safari 5.0

kudos

Heavily inspired by (and previously mostly lifted outright from) isaacs's nifty
tmp/instrument.js thingy from uglify-js.

主要指标

概览
名称与所有者substack/node-burrito
主编程语言JavaScript
编程语言JavaScript (语言数: 1)
平台
许可证
所有者活动
创建于2011-06-04 11:20:26
推送于2019-11-06 17:12:35
最后一次提交2012-05-26 18:08:45
发布数4
最新版本名称0.2.12 (发布于 2012-05-26 18:08:45)
第一版名称0.2.9 (发布于 2011-09-09 05:49:30)
用户参与
星数262
关注者数7
派生数17
提交数81
已启用问题?
问题数10
打开的问题数8
拉请求数2
打开的拉请求数2
关闭的拉请求数3
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?