-
Notifications
You must be signed in to change notification settings - Fork 282
/
generate.js
139 lines (130 loc) · 5.85 KB
/
generate.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
var dir_mode, fs, log, makeRootDirectory, path, success, util;
log = console.log;
require('colors');
fs = require('fs');
path = require('path');
util = require('util');
dir_mode = 0755;
exports.generate = function(program) {
var appjs, codeExtension, cp, mkdir, mods, name, pacakgejs, selectedFormatters, source, viewExtension, write;
name = program.args[1];
if (name === void 0) {
return console.log("Please provide a name for your application: $> socketstream new <MyAppName>");
}
if (makeRootDirectory(name)) {
program.stylus = true;
source = path.join(__dirname, '/../../new_project');
codeExtension = program.coffee && 'coffee' || 'js';
viewExtension = program.jade && 'jade' || 'html';
selectedFormatters = [];
['coffee', 'jade', 'less', 'stylus'].forEach(function(formatter) {
if (program[formatter]) return selectedFormatters.push(formatter);
});
mkdir = function(dir) {
return fs.mkdirSync(path.join(name, dir), dir_mode);
};
cp = function(src, dest) {
var destination, read, write;
destination = path.join(name, dest || src);
read = fs.createReadStream(path.join(source, src));
write = fs.createWriteStream(destination);
return util.pump(read, write);
};
write = function(fileName, content) {
return fs.writeFileSync(path.join(name, fileName), content, 'utf8');
};
mkdir('/client');
mkdir('/client/code');
mkdir('/client/code/app');
mkdir('/client/code/libs');
mkdir('/client/views');
mkdir('/client/css');
mkdir('/client/css/libs');
mkdir('/client/templates');
mkdir('/client/static');
mkdir('/client/static/images');
mkdir('/server');
mkdir('/server/rpc');
mkdir('/server/middleware');
cp('/.gitignore');
cp('/.nodemonignore');
cp('/README.md');
cp('/client/static/favicon.ico');
cp('/client/code/libs/jquery.min.js');
cp("/client/code/app/entry." + codeExtension);
if (program.minimal) {
cp("/client/views/app.minimal." + viewExtension, "/client/views/app." + viewExtension);
cp("/client/code/app/app.minimal." + codeExtension, "/client/code/app/app." + codeExtension);
cp("/client/css/app.minimal.styl", "/client/css/app.styl");
} else {
cp('/client/static/images/logo.png');
cp("/client/code/app/app.demo." + codeExtension, "/client/code/app/app." + codeExtension);
cp("/server/middleware/example." + codeExtension);
cp("/server/rpc/demo." + codeExtension);
cp('/client/css/libs/reset.css');
cp("/client/css/app.demo.styl", "/client/css/app.styl");
mkdir('/client/templates/chat');
cp("/client/templates/chat/message." + viewExtension);
cp("/client/views/app.demo." + viewExtension, "/client/views/app." + viewExtension);
}
appjs = "// My SocketStream app\n\nvar http = require('http')\n , ss = require('socketstream');\n\n// Define a single-page client\nss.client.define('main', {\n view: 'app." + viewExtension + "',\n css: ['libs', 'app.styl'],\n code: ['libs', 'app'],\n tmpl: '*'\n});\n\n// Serve this client on the root URL\nss.http.route('/', function(req, res){\n res.serveClient('main');\n})\n";
if (selectedFormatters.length > 0) appjs += "\n// Code Formatters\n";
selectedFormatters.forEach(function(name) {
return appjs += "ss.client.formatters.add(require('ss-" + name + "'));\n";
});
appjs += "\n// Use server-side compiled Hogan (Mustache) templates. Others engines available\nss.client.templateEngine.use(require('ss-hogan'));\n\n// Minimize and pack assets if you type: SS_ENV=production node app.js\nif (ss.env == 'production') ss.client.packAssets();\n\n// Start web server\nvar server = http.Server(ss.http.middleware);\nserver.listen(3000);\n";
if (program.repl) {
appjs += "\n// Start Console Server (REPL)\n// To install client: sudo npm install -g ss-console\n// To connect: ss-console <optional_host_or_port>\nvar consoleServer = require('ss-console')(ss);\nconsoleServer.listen(5000);\n";
}
appjs += "\n// Start SocketStream\nss.start(server);";
write('/app.js', appjs);
pacakgejs = "{\n \"name\": \"" + name + "\",\n \"description\": \"An awesome real time application\",\n \"version\": \"0.0.1\",\n \"author\": \"Me <me@mydomain.com>\",\n \"private\": true,\n \"engines\": { \"node\": \">= 0.6.0\" },\n \"dependencies\": {\n";
mods = selectedFormatters.concat(['hogan']);
if (program.repl) mods.push('console');
mods.forEach(function(name, i) {
if (i !== 0) pacakgejs += ",\n";
return pacakgejs += " \"ss-" + name + "\": \"0.1.x\"";
});
pacakgejs += "\n }\n}";
write('/package.json', pacakgejs);
log(("Success! Created app '" + name + "' with:").yellow);
if (program.minimal) {
success("Minimal install (no demo)");
} else {
success("Basic chat demo", "(-m for minimal install)");
}
if (program.coffee) {
success("CoffeeScript example code");
} else {
success("Javascript example code", "(-c if you prefer CoffeeScript)");
}
if (program.jade) {
success("Jade for views");
} else {
success("Plain HTML for views", "(-j if you prefer Jade)");
}
if (program.repl) success("Console Server / REPL");
log("Next, run the following commands:".yellow);
log(" cd " + name);
log(" sudo npm install");
log(" npm link socketstream", " (just until 0.3 is published to npm)".grey);
log("To start your app:".yellow);
return log(" node app.js");
}
};
success = function(name, alternative) {
return log(" ✓".green, name, (alternative || '').grey);
};
makeRootDirectory = function(name) {
try {
fs.mkdirSync(name, dir_mode);
return true;
} catch (e) {
if (e.code === 'EEXIST') {
log("Sorry the '" + name + "' directory already exists. Please choose another name for your app.");
return false;
} else {
throw e;
}
}
};