ima
Version:
IMA.js framework for isomorphic javascript application
236 lines (197 loc) • 6.87 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.onLoad = exports.reviveClientApp = exports.hotReloadClientApp = exports.routeClientApp = exports.bootClientApp = exports.getClientBootConfig = exports.createImaApp = exports.getInitialPluginConfig = exports.getNamespace = exports.getInitialImaConfigFunctions = undefined;
var _vendorLinker = require("./vendorLinker");
var _vendorLinker2 = _interopRequireDefault(_vendorLinker);
var _namespace = require("./namespace");
var _namespace2 = _interopRequireDefault(_namespace);
var _ObjectContainer = require("./ObjectContainer");
var _ObjectContainer2 = _interopRequireDefault(_ObjectContainer);
var _Bootstrap = require("./Bootstrap");
var _Bootstrap2 = _interopRequireDefault(_Bootstrap);
var _bind = require("./config/bind");
var _bind2 = _interopRequireDefault(_bind);
var _services = require("./config/services");
var _services2 = _interopRequireDefault(_services);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function getInitialImaConfigFunctions() {
return {
initBindIma: _bind2.default,
initServicesIma: _services2.default
};
}
function getNamespace() {
return _namespace2.default;
}
function getInitialPluginConfig() {
return {
plugins: _vendorLinker2.default.getImaPlugins()
};
}
function _getRoot() {
return _isClient() ? window : global;
}
function _isClient() {
return typeof window !== 'undefined' && window !== null;
}
function createImaApp() {
let oc = new _ObjectContainer2.default(_namespace2.default);
let bootstrap = new _Bootstrap2.default(oc);
return {
oc,
bootstrap
};
}
function getClientBootConfig(initialAppConfigFunctions) {
let root = _getRoot();
if ($Debug && _isClient()) {
if ($IMA.$Protocol !== root.location.protocol) {
throw new Error(`Your client's protocol is not same as server's protocol. ` + `For right setting protocol on the server site set ` + `'X-Forwarded-Proto' header.`);
}
if ($IMA.$Host !== root.location.host) {
throw new Error(`Your client's host is not same as server's host. For right ` + `setting host on the server site set 'X-Forwarded-Host' ` + `header.`);
}
}
let bootConfig = {
services: {
respond: null,
request: null,
$IMA: $IMA,
dictionary: {
language: $IMA.$Language,
dictionary: $IMA.i18n
},
router: {
$Protocol: $IMA.$Protocol,
$Host: $IMA.$Host,
$Path: $IMA.$Path,
$Root: $IMA.$Root,
$LanguagePartPath: $IMA.$LanguagePartPath
}
},
settings: {
$Debug: $IMA.$Debug,
$Env: $IMA.$Env,
$Version: $IMA.$Version,
$App: $IMA.$App,
$Protocol: $IMA.$Protocol,
$Language: $IMA.$Language,
$Host: $IMA.$Host,
$Path: $IMA.$Path,
$Root: $IMA.$Root,
$LanguagePartPath: $IMA.$LanguagePartPath
}
};
return Object.assign(bootConfig, initialAppConfigFunctions, getInitialPluginConfig(), getInitialImaConfigFunctions());
}
function bootClientApp(app, bootConfig) {
app.bootstrap.run(bootConfig);
$IMA.$Dispatcher = app.oc.get('$Dispatcher');
let cache = app.oc.get('$Cache');
cache.deserialize($IMA.Cache || {});
return app;
}
function routeClientApp(app) {
let router = app.oc.get('$Router');
return router.listen().route(router.getPath()).catch(error => {
if (typeof $IMA.fatalErrorHandler === 'function') {
$IMA.fatalErrorHandler(error);
} else {
console.warn('Define function config.$IMA.fatalErrorHandler in ' + 'services.js.');
}
});
}
function hotReloadClientApp(initialAppConfigFunctions) {
if (!$Debug) {
return;
}
let app = createImaApp();
let bootConfig = getClientBootConfig(initialAppConfigFunctions);
app = bootClientApp(app, bootConfig);
let router = app.oc.get('$Router');
let pageManager = app.oc.get('$PageManager');
let currentRouteInfo = router.getCurrentRouteInfo();
let currentRoute = currentRouteInfo.route;
let currentRouteOptions = Object.assign({}, currentRoute.getOptions(), {
onlyUpdate: false,
autoScroll: false,
allowSPA: false
});
router.listen();
try {
return pageManager.manage(currentRoute, currentRouteOptions, currentRouteInfo.params).catch(error => {
return router.handleError({
error
});
}).catch(error => {
if (typeof $IMA.fatalErrorHandler === 'function') {
$IMA.fatalErrorHandler(error);
} else {
console.warn('Define the config.$IMA.fatalErrorHandler function ' + 'in services.js.');
}
});
} catch (error) {
return router.handleError({
error
});
}
}
function reviveClientApp(initialAppConfigFunctions) {
let root = _getRoot(); //set React for ReactJS extension for browser
root.React = _vendorLinker2.default.get('react');
root.$Debug = root.$IMA.$Debug;
let app = createImaApp();
let bootConfig = getClientBootConfig(initialAppConfigFunctions);
app = bootClientApp(app, bootConfig);
return routeClientApp(app).then(pageInfo => {
return Object.assign({}, pageInfo || {}, {
app,
bootConfig
});
});
}
function onLoad() {
_vendorLinker2.default.bindToNamespace(_namespace2.default);
if (!_isClient()) {
return Promise.reject(null);
}
if (document.readyState !== 'loading') {
return Promise.resolve();
}
return new Promise(resolve => {
document.addEventListener('DOMContentLoaded', () => resolve(), {
once: true
});
});
}
exports.getInitialImaConfigFunctions = getInitialImaConfigFunctions;
exports.getNamespace = getNamespace;
exports.getInitialPluginConfig = getInitialPluginConfig;
exports.createImaApp = createImaApp;
exports.getClientBootConfig = getClientBootConfig;
exports.bootClientApp = bootClientApp;
exports.routeClientApp = routeClientApp;
exports.hotReloadClientApp = hotReloadClientApp;
exports.reviveClientApp = reviveClientApp;
exports.onLoad = onLoad;
typeof $IMA !== 'undefined' && $IMA !== null && $IMA.Loader && $IMA.Loader.register('ima/main', [], function (_export, _context) {
'use strict';
return {
setters: [],
execute: function () {
_export('onLoad', exports.onLoad);
_export('getInitialImaConfigFunctions', exports.getInitialImaConfigFunctions);
_export('getNamespace', exports.getNamespace);
_export('getInitialPluginConfig', exports.getInitialPluginConfig);
_export('createImaApp', exports.createImaApp);
_export('getClientBootConfig', exports.getClientBootConfig);
_export('bootClientApp', exports.bootClientApp);
_export('routeClientApp', exports.routeClientApp);
_export('hotReloadClientApp', exports.hotReloadClientApp);
_export('reviveClientApp', exports.reviveClientApp);
_export('onLoad', exports.onLoad);
}
};
});