1 | var project = require('../lib/project.js');
|
2 |
|
3 | var jsonHandle = require('./jsonHandle.js');
|
4 | var dataApiHandle = require('./dataApiHandle.js');
|
5 | var debug = require('debug')('clam:server');
|
6 | var config = require('./config.js');
|
7 | var _ = require('underscore');
|
8 | var fs = require("fs");
|
9 | var path = require("path");
|
10 | var util = require("util");
|
11 | var HOST_NAME = 'clam.com';
|
12 | var inspector = require('condenser')(HOST_NAME);
|
13 | var doji = require('doji');
|
14 | var flexCombo = require("flex-combo");
|
15 | var essi = require("essi");
|
16 |
|
17 | exports = 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 | };
|