forked from vaffel/react-components
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
130 lines (112 loc) · 3.13 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
'use strict';
require('node-jsx').install({ extension: '.jsx' });
var isDev = process.env.NODE_ENV === 'development';
var winston = require('winston');
var Pushover = require('winston-pushover').Pushover;
if (!isDev) {
var pushOpts = {
userKey: process.env.PUSHOVER_USER_KEY,
token: process.env.PUSHOVER_TOKEN,
handleExceptions: true
};
winston.add(Pushover, pushOpts);
winston.handleExceptions(new Pushover(pushOpts));
}
var _ = require('lodash');
var Hapi = require('hapi');
var server = new Hapi.Server(process.env.REACT_COMPONENTS_PORT || 3000);
var render = require('app/react/renderer');
var pkgInfo = require('./package.json');
var tpl = function(file) { return __dirname + '/templates/' + file + '.html'; };
var params = {
'package': pkgInfo,
'page': {
description: pkgInfo.description,
title: 'React Components'
},
'resources': {
css: [
'/css/pure-min.css',
'/css/codemirror.css',
'/css/components.css'
],
js: [
'/js/codemirror-compressed.js',
'/js/analytics.js',
'/dist/vendor.bundle.js',
'/dist/bundle.js',
]
}
};
var controllers = {
components: require('app/controllers/components')
};
function getPageTitle(query) {
if (!query) {
return params.page.title;
}
return query + ' - ' + params.page.title;
}
function handleRequest(request, reply) {
var reqParams = _.merge({}, params, {
page: {
title: getPageTitle(request.params.query || request.params.component)
}
});
var liveReloadSrc = isDev ? ' localhost:35729' : '';
var analyticsSrc = ' http://www.google-analytics.com https://www.google-analytics.com';
reply(render(request, reqParams, tpl('default')))
.header('X-UA-Compatible', 'IE=edge,chrome=1')
.header('Cache-Control', 'public, must-revalidate, max-age=150')
.header('Content-Security-Policy', [
'script-src \'self\'' + liveReloadSrc + analyticsSrc,
'frame-src \'none\'',
'object-src \'none\''
].join(';'));
}
server.route({
method: 'GET',
path: '/',
handler: handleRequest
});
server.route({
method: 'GET',
path: '/search/{query}',
handler: handleRequest
});
server.route({
method: 'GET',
path: '/component/{component}',
handler: handleRequest
});
server.route({
method: 'GET',
path: '/api/components',
config: {
handler: controllers.components.componentsList,
cache: { expiresIn: 1000 * 60 * 5, privacy: 'public' }
}
});
server.route({
method: 'GET',
path: '/api/components/{component}',
config: {
handler: controllers.components.componentInfo
}
});
server.route({
method: 'GET',
path: '/{param*}',
config: {
handler: {
directory: {
path: 'public',
lookupCompressed: true
}
},
cache: { expiresIn: 3600 * 1000, privacy: 'public' }
}
});
server.start(function() {
console.log('Server running at:', server.info.uri);
});