UNPKG

5.64 kBJavaScriptView Raw
1"use strict";
2/*jshint eqnull:true */
3/*jshint globalstrict:true */
4/*jshint node:true */
5/*eslint-disable no-console */
6
7var MiniTools = {};
8
9var Path = require('path');
10var Promises = require('best-promise');
11require('fs-extra');
12var fs = require('fs-promise');
13var readYaml = require('read-yaml-promise');
14
15var bestGlobals = require('best-globals');
16
17MiniTools.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
37MiniTools.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; // may be throw Exception
43 }
44 });
45 return ok;
46};
47
48MiniTools.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
60function escapeRegExp(string){
61 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters
62 return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
63}
64
65MiniTools.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
94MiniTools.serveStylus = function serveStylus(pathToFile,anyFile){
95 var stylus = require('stylus');
96 return MiniTools.serveTransforming(pathToFile, anyFile, 'css', 'styl', stylus, 'css');
97};
98
99MiniTools.serveJade = function serveJade(pathToFile,anyFile){
100 var jade = require('jade');
101 return MiniTools.serveTransforming(pathToFile, anyFile, '', 'jade', jade, 'html');
102};
103
104MiniTools.serveJson = function serveJson(object){
105 return MiniTools.serveText(JSON.stringify(object),'application/json');
106};
107
108MiniTools.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
145MiniTools.readConfig.exts={
146 ".yaml": readYaml,
147 ".yml": readYaml,
148 ".json": fs.readJson.bind(fs),
149};
150
151module.exports=MiniTools;
\No newline at end of file