UNPKG

5.38 kBJavaScriptView Raw
1var project = require('../lib/project.js');
2
3var jsonHandle = require('./jsonHandle.js');
4var dataApiHandle = require('./dataApiHandle.js');
5var debug = require('debug')('clam:server');
6var config = require('./config.js');
7var _ = require('underscore');
8var fs = require("fs");
9var path = require("path");
10var util = require("util");
11var HOST_NAME = 'clam.com';
12var inspector = require('condenser')(HOST_NAME);
13var doji = require('doji');
14var flexCombo = require("flex-combo");
15var essi = require("essi");
16
17exports = module.exports = function (needInject, basePath, port, sport) {
18 var config_dir = ".clam";
19 ["buildhistory", "mock", "gconfig"].forEach(function (i) {
20 var file = path.join(process.cwd(), config_dir, i+".json");
21 if (fs.existsSync(file)) {
22 fs.unlink(file);
23 }
24 });
25
26 var absConfDir = path.join(process.cwd(), config_dir);
27 if (!fs.existsSync(absConfDir)) {
28 fs.mkdirSync(absConfDir);
29 }
30
31 var gitignore = path.join(process.cwd(), ".gitignore");
32 var ig = fs.existsSync(gitignore) ? fs.readFileSync(gitignore) : null;
33 if (!ig || !/\.cache/.test(ig)) {
34 fs.appendFile(gitignore, "\n.cache/\n", function () {
35 fs.chmod(gitignore, 0777);
36 });
37 }
38 if (!ig || !/node_modules/.test(ig)) {
39 fs.appendFile(gitignore, "\nnode_modules/\n", function () {
40 fs.chmod(gitignore, 0777);
41 });
42 }
43
44 var prjInfo = project();
45
46 var ports = [80, 443];
47 if (typeof prjInfo.port == "number" || typeof prjInfo.port == "string") {
48 ports[0] = parseInt(prjInfo.port);
49 }
50 else if (util.isArray(prjInfo.port)) {
51 ports = prjInfo.port;
52 }
53
54 var hostsInfo = prjInfo.hosts;
55 if (typeof hostsInfo != "undefined") {
56 hostsInfo += '\n127.0.0.1 ' + HOST_NAME;
57 var hostsArr = hostsInfo.split(/[\n\r]{1,}/g);
58 var hostsObj = {};
59 var tmp;
60 for (var i = 0; i < hostsArr.length; i++) {
61 tmp = hostsArr[i].split(/\s{1,}/g);
62 if (tmp.length >= 2) {
63 if (!hostsObj[tmp[0]]) {
64 hostsObj[tmp[0]] = [];
65 }
66 for (var j = 1; j < tmp.length; j++) {
67 hostsObj[tmp[0]].push(tmp[j]);
68 }
69 }
70 }
71 var fhConfFile = path.join(absConfDir, "flex-hosts.json");
72 if (!fs.existsSync(fhConfFile)) {
73 fs.writeFileSync(fhConfFile, JSON.stringify(hostsObj, null, 2));
74 fs.chmod(fhConfFile, 0777);
75 }
76 }
77
78 var essiConf = essi.config;
79 var essiFlag = false;
80 var cdnPath = prjInfo.cdnPath;
81 if (cdnPath) {
82 essiConf.cdnPath = cdnPath;
83 essiFlag = true;
84 }
85 var essiCharset = prjInfo.charset;
86 if (essiCharset && essiCharset[0]) {
87 essiConf.charset = essiCharset[0];
88 essiFlag = true;
89 }
90
91 var essiConfFile = path.join(absConfDir, "essi.json");
92 if (essiFlag && !fs.existsSync(essiConfFile)) {
93 fs.writeFileSync(essiConfFile, JSON.stringify(essiConf, null, 2));
94 fs.chmod(essiConfFile, 0777);
95 }
96
97 var fcConf = flexCombo.config;
98 var fcFlag = false;
99 var fcCharset = prjInfo.charset;
100 if (fcCharset && fcCharset[1]) {
101 fcConf.charset = essiCharset[1];
102 fcFlag = true;
103 }
104 var fcUrls = prjInfo.urls;
105 if (fcUrls) {
106 fcConf.urls = fcUrls;
107 fcFlag = true;
108 }
109 var fcdefine = prjInfo.define;
110 if (fcdefine) {
111 if (!fcConf['dac/tpl']) {
112 fcConf['dac/tpl'] = {filter:{}};
113 }
114 fcConf['dac/tpl'].define = fcdefine;
115 fcFlag = true;
116 }
117 var fcanonymous = prjInfo.anonymous;
118 if (fcanonymous) {
119 if (!fcConf['dac/tpl']) {
120 fcConf['dac/tpl'] = {filter:{}};
121 }
122 fcConf['dac/tpl'].anonymous = fcanonymous;
123 fcFlag = true;
124 }
125 var fcConfFile = path.join(absConfDir, "flex-combo.json");
126 if (fcFlag && !fs.existsSync(fcConfFile)) {
127 fs.writeFileSync(fcConfFile, JSON.stringify(fcConf, null, 2));
128 fs.chmod(fcConfFile, 0777);
129 }
130
131 var plugBase = require("plug-base");
132 plugBase.root(basePath ? basePath : "src");
133 plugBase.config(config_dir);
134 plugBase
135 .use(doji.PACHandle())
136 .use(inspector)
137 .use(dataApiHandle())
138 .use(jsonHandle.json(prjInfo))
139 .plug(require("flex-combo"), {filter:{
140 '\\/\\$CLAM_VER\\$': ''
141 }})
142 .plug(require("essi"))
143 .listen(port || ports[0] || 80, sport || ports[1] || 443);
144
145 var clamApp = plugBase.app;
146 var clamServer = plugBase.http;
147 var proxyInfo = _.extend({
148 port: 9000,
149 dojiDir: '',
150 urls: {},
151 hosts: {},
152 filters: {},
153 parsers: [],
154 timestamp: false,
155 widgets: {}
156 }, prjInfo.proxy);
157
158 if (needInject) {
159 proxyInfo.parsers.unshift(function (buffer, proxyRes, req) {
160 debug('Now inject the inspector for mobile');
161 return inspector.inject(buffer, req.serverIP);
162 });
163 inspector.connect(clamServer);
164 }
165
166 var proxyApp = doji(proxyInfo);
167 config.on('projectChange', function () {
168 proxyApp.config(config.get('project').proxy || {});
169 });
170 proxyApp.listen(proxyInfo.port);
171 proxyApp.on('req:start', function (req) {
172 console.log('=> Proxy request method: \x1B[32m%s\x1B[39m path: \x1B[34m%s\x1B[39m', req.method, req.url);
173 });
174 proxyApp.on('proxy:circle', clamApp);
175 proxyApp.on('proxy:local', clamApp);
176
177 var ignore = ["name", "charset", "dataApi", "port", "json"];
178 for (var k in prjInfo) {
179 if (ignore.indexOf(k) == -1) {
180 delete prjInfo[k];
181 }
182 }
183 var prjFile = path.join(process.cwd(), config_dir, "project.json");
184 fs.writeFile(prjFile, JSON.stringify(prjInfo, null, 2), function () {
185 fs.chmod(prjFile, 0777);
186 });
187};