Allow to output either raw or transformed AST, fix several transformation bugs with...
[jst.git] / jst.js
1 /*
2  * Copyright (C) 2018 Nick Downing <nick@ndcode.org>
3  * SPDX-License-Identifier: MIT
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to
7  * deal in the Software without restriction, including without limitation the
8  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9  * sell copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23
24 let acorn = require('./dist/acorn')
25 let astring = require('astring')
26 let transform = require('./transform')
27 let visitors = require('./visitors')
28 let uglify_js = require('@ndcode/uglify-js')
29
30 let jst = (text, options) => {
31   options = Object.assign(
32     {
33       bare_returns: true,
34       ecma_version: 'latest', // or 11, 12, 13, etc
35       output: 'astring',
36       ast_options: {indent: 2},
37       astring_options: {indent: '  ', startingIndentLevel: 0},
38       uglify_options: {compress: true, mangle: true}
39     },
40     options || {}
41   )
42
43   let ast0 = acorn.parse(
44     text,
45     {
46       allowReturnOutsideFunction: options.bare_returns,
47       ecmaVersion: options.ecma_version
48     }
49   )
50   if (options.output === 'ast0')
51     return JSON.stringify(ast0, null, options.ast_options.indent)
52
53   let ast1 = transform.transform(visitors, ast0)
54   if (options.output === 'ast1')
55     return JSON.stringify(ast1, null, options.ast_options.indent)
56
57   if (options.output === 'astring')
58     return astring.generate(ast1, options.astring_options)
59
60   let render = uglify_js.minify(
61     uglify_js.AST_Node.from_mozilla_ast(ast1),
62     options.uglify_options
63   )
64   if (render.error)
65     throw render.error
66   return render.code
67 }
68
69 module.exports = jst