Index: node_modules/vulcanize/node_modules/uglify-js/test/mozilla-ast.js |
diff --git a/node_modules/vulcanize/node_modules/uglify-js/test/mozilla-ast.js b/node_modules/vulcanize/node_modules/uglify-js/test/mozilla-ast.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..026286761e48b5c6f0fcb4cb798a2e7b93427471 |
--- /dev/null |
+++ b/node_modules/vulcanize/node_modules/uglify-js/test/mozilla-ast.js |
@@ -0,0 +1,103 @@ |
+// Testing UglifyJS <-> SpiderMonkey AST conversion |
+// through generative testing. |
+ |
+var UglifyJS = require(".."), |
+ escodegen = require("escodegen"), |
+ esfuzz = require("esfuzz"), |
+ estraverse = require("estraverse"), |
+ prefix = Array(20).join("\b") + " "; |
+ |
+// Normalizes input AST for UglifyJS in order to get correct comparison. |
+ |
+function normalizeInput(ast) { |
+ return estraverse.replace(ast, { |
+ enter: function(node, parent) { |
+ switch (node.type) { |
+ // Internally mark all the properties with semi-standard type "Property". |
+ case "ObjectExpression": |
+ node.properties.forEach(function (property) { |
+ property.type = "Property"; |
+ }); |
+ break; |
+ |
+ // Since UglifyJS doesn"t recognize different types of property keys, |
+ // decision on SpiderMonkey node type is based on check whether key |
+ // can be valid identifier or not - so we do in input AST. |
+ case "Property": |
+ var key = node.key; |
+ if (key.type === "Literal" && typeof key.value === "string" && UglifyJS.is_identifier(key.value)) { |
+ node.key = { |
+ type: "Identifier", |
+ name: key.value |
+ }; |
+ } else if (key.type === "Identifier" && !UglifyJS.is_identifier(key.name)) { |
+ node.key = { |
+ type: "Literal", |
+ value: key.name |
+ }; |
+ } |
+ break; |
+ |
+ // UglifyJS internally flattens all the expression sequences - either |
+ // to one element (if sequence contains only one element) or flat list. |
+ case "SequenceExpression": |
+ node.expressions = node.expressions.reduce(function flatten(list, expr) { |
+ return list.concat(expr.type === "SequenceExpression" ? expr.expressions.reduce(flatten, []) : [expr]); |
+ }, []); |
+ if (node.expressions.length === 1) { |
+ return node.expressions[0]; |
+ } |
+ break; |
+ } |
+ } |
+ }); |
+} |
+ |
+module.exports = function(options) { |
+ console.log("--- UglifyJS <-> Mozilla AST conversion"); |
+ |
+ for (var counter = 0; counter < options.iterations; counter++) { |
+ process.stdout.write(prefix + counter + "/" + options.iterations); |
+ |
+ var ast1 = normalizeInput(esfuzz.generate({ |
+ maxDepth: options.maxDepth |
+ })); |
+ |
+ var ast2 = |
+ UglifyJS |
+ .AST_Node |
+ .from_mozilla_ast(ast1) |
+ .to_mozilla_ast(); |
+ |
+ var astPair = [ |
+ {name: 'expected', value: ast1}, |
+ {name: 'actual', value: ast2} |
+ ]; |
+ |
+ var jsPair = astPair.map(function(item) { |
+ return { |
+ name: item.name, |
+ value: escodegen.generate(item.value) |
+ } |
+ }); |
+ |
+ if (jsPair[0].value !== jsPair[1].value) { |
+ var fs = require("fs"); |
+ var acorn = require("acorn"); |
+ |
+ fs.existsSync("tmp") || fs.mkdirSync("tmp"); |
+ |
+ jsPair.forEach(function (item) { |
+ var fileName = "tmp/dump_" + item.name; |
+ var ast = acorn.parse(item.value); |
+ fs.writeFileSync(fileName + ".js", item.value); |
+ fs.writeFileSync(fileName + ".json", JSON.stringify(ast, null, 2)); |
+ }); |
+ |
+ process.stdout.write("\n"); |
+ throw new Error("Got different outputs, check out tmp/dump_*.{js,json} for codes and ASTs."); |
+ } |
+ } |
+ |
+ process.stdout.write(prefix + "Probability of error is less than " + (100 / options.iterations) + "%, stopping.\n"); |
+}; |