Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 2 additions & 7 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@

module.exports = function(root, opts) {
return function() {
var args = Array.prototype.concat.apply([root, opts || {}], arguments);
require('./lib/express').apply(this, args);
};
};

module.exports = require('./lib/express');
module.exports.util = require('./lib/util');

/* istanbul ignore else */
if (require('generator-support')) {
module.exports.koa = require('./lib/koa');
} else {
Expand Down
131 changes: 42 additions & 89 deletions lib/express.js
Original file line number Diff line number Diff line change
@@ -1,109 +1,62 @@
'use strict';

var path = require('path');
var fs = require('fs');
var urlparse = require('url').parse;
var through = require('through2');
var pipe = require('multipipe');
var gulp = require('gulp');
var less = require('gulp-less');
var gulpif = require('gulp-if');
var coffee = require('gulp-coffee');
var mime = require('mime');
var extend = require('extend');

var cssParser = require('./parser/css');
var css2jsParser = require('./parser/css2js');
var jsParser = require('./parser/js');
var tplParser = require('./parser/tpl');
var jsonParser = require('./parser/json');
var handlebarsParser = require('./parser/handlebars');
var standalonify = require('./parser/standalonify');
var Parser = require('./parser');
var parse = require('./parse');
var util = require('./util');
var transport = require('./transport');

module.exports = function(root, opts, req, res, next) {
next = req.headers['servespmexit'] ? notFound : (next || notFound);

var pkg = util.getPkg(root);
if (!pkg) {
return next();
}

var parser = new Parser(extend({
root: root,
req: urlparse(req.url.toLowerCase()),
headers: req.headers,
pkg: util.getPkg(root)
}, opts));

// is dep package, but not found
if (!parser.pkg) {
return next();
}
module.exports = function(root, opts) {
opts = opts || {};
var log = opts.log || function() {};

// don't handle if file is not found
if (!parser.file) {
return next();
}
return function(req, res, next) {
next = req.headers['servespmexit'] ? notFound : (next || notFound);

// don't handle dir
if (parser.isDir) {
return next();
}

// 304
var isModified = parser.isModified();
res.setHeader('Last-Modified', parser.modifiedTime);
if (!isModified) {
res.writeHead(304);
return res.end('');
}
var pkg = util.getPackage(root);
if (!pkg) {
return next();
}

if (opts.log) {
console.log('>> ServeSPM %s < ./%s',
parser.req.pathname, path.relative(process.cwd(), parser.file));
}
var file = parse(req.url, {
pkg: pkg,
rules: opts.rules
});

// nowrap
if (parser.noWrap) {
var data = fs.readFileSync(parser.file, 'utf-8');
if (parser.handlebarId) {
data = util.template(data, {id:parser.handlebarId});
if (!file) {
return next();
}
return end(data, res, path.extname(parser.file));
}

// transport file

var file = parser.file;
var useCss2jsParser = util.isCSSFile(file) &&
/\.js$/.test(parser.req.pathname);
var useStandalone = function(file) {
return parser.isStandalone(file.path);
};
// 304
var modifiedTime = util.getModifiedTime(file);
res.setHeader('Last-Modified', modifiedTime);
if (!util.isModified(req.headers, modifiedTime)) {
res.writeHead(304);
return res.end('');
}

pipe(
gulp.src(file),
log('>> ServeSPM %s < ./%s',
file.url.pathname, path.relative(process.cwd(), file.path));

gulpif(/\.less$/, less({ paths: [path.dirname(file)] })),
gulpif(/\.css$/, cssParser(parser)),
gulpif(useCss2jsParser, css2jsParser(parser)),
gulpif(/\.coffee$/, coffee({bare: true})),
gulpif(/\.js$/, jsParser(parser)),
gulpif(/\.tpl$/, tplParser(parser)),
gulpif(/\.json$/, jsonParser(parser)),
gulpif(/\.handlebars$/, handlebarsParser(parser)),
gulpif(useStandalone, standalonify(req.url)),
// nowrap
if (!file.wrap) {
return end(file.contents, res, path.extname(file.path));
}

through.obj(function(file) {
var opt = {
pkg: pkg
};
transport(file, opt, function(err, file) {
var ext = path.extname(file.path);
end(file.contents, res, ext);
})
);
});

function notFound() {
res.writeHead(404);
res.end('');
}
function notFound() {
res.writeHead(404);
res.end('');
}
};
};

function end(data, res, extname) {
Expand Down
102 changes: 24 additions & 78 deletions lib/koa.js
Original file line number Diff line number Diff line change
@@ -1,85 +1,55 @@
'use strict';

var path = require('path');
var fs = require('fs');
var urlparse = require('url').parse;
var through = require('through2');
var pipe = require('multipipe');
var gulp = require('gulp');
var less = require('gulp-less');
var gulpif = require('gulp-if');
var coffee = require('gulp-coffee');
var mime = require('mime');
var extend = require('extend');

var cssParser = require('./parser/css');
var css2jsParser = require('./parser/css2js');
var jsParser = require('./parser/js');
var tplParser = require('./parser/tpl');
var jsonParser = require('./parser/json');
var handlebarsParser = require('./parser/handlebars');
var standalonify = require('./parser/standalonify');
var Parser = require('./parser');
var util = require('./util');
var parse = require('./parse');
var transport = require('./transport');

module.exports = function(root, opts) {
opts = opts || {};
var log = opts.log || function() {};

return function*(next) {
if (this.header['servespmexit']) {
next = notFound(this);
}

var pkg = util.getPkg(root);
var pkg = util.getPackage(root);
if (!pkg) {
return yield* next;
}

var parser = new Parser(extend({
root: root,
req: urlparse(this.url.toLowerCase()),
headers: this.header,
pkg: util.getPkg(root)
}, opts));

// is dep package, but not found
if (!parser.pkg) {
return yield* next;
}
var file = parse(this.url, {
pkg: pkg,
rules: opts.rules
});

// don't handle if file is not found
if (!parser.file) {
if (!file) {
return yield* next;
}

// don't handle dir
if (parser.isDir) {
return yield* next;
}

// 304
var isModified = parser.isModified();
this.set('Last-Modified', parser.modifiedTime);
if (!isModified) {
var modifiedTime = util.getModifiedTime(file);
this.set('Last-Modified', modifiedTime);
if (!util.isModified(this.header, modifiedTime)) {
this.status = 304;
return;
}

if (opts.log) {
console.log('>> ServeSPM %s < ./%s',
parser.req.pathname, path.relative(process.cwd(), parser.file));
}
log('>> ServeSPM %s < ./%s',
file.url.pathname, path.relative(process.cwd(), file.path));

var data, ext;
// nowrap
if (parser.noWrap) {
data = fs.readFileSync(parser.file, 'utf-8');
if (parser.handlebarId) {
data = util.template(data, {id:parser.handlebarId});
}
ext = path.extname(parser.file);
var data, ext;
if (!file.wrap) {
data = file.contents;
ext = path.extname(file.path);
}

else {
// transport file
var file = yield parse(parser);
file = yield transportThunk(file, {pkg: pkg});
data = file.contents;
ext = path.extname(file.path);
}
Expand All @@ -99,32 +69,8 @@ function* notFound(ctx) {
ctx.status = 404;
}

function parse(parser) {
var file = parser.file;
var useCss2jsParser = util.isCSSFile(file) &&
/\.js$/.test(parser.req.pathname);
var useStandalone = function(file) {
return parser.isStandalone(file.path);
};

function transportThunk(file, opt) {
return function(cb) {
pipe(
gulp.src(file),

gulpif(/\.less$/, less({ paths: [path.dirname(file)] })),
gulpif(/\.css$/, cssParser(parser)),
gulpif(useCss2jsParser, css2jsParser(parser)),
gulpif(/\.coffee$/, coffee({bare: true})),
gulpif(/\.js$/, jsParser(parser)),
gulpif(/\.tpl$/, tplParser(parser)),
gulpif(/\.json$/, jsonParser(parser)),
gulpif(/\.handlebars$/, handlebarsParser(parser)),
gulpif(useStandalone, standalonify(this.url)),

through.obj(function(file) {
cb(null, file);
})
)
.once('error', cb);
transport(file, opt, cb);
};
}
Loading