replace-log.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. var path = require('path')
  2. , fs = require('fs')
  3. , redeyed = require('..')
  4. , vm = require('vm')
  5. ;
  6. var samplePath = path.join(__dirname, 'sources', 'log.js')
  7. , origCode = fs.readFileSync(samplePath, 'utf-8')
  8. , kinds = ['silly', 'info', 'warn', 'error' ]
  9. ;
  10. function replaceConsole(s, info) {
  11. var code = info.code
  12. , idx = info.tokenIndex
  13. , tokens = info.tokens
  14. , next = tokens[idx + 1].value
  15. , kind = tokens[idx + 2].value
  16. , openParen = tokens[idx + 3].value
  17. , firstArgTkn = tokens[idx + 4]
  18. , argIdx = idx + 3
  19. , open
  20. , tkn
  21. ;
  22. if (kind === 'log') kind = 'silly';
  23. // not a console.xxx(...) statement? -> just return original
  24. if (next !== '.' || !~kinds.indexOf(kind) || openParen !== '(') return s;
  25. // skip past arguments to console.xxx all args from ( to )
  26. open = 1;
  27. while (open) {
  28. tkn = tokens[++argIdx];
  29. // count open parens vs. closed ones to handle things like console.log(new Error('..'));
  30. if (tkn.value === '(') open++;
  31. if (tkn.value === ')') open--;
  32. }
  33. // tkn now is the last closing paren
  34. var argsIncludingClosingParen = code.slice(firstArgTkn.range[0], tkn.range[1])
  35. , result = 'log.' + kind + '("main-logger", ' + argsIncludingClosingParen;
  36. // tell redeyed to skip the entire console.xxx(..) statement since we are replacing it all
  37. return { replacement: result, skipPastToken: tkn };
  38. }
  39. function transformAndRun () {
  40. var config = {
  41. Identifier: { console: replaceConsole }
  42. }
  43. , code = redeyed(origCode, config).code
  44. , context = vm.createContext({ require: require });
  45. console.log('Original code:\n', origCode);
  46. console.log('\nlog calls replaced:\n', code);
  47. console.log('\nLets run it:');
  48. vm.runInContext(code, context, 'transformed-log.vm');
  49. }
  50. transformAndRun();