Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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