UNPKG

3.63 kBJavaScriptView Raw
1'use strict';
2
3module.exports = function (app, option) {
4 option = option || {};
5 var serve = require('koa-static');
6 var babel = require('babel-core');
7 var cwd = process.cwd();
8 var util = require('modulex-util');
9 var path = require('path');
10 require('xtpl').config({
11 XTemplate: require('xtemplate')
12 });
13 app = app || require('koa')();
14 app = require('xtpl/lib/koa')(app, {
15 views: path.join(__dirname, '../views')
16 });
17 var fs = require('fs');
18 var root = cwd;
19 var serveIndex = require('koa-serve-index');
20 var modularize = require('koa-modularize');
21 var jsx = require('koa-jsx');
22 var koaBody = require('koa-body');
23 var jscoverHandler = require('koa-node-jscover');
24 var jscoverCoveralls = require('node-jscover-coveralls/lib/koa');
25 var router = require('koa-router');
26 var reactPath = 'node_modules/react';
27 var currentPackageInfo = require(path.join(cwd, 'package.json'));
28 var autoprefixer = require('autoprefixer-core');
29 var lessReg = /\.less['"]/;
30 var matchRequire = require('match-require');
31
32 app.use(require('koa-favicon')(path.join(__dirname, '../public/favicon.ico')));
33
34 app.use(router(app));
35
36 var utils = require('./util');
37 var appname = currentPackageInfo.name;
38
39 app.get('/tests/runner.html', function* () {
40 var react = 1;
41 if (!fs.existsSync(path.join(cwd, reactPath))) {
42 react = 0;
43 }
44 yield this.render('runner', util.merge({
45 appname: appname,
46 react: react,
47 query: this.query
48 }, utils.getPackages()));
49 });
50
51 app.use(require('./js2html')());
52
53 // parse application/x-www-form-urlencoded
54 app.use(koaBody());
55 app.use(jscoverHandler({
56 onlyLoad: function () {
57 return 1;
58 },
59 next: function () {
60 return 1;
61 }
62 }));
63 app.use(jsx(root, {
64 babel: babel,
65 // for test coverage
66 transformOption: {
67 retainLines: true
68 },
69 next: function () {
70 var ctx = this;
71 if (lessReg.test(ctx.body)) {
72 ctx.body = matchRequire.replaceAll(ctx.body, function (match, quote, dep) {
73 if (lessReg.test(dep + quote)) {
74 return 'require(' + quote + dep.replace(/\.less$/g, '.css') + quote + ')';
75 }
76 return match;
77 });
78 }
79 return 1;
80 }
81 }));
82 app.use(jscoverHandler({
83 jscover: require('node-jscover'),
84 next: function () {
85 return 1;
86 }
87 }));
88
89 app.use(require('./koa-less')(cwd, {
90 postprocess: {
91 css: function (css) {
92 return autoprefixer.process(css).css;
93 }
94 },
95 storeCss: function (cssPath, css, req, res) {
96 res.setHeader('Content-Length', new Buffer(css).length);
97 res.setHeader('Content-Type', 'text/css; charset=utf-8');
98 res.statusCode = (200);
99 res.end(css);
100 },
101 compiler: {
102 compress: false
103 }
104 }));
105
106 // before less
107 app.use(modularize(root, util.mix({
108 nowrap: function () {
109 return this.url.indexOf('nowrap') !== -1 ||
110 this.url.indexOf('/node_modules/node-jscover/') !== -1 ||
111 this.url.indexOf('/node_modules/mocha/') !== -1;
112 },
113 modules: {
114 react: path.join(cwd, reactPath, 'react.js'),
115 'react/addons': path.join(cwd, reactPath, 'addons.js')
116 },
117 next: function () {
118 return 1;
119 }
120 }, option.modularize)));
121
122 app.use(jscoverCoveralls({}));
123
124 app.use(require('koa-source-map')({
125 skip: function (currentApp, next) {
126 if (currentApp.url.indexOf('-coverage.js') !== -1) {
127 return true;
128 }
129 }
130 }));
131
132 app.use(serveIndex(root, {
133 hidden: true,
134 view: 'details'
135 }));
136
137 app.use(serve(root, {
138 hidden: true
139 }));
140
141 return app;
142};