all files / fc-er/ main.js

80% Statements 32/40
52.63% Branches 10/19
70% Functions 7/10
80% Lines 32/40
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 131 132 133 134 135 136 137 138 139                                                         16× 16×                                                                             871× 871×     871×             871×                                                                  
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==