Eif (typeof define !== 'function') {
var define = require('amdefine')(module);
}
define(function (require) {
'use strict';
var ErContext = require('./ErContext');
var controller = require('./controller');
var router = require('./router');
var locator = require('./locator');
var eventBus = require('./events');
var permission = require('./permission');
var canUseDOM = require('./ExecutionEnvironment').canUseDOM;
var util = require('./util');
var actionPathMapping = {};
var Plugins = {};
var main = {
/**
* Register action configurations
* @static
* @method registerActionConfigs
* @param {Array|Object} actionConfigs Action configurations
*/
registerAction: function registerAction(actionConfigs) {
if (!Array.isArray(actionConfigs)) {
actionConfigs = [actionConfigs];
}
actionConfigs.forEach(function (actionConfig) {
if (!actionConfig.path) {
throw new Error('action config should contains a `path` property');
}
actionPathMapping[actionConfig.path] = actionConfig;
});
},
/**
* Find action configuration according to action context
* @static
* @method findActionConfig
* @param {ActionContext} actionContext Action context
* @returns {*}
*/
findActionConfig: function findActionConfig(actionContext) {
var path = actionContext.url.getPath();
return actionPathMapping[path];
},
/**
* Provides plugin mechanism for adding application level settings that are persisted
* between server/client and also modification of the ErContext
* @static
* @method registerPlugin
* @param {string} name Name of the plugin
* @param {Object} plugin
* @param {Function} plugin.plugContext Method called after context is created to allow
* dynamically plugging the context
* @param {Function} [plugin.dehydrate] Method called to serialize the plugin settings to persisted
* to the client
* @param {Function} [plugin.rehydrate] Method to called to rehydrate the plugin settings from the server
* to the client
*/
registerPlugin: function registerPlugin(name, Plugin) {
if (!name) {
throw new Error('Application plugin must have a name');
}
Plugins[name] = Plugin;
},
/**
* Unregister a plugin
* @static
* @method unregisterPlugin
* @param {string} name Name of the plugin
*/
unregisterPlugin: function unregisterPlugin(name) {
Eif (name) {
delete Plugins[name];
}
},
/**
* Creates a isolated context for a request and session
* @static
* @method createErContext
* @param {Object} [options]
* @return {ErContext}
*/
createErContext: function createErContext(options) {
options = options || {};
var erContext = new ErContext(options);
// plug erContext with app plugins that implement plugContext method
Object.keys(Plugins).forEach(function (name) {
var Plugin = Plugins[name];
var erContextPlugin = new Plugin(erContext, options);
!canUseDOM && erContextPlugin.plugErContext && erContextPlugin.plugErContext();
erContext.plug(erContextPlugin);
});
return erContext;
},
/**
* Creates a serializable state of the application and a given context for sending to the client
* @static
* @method dehydrate
* @param {ErContext} erContext
* @returns {Object} Dehydrated state object
*/
dehydrate: function dehydrate(erContext) {
return erContext.dehydrate();
},
/**
* Rehydrate the application and creates a new context with the state from the server
* @static
* @method rehydrate
* @param {Object} obj Raw object of dehydrated state
* @param {Object} obj.plugins Dehydrated app plugin state
* @param {Object} obj.erContext Dehydrated erContext state
* @async Rehydration may require more asset loading or async IO calls
*/
rehydrate: function rehydrate(obj, options) {
// use the default controller, router, locator, eventBus, permission in browser environment
options = util.mix({ controller: controller, router: router, locator: locator, eventBus: eventBus, permission: permission }, options || {});
var erContext = main.createErContext(options);
return erContext.rehydrate(obj || {});
}
};
return main;
});
//# sourceMappingURL=data:application/json;base64,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WCxtQkFBVyxtQkFBQyxHQUFELEVBQU0sT0FBTixFQUFrQjs7QUFFekIsc0JBQVUsS0FBSyxHQUFMLENBQVMsRUFBQyxzQkFBRCxFQUFhLGNBQWIsRUFBcUIsZ0JBQXJCLEVBQThCLGtCQUE5QixFQUF3QyxzQkFBeEMsRUFBVCxFQUErRCxXQUFXLEVBQVgsQ0FBekUsQ0FGeUI7QUFHekIsZ0JBQU0sWUFBWSxLQUFLLGVBQUwsQ0FBcUIsT0FBckIsQ0FBWixDQUhtQjs7QUFLekIsbUJBQU8sVUFBVSxTQUFWLENBQW9CLE9BQU8sRUFBUCxDQUEzQixDQUx5QjtTQUFsQjtLQTNHVCxDQWpCZ0I7O0FBcUl0QixXQUFPLElBQVAsQ0FySXNCO0NBQW5CLENBQVAiLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7dmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlKX1cblxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgY29uc3QgRXJDb250ZXh0ID0gcmVxdWlyZSgnLi9FckNvbnRleHQnKTtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSByZXF1aXJlKCcuL2NvbnRyb2xsZXInKTtcbiAgICBjb25zdCByb3V0ZXIgPSByZXF1aXJlKCcuL3JvdXRlcicpO1xuICAgIGNvbnN0IGxvY2F0b3IgPSByZXF1aXJlKCcuL2xvY2F0b3InKTtcbiAgICBjb25zdCBldmVudEJ1cyA9IHJlcXVpcmUoJy4vZXZlbnRzJyk7XG4gICAgY29uc3QgcGVybWlzc2lvbiA9IHJlcXVpcmUoJy4vcGVybWlzc2lvbicpO1xuICAgIGNvbnN0IGNhblVzZURPTSA9IHJlcXVpcmUoJy4vRXhlY3V0aW9uRW52aXJvbm1lbnQnKS5jYW5Vc2VET007XG4gICAgY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4gICAgY29uc3QgYWN0aW9uUGF0aE1hcHBpbmcgPSB7fTtcbiAgICBjb25zdCBQbHVnaW5zID0ge307XG5cblxuICAgIGNvbnN0IG1haW4gPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWdpc3RlciBhY3Rpb24gY29uZmlndXJhdGlvbnNcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWV0aG9kIHJlZ2lzdGVyQWN0aW9uQ29uZmlnc1xuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gYWN0aW9uQ29uZmlncyBBY3Rpb24gY29uZmlndXJhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIHJlZ2lzdGVyQWN0aW9uOiAoYWN0aW9uQ29uZmlncykgPT4ge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFjdGlvbkNvbmZpZ3MpKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uQ29uZmlncyA9IFthY3Rpb25Db25maWdzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYWN0aW9uQ29uZmlncy5mb3JFYWNoKChhY3Rpb25Db25maWcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkNvbmZpZy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYWN0aW9uIGNvbmZpZyBzaG91bGQgY29udGFpbnMgYSBgcGF0aGAgcHJvcGVydHknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWN0aW9uUGF0aE1hcHBpbmdbYWN0aW9uQ29uZmlnLnBhdGhdID0gYWN0aW9uQ29uZmlnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbmQgYWN0aW9uIGNvbmZpZ3VyYXRpb24gYWNjb3JkaW5nIHRvIGFjdGlvbiBjb250ZXh0XG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQG1ldGhvZCBmaW5kQWN0aW9uQ29uZmlnXG4gICAgICAgICAqIEBwYXJhbSB7QWN0aW9uQ29udGV4dH0gYWN0aW9uQ29udGV4dCBBY3Rpb24gY29udGV4dFxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGZpbmRBY3Rpb25Db25maWc6IChhY3Rpb25Db250ZXh0KSA9PiB7XG4gICAgICAgICAgICBsZXQgcGF0aCA9IGFjdGlvbkNvbnRleHQudXJsLmdldFBhdGgoKTtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb25QYXRoTWFwcGluZ1twYXRoXTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUHJvdmlkZXMgcGx1Z2luIG1lY2hhbmlzbSBmb3IgYWRkaW5nIGFwcGxpY2F0aW9uIGxldmVsIHNldHRpbmdzIHRoYXQgYXJlIHBlcnNpc3RlZFxuICAgICAgICAgKiBiZXR3ZWVuIHNlcnZlci9jbGllbnQgYW5kIGFsc28gbW9kaWZpY2F0aW9uIG9mIHRoZSBFckNvbnRleHRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWV0aG9kIHJlZ2lzdGVyUGx1Z2luXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHBsdWdpblxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcGx1Z2luXG4gICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBsdWdpbi5wbHVnQ29udGV4dCBNZXRob2QgY2FsbGVkIGFmdGVyIGNvbnRleHQgaXMgY3JlYXRlZCB0byBhbGxvd1xuICAgICAgICAgKiBkeW5hbWljYWxseSBwbHVnZ2luZyB0aGUgY29udGV4dFxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcGx1Z2luLmRlaHlkcmF0ZV0gTWV0aG9kIGNhbGxlZCB0byBzZXJpYWxpemUgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBwZXJzaXN0ZWRcbiAgICAgICAgICogdG8gdGhlIGNsaWVudFxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcGx1Z2luLnJlaHlkcmF0ZV0gTWV0aG9kIHRvIGNhbGxlZCB0byByZWh5ZHJhdGUgdGhlIHBsdWdpbiBzZXR0aW5ncyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICogdG8gdGhlIGNsaWVudFxuICAgICAgICAgKi9cbiAgICAgICAgcmVnaXN0ZXJQbHVnaW46IChuYW1lLCBQbHVnaW4pID0+IHtcbiAgICAgICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwbGljYXRpb24gcGx1Z2luIG11c3QgaGF2ZSBhIG5hbWUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFBsdWdpbnNbbmFtZV0gPSBQbHVnaW47XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVucmVnaXN0ZXIgYSBwbHVnaW5cbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAbWV0aG9kIHVucmVnaXN0ZXJQbHVnaW5cbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgcGx1Z2luXG4gICAgICAgICAqL1xuICAgICAgICB1bnJlZ2lzdGVyUGx1Z2luOiAobmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgUGx1Z2luc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIGlzb2xhdGVkIGNvbnRleHQgZm9yIGEgcmVxdWVzdCBhbmQgc2Vzc2lvblxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZXRob2QgY3JlYXRlRXJDb250ZXh0XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgICAgICogQHJldHVybiB7RXJDb250ZXh0fVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlRXJDb250ZXh0OiAob3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICBjb25zdCBlckNvbnRleHQgPSBuZXcgRXJDb250ZXh0KG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBwbHVnIGVyQ29udGV4dCB3aXRoIGFwcCBwbHVnaW5zIHRoYXQgaW1wbGVtZW50IHBsdWdDb250ZXh0IG1ldGhvZFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoUGx1Z2lucykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFBsdWdpbiA9IFBsdWdpbnNbbmFtZV07XG4gICAgICAgICAgICAgICAgY29uc3QgZXJDb250ZXh0UGx1Z2luID0gbmV3IFBsdWdpbihlckNvbnRleHQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICFjYW5Vc2VET00gJiYgZXJDb250ZXh0UGx1Z2luLnBsdWdFckNvbnRleHQgJiYgZXJDb250ZXh0UGx1Z2luLnBsdWdFckNvbnRleHQoKTtcbiAgICAgICAgICAgICAgICBlckNvbnRleHQucGx1ZyhlckNvbnRleHRQbHVnaW4pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBlckNvbnRleHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSBzZXJpYWxpemFibGUgc3RhdGUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCBhIGdpdmVuIGNvbnRleHQgZm9yIHNlbmRpbmcgdG8gdGhlIGNsaWVudFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZXRob2QgZGVoeWRyYXRlXG4gICAgICAgICAqIEBwYXJhbSB7RXJDb250ZXh0fSBlckNvbnRleHRcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gRGVoeWRyYXRlZCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICovXG4gICAgICAgIGRlaHlkcmF0ZTogKGVyQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGVyQ29udGV4dC5kZWh5ZHJhdGUoKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVoeWRyYXRlIHRoZSBhcHBsaWNhdGlvbiBhbmQgY3JlYXRlcyBhIG5ldyBjb250ZXh0IHdpdGggdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBtZXRob2QgcmVoeWRyYXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogUmF3IG9iamVjdCBvZiBkZWh5ZHJhdGVkIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmoucGx1Z2lucyBEZWh5ZHJhdGVkIGFwcCBwbHVnaW4gc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iai5lckNvbnRleHQgRGVoeWRyYXRlZCBlckNvbnRleHQgc3RhdGVcbiAgICAgICAgICogQGFzeW5jIFJlaHlkcmF0aW9uIG1heSByZXF1aXJlIG1vcmUgYXNzZXQgbG9hZGluZyBvciBhc3luYyBJTyBjYWxsc1xuICAgICAgICAgKi9cbiAgICAgICAgcmVoeWRyYXRlOiAob2JqLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAvLyB1c2UgdGhlIGRlZmF1bHQgY29udHJvbGxlciwgcm91dGVyLCBsb2NhdG9yLCBldmVudEJ1cywgcGVybWlzc2lvbiBpbiBicm93c2VyIGVudmlyb25tZW50XG4gICAgICAgICAgICBvcHRpb25zID0gdXRpbC5taXgoe2NvbnRyb2xsZXIsIHJvdXRlciwgbG9jYXRvciwgZXZlbnRCdXMsIHBlcm1pc3Npb259LCAob3B0aW9ucyB8fCB7fSkpO1xuICAgICAgICAgICAgY29uc3QgZXJDb250ZXh0ID0gbWFpbi5jcmVhdGVFckNvbnRleHQob3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHJldHVybiBlckNvbnRleHQucmVoeWRyYXRlKG9iaiB8fCB7fSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG1haW47XG59KTtcbiJdfQ== |