UNPKG

6.7 kBJavaScriptView Raw
1let File = require("../base/lib/file");
2let Path = require("path");
3let util = require("./../base/util");
4let opn = require("opn");
5let ora = require('ora');
6
7let connected = false;
8let messageQueue = {
9 listeners: [],
10 subscribe(fn) {
11 this.listeners.push(fn);
12 return this;
13 },
14 add(info) {
15 this.listeners.forEach(fn => {
16 fn(info);
17 });
18 return this;
19 }
20};
21
22function runDev() {
23 util.showTips();
24 let waitTime = 5000;
25 let projectPath = Path.resolve(__dirname, "./../../../");
26 let express = require(Path.resolve(projectPath, "./node_modules/express"));
27 let packagePath = Path.resolve(projectPath, "./package.json");
28 let packageInfo = JSON.parse(new File(packagePath).readSync());
29 if (!packageInfo["ada-develop"]) {
30 packageInfo["ada-develop"] = {
31 appPath: "./app/app.js"
32 };
33 } else {
34 packageInfo["ada-develop"] = Object.assign({
35 appPath: "./app/app.js"
36 }, packageInfo["ada-develop"]);
37 }
38 let appPath = Path.resolve(packagePath, "./../", packageInfo["ada-develop"].appPath);
39 if (!new File(appPath).isExists()) {
40 appPath = Path.resolve(projectPath, "./app.js");
41 }
42 util.getAppInfo(appPath).then(appInfo => {
43 let ps = Promise.resolve();
44 if (appInfo.proxy && appInfo.proxy.server) {
45 let proxy = new File(Path.resolve(projectPath, "./node_modules/http-proxy-middleware"));
46 if (!proxy.isExists()) {
47 ps = ps.then(() => {
48 return new Promise((resolve, reject) => {
49 let name = "http-proxy-middleware";
50 let spinner = ora({
51 color: "yellow",
52 text: `INSTALL MODULE [ ${name} ]`
53 }).start();
54 let args = ["install", name, "--save-dev"];
55 require("child_process").exec(`npm ${args.join(" ")}`, {
56 encoding: "utf-8",
57 cwd: projectPath
58 }, (error, stdout, stderr) => {
59 if (error) {
60 spinner.fail(`INSTALL MODULE [ ${name} ]`);
61 console.log(`Please run > npm install`.red, `${name}`.white, `to install the module`.red);
62 reject(name);
63 } else {
64 spinner.succeed(`INSTALL MODULE [ ${name} ]`);
65 resolve(name);
66 }
67 });
68 });
69 });
70 }
71 }
72 ps.then(() => {
73 if (!appInfo.server) {
74 appInfo.server = {
75 protocol: "http",
76 host: "localhost",
77 port: "8080",
78 serverPath: "./server.js"
79 };
80 }
81 let port = appInfo.server.port || 8080;
82 let host = appInfo.server.host || "localhost";
83 let distPath = Path.resolve(appPath, "./../", appInfo.dist_path);
84 let serverPath = Path.resolve(projectPath, (appInfo.server.serverPath || "./server.js"));
85 let app = null;
86 if (!new File(serverPath).isExists()) {
87 app = new express();
88 } else {
89 app = require(serverPath);
90 }
91 app.use(express.static(distPath));
92 app.get("/", (req, res) => {
93 res.send(require("fs").readFileSync(Path.resolve(distPath, "./index.html"), "utf-8"));
94 });
95 if (appInfo.proxy && appInfo.proxy.server) {
96 let proxyMiddleWare = require(Path.resolve(projectPath, "./node_modules/http-proxy-middleware"));
97 app.use(appInfo.proxy.path, proxyMiddleWare(Object.assign({
98 target: "",
99 changeOrigoin: true
100 }, appInfo.proxy.option, {
101 target: appInfo.proxy.server
102 })));
103 }
104 app.use("/ada/sse", (req, res) => {
105 connected = true;
106 res.writeHead(200, {
107 'Connection': 'keep-alive',
108 'Content-Type': 'text/event-stream',
109 'Cache-Control': 'no-cache'
110 });
111 res.write(`retry: ${waitTime}\n`);
112 res.write("id: " + Date.now() + "\ndata:{}\n\n");
113 messageQueue.subscribe((info) => {
114 res.write("id: " + Date.now() + "\ndata: " + JSON.stringify(info) + "\n\n");
115 });
116 });
117
118 app.get('*', function (req, res) {
119 res.send(require("fs").readFileSync(Path.resolve(distPath, "./index.html"), "utf-8"));
120 });
121
122 require("./../index").develop(appPath, ({type, files, map, log}) => {
123 messageQueue.add({type, files, map, log});
124 }).then(() => {
125 app.listen(port, () => {
126 console.log("");
127 console.log(` ▶ SERVER RUNNING LOCALHOST PORT [: ${port}] `.yellow);
128 let desc = ` now try to open the page...`;
129 process.stderr.write(desc.grey);
130 process.stderr.cursorTo(desc.length);
131 let count = waitTime / 1000;
132 let num = 0;
133 let intevalId = setInterval(() => {
134 num += 1;
135 process.stderr.clearLine();
136 process.stderr.cursorTo(0);
137 if (connected) {
138 clearInterval(intevalId);
139 messageQueue.add({type: "reload"});
140 process.stderr.write(` page is opened,reload it`.grey);
141 process.stderr.write(`\n`);
142 } else if (num === count) {
143 clearInterval(intevalId);
144 opn(`http://${host}:${port}`);
145 process.stderr.write(` can not found opened page,open it`.grey);
146 process.stderr.write(`\n`);
147 } else {
148 let rdesc = ` now check [${num}] times ...`;
149 process.stderr.write(rdesc.grey);
150 process.stderr.cursorTo(rdesc.length);
151 }
152 }, 1000);
153 });
154 });
155 });
156 return ps;
157 });
158}
159
160runDev();
\No newline at end of file