読者です 読者をやめる 読者になる 読者になる

なっく日報

技術やら生活やらのメモ

esprima→escodegenで元のソースに復元されるか試してみた

escodegenを触ったことがなかったので試してみました。

変換コード

元のファイル(original.js

'use strict';
var fs = require('fs');
var esprima = require('esprima');
var escodegen = require('escodegen');

var original = fs.readFileSync('./original.js', 'utf8');

var ast = esprima.parse(original, {
  range: true,
  tokens: true,
  comment: true,
});
ast = escodegen.attachComments(ast, ast.comments, ast.tokens);

var generated = escodegen.generate(ast, {
  comment: true,
  sourceCode: original,
  format: {
    preserveBlankLines: true,
  }
});

fs.writeFileSync('generated.js', generated, 'utf8');

// コメント
setTimeout(function() {
  console.log('aaa');
}, 1000);

変換後(generated.js

npm i -g escodegen esprima
node original.js
'use strict';
var fs = require('fs');
var esprima = require('esprima');
var escodegen = require('escodegen');

var original = fs.readFileSync('./original.js', 'utf8');

var ast = esprima.parse(original, {
    range: true,
    tokens: true,
    comment: true
});
ast = escodegen.attachComments(ast, ast.comments, ast.tokens);

var generated = escodegen.generate(ast, {
    comment: true,
    sourceCode: original,
    format: { preserveBlankLines: true }
});

fs.writeFileSync('generated.js', generated, 'utf8');

// コメント
setTimeout(function () {
    console.log('aaa');
}, 1000);

結果

ほぼ、同じに見えますが、ケツカンマとか、無名関数の()のスペースとか微妙に変わっています。

続く

時間がないので、今日はここまで。多分続く。