index.js 910 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. var codegen = require('escodegen')
  2. var esprima = require('esprima')
  3. var through = require('through')
  4. module.exports = astTransform
  5. function astTransform(transform, opts) {
  6. opts = opts || {}
  7. return function(file) {
  8. var stream = through(write, flush)
  9. var tr = transform(file)
  10. var buffer = []
  11. if (!tr) return through()
  12. return stream
  13. function write(data) { buffer.push(data) }
  14. function flush() {
  15. buffer = buffer.join('')
  16. try {
  17. var ast = esprima.parse(buffer, opts)
  18. } catch(e) {
  19. return stream.emit('error', e)
  20. }
  21. tr(ast, function(err, updated) {
  22. if (err) return stream.emit('error', err)
  23. try {
  24. var code = codegen.generate(updated || ast)
  25. } catch(e) {
  26. return stream.emit('error', e)
  27. }
  28. stream.queue(code.code || code)
  29. stream.queue(null)
  30. })
  31. }
  32. }
  33. }