2018-05-07 15:33:08 +03:00
|
|
|
const Boom = require('boom');
|
2018-01-08 17:13:05 +02:00
|
|
|
const Inert = require('inert');
|
|
|
|
const Path = require('path');
|
2018-02-20 02:35:31 +02:00
|
|
|
const RenderReact = require('hapi-render-react');
|
2018-03-23 02:57:18 +02:00
|
|
|
const Intercept = require('apr-intercept');
|
|
|
|
const Fs = require('mz/fs');
|
|
|
|
|
2018-04-12 12:53:00 +03:00
|
|
|
const { NAMESPACE = 'images', NODE_ENV = 'development' } = process.env;
|
2018-01-08 17:13:05 +02:00
|
|
|
|
|
|
|
exports.register = async server => {
|
2018-05-07 15:33:08 +03:00
|
|
|
let manifest = {};
|
|
|
|
|
|
|
|
try {
|
|
|
|
manifest = require('../build/asset-manifest.json');
|
|
|
|
} catch (err) {
|
|
|
|
if (NODE_ENV === 'production') {
|
|
|
|
throw err;
|
|
|
|
} else {
|
|
|
|
console.error(err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-23 02:57:18 +02:00
|
|
|
const relativeTo = Path.join(__dirname, 'app');
|
2018-05-07 15:33:08 +03:00
|
|
|
const buildRoot = Path.join(__dirname, '../build');
|
|
|
|
const buildStatic = Path.join(buildRoot, `${NAMESPACE}`);
|
2018-03-23 02:57:18 +02:00
|
|
|
const publicRoot = Path.join(__dirname, `../public/static/`);
|
|
|
|
|
2018-02-20 02:35:31 +02:00
|
|
|
await server.register([
|
|
|
|
{
|
|
|
|
plugin: Inert
|
|
|
|
},
|
|
|
|
{
|
2018-03-23 02:57:18 +02:00
|
|
|
plugin: RenderReact
|
2018-02-20 02:35:31 +02:00
|
|
|
}
|
|
|
|
]);
|
2018-01-08 17:13:05 +02:00
|
|
|
|
|
|
|
server.route([
|
2018-02-20 02:35:31 +02:00
|
|
|
{
|
|
|
|
method: 'GET',
|
2018-03-23 02:57:18 +02:00
|
|
|
path: `/${NAMESPACE}/service-worker.js`,
|
2018-02-20 02:35:31 +02:00
|
|
|
config: {
|
|
|
|
auth: false,
|
|
|
|
handler: {
|
|
|
|
file: {
|
|
|
|
path: Path.join(__dirname, '../build/service-worker.js')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
method: 'GET',
|
2018-03-23 02:57:18 +02:00
|
|
|
path: `/${NAMESPACE}/favicon.ico`,
|
2018-02-20 02:35:31 +02:00
|
|
|
config: {
|
|
|
|
auth: false,
|
|
|
|
handler: {
|
|
|
|
file: {
|
|
|
|
path: Path.join(__dirname, '../build/favicon.ico')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
method: 'GET',
|
2018-03-23 02:57:18 +02:00
|
|
|
path: `/${NAMESPACE}/static/{rest*}`,
|
2018-02-20 02:35:31 +02:00
|
|
|
config: {
|
2018-03-23 02:57:18 +02:00
|
|
|
auth: false
|
|
|
|
},
|
|
|
|
handler: async (request, h) => {
|
|
|
|
const { params } = request;
|
|
|
|
const { rest } = params;
|
2018-02-20 02:35:31 +02:00
|
|
|
|
2018-05-07 15:33:08 +03:00
|
|
|
if (!rest) {
|
|
|
|
return Boom.notFound();
|
|
|
|
}
|
2018-02-20 02:35:31 +02:00
|
|
|
|
2018-05-07 15:33:08 +03:00
|
|
|
const publicPathname = Path.join(publicRoot, rest);
|
|
|
|
const [err1] = await Intercept(
|
2018-03-23 02:57:18 +02:00
|
|
|
Fs.access(publicPathname, Fs.constants.R_OK)
|
|
|
|
);
|
2018-02-20 02:35:31 +02:00
|
|
|
|
2018-05-07 15:33:08 +03:00
|
|
|
if (!err1) {
|
|
|
|
return h.file(publicPathname, {
|
|
|
|
confine: publicRoot
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const filename = manifest[rest];
|
|
|
|
if (!filename) {
|
|
|
|
return Boom.notFound();
|
|
|
|
}
|
|
|
|
|
|
|
|
const buildMapPathname = Path.join(buildRoot, filename);
|
|
|
|
const [err2] = await Intercept(
|
|
|
|
Fs.access(buildMapPathname, Fs.constants.R_OK)
|
|
|
|
);
|
|
|
|
|
|
|
|
if (!err2) {
|
|
|
|
return h.file(buildMapPathname, {
|
|
|
|
confine: buildStatic
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const buildPathname = Path.join(buildStatic, rest);
|
|
|
|
return h.file(buildPathname, {
|
|
|
|
confine: buildStatic
|
|
|
|
});
|
2018-01-08 17:13:05 +02:00
|
|
|
}
|
|
|
|
},
|
2018-02-20 02:35:31 +02:00
|
|
|
{
|
|
|
|
method: '*',
|
2018-03-23 02:57:18 +02:00
|
|
|
path: `/${NAMESPACE}/~server-error`,
|
2018-02-20 02:35:31 +02:00
|
|
|
handler: {
|
|
|
|
view: {
|
2018-03-23 02:57:18 +02:00
|
|
|
name: 'server-error',
|
|
|
|
relativeTo
|
2018-02-20 02:35:31 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2018-01-08 17:13:05 +02:00
|
|
|
{
|
|
|
|
method: '*',
|
2018-03-23 02:57:18 +02:00
|
|
|
path: `/${NAMESPACE}/{path*}`,
|
2018-02-20 02:35:31 +02:00
|
|
|
handler: {
|
|
|
|
view: {
|
2018-03-23 02:57:18 +02:00
|
|
|
name: 'app',
|
|
|
|
relativeTo
|
2018-01-08 17:13:05 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]);
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.pkg = require('../package.json');
|