UNPKG

4.17 kBJavaScriptView Raw
1const path = require('path')
2const fs = require('fs')
3const { FirescriptParser, Parser } = require('firescript-parser')
4const FirescriptConfig = require('firescript-config').FirescriptConfig
5const FirescriptLinter = require('firescript-linter').FirescriptLinter
6const FirescriptTranspiler = require('firescript-transpiler').FirescriptTranspiler
7const JavascriptTranspiler = require('firescript-transpiler').JavascriptTranspiler
8const esprima = require('esprima')
9
10module.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 // if (opts.linting && opts.type === 'fire') {
50 // const linter = new FirescriptLinter()
51 // const lintSession = linter.lint(ast)
52 // if (lintSession.status === 'failed') {
53 // lintSession.exceptions.forEach((exception) => {
54 // const location = exception.location
55 // ? `in file ${colorfy.grey(file)} at line ${colorfy.grey(exception.location[0])}` : ''
56 // console.log(
57 // `🔥${exception.message}`,
58 // `(${colorfy.red(exception.exception)})`,
59 // location
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}