1 | const path = require('path')
|
2 | const fs = require('fs')
|
3 | const { FirescriptParser, Parser } = require('firescript-parser')
|
4 | const FirescriptConfig = require('firescript-config').FirescriptConfig
|
5 | const FirescriptLinter = require('firescript-linter').FirescriptLinter
|
6 | const FirescriptTranspiler = require('firescript-transpiler').FirescriptTranspiler
|
7 | const JavascriptTranspiler = require('firescript-transpiler').JavascriptTranspiler
|
8 | const esprima = require('esprima')
|
9 |
|
10 | module.exports = {
|
11 | FirescriptParser,
|
12 | FirescriptTranspiler,
|
13 | FirescriptLinter,
|
14 | JavascriptTranspiler,
|
15 | Parser,
|
16 | tokenize (input, opts) {
|
17 | const parser = new FirescriptParser(opts)
|
18 | return parser.tokenize(input)
|
19 | },
|
20 | transpileFile (filename, opts = {}) {
|
21 | const ext = path.extname(filename)
|
22 | opts.type = opts.type || ext === '.fire' ? 'fire' : 'js'
|
23 | return this.transpile(fs.readFileSync(filename, 'utf8'), opts)
|
24 | },
|
25 | transpile (input, opts) {
|
26 | opts = Object.assign({
|
27 | type: 'fire'
|
28 | }, opts || {})
|
29 |
|
30 | let ast
|
31 |
|
32 | if (typeof input === 'string') {
|
33 | if (opts.verbose) console.log(`[TRANSPILER] Transpile source into ${opts.type === 'fire' ? 'Javascript' : 'Firescript'}`)
|
34 | if (opts.type === 'js') {
|
35 | ast = esprima.parseModule(input, {
|
36 | loc: !!opts.location,
|
37 | range: !!opts.range,
|
38 | comment: opts.comments
|
39 | })
|
40 | } else {
|
41 | const parser = new FirescriptParser(opts)
|
42 | ast = parser.parse(input)
|
43 | }
|
44 | } else {
|
45 | if (opts.verbose) console.log(`[TRANSPILER] Transpile AST into ${opts.type === 'fire' ? 'Javascript' : 'Firescript'}`)
|
46 | ast = input
|
47 | }
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 | if (opts.type === 'js') {
|
66 | const transpiler = new FirescriptTranspiler(opts)
|
67 | return transpiler.transpile(ast)
|
68 | } else {
|
69 | const config = new FirescriptConfig(opts)
|
70 | opts.features = config.getConfig('features')
|
71 | const transpiler = new JavascriptTranspiler(opts)
|
72 | return transpiler.transpile(ast)
|
73 | }
|
74 | },
|
75 | parse (input, opts) {
|
76 | opts = opts || {}
|
77 | let ast
|
78 | if (opts.type === 'js') {
|
79 | ast = esprima.parseModule(input, {
|
80 | loc: !!opts.location,
|
81 | range: !!opts.range,
|
82 | comment: opts.comments
|
83 | })
|
84 | } else {
|
85 | const parser = new FirescriptParser(opts)
|
86 | ast = parser.parse(input)
|
87 | }
|
88 | return ast
|
89 | },
|
90 | loadConf (customConf) {
|
91 | console.warn('Firescript.loadConf is deprecated! Use FirescriptConfig module instead')
|
92 | return new FirescriptConfig()
|
93 | },
|
94 | version (print) {
|
95 | const loadVersion = (pkgName) => {
|
96 | try {
|
97 | return `v${require(pkgName).version}`
|
98 | } catch (err) {
|
99 | return 'Not installed'
|
100 | }
|
101 | }
|
102 | const version = loadVersion('../package.json')
|
103 | const builderVersion = loadVersion('firescript-builder/package.json')
|
104 | const parserVersion = loadVersion('firescript-parser/package.json')
|
105 | const transpilerVersion = loadVersion('firescript-transpiler/package.json')
|
106 | const linterVersion = loadVersion('firescript-linter/package.json')
|
107 |
|
108 | if (print) {
|
109 | console.log(`Firescript: ${version}`)
|
110 | console.log(`Firescript Builder: ${builderVersion}`)
|
111 | console.log(`Firescript Parser: ${parserVersion}`)
|
112 | console.log(`Firescript Linter: ${linterVersion}`)
|
113 | console.log(`Firescript Transpiler: ${transpilerVersion}`)
|
114 | }
|
115 |
|
116 | return {
|
117 | firescript: version,
|
118 | 'firescript-builder': builderVersion,
|
119 | 'firescript-parser': parserVersion,
|
120 | 'firescript-linter': linterVersion,
|
121 | 'firescript-transpiler': transpilerVersion
|
122 | }
|
123 | }
|
124 | }
|