UNPKG

1.92 kBtext/coffeescriptView Raw
1util = require "util"
2esprima = require "esprima"
3escodegen = require "escodegen"
4config = require "./config"
5kit = require "./kit"
6{Scope} = require "./scope"
7require "./stmt"
8require "./par"
9fs = require "fs"
10root = module.exports
11findup = require("findup").sync
12path = require("path")
13
14defaults =
15 loc: true
16 range: true
17 token: true
18 comment: true
19
20root.FILE_EXTENSIONS =
21 ".mjs": {profile: "minimal"}
22 ".json": false
23
24defaults =
25 parser:
26 loc: true
27 range: true
28 token: true
29 comment: true
30 transform: {}
31
32CONFIG_NAME = "mfjs-config.json"
33
34convOptions = (v,fn) ->
35 v = {} unless v?
36 v = {} if v is true
37 v = {profile:v} if v.substr?
38 v = kit.merge {}, defaults, v
39 fn ?= v.transform.filename
40 if fn?
41 v.parser.source = v.transform.filename = fn
42 try
43 f = findup(path.dirname(fn), CONFIG_NAME)
44 console.log('using config #{f}') if config.versbose
45 catch e
46 if config.verbose
47 console.log('looking for #{CONFIG_NAME} failed: #{e}')
48 kit.merge(v, require(path.join(f,CONFIG_NAME))) if f?
49 v
50
51root.compile = compile = (str, opts, fn) ->
52 opts = convOptions opts, fn
53 ast = esprima.parse str, opts.parser
54 nast = transform(ast,opts)
55 escodegen.generate nast, opts.printer
56
57root.compileFile = (fn, opts) ->
58 txt = fs.readFileSync fn, "utf8"
59 opts = convOptions(opts,fn)
60 opts.parse ?= {}
61 compile(txt, opts)
62
63root.parse = (str, opts) ->
64 esprima.parse str, opts
65
66root.print = (str) ->
67 ast = root.parse str
68 @pretty ast
69
70root.pretty = (ast, opts) ->
71 escodegen.generate ast, convOptions(opts).printer
72
73root.transform = transform = (ast,opts) ->
74 oldConfig = kit.merge({}, config)
75 opts ?= {}
76 try
77 kit.merge(config, opts.transform) if opts.transform?
78 ctx = new Scope()
79 res = ctx.prog(ast,opts)
80 res.type = "Program"
81 return res
82 finally
83 for i of config
84 delete config[i]
85 kit.merge(config,oldConfig)
86