fusion-cli
Version:
81 lines (69 loc) • 2.39 kB
JavaScript
/** Copyright (c) 2018 Uber Technologies, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
/* eslint-env node */
/* eslint-disable import/first */
import sourceMapSupport from 'source-map-support';
sourceMapSupport.install();
// $FlowFixMe
import '__SECRET_I18N_MANIFEST_INSTRUMENTATION_LOADER__!'; // eslint-disable-line
import BaseApp, {
RoutePrefixToken,
SSRBodyTemplateToken,
SSRShellTemplateToken,
CriticalChunkIdsToken,
} from 'fusion-core';
import CriticalChunkIdsPlugin from '../plugins/critical-chunk-ids-plugin.js';
import AssetsFactory from '../plugins/assets-plugin';
import ContextPlugin from '../plugins/context-plugin';
import {SSRBodyTemplate, getSSRShellTemplate} from '../plugins/ssr-plugin';
import {SSRModuleScriptsBodyTemplate} from '../plugins/ssr-module-scripts-plugin';
import stripRoutePrefix from '../lib/strip-prefix.js';
let prefix = process.env.ROUTE_PREFIX;
// $FlowFixMe
const main = require('__FUSION_ENTRY_PATH__'); // eslint-disable-line import/no-unresolved, import/no-extraneous-dependencies
const initialize = main
? main.default || main
: () => {
throw new Error('App should export a function');
};
export default async function loadApp(
dir /*: string */ = '.',
options /* : ?{useModuleScripts?: boolean} */ = {}
) {
const {useModuleScripts = false} = options || {};
const app = await initialize();
if (!(app instanceof BaseApp)) {
throw new Error('Application entry point did not return an App');
}
const AssetsPlugin = AssetsFactory(dir);
reverseRegister(app, ContextPlugin);
app.register(AssetsPlugin);
app.register(
SSRBodyTemplateToken,
useModuleScripts ? SSRModuleScriptsBodyTemplate : SSRBodyTemplate
);
app.register(SSRShellTemplateToken, getSSRShellTemplate(useModuleScripts));
app.register(CriticalChunkIdsToken, CriticalChunkIdsPlugin);
if (prefix) {
app.register(RoutePrefixToken, prefix);
}
const appHandler = app.callback();
const handler = (req /*: any */, res /*: any */) => {
if (prefix) {
stripRoutePrefix(req, prefix);
}
appHandler(req, res).catch((e) => {
app.onerror(e);
});
};
return handler;
}
function reverseRegister(app, token, plugin) {
app.register(token, plugin);
app.plugins.unshift(app.plugins.pop());
}