express-cjs
Version:
coffee-react / jade / stylus middleware for Single Page Application on Express4
136 lines (124 loc) • 3.86 kB
JavaScript
// Generated by CoffeeScript 1.10.0
var Promise, browserify, express, expressCjs, fs, jade, koutoSwiss, path, prepareResponse, stylus;
Promise = require('bluebird');
express = require('express');
prepareResponse = require('prepare-response');
browserify = require('browserify-middleware');
jade = require('jade');
stylus = require('stylus');
koutoSwiss = require('kouto-swiss');
path = require('path');
fs = require('fs');
expressCjs = function(arg) {
var browserifyMiddleware, bundleExternal, cjs, cssPromise, cwd, debug, html5Mode, htmlPromise, htmlResolver, jadeOptions, ref, transformers, useBrfs, useNgannotate, usePlainJadeify, useReactify;
ref = arg != null ? arg : {}, cwd = ref.cwd, debug = ref.debug, bundleExternal = ref.bundleExternal, jadeOptions = ref.jadeOptions, useReactify = ref.useReactify, useNgannotate = ref.useNgannotate, usePlainJadeify = ref.usePlainJadeify, useBrfs = ref.useBrfs, html5Mode = ref.html5Mode;
cjs = express.Router();
if (cwd == null) {
cwd = process.cwd();
}
if (debug == null) {
debug = process.env.NODE_ENV !== 'production';
}
if (bundleExternal == null) {
bundleExternal = true;
}
if (useReactify == null) {
useReactify = true;
}
if (useNgannotate == null) {
useNgannotate = true;
}
if (usePlainJadeify == null) {
usePlainJadeify = true;
}
if (useBrfs == null) {
useBrfs = true;
}
if (html5Mode == null) {
html5Mode = false;
}
transformers = [];
if (useReactify) {
transformers.push('coffee-reactify');
} else {
transformers.push('coffeeify');
}
if (useNgannotate) {
transformers.push([
'browserify-ngannotate', {
ext: '.coffee'
}
]);
}
if (usePlainJadeify) {
transformers.push('plain-jadeify');
}
if (useBrfs) {
transformers.push('brfs');
}
browserify.settings('basedir', path.resolve(__dirname, '..'));
browserify.settings('transform', transformers);
browserifyMiddleware = browserify(cwd + path.sep + 'index.coffee', {
extensions: ['.coffee', '.cjsx'],
bundleExternal: bundleExternal
});
cjs.get('/index.js', browserifyMiddleware);
cssPromise = null;
cjs.get('/index.css', function(req, res, next) {
if (debug) {
cssPromise = null;
}
if (cssPromise == null) {
cssPromise = new Promise(function(resolve, reject) {
var styl, stylData;
styl = cwd + path.sep + 'index.styl';
stylData = fs.readFileSync(styl, 'utf8');
return stylus(stylData).set('filename', styl).set('sourcemap', debug ? {
inline: true
} : false).set('compress', !debug).use(koutoSwiss())["import"]('kouto-swiss').render(function(error, css) {
if (!error) {
return resolve(prepareResponse(css, {
'content-type': 'css'
}));
} else {
return reject(error);
}
});
});
}
return cssPromise.then(function(prepare) {
return prepare.send(req, res, next);
});
});
htmlPromise = null;
htmlResolver = function(req, res, next) {
if (debug) {
htmlPromise = null;
}
if (htmlPromise == null) {
htmlPromise = new Promise(function(resolve) {
var filename, html;
filename = cwd + path.sep + 'index.jade';
if (jadeOptions == null) {
jadeOptions = {};
}
if (jadeOptions.pretty == null) {
jadeOptions.pretty = debug;
}
html = jade.renderFile(filename, jadeOptions);
return resolve(prepareResponse(html, {
'content-type': 'html'
}));
});
}
return htmlPromise.then(function(prepare) {
return prepare.send(req, res, next);
});
};
cjs.get('/', htmlResolver);
if (html5Mode) {
cjs.get('*', htmlResolver);
}
return cjs;
};
module.exports = expressCjs;