Allow to output either raw or transformed AST, fix several transformation bugs with... master
authorNick Downing <nick@ndcode.org>
Fri, 14 Jan 2022 11:10:31 +0000 (22:10 +1100)
committerNick Downing <nick@ndcode.org>
Fri, 14 Jan 2022 11:10:54 +0000 (22:10 +1100)
cli.js
jst.js
transform.js

diff --git a/cli.js b/cli.js
index 86e2f25..c05fef6 100755 (executable)
--- a/cli.js
+++ b/cli.js
@@ -8,7 +8,7 @@ commander
   .version('0.1.0', '-v, --version')
   .option('-s, --signature <str>', 'function signature for --wrap', 'async (_require, _pathname, _root)')
   .option('-b, --bare-returns', 'allow return in top level code', false)
-  .option('-o, --output <ast|astring|uglify>', 'output AST, or via astring/UglifyJS', 'astring')
+  .option('-o, --output <ast0|ast1|astring|uglify>', 'output raw or transformed AST, or via astring/UglifyJS', 'astring')
   .option('-i, --indent <n>', 'indent per level (ast/astring only)', '2')
   .option('-j, --initial-indent <n>', 'initial indent (astring only)', '0')
   .option('-c, --compress', 'compress the logic (UglifyJS only)', true)
diff --git a/jst.js b/jst.js
index da88339..6baa7c2 100644 (file)
--- a/jst.js
+++ b/jst.js
@@ -39,22 +39,26 @@ let jst = (text, options) => {
     },
     options || {}
   )
-  let ast = transform.transform(
-    visitors,
-    acorn.parse(
-      text,
-      {
-        allowReturnOutsideFunction: options.bare_returns,
-        ecmaVersion: options.ecma_version
-      }
-    )
+
+  let ast0 = acorn.parse(
+    text,
+    {
+      allowReturnOutsideFunction: options.bare_returns,
+      ecmaVersion: options.ecma_version
+    }
   )
-  if (options.output === 'ast')
-    return JSON.stringify(ast, null, options.ast_options.indent)
+  if (options.output === 'ast0')
+    return JSON.stringify(ast0, null, options.ast_options.indent)
+
+  let ast1 = transform.transform(visitors, ast0)
+  if (options.output === 'ast1')
+    return JSON.stringify(ast1, null, options.ast_options.indent)
+
   if (options.output === 'astring')
-    return astring.generate(ast, options.astring_options)
+    return astring.generate(ast1, options.astring_options)
+
   let render = uglify_js.minify(
-    uglify_js.AST_Node.from_mozilla_ast(ast),
+    uglify_js.AST_Node.from_mozilla_ast(ast1),
     options.uglify_options
   )
   if (render.error)
index d633565..990da52 100644 (file)
@@ -94,8 +94,10 @@ visitors.InterpolateExpression = (node, st, c) => {
   return node
 }
 visitors.ThrowStatement =
-visitors.SpreadElement = (node, st, c) =>
+visitors.SpreadElement = (node, st, c) => {
   node.argument = c(node.argument, st, 'Expression')
+  return node
+}
 visitors.TryStatement = (node, st, c) => {
   node.block = c(node.block, st, 'Statement')
   if (node.handler) node.handler = c(node.handler, st)
@@ -165,8 +167,10 @@ visitors.Pattern = (node, st, c) => {
 }
 visitors.VariablePattern = ignore
 visitors.MemberPattern = skipThrough
-visitors.RestElement = (node, st, c) =>
+visitors.RestElement = (node, st, c) => {
   node.argument = c(node.argument, st, 'Pattern')
+  return node
+}
 visitors.ArrayPattern = (node, st, c) => {
   for (let i = 0; i < node.elements.length; ++i) {
     let elt = node.elements[i]