1 | let File = require("../base/lib/file");
|
2 | let Path = require("path");
|
3 | let util = require("./../base/util");
|
4 | let opn = require("opn");
|
5 | let ora = require('ora');
|
6 |
|
7 | let connected = false;
|
8 | let 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 |
|
22 | function 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 |
|
160 | runDev(); |
\ | No newline at end of file |