UNPKG

3.35 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 app.use(require('./lib/js2html')());
34 app.use(router(app));
35 // parse application/x-www-form-urlencoded
36 app.use(koaBody());
37 app.use(jscoverHandler({
38 onlyLoad: function () {
39 return 1;
40 },
41 next: function () {
42 return 1;
43 }
44 }));
45 app.use(jsx(root, {
46 babel: babel,
47 // for test coverage
48 transformOption: {
49 retainLines: true
50 },
51 next: function () {
52 var ctx = this;
53 if (lessReg.test(ctx.body)) {
54 ctx.body = matchRequire.replaceAll(ctx.body, function (match, quote, dep) {
55 if (lessReg.test(dep + quote)) {
56 return 'require(' + quote + dep.replace(/\.less$/g, '.css') + quote + ')';
57 }
58 return match;
59 });
60 }
61 return 1;
62 }
63 }));
64 app.use(jscoverHandler({
65 jscover: require('node-jscover'),
66 next: function () {
67 return 1;
68 }
69 }));
70
71 var less = require('koa-less');
72 app.use(less(cwd, {
73 postprocess: {
74 css: function (css) {
75 return autoprefixer.process(css).css;
76 }
77 },
78 compiler: {
79 compress: false
80 }
81 }));
82
83 // before less
84 app.use(modularize(root, util.mix({
85 nowrap: function () {
86 return this.url.indexOf('nowrap') !== -1 || this.url.indexOf('/node_modules/node-jscover/') !== -1;
87 },
88 modules: {
89 react: path.join(cwd, reactPath, 'react.js'),
90 'react/addons': path.join(cwd, reactPath, 'addons.js')
91 },
92 next: function () {
93 return 1;
94 }
95 }, option.modularize)));
96
97 app.use(jscoverCoveralls({}));
98
99 app.use(require('koa-source-map')({
100 skip: function (currentApp, next) {
101 if (currentApp.url.indexOf('-coverage.js') !== -1) {
102 return true;
103 }
104 }
105 }));
106
107 app.use(serveIndex(root, {
108 hidden: true,
109 view: 'details'
110 }));
111
112 app.use(serve(root, {
113 hidden: true
114 }));
115
116 var utils = require('./lib/util');
117 var appname = currentPackageInfo.name;
118
119 app.get('/tests/runner.html', function* () {
120 var react = 1;
121 if (!fs.existsSync(path.join(cwd, reactPath))) {
122 react = 0;
123 }
124 yield this.render('runner', util.merge({
125 appname: appname,
126 react: react,
127 query: this.query
128 }, utils.getPackages()));
129 });
130
131 return app;
132};