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?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?