UNPKG

4.23 kBJavaScriptView Raw
1'use strict';
2
3/**
4 * tsx、ts编译为jsx、js
5 *
6 * @class Jsx2js
7 * {
8 * src:'', <string> 源文件路径
9 * dist:'', <string> 输出路径
10 * debug:true [boolean] 默认:true,debug模式将生成调试信息
11 * }
12 */
13class Jsx2js{
14 constructor(option){
15 const _ts = this;
16
17 option = option || {};
18
19 let m = _ts.m = {
20 fs:require('fs-extra'),
21 path:require('path'),
22 babel:require("babel-core"),
23 preset_react:require("babel-preset-react"),
24 preset_es2015:require("babel-preset-es2015"),
25 preset_stage_0:require("babel-preset-stage-0"),
26 hot_loader:require("./babel_plugin_react_hot_loader"),
27 syntax_jsx:require("babel-plugin-syntax-jsx"),
28 transform_react_jsx:require("babel-plugin-transform-react-jsx"),
29 pathInfo:require('./getPathInfo') //获取目标路径信息
30 },
31 config = _ts.config = {};
32
33 //配置写入到_ts.config
34 for(let i in option){
35 config[i] = option[i];
36 };
37
38 //默认开启debug模式
39 config.debug = config.debug === undefined ? true : config.debug;
40
41 return new Promise((resolve,reject)=>{
42 //检查文件是否为有效的类型
43 if(m.pathInfo(config.src).extension === '.jsx'){
44 try {
45 _ts.init().then(v => {
46 resolve(v);
47 }).catch(e => {
48 reject(e);
49 });
50 } catch (error) {
51 reject({
52 status:'error',
53 msg:`初始化失败 ${m.path.join(fwsPath,'lib','jsx2js.js')}`,
54 info:error
55 });
56 };
57 }else{
58 reject({
59 status:'error',
60 msg:typeof config.src === 'string' ? `${config.src} 不是有效的Jsx文件` : `参数传入错误`
61 });
62 };
63 });
64 }
65 init(){
66 const _ts = this,
67 m = _ts.m,
68 config = _ts.config;
69
70 let render = (resolve,reject)=>{
71 let result;
72 try {
73 let presets = [m.preset_react,m.preset_stage_0],
74 plugins = [m.syntax_jsx,m.transform_react_jsx],
75 outMap = false;
76
77 if(config.debug){
78 plugins.push(m.hot_loader);
79 outMap = 'inline';
80 };
81
82 result = m.babel.transformFileSync(config.src,{
83 presets:presets,
84 plugins:plugins,
85 sourceMaps:outMap
86 });
87 } catch (err) {
88 reject({
89 status:'error',
90 msg:`编译出错 ${config.src}`,
91 info:err
92 });
93 };
94
95 //将结果写入文件
96 let distDir = m.path.dirname(config.dist);
97 m.fs.ensureDir(distDir,(err)=>{
98 if(err){
99 reject({
100 status:'error',
101 msg:`创建失败 ${distDir}`,
102 info:err
103 });
104 }else{
105 try {
106 m.fs.writeFileSync(config.dist,result.code);
107 resolve({
108 status:'success',
109 msg:`写入 ${config.dist}`,
110 distPath:config.dist,
111 data:result.code
112 });
113 } catch (err) {
114 reject({
115 status:'error',
116 msg:`写入失败 ${config.dist}`,
117 distPath:config.dist,
118 info:err
119 });
120 };
121 };
122 });
123 };
124 return new Promise(render);
125 }
126}
127
128module.exports = Jsx2js;