sim 1.0.17 → 2.0.0-dev.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,249 +0,0 @@
1
- 'use strict';
2
-
3
- const _ = require('lodash');
4
- const path = require('path');
5
- const fs = require('fs');
6
- const kit = require('kit');
7
- const jade = require('jade');
8
- const cml = require('cortml');
9
-
10
- const state = {
11
- uids: {},
12
- };
13
-
14
- require('require.fresh')(module, require);
15
-
16
- const Handler = require('../handler');
17
-
18
- const config = cml.loadFile(path.join(__dirname, 'config.yaml')),
19
- rfile = filename => fs.readFileSync(filename, 'utf-8'),
20
- exists = filename => fs.existsSync(filename);
21
-
22
- class Page {
23
-
24
- constructor (root, project) {
25
- var self = this;
26
-
27
- _.extend(self, {
28
- root,
29
- project,
30
- settings: project.settings,
31
- });
32
-
33
- self.jade = {
34
- get: self.compileJadeGet(),
35
- post: self.compileJadePost(),
36
- };
37
- self.stylus = self.compileStylus();
38
- }
39
-
40
- get uid () {
41
- var self = this,
42
- uid = state.uids[self.root] || `page-uid-${_.uniqueId()}`;
43
- state.uids[self.root] = uid;
44
- return uid;
45
- }
46
-
47
- render (type = 'get', context = {}) {
48
- var self = this,
49
- css = `${self.getCss() || ''}\n${self.renderStylus() || ''}`,
50
- js = '',
51
- html = self.renderJade(type, context) || self.getHtmlGet(),
52
- styleFilename = self.project.resolve(`static/${self.getStyleFilename()}`);
53
-
54
- try {
55
- fs.mkdirSync(path.dirname(styleFilename));
56
- fs.mkdirSync(path.dirname(path.dirname(styleFilename)));
57
- fs.mkdirSync(path.dirname(path.dirname(path.dirname(styleFilename))));
58
- } catch(err) {}
59
-
60
- fs.writeFileSync(styleFilename, css);
61
- return self
62
- .compileJavaScript()
63
- .then(code => {
64
- return code;
65
- })
66
- .then(code => js = code)
67
- .then(() => {
68
- return html
69
- .replace('</head>', `<link rel="stylesheet" href="/static/${self.getStyleFilename()}"></head>`)
70
- .replace('</body>', `<script src="/static/${self.getScriptFilename()}"></script></body>`);
71
- });
72
- }
73
-
74
- getScriptFilename () {
75
- var self = this;
76
- return `js/${self.uid}.pack.js`;
77
- }
78
-
79
- getStyleFilename () {
80
- var self = this;
81
- return `css/${self.uid}.pack.css`;
82
- }
83
-
84
- request (req, res, user, route) {
85
- var self = this;
86
- return new Promise((resolve, reject) => {
87
- var Handler = self.getHandler(),
88
- handler = new Handler({
89
- page: self,
90
- args: route.args,
91
- req: req,
92
- res: res,
93
- user: user,
94
- url: {},
95
- get: {},
96
- post: {},
97
- }),
98
- chain = req.method === 'POST'
99
- ? handler.handlePost(req, res)
100
- : handler.handleGet(req, res);
101
- chain.then(() => {});
102
- });
103
- }
104
-
105
- resolve (...args) {
106
- var self = this;
107
- return path.resolve(self.root, ...args);
108
- }
109
-
110
- firstExists (files, dir) {
111
- var self = this,
112
- dirname = dir || self.root,
113
- filename = null;
114
- files
115
- .map(file => path.resolve(dirname, file))
116
- .forEach(file => {
117
- if (!exists(file) || filename) return;
118
- filename = file;
119
- });
120
- return filename;
121
- }
122
-
123
- getSource (files) {
124
- var self = this,
125
- filename = self.firstExists(files);
126
- if (!exists(filename)) return null;
127
- return rfile(filename);
128
- }
129
-
130
- // Request ===================================================================
131
-
132
- getHandler () {
133
- var self = this,
134
- filename = self.firstExists(config.files.request);
135
- if (!exists(filename)) return Handler;
136
- return require.fresh(filename);
137
- }
138
-
139
- // JavaScript ================================================================
140
-
141
- compileJavaScript () {
142
- var self = this,
143
- filename = self.firstExists(config.files.js);
144
- return new Promise((resolve, reject) => {
145
- if (!exists(filename)) {
146
- fs.unlinkSync(self.project.resolve(`static/${self.getScriptFilename()}`));
147
- return resolve('');
148
- };
149
- return kit.packer
150
- .packFile({
151
- context: self.project.root,
152
- entry: filename,
153
- output: {
154
- path: path.resolve(self.project.root, 'static'),
155
- filename: self.getScriptFilename(),
156
- },
157
- })
158
- .then(code => resolve(code));
159
- });
160
- }
161
-
162
- // Stylus ====================================================================
163
-
164
- getStylusFiles () {
165
- var self = this,
166
- files = config.files.stylus,
167
- parents = [],
168
- dir = fs.realpathSync(self.root),
169
- root = fs.realpathSync(self.project.root);
170
- while (dir && dir !== '/' && dir !== root) {
171
- let filename = self.firstExists(files, dir);
172
- if (exists(filename)) {
173
- parents.unshift(filename);
174
- }
175
- dir = path.dirname(dir);
176
- }
177
- return self.project.settings.includeParentStyles
178
- ? parents
179
- : [parents.pop()];
180
- }
181
-
182
- compileStylus () {
183
- var self = this,
184
- files = self.getStylusFiles(),
185
- filename = files.pop(),
186
- st = kit.styles.compileFile(filename, {
187
- imports: files,
188
- });
189
- return st;
190
- }
191
-
192
- renderStylus () {
193
- var self = this,
194
- pack = self.compileStylus();
195
- return pack.render();
196
- }
197
-
198
- // CSS =======================================================================
199
-
200
- getCss () {
201
- var self = this;
202
- return self.getSource(config.files.css);
203
- }
204
-
205
- // Jade ======================================================================
206
-
207
- renderJade (type = 'get', context = {}) {
208
- var self = this,
209
- template = self.compileJade(type);
210
- if (!template || typeof template !== 'function') return null;
211
- return template(_.extend(context, {
212
- self: context,
213
- }));
214
- }
215
-
216
- compileJade (type = 'get') {
217
- var self = this,
218
- filename = self.firstExists(config.files.jade[type]);
219
- if (!exists(filename)) return null;
220
- return jade.compile(rfile(filename), {
221
- filename,
222
- });
223
- }
224
-
225
- compileJadeGet () {
226
- var self = this;
227
- return self.compileJade('get');
228
- }
229
-
230
- compileJadePost () {
231
- var self = this;
232
- return self.compileJade('post');
233
- }
234
-
235
- // HTML ======================================================================
236
-
237
- getHtmlGet () {
238
- var self = this;
239
- return self.getSource(config.files.html.get);
240
- }
241
-
242
- getHtmlPost () {
243
- var self = this;
244
- return self.getSource(config.files.html.post);
245
- }
246
-
247
- }
248
-
249
- module.exports = Page;
@@ -1,261 +0,0 @@
1
- 'use strict';
2
-
3
- const _ = require('lodash');
4
- const fs = require('fs');
5
- const path = require('path');
6
- const http = require('http');
7
- const cml = require('cortml');
8
- const kit = require('kit');
9
- const config = cml.loadFile(path.join(__dirname, 'config.yaml'));
10
- const connect = require('connect');
11
- const socketio = require('socket.io', config.socket);
12
- const serveStatic = require('serve-static');
13
- const bodyParser = require('body-parser');
14
- const colors = require('colors');
15
-
16
- const auth = require('../auth');
17
- const db = require('../db');
18
- const Middleware = require('../middleware');
19
- const File = require('./file');
20
- const Page = require('./page');
21
- const packageJSON = require('../../package.json');
22
-
23
- require('require.fresh')(module, require);
24
-
25
- const rfile = filename => fs.readFileSync(filename, 'utf-8'),
26
- exists = filename => fs.existsSync(filename);
27
-
28
- class Project {
29
-
30
- constructor (root) {
31
- var self = this;
32
-
33
- self.root = root;
34
-
35
- _.extend(self, {
36
- settings: {},
37
- router: self.updateRouter(),
38
- pages: {},
39
- server: {},
40
- middleware: {},
41
- });
42
- }
43
-
44
- start () {
45
- var self = this;
46
- self.update();
47
- self.server.native.listen(self.settings.port);
48
- console.log(`SIM server started at 127.0.0.1:${self.settings.port}...`);
49
- }
50
-
51
- resolve (...args) {
52
- var self = this;
53
- return path.resolve(self.root, ...args);
54
- }
55
-
56
- loadPage (name) {
57
- var self = this;
58
- return new Page(path.resolve(self.root, `pages/${name}`), self);
59
- }
60
-
61
- // Handlers ==================================================================
62
-
63
- authHandler (req, res, next) {
64
- var self = this;
65
- req._response = res;
66
- auth.auth(req, user => {
67
- req.user = user;
68
- next();
69
- });
70
- }
71
-
72
- pageHandler (req, res, next) {
73
- var self = this,
74
- url = req.url.split('?')[0],
75
- user = req.user || {
76
- isAuth: false
77
- },
78
- route = self.router.get(url, user),
79
- page = self.pages[route.path];
80
-
81
- if (!page && exists(self.resolve(`pages/${route.path}`))) {
82
- page = self.loadPage(route.path);
83
- }
84
-
85
- if (!page) return next();
86
-
87
- page.request(req, res, user, route);
88
- }
89
-
90
- filesHandler (req, res, next) {
91
- var self = this,
92
- files = req.files;
93
- req.files = {};
94
- _.each(files, (file, name) => {
95
- if (Array.isArray(file)) {
96
- req.files[name] = [];
97
- return _.each(Array.isArray(file[0]) ? file[0] : file, f => {
98
- req.files[name].push(new File(f));
99
- });
100
- }
101
- req.files[name] = new File(file);
102
- });
103
- req.body.files = req.files;
104
- next();
105
- }
106
-
107
- // Updaters ==================================================================
108
-
109
- update () {
110
- var self = this;
111
- self.updateSettings();
112
- self.updateRouter();
113
- self.updatePages();
114
- self.updateMiddleware();
115
- self.updateServer();
116
- return self;
117
- }
118
-
119
- updateSettings () {
120
- var self = this,
121
- defaults = JSON.parse(JSON.stringify(config.defaults)),
122
- filename = path.join(self.root, 'settings.yaml');
123
- if (!exists(filename)) return;
124
- self.settings = _.extend(
125
- defaults,
126
- JSON.parse(JSON.stringify(cml.loadFile(filename)))
127
- );
128
- return self;
129
- }
130
-
131
- updatePages () {
132
- var self = this;
133
- _.each(self.router.getPaths(), name => {
134
- self.pages[name] = self.loadPage(name);
135
- });
136
- return self;
137
- }
138
-
139
- updateRouter () {
140
- var self = this,
141
- router = self.router = kit.router.loadFile(path.resolve(self.root, 'urls.yaml'));
142
- return router;
143
- }
144
-
145
- updateServer () {
146
- var self = this,
147
- app = connect(),
148
- native = http.createServer(app),
149
- io = socketio.listen(native);
150
-
151
- app.use('/static/', serveStatic(self.resolve('static')));
152
- app.use(bodyParser.urlencoded({
153
- extended: true
154
- }));
155
- app.use(self.authHandler.bind(self));
156
- app.use(self.filesHandler.bind(self));
157
- app.use(self.pageHandler.bind(self));
158
-
159
- self.server = {
160
- connect: app,
161
- native: native,
162
- io: io,
163
- };
164
- }
165
-
166
- // Middleware ================================================================
167
-
168
- updateMiddleware () {
169
- var self = this,
170
- dirname = self.resolve('middleware');
171
- if (!exists(dirname)) return;
172
- self.middleware = [];
173
- fs
174
- .readdirSync(dirname)
175
- .map(file => path.join(dirname, file))
176
- .forEach(filename => {
177
- var Class = require.fresh(filename);
178
- Class.getMethodsNames().forEach(name => {
179
- self.middleware[name] = self.middleware[name] || [];
180
- self.middleware[name].push(Class);
181
- });
182
- });
183
- return self;
184
- }
185
-
186
- applyMiddleware (name, data = {}, context = {}) {
187
- var self = this;
188
-
189
- return new Promise((resolve, reject) => {
190
- var classes = self.middleware[name];
191
- if (!classes || !classes.length) return resolve(data);
192
- Promise
193
- .all(classes.map(call))
194
- .then(() => resolve(data));
195
- });
196
-
197
- function call(Class) {
198
- return new Promise((resolve, reject) => {
199
- var result = Class.prototype[name].call(context, data);
200
- if (result instanceof Promise) {
201
- return result.then(resolve);
202
- }
203
- resolve(result);
204
- });
205
- }
206
- }
207
-
208
- // Logger ====================================================================
209
-
210
- createLogger () {
211
- var self = this,
212
- logger = {};
213
- _.each(config.logs, (opts, name) => {
214
- logger[name] = (msg = '', data = {}) => {
215
- console.log(
216
- self.renderMessage(msg[opts.color], _.extend({
217
- color: opts.color,
218
- icon: `${opts.icon}`[opts.color],
219
- }, data))
220
- );
221
- };
222
- });
223
- return logger;
224
- }
225
-
226
- info (...args) {
227
- var self = this;
228
- return self.logger.info(...args);
229
- }
230
-
231
- success (...args) {
232
- var self = this;
233
- return self.logger.success(...args);
234
- }
235
-
236
- error (...args) {
237
- var self = this;
238
- return self.logger.error(...args);
239
- }
240
-
241
- render (code, data = {}) {
242
- var self = this,
243
- re = /\{\{([^\}]+)\}\}/mgi,
244
- context = _.extend({
245
- name: packageJSON.name,
246
- version: packageJSON.version,
247
- date: `${(new Date()).miniDate()}:`.grey,
248
- project: self,
249
- root: self.root,
250
- }, data);
251
- return code.replace(re, (txt, name) => _.get(context, name));
252
- }
253
-
254
- renderMessage (message, data) {
255
- var self = this;
256
- return self.render(message, data);
257
- }
258
-
259
- }
260
-
261
- module.exports = Project;
package/simple/index.js DELETED
@@ -1,96 +0,0 @@
1
- 'use strict';
2
-
3
- const _ = require('underscore');
4
- const connect = require('connect');
5
- const stylus = require('stylus');
6
- const jade = require('jade');
7
- const fs = require('fs');
8
- const open = require('open');
9
- const path = require('path');
10
-
11
- exports.start = function (root, argv) {
12
- var app = connect(),
13
- settings = {
14
- port: argv.port || 8000
15
- };
16
-
17
- prepareFolder(root);
18
-
19
- app.use(handleContent);
20
-
21
- app.use(connect.static(root));
22
-
23
- app.listen(settings.port);
24
- console.log('Server started at 127.0.0.1:' + settings.port + '...');
25
- open('http://127.0.0.1:' + settings.port);
26
-
27
-
28
- function handleContent(request, response, next) {
29
- var filename = root + request.url.split('?')[0],
30
- ext = path.extname(filename).slice(1);
31
- if (ext === 'styl') {
32
- toStylus(filename, response);
33
- return;
34
- }
35
- filename = root + '/pages/' + request.url.split('?')[0];
36
- if (request.url === '/' &&
37
- fs.existsSync(root + '/pages/index.jade')) {
38
- filename = root + '/pages/index.jade';
39
- ext = 'jade';
40
- }
41
- if (fs.existsSync(filename + '.jade')) {
42
- toJade(filename + '.jade', response);
43
- return;
44
- }
45
- if (fs.existsSync(filename.slice(0, -1) + '.jade')) {
46
- toJade(filename.slice(0, -1) + '.jade', response);
47
- return;
48
- }
49
- if (!fs.existsSync(filename)) {
50
- next();
51
- return;
52
- }
53
- if (ext === 'jade') {
54
- toJade(filename, response);
55
- return;
56
- }
57
- next();
58
- }
59
- };
60
-
61
- function toStylus(filename, response) {
62
- source = fs.readFileSync(filename) + '';
63
- stylus.render(source, {
64
- filename: filename
65
- }, function (err, css) {
66
- if (err) {
67
- throw err;
68
- }
69
- response.writeHead(200, {
70
- 'Content-Type': 'text/css'
71
- });
72
- response.end(css);
73
- });
74
- }
75
-
76
- function toJade(filename, response) {
77
- source = fs.readFileSync(filename) + '';
78
- response.writeHead(200, {
79
- 'Content-Type': 'text/html'
80
- });
81
- response.end(jade.compile(source, {
82
- filename: filename
83
- })());
84
- }
85
-
86
- function prepareFolder(root) {
87
- if (!fs.existsSync(root + '/img')) {
88
- fs.mkdirSync(root + '/img');
89
- }
90
- if (!fs.existsSync(root + '/styles')) {
91
- fs.mkdirSync(root + '/styles');
92
- }
93
- if (!fs.existsSync(root + '/pages')) {
94
- fs.mkdirSync(root + '/pages');
95
- }
96
- }