1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 | var MiniTools = {};
|
8 |
|
9 | var Path = require('path');
|
10 | var Promises = require('best-promise');
|
11 | require('fs-extra');
|
12 | var fs = require('fs-promise');
|
13 | var readYaml = require('read-yaml-promise');
|
14 |
|
15 | var bestGlobals = require('best-globals');
|
16 |
|
17 | MiniTools.serveErr=function serveErr(req,res,next){
|
18 | return function(err){
|
19 | if(err.message=='next'){
|
20 | return next();
|
21 | }
|
22 | console.log('ERROR', err);
|
23 | console.log('STACK', err.stack);
|
24 | var text='ERROR! '+(err.code||'')+'\n'+err.message+'\n------------------\n'+err.stack;
|
25 | if(!res.headersSent){
|
26 | res.writeHead(400, {
|
27 | 'Content-Length': text.length,
|
28 | 'Content-Type': 'text/plain; charset=utf-8'
|
29 | });
|
30 | }else{
|
31 | text+="\n</script>\n<pre>\n------------------------------------\n";
|
32 | }
|
33 | res.end(text);
|
34 | };
|
35 | };
|
36 |
|
37 | MiniTools.preEval=function(expresion, vars, functions){
|
38 | var r=/\b([a-zA-Z_]+)(\s*\()?/;
|
39 | var ok=true;
|
40 | expresion.replace(r,function(_, name, isFun){
|
41 | if(!(isFun?functions:vars)[name]){
|
42 | ok=false;
|
43 | }
|
44 | });
|
45 | return ok;
|
46 | };
|
47 |
|
48 | MiniTools.serveText = function serveText(htmlText,contentTypeText){
|
49 | return function(req,res){
|
50 | var ct = (contentTypeText||'plain').replace(/^(.*\/)?([^\/]+)$/, function(phrase, first, second){
|
51 | return (first||'text/')+second;
|
52 | });
|
53 | res.setHeader('Content-Type', ct+'; charset=utf-8');
|
54 | var buf=new Buffer(htmlText);
|
55 | res.setHeader('Content-Length', buf.length);
|
56 | res.end(buf);
|
57 | };
|
58 | };
|
59 |
|
60 | function escapeRegExp(string){
|
61 |
|
62 | return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
63 | }
|
64 |
|
65 | MiniTools.serveTransforming = function serveTransforming(pathToFile, anyFile, extOriginal, extTarget, renderizer, textType){
|
66 | var regExpExtDetect;
|
67 | var regExpExtReplace;
|
68 | if(extOriginal){
|
69 | regExpExtDetect =new RegExp('\.'+escapeRegExp(extOriginal)+'$');
|
70 | regExpExtReplace=new RegExp('\.'+escapeRegExp(extOriginal)+'$','g');
|
71 | }else{
|
72 | regExpExtDetect=/^(.*\/)?[^\/\.]+$/;
|
73 | regExpExtReplace=/$/g;
|
74 | }
|
75 | return function(req,res,next){
|
76 | if(anyFile && !regExpExtDetect.test(req.path)){
|
77 | return next();
|
78 | }
|
79 | Promises.start(function(){
|
80 | var fileName=(pathToFile+(anyFile?'/'+req.path:'')).replace(regExpExtReplace, '.'+extTarget);
|
81 | return fs.readFile(fileName, {encoding: 'utf8'});
|
82 | }).catch(function(err){
|
83 | if(anyFile && err.code==='ENOENT'){
|
84 | throw new Error('next');
|
85 | }
|
86 | throw err;
|
87 | }).then(function(fileContent){
|
88 | var htmlText=renderizer.render(fileContent);
|
89 | MiniTools.serveText(htmlText,textType)(req,res);
|
90 | }).catch(MiniTools.serveErr(req,res,next));
|
91 | };
|
92 | };
|
93 |
|
94 | MiniTools.serveStylus = function serveStylus(pathToFile,anyFile){
|
95 | var stylus = require('stylus');
|
96 | return MiniTools.serveTransforming(pathToFile, anyFile, 'css', 'styl', stylus, 'css');
|
97 | };
|
98 |
|
99 | MiniTools.serveJade = function serveJade(pathToFile,anyFile){
|
100 | var jade = require('jade');
|
101 | return MiniTools.serveTransforming(pathToFile, anyFile, '', 'jade', jade, 'html');
|
102 | };
|
103 |
|
104 | MiniTools.serveJson = function serveJson(object){
|
105 | return MiniTools.serveText(JSON.stringify(object),'application/json');
|
106 | };
|
107 |
|
108 | MiniTools.readConfig = function readConfig(listOfFileNamesOrConfigObjects){
|
109 | return Promises.all(listOfFileNamesOrConfigObjects.map(function(fileNameOrObject){
|
110 | if(typeof fileNameOrObject==="string"){
|
111 | return Promises.start(function(){
|
112 | var ext=Path.extname(fileNameOrObject);
|
113 | if(ext){
|
114 | return {ext:ext, fileName:fileNameOrObject};
|
115 | }else{
|
116 | var exts=Object.keys(MiniTools.readConfig.exts);
|
117 | var searchFileName=function(){
|
118 | return Promises.start(function(){
|
119 | if(!exts.length){
|
120 | return Promises.reject(Error('Config file does not found '+fileNameOrObject));
|
121 | }
|
122 | var ext=exts.shift();
|
123 | return fs.access(fileNameOrObject+ext,fs.R_OK).then(function(){
|
124 | return {ext:ext, fileName:fileNameOrObject+ext};
|
125 | },searchFileName);
|
126 | });
|
127 | };
|
128 | return searchFileName();
|
129 | }
|
130 | }).then(function(opts){
|
131 | return MiniTools.readConfig.exts[opts.ext](opts.fileName);
|
132 | });
|
133 | }else if(typeof fileNameOrObject==="object" && !(fileNameOrObject instanceof Array)){
|
134 | return fileNameOrObject;
|
135 | }else{
|
136 | return Promises.reject(new Error("readConfig must receive string filename or config object"));
|
137 | }
|
138 | })).then(function(listOfConfig){
|
139 | return listOfConfig.reduce(function(acumConfig, oneConfig){
|
140 | return bestGlobals.changing(acumConfig, oneConfig);
|
141 | },{});
|
142 | });
|
143 | };
|
144 |
|
145 | MiniTools.readConfig.exts={
|
146 | ".yaml": readYaml,
|
147 | ".yml": readYaml,
|
148 | ".json": fs.readJson.bind(fs),
|
149 | };
|
150 |
|
151 | module.exports=MiniTools; |
\ | No newline at end of file |