Add PEG support to gulpfile

- Extract conf - all project specific conf outside gulpfile
- Generalize filt.js exports, add required imports
This commit is contained in:
Aldo Cortesi 2015-01-03 11:46:51 +13:00
parent f1b040e808
commit 1959aebc08
8 changed files with 670 additions and 646 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

33
web/conf.js Normal file
View File

@ -0,0 +1,33 @@
var conf = {
src: "src/",
dist: "../libmproxy/web",
static: "../libmproxy/web/static",
js: {
// Don't package these in the vendor distribution
vendor_excludes: [
"bootstrap"
],
// Package these as well as the dependencies
vendor_includes: [
"react/addons"
],
app: 'src/js/app.js',
jshint: ["src/js/**.js", "!src/js/filt/filt.js"]
},
css: {
vendor: ["src/css/vendor.less"],
app: ["src/css/app.less"]
},
copy: [
"src/images/**",
],
templates: [
"src/templates/*"
],
fonts: ["src/fontawesome/fontawesome-webfont.*"],
peg: ["src/js/filt/filt.peg"],
port: 8082
};
module.exports = conf;

View File

@ -22,8 +22,11 @@ var source = require('vinyl-source-stream');
var sourcemaps = require('gulp-sourcemaps'); var sourcemaps = require('gulp-sourcemaps');
var transform = require('vinyl-transform'); var transform = require('vinyl-transform');
var uglify = require('gulp-uglify'); var uglify = require('gulp-uglify');
var peg = require("gulp-peg");
var filelog = require('gulp-filelog');
var packagejs = require('./package.json'); var packagejs = require('./package.json');
var conf = require('./conf.js');
// FIXME: react-with-addons.min.js for prod use issue // FIXME: react-with-addons.min.js for prod use issue
@ -35,41 +38,13 @@ var manifest = {
"app.js": "app.js", "app.js": "app.js",
}; };
var CONF = {
dist: "../libmproxy/web",
static: "../libmproxy/web/static",
js: {
// Don't package these in the vendor distribution
vendor_excludes: [
"bootstrap"
],
// Package these as well as the dependencies
vendor_includes: [
"react/addons"
],
app: 'src/js/app.js'
},
css: {
vendor: ["src/css/vendor.less"],
app: ["src/css/app.less"]
},
copy: [
"src/images/**",
],
templates: [
"src/templates/*"
],
fonts: ["src/fontawesome/fontawesome-webfont.*"],
port: 8082
};
var vendor_packages = _.difference( var vendor_packages = _.difference(
_.union( _.union(
_.keys(packagejs.dependencies), _.keys(packagejs.dependencies),
CONF.js.vendor_includes conf.js.vendor_includes
), ),
CONF.js.vendor_excludes conf.js.vendor_excludes
); );
// Custom linting reporter used for error notify // Custom linting reporter used for error notify
@ -113,8 +88,8 @@ var dont_break_on_errors = function(){
gulp.task("fonts", function () { gulp.task("fonts", function () {
return gulp.src(CONF.fonts) return gulp.src(conf.fonts)
.pipe(gulp.dest(CONF.dist + "fonts")); .pipe(gulp.dest(conf.dist + "fonts"));
}); });
@ -124,14 +99,14 @@ function styles_dev(files) {
.pipe(sourcemaps.init()) .pipe(sourcemaps.init())
.pipe(less()) .pipe(less())
.pipe(sourcemaps.write(".", {sourceRoot: "/static"})) .pipe(sourcemaps.write(".", {sourceRoot: "/static"}))
.pipe(gulp.dest(CONF.static)) .pipe(gulp.dest(conf.static))
.pipe(livereload({ auto: false }))); .pipe(livereload({ auto: false })));
} }
gulp.task("styles-app-dev", function(){ gulp.task("styles-app-dev", function(){
styles_dev(CONF.css.app); styles_dev(conf.css.app);
}); });
gulp.task("styles-vendor-dev", function(){ gulp.task("styles-vendor-dev", function(){
styles_dev(CONF.css.vendor); styles_dev(conf.css.vendor);
}); });
@ -143,14 +118,14 @@ function styles_prod(files) {
.pipe(minifyCSS()) .pipe(minifyCSS())
.pipe(rev()) .pipe(rev())
.pipe(save_rev()) .pipe(save_rev())
.pipe(gulp.dest(CONF.static)) .pipe(gulp.dest(conf.static))
.pipe(livereload({ auto: false }))); .pipe(livereload({ auto: false })));
} }
gulp.task("styles-app-prod", function(){ gulp.task("styles-app-prod", function(){
styles_prod(CONF.css.app); styles_prod(conf.css.app);
}); });
gulp.task("styles-vendor-prod", function(){ gulp.task("styles-vendor-prod", function(){
styles_prod(CONF.css.vendor); styles_prod(conf.css.vendor);
}); });
@ -165,7 +140,7 @@ function vendor_stream(debug){
} }
gulp.task("scripts-vendor-dev", function (){ gulp.task("scripts-vendor-dev", function (){
return vendor_stream(true) return vendor_stream(true)
.pipe(gulp.dest(CONF.static)); .pipe(gulp.dest(conf.static));
}); });
gulp.task("scripts-vendor-prod", function(){ gulp.task("scripts-vendor-prod", function(){
return vendor_stream(false) return vendor_stream(false)
@ -173,7 +148,7 @@ gulp.task("scripts-vendor-prod", function(){
.pipe(uglify()) .pipe(uglify())
.pipe(rev()) .pipe(rev())
.pipe(save_rev()) .pipe(save_rev())
.pipe(gulp.dest(CONF.static)); .pipe(gulp.dest(conf.static));
}); });
@ -186,14 +161,14 @@ function app_stream(debug) {
b.transform(reactify); b.transform(reactify);
return b.bundle(); return b.bundle();
}); });
return gulp.src([CONF.js.app]) return gulp.src([conf.js.app])
.pipe(dont_break_on_errors()) .pipe(dont_break_on_errors())
.pipe(browserified) .pipe(browserified)
.pipe(rename("app.js")); .pipe(rename("app.js"));
}; };
gulp.task('scripts-app-dev', function () { gulp.task('scripts-app-dev', function () {
return app_stream(true) return app_stream(true)
.pipe(gulp.dest(CONF.static)) .pipe(gulp.dest(conf.static))
.pipe(livereload({ auto: false })); .pipe(livereload({ auto: false }));
}); });
gulp.task('scripts-app-prod', function () { gulp.task('scripts-app-prod', function () {
@ -202,12 +177,12 @@ gulp.task('scripts-app-prod', function () {
.pipe(uglify()) .pipe(uglify())
.pipe(rev()) .pipe(rev())
.pipe(save_rev()) .pipe(save_rev())
.pipe(gulp.dest(CONF.static)); .pipe(gulp.dest(conf.static));
}); });
gulp.task("jshint", function () { gulp.task("jshint", function () {
return gulp.src(["src/js/**.js"]) return gulp.src(conf.js.jshint)
.pipe(dont_break_on_errors()) .pipe(dont_break_on_errors())
.pipe(react()) .pipe(react())
.pipe(plumber()) .pipe(plumber())
@ -217,27 +192,34 @@ gulp.task("jshint", function () {
}); });
gulp.task("copy", function(){ gulp.task("copy", function(){
return gulp.src(CONF.copy, {base:"src/"}) return gulp.src(conf.copy, {base:"src/"})
.pipe(gulp.dest(CONF.dist)); .pipe(gulp.dest(conf.dist));
}); });
function templates(){ function templates(){
return gulp.src(CONF.templates, {base:"src/"}) return gulp.src(conf.templates, {base:"src/"})
.pipe(replace(/\{\{\{(\S*)\}\}\}/g, function(match, p1) { .pipe(replace(/\{\{\{(\S*)\}\}\}/g, function(match, p1) {
return manifest[p1]; return manifest[p1];
})) }))
.pipe(gulp.dest(CONF.dist)); .pipe(gulp.dest(conf.dist));
}; };
gulp.task('templates', templates); gulp.task('templates', templates);
gulp.task("peg", function () {
return gulp.src(conf.peg, {base: "src/"})
.pipe(dont_break_on_errors())
.pipe(peg())
.pipe(filelog())
.pipe(gulp.dest("src/"));
});
gulp.task('connect', function() { gulp.task('connect', function() {
connect.server({ connect.server({
port: CONF.port port: conf.port
}); });
}); });
common = ["fonts", "copy"];
gulp.task( gulp.task(
"dev", "dev",
[ [
@ -246,6 +228,7 @@ gulp.task(
"styles-vendor-dev", "styles-vendor-dev",
"styles-app-dev", "styles-app-dev",
"scripts-vendor-dev", "scripts-vendor-dev",
"peg",
"scripts-app-dev", "scripts-app-dev",
], ],
templates templates
@ -258,6 +241,7 @@ gulp.task(
"styles-vendor-prod", "styles-vendor-prod",
"styles-app-prod", "styles-app-prod",
"scripts-vendor-prod", "scripts-vendor-prod",
"peg",
"scripts-app-prod", "scripts-app-prod",
"connect" "connect"
], ],
@ -267,8 +251,9 @@ gulp.task(
gulp.task("default", ["dev", "connect"], function () { gulp.task("default", ["dev", "connect"], function () {
livereload.listen({auto: true}); livereload.listen({auto: true});
gulp.watch(["src/css/vendor*"], ["styles-vendor-dev"]); gulp.watch(["src/css/vendor*"], ["styles-vendor-dev"]);
gulp.watch(conf.peg, ["peg", "scripts-app-dev"]);
gulp.watch(["src/js/**"], ["scripts-app-dev", "jshint"]); gulp.watch(["src/js/**"], ["scripts-app-dev", "jshint"]);
gulp.watch(["src/css/**"], ["styles-app-dev"]); gulp.watch(["src/css/**"], ["styles-app-dev"]);
gulp.watch(CONF.templates, ["templates"]); gulp.watch(conf.templates, ["templates"]);
gulp.watch(CONF.copy, ["copy"]); gulp.watch(conf.copy, ["copy"]);
}); });

View File

@ -12,4 +12,5 @@ $(function () {
ReactRouter.run(proxyapp.routes, function (Handler) { ReactRouter.run(proxyapp.routes, function (Handler) {
React.render(<Handler/>, document.body); React.render(<Handler/>, document.body);
}); });
}); });

View File

@ -1,6 +1,9 @@
var React = require("react"); var React = require("react");
var $ = require("jquery"); var $ = require("jquery");
var Filt = require("../filt/filt.js");
var utils = require("../utils.js");
var common = require("./common.js"); var common = require("./common.js");
var FilterDocs = React.createClass({ var FilterDocs = React.createClass({
@ -105,7 +108,7 @@ var FilterInput = React.createClass({
this.setState({mousefocus: false}); this.setState({mousefocus: false});
}, },
onKeyDown: function (e) { onKeyDown: function (e) {
if (e.keyCode === Key.ESC || e.keyCode === Key.ENTER) { if (e.keyCode === utils.Key.ESC || e.keyCode === utils.Key.ENTER) {
this.blur(); this.blur();
// If closed using ESC/ENTER, hide the tooltip. // If closed using ESC/ENTER, hide the tooltip.
this.setState({mousefocus: false}); this.setState({mousefocus: false});

View File

@ -1,5 +1,4 @@
/* jshint ignore:start */ module.exports = (function() {
Filt = (function() {
/* /*
* Generated by PEG.js 0.8.0. * Generated by PEG.js 0.8.0.
* *
@ -1592,6 +1591,8 @@ Filt = (function() {
} }
var flowutils = require("../flow/utils.js");
function or(first, second) { function or(first, second) {
// Add explicit function names to ease debugging. // Add explicit function names to ease debugging.
function orFilter() { function orFilter() {
@ -1640,7 +1641,7 @@ Filt = (function() {
]; ];
function assetFilter(flow) { function assetFilter(flow) {
if (flow.response) { if (flow.response) {
var ct = ResponseUtils.getContentType(flow.response); var ct = flowutils.ResponseUtils.getContentType(flow.response);
var i = ASSET_TYPES.length; var i = ASSET_TYPES.length;
while (i--) { while (i--) {
if (ASSET_TYPES[i].test(ct)) { if (ASSET_TYPES[i].test(ct)) {
@ -1674,9 +1675,9 @@ Filt = (function() {
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function headerFilter(flow){ function headerFilter(flow){
return ( return (
(flow.request && RequestUtils.match_header(flow.request, regex)) (flow.request && flowutils.RequestUtils.match_header(flow.request, regex))
|| ||
(flow.response && ResponseUtils.match_header(flow.response, regex)) (flow.response && flowutils.ResponseUtils.match_header(flow.response, regex))
); );
} }
headerFilter.desc = "header matches " + regex; headerFilter.desc = "header matches " + regex;
@ -1685,7 +1686,7 @@ Filt = (function() {
function requestHeader(regex){ function requestHeader(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function requestHeaderFilter(flow){ function requestHeaderFilter(flow){
return (flow.request && RequestUtils.match_header(flow.request, regex)); return (flow.request && flowutils.RequestUtils.match_header(flow.request, regex));
} }
requestHeaderFilter.desc = "req. header matches " + regex; requestHeaderFilter.desc = "req. header matches " + regex;
return requestHeaderFilter; return requestHeaderFilter;
@ -1693,7 +1694,7 @@ Filt = (function() {
function responseHeader(regex){ function responseHeader(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function responseHeaderFilter(flow){ function responseHeaderFilter(flow){
return (flow.response && ResponseUtils.match_header(flow.response, regex)); return (flow.response && flowutils.ResponseUtils.match_header(flow.response, regex));
} }
responseHeaderFilter.desc = "resp. header matches " + regex; responseHeaderFilter.desc = "resp. header matches " + regex;
return responseHeaderFilter; return responseHeaderFilter;
@ -1719,9 +1720,9 @@ Filt = (function() {
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function contentTypeFilter(flow){ function contentTypeFilter(flow){
return ( return (
(flow.request && regex.test(RequestUtils.getContentType(flow.request))) (flow.request && regex.test(flowutils.RequestUtils.getContentType(flow.request)))
|| ||
(flow.response && regex.test(ResponseUtils.getContentType(flow.response))) (flow.response && regex.test(flowutils.ResponseUtils.getContentType(flow.response)))
); );
} }
contentTypeFilter.desc = "content type matches " + regex; contentTypeFilter.desc = "content type matches " + regex;
@ -1730,7 +1731,7 @@ Filt = (function() {
function requestContentType(regex){ function requestContentType(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function requestContentTypeFilter(flow){ function requestContentTypeFilter(flow){
return flow.request && regex.test(RequestUtils.getContentType(flow.request)); return flow.request && regex.test(flowutils.RequestUtils.getContentType(flow.request));
} }
requestContentTypeFilter.desc = "req. content type matches " + regex; requestContentTypeFilter.desc = "req. content type matches " + regex;
return requestContentTypeFilter; return requestContentTypeFilter;
@ -1738,7 +1739,7 @@ Filt = (function() {
function responseContentType(regex){ function responseContentType(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function responseContentTypeFilter(flow){ function responseContentTypeFilter(flow){
return flow.response && regex.test(ResponseUtils.getContentType(flow.response)); return flow.response && regex.test(flowutils.ResponseUtils.getContentType(flow.response));
} }
responseContentTypeFilter.desc = "resp. content type matches " + regex; responseContentTypeFilter.desc = "resp. content type matches " + regex;
return responseContentTypeFilter; return responseContentTypeFilter;
@ -1746,7 +1747,7 @@ Filt = (function() {
function url(regex){ function url(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function urlFilter(flow){ function urlFilter(flow){
return flow.request && regex.test(RequestUtils.pretty_url(flow.request)); return flow.request && regex.test(flowutils.RequestUtils.pretty_url(flow.request));
} }
urlFilter.desc = "url matches " + regex; urlFilter.desc = "url matches " + regex;
return urlFilter; return urlFilter;
@ -1770,7 +1771,4 @@ Filt = (function() {
SyntaxError: SyntaxError, SyntaxError: SyntaxError,
parse: parse parse: parse
}; };
})(); })();
/* jshint ignore:end */
module.exports = Filt;

View File

@ -1,6 +1,8 @@
// PEG.js filter rules - see http://pegjs.majda.cz/online // PEG.js filter rules - see http://pegjs.majda.cz/online
{ {
var flowutils = require("../flow/utils.js");
function or(first, second) { function or(first, second) {
// Add explicit function names to ease debugging. // Add explicit function names to ease debugging.
function orFilter() { function orFilter() {
@ -49,7 +51,7 @@ var ASSET_TYPES = [
]; ];
function assetFilter(flow) { function assetFilter(flow) {
if (flow.response) { if (flow.response) {
var ct = ResponseUtils.getContentType(flow.response); var ct = flowutils.ResponseUtils.getContentType(flow.response);
var i = ASSET_TYPES.length; var i = ASSET_TYPES.length;
while (i--) { while (i--) {
if (ASSET_TYPES[i].test(ct)) { if (ASSET_TYPES[i].test(ct)) {
@ -83,9 +85,9 @@ function header(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function headerFilter(flow){ function headerFilter(flow){
return ( return (
(flow.request && RequestUtils.match_header(flow.request, regex)) (flow.request && flowutils.RequestUtils.match_header(flow.request, regex))
|| ||
(flow.response && ResponseUtils.match_header(flow.response, regex)) (flow.response && flowutils.ResponseUtils.match_header(flow.response, regex))
); );
} }
headerFilter.desc = "header matches " + regex; headerFilter.desc = "header matches " + regex;
@ -94,7 +96,7 @@ function header(regex){
function requestHeader(regex){ function requestHeader(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function requestHeaderFilter(flow){ function requestHeaderFilter(flow){
return (flow.request && RequestUtils.match_header(flow.request, regex)); return (flow.request && flowutils.RequestUtils.match_header(flow.request, regex));
} }
requestHeaderFilter.desc = "req. header matches " + regex; requestHeaderFilter.desc = "req. header matches " + regex;
return requestHeaderFilter; return requestHeaderFilter;
@ -102,7 +104,7 @@ function requestHeader(regex){
function responseHeader(regex){ function responseHeader(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function responseHeaderFilter(flow){ function responseHeaderFilter(flow){
return (flow.response && ResponseUtils.match_header(flow.response, regex)); return (flow.response && flowutils.ResponseUtils.match_header(flow.response, regex));
} }
responseHeaderFilter.desc = "resp. header matches " + regex; responseHeaderFilter.desc = "resp. header matches " + regex;
return responseHeaderFilter; return responseHeaderFilter;
@ -128,9 +130,9 @@ function contentType(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function contentTypeFilter(flow){ function contentTypeFilter(flow){
return ( return (
(flow.request && regex.test(RequestUtils.getContentType(flow.request))) (flow.request && regex.test(flowutils.RequestUtils.getContentType(flow.request)))
|| ||
(flow.response && regex.test(ResponseUtils.getContentType(flow.response))) (flow.response && regex.test(flowutils.ResponseUtils.getContentType(flow.response)))
); );
} }
contentTypeFilter.desc = "content type matches " + regex; contentTypeFilter.desc = "content type matches " + regex;
@ -139,7 +141,7 @@ function contentType(regex){
function requestContentType(regex){ function requestContentType(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function requestContentTypeFilter(flow){ function requestContentTypeFilter(flow){
return flow.request && regex.test(RequestUtils.getContentType(flow.request)); return flow.request && regex.test(flowutils.RequestUtils.getContentType(flow.request));
} }
requestContentTypeFilter.desc = "req. content type matches " + regex; requestContentTypeFilter.desc = "req. content type matches " + regex;
return requestContentTypeFilter; return requestContentTypeFilter;
@ -147,7 +149,7 @@ function requestContentType(regex){
function responseContentType(regex){ function responseContentType(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function responseContentTypeFilter(flow){ function responseContentTypeFilter(flow){
return flow.response && regex.test(ResponseUtils.getContentType(flow.response)); return flow.response && regex.test(flowutils.ResponseUtils.getContentType(flow.response));
} }
responseContentTypeFilter.desc = "resp. content type matches " + regex; responseContentTypeFilter.desc = "resp. content type matches " + regex;
return responseContentTypeFilter; return responseContentTypeFilter;
@ -155,7 +157,7 @@ function responseContentType(regex){
function url(regex){ function url(regex){
regex = new RegExp(regex, "i"); regex = new RegExp(regex, "i");
function urlFilter(flow){ function urlFilter(flow){
return flow.request && regex.test(RequestUtils.pretty_url(flow.request)); return flow.request && regex.test(flowutils.RequestUtils.pretty_url(flow.request));
} }
urlFilter.desc = "url matches " + regex; urlFilter.desc = "url matches " + regex;
return urlFilter; return urlFilter;