1 | 'use strict';
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | class 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 |
|
34 | for(let i in option){
|
35 | config[i] = option[i];
|
36 | };
|
37 |
|
38 |
|
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 |
|
128 | module.exports = Jsx2js;
|