Skip to content

Commit 648f15c

Browse files
committed
Merge pull request #14 from spmjs/refactor-parser
refactor(parser) abstract parser
2 parents 7e73dae + 8f7a4eb commit 648f15c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+6806
-784
lines changed

index.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
11

2-
module.exports = function(root, opts) {
3-
return function() {
4-
var args = Array.prototype.concat.apply([root, opts || {}], arguments);
5-
require('./lib/express').apply(this, args);
6-
};
7-
};
8-
2+
module.exports = require('./lib/express');
93
module.exports.util = require('./lib/util');
104

5+
/* istanbul ignore else */
116
if (require('generator-support')) {
127
module.exports.koa = require('./lib/koa');
138
} else {

lib/express.js

Lines changed: 42 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,109 +1,62 @@
1+
'use strict';
2+
13
var path = require('path');
2-
var fs = require('fs');
3-
var urlparse = require('url').parse;
4-
var through = require('through2');
5-
var pipe = require('multipipe');
6-
var gulp = require('gulp');
7-
var less = require('gulp-less');
8-
var gulpif = require('gulp-if');
9-
var coffee = require('gulp-coffee');
104
var mime = require('mime');
11-
var extend = require('extend');
125

13-
var cssParser = require('./parser/css');
14-
var css2jsParser = require('./parser/css2js');
15-
var jsParser = require('./parser/js');
16-
var tplParser = require('./parser/tpl');
17-
var jsonParser = require('./parser/json');
18-
var handlebarsParser = require('./parser/handlebars');
19-
var standalonify = require('./parser/standalonify');
20-
var Parser = require('./parser');
6+
var parse = require('./parse');
217
var util = require('./util');
8+
var transport = require('./transport');
229

23-
module.exports = function(root, opts, req, res, next) {
24-
next = req.headers['servespmexit'] ? notFound : (next || notFound);
25-
26-
var pkg = util.getPkg(root);
27-
if (!pkg) {
28-
return next();
29-
}
30-
31-
var parser = new Parser(extend({
32-
root: root,
33-
req: urlparse(req.url.toLowerCase()),
34-
headers: req.headers,
35-
pkg: util.getPkg(root)
36-
}, opts));
37-
38-
// is dep package, but not found
39-
if (!parser.pkg) {
40-
return next();
41-
}
10+
module.exports = function(root, opts) {
11+
opts = opts || {};
12+
var log = opts.log || function() {};
4213

43-
// don't handle if file is not found
44-
if (!parser.file) {
45-
return next();
46-
}
14+
return function(req, res, next) {
15+
next = req.headers['servespmexit'] ? notFound : (next || notFound);
4716

48-
// don't handle dir
49-
if (parser.isDir) {
50-
return next();
51-
}
52-
53-
// 304
54-
var isModified = parser.isModified();
55-
res.setHeader('Last-Modified', parser.modifiedTime);
56-
if (!isModified) {
57-
res.writeHead(304);
58-
return res.end('');
59-
}
17+
var pkg = util.getPackage(root);
18+
if (!pkg) {
19+
return next();
20+
}
6021

61-
if (opts.log) {
62-
console.log('>> ServeSPM %s < ./%s',
63-
parser.req.pathname, path.relative(process.cwd(), parser.file));
64-
}
22+
var file = parse(req.url, {
23+
pkg: pkg,
24+
rules: opts.rules
25+
});
6526

66-
// nowrap
67-
if (parser.noWrap) {
68-
var data = fs.readFileSync(parser.file, 'utf-8');
69-
if (parser.handlebarId) {
70-
data = util.template(data, {id:parser.handlebarId});
27+
if (!file) {
28+
return next();
7129
}
72-
return end(data, res, path.extname(parser.file));
73-
}
7430

75-
// transport file
76-
77-
var file = parser.file;
78-
var useCss2jsParser = util.isCSSFile(file) &&
79-
/\.js$/.test(parser.req.pathname);
80-
var useStandalone = function(file) {
81-
return parser.isStandalone(file.path);
82-
};
31+
// 304
32+
var modifiedTime = util.getModifiedTime(file);
33+
res.setHeader('Last-Modified', modifiedTime);
34+
if (!util.isModified(req.headers, modifiedTime)) {
35+
res.writeHead(304);
36+
return res.end('');
37+
}
8338

84-
pipe(
85-
gulp.src(file),
39+
log('>> ServeSPM %s < ./%s',
40+
file.url.pathname, path.relative(process.cwd(), file.path));
8641

87-
gulpif(/\.less$/, less({ paths: [path.dirname(file)] })),
88-
gulpif(/\.css$/, cssParser(parser)),
89-
gulpif(useCss2jsParser, css2jsParser(parser)),
90-
gulpif(/\.coffee$/, coffee({bare: true})),
91-
gulpif(/\.js$/, jsParser(parser)),
92-
gulpif(/\.tpl$/, tplParser(parser)),
93-
gulpif(/\.json$/, jsonParser(parser)),
94-
gulpif(/\.handlebars$/, handlebarsParser(parser)),
95-
gulpif(useStandalone, standalonify(req.url)),
42+
// nowrap
43+
if (!file.wrap) {
44+
return end(file.contents, res, path.extname(file.path));
45+
}
9646

97-
through.obj(function(file) {
47+
var opt = {
48+
pkg: pkg
49+
};
50+
transport(file, opt, function(err, file) {
9851
var ext = path.extname(file.path);
9952
end(file.contents, res, ext);
100-
})
101-
);
53+
});
10254

103-
function notFound() {
104-
res.writeHead(404);
105-
res.end('');
106-
}
55+
function notFound() {
56+
res.writeHead(404);
57+
res.end('');
58+
}
59+
};
10760
};
10861

10962
function end(data, res, extname) {

lib/koa.js

Lines changed: 24 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,55 @@
1+
'use strict';
2+
13
var path = require('path');
2-
var fs = require('fs');
3-
var urlparse = require('url').parse;
4-
var through = require('through2');
5-
var pipe = require('multipipe');
6-
var gulp = require('gulp');
7-
var less = require('gulp-less');
8-
var gulpif = require('gulp-if');
9-
var coffee = require('gulp-coffee');
104
var mime = require('mime');
11-
var extend = require('extend');
125

13-
var cssParser = require('./parser/css');
14-
var css2jsParser = require('./parser/css2js');
15-
var jsParser = require('./parser/js');
16-
var tplParser = require('./parser/tpl');
17-
var jsonParser = require('./parser/json');
18-
var handlebarsParser = require('./parser/handlebars');
19-
var standalonify = require('./parser/standalonify');
20-
var Parser = require('./parser');
216
var util = require('./util');
7+
var parse = require('./parse');
8+
var transport = require('./transport');
229

2310
module.exports = function(root, opts) {
2411
opts = opts || {};
12+
var log = opts.log || function() {};
13+
2514
return function*(next) {
2615
if (this.header['servespmexit']) {
2716
next = notFound(this);
2817
}
2918

30-
var pkg = util.getPkg(root);
19+
var pkg = util.getPackage(root);
3120
if (!pkg) {
3221
return yield* next;
3322
}
3423

35-
var parser = new Parser(extend({
36-
root: root,
37-
req: urlparse(this.url.toLowerCase()),
38-
headers: this.header,
39-
pkg: util.getPkg(root)
40-
}, opts));
41-
42-
// is dep package, but not found
43-
if (!parser.pkg) {
44-
return yield* next;
45-
}
24+
var file = parse(this.url, {
25+
pkg: pkg,
26+
rules: opts.rules
27+
});
4628

47-
// don't handle if file is not found
48-
if (!parser.file) {
29+
if (!file) {
4930
return yield* next;
5031
}
5132

52-
// don't handle dir
53-
if (parser.isDir) {
54-
return yield* next;
55-
}
56-
57-
// 304
58-
var isModified = parser.isModified();
59-
this.set('Last-Modified', parser.modifiedTime);
60-
if (!isModified) {
33+
var modifiedTime = util.getModifiedTime(file);
34+
this.set('Last-Modified', modifiedTime);
35+
if (!util.isModified(this.header, modifiedTime)) {
6136
this.status = 304;
6237
return;
6338
}
6439

65-
if (opts.log) {
66-
console.log('>> ServeSPM %s < ./%s',
67-
parser.req.pathname, path.relative(process.cwd(), parser.file));
68-
}
40+
log('>> ServeSPM %s < ./%s',
41+
file.url.pathname, path.relative(process.cwd(), file.path));
6942

70-
var data, ext;
7143
// nowrap
72-
if (parser.noWrap) {
73-
data = fs.readFileSync(parser.file, 'utf-8');
74-
if (parser.handlebarId) {
75-
data = util.template(data, {id:parser.handlebarId});
76-
}
77-
ext = path.extname(parser.file);
44+
var data, ext;
45+
if (!file.wrap) {
46+
data = file.contents;
47+
ext = path.extname(file.path);
7848
}
7949

8050
else {
8151
// transport file
82-
var file = yield parse(parser);
52+
file = yield transportThunk(file, {pkg: pkg});
8353
data = file.contents;
8454
ext = path.extname(file.path);
8555
}
@@ -99,32 +69,8 @@ function* notFound(ctx) {
9969
ctx.status = 404;
10070
}
10171

102-
function parse(parser) {
103-
var file = parser.file;
104-
var useCss2jsParser = util.isCSSFile(file) &&
105-
/\.js$/.test(parser.req.pathname);
106-
var useStandalone = function(file) {
107-
return parser.isStandalone(file.path);
108-
};
109-
72+
function transportThunk(file, opt) {
11073
return function(cb) {
111-
pipe(
112-
gulp.src(file),
113-
114-
gulpif(/\.less$/, less({ paths: [path.dirname(file)] })),
115-
gulpif(/\.css$/, cssParser(parser)),
116-
gulpif(useCss2jsParser, css2jsParser(parser)),
117-
gulpif(/\.coffee$/, coffee({bare: true})),
118-
gulpif(/\.js$/, jsParser(parser)),
119-
gulpif(/\.tpl$/, tplParser(parser)),
120-
gulpif(/\.json$/, jsonParser(parser)),
121-
gulpif(/\.handlebars$/, handlebarsParser(parser)),
122-
gulpif(useStandalone, standalonify(this.url)),
123-
124-
through.obj(function(file) {
125-
cb(null, file);
126-
})
127-
)
128-
.once('error', cb);
74+
transport(file, opt, cb);
12975
};
13076
}

0 commit comments

Comments
 (0)