server.js (3197B)
1 /* eslint no-console:0 */ 2 const fs = require("fs"); 3 const path = require("path"); 4 5 const babelify = require("babelify"); 6 const browserify = require("browserify"); 7 const express = require("express"); 8 const glob = require("glob"); 9 const less = require("less"); 10 11 const app = express(); 12 13 if (require.main === module) { 14 app.use(require("morgan")( 15 ":date[iso] :method :url HTTP/:http-version - :status")); 16 } 17 18 function serveBrowserified(file, standaloneName, doBabelify) { 19 return function(req, res, next) { 20 let files; 21 if (Array.isArray(file)) { 22 files = file.map(function(f) { return path.join(__dirname, f); }); 23 } else if (file.indexOf("*") !== -1) { 24 files = glob.sync(file, {cwd: __dirname}); 25 } else { 26 files = [path.join(__dirname, file)]; 27 } 28 29 const options = {}; 30 if (doBabelify) { 31 options.transform = [babelify]; 32 } 33 if (standaloneName) { 34 options.standalone = standaloneName; 35 } 36 const b = browserify(files, options); 37 const stream = b.bundle(); 38 39 let body = ""; 40 stream.on("data", function(s) { body += s; }); 41 stream.on("error", function(e) { next(e); }); 42 stream.on("end", function() { 43 res.setHeader("Content-Type", "text/javascript"); 44 res.send(body); 45 }); 46 }; 47 } 48 49 function twoBrowserified(url, file, standaloneName) { 50 app.get(url, serveBrowserified(file, standaloneName, false)); 51 app.get("/babel" + url, serveBrowserified(file, standaloneName, true)); 52 } 53 54 function twoUse(url, handler) { 55 app.use(url, handler); 56 app.use("/babel" + url, handler); 57 } 58 59 function twoStatic(url, file) { 60 twoUse(url, express.static(path.join(__dirname, file))); 61 } 62 63 twoBrowserified("/katex.js", "katex", "katex"); 64 twoUse("/test/jasmine", express.static(path.dirname( 65 require.resolve("jasmine-core/lib/jasmine-core/jasmine.js")))); 66 twoBrowserified("/test/katex-spec.js", "test/*[Ss]pec.js"); 67 twoBrowserified( 68 "/contrib/auto-render/auto-render.js", 69 "contrib/auto-render/auto-render", 70 "renderMathInElement"); 71 72 twoUse("/katex.css", function(req, res, next) { 73 const lessfile = path.join(__dirname, "static", "katex.less"); 74 fs.readFile(lessfile, {encoding: "utf8"}, function(err, data) { 75 if (err) { 76 next(err); 77 return; 78 } 79 80 less.render(data, { 81 paths: [path.join(__dirname, "static")], 82 filename: "katex.less", 83 }, function(err, output) { 84 if (err) { 85 console.error(String(err)); 86 next(err); 87 return; 88 } 89 90 res.setHeader("Content-Type", "text/css"); 91 res.send(output.css); 92 }); 93 }); 94 }); 95 96 twoStatic("", "static"); 97 twoStatic("", "build"); 98 twoStatic("/test", "test"); 99 twoStatic("/contrib", "contrib"); 100 101 app.use(function(err, req, res, next) { 102 console.error(err.stack); 103 res.setHeader("Content-Type", "text/plain"); 104 res.send(500, err.stack); 105 }); 106 107 if (require.main === module) { 108 app.listen(7936); 109 console.log("Serving on http://0.0.0.0:7936/ ..."); 110 } 111 112 module.exports = app;