389 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			389 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
var storageShim = {
 | 
						|
    _data: {},
 | 
						|
 | 
						|
    /**
 | 
						|
     * Sets value of the specified item.
 | 
						|
     *
 | 
						|
     * @param {String} key - Key of the property.
 | 
						|
     * @param {*} value - Properties' value.
 | 
						|
     */
 | 
						|
    setItem: function (key, value) {
 | 
						|
        'use strict';
 | 
						|
 | 
						|
        this._data[key] = value + '';
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Retrieves specified item.
 | 
						|
     *
 | 
						|
     * @param {String} key - Key of the property to be retrieved.
 | 
						|
     */
 | 
						|
    getItem: function (key) {
 | 
						|
        'use strict';
 | 
						|
 | 
						|
        return this._data[key];
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Removes specified item.
 | 
						|
     *
 | 
						|
     * @param {String} key - Key of the property to be removed.
 | 
						|
     */
 | 
						|
    removeItem: function (key) {
 | 
						|
        'use strict';
 | 
						|
 | 
						|
        delete this._data[key];
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Removes all items.
 | 
						|
     */
 | 
						|
    clear: function () {
 | 
						|
        'use strict';
 | 
						|
 | 
						|
        this._data = {};
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
define('buildTools', [
 | 
						|
], function () {
 | 
						|
    'use strict';
 | 
						|
 | 
						|
    var storage,
 | 
						|
        storeName = 'buildDisabled';
 | 
						|
 | 
						|
    try {
 | 
						|
        storage = window.localStorage;
 | 
						|
    } catch (e) {
 | 
						|
        storage = storageShim;
 | 
						|
    }
 | 
						|
 | 
						|
    return {
 | 
						|
        isEnabled: storage.getItem(storeName) === null,
 | 
						|
 | 
						|
        /**
 | 
						|
         * Removes base url from the provided string
 | 
						|
         *
 | 
						|
         * @param {String} url - Url to be processed.
 | 
						|
         * @param {Object} config - RequiereJs config object.
 | 
						|
         * @returns {String} String without base url.
 | 
						|
         */
 | 
						|
        removeBaseUrl: function (url, config) {
 | 
						|
            var urlParts,
 | 
						|
                baseUrlParts,
 | 
						|
                baseUrl = config.baseUrl || '',
 | 
						|
                index = url.indexOf(baseUrl);
 | 
						|
 | 
						|
            if (~index) {
 | 
						|
                url = url.substring(baseUrl.length - index);
 | 
						|
            } else {
 | 
						|
                baseUrlParts = baseUrl.split('/');
 | 
						|
                baseUrlParts = baseUrlParts.slice(0, -5); // slice area/vendor/theme/locale/empty chunk
 | 
						|
                baseUrl = baseUrlParts.join('/');
 | 
						|
 | 
						|
                url = url.substring(baseUrl.length);
 | 
						|
 | 
						|
                urlParts = url.split('/');
 | 
						|
                urlParts = urlParts.slice(5); // slice empty chunk/area/vendor/theme/locale/
 | 
						|
                url = urlParts.join('/');
 | 
						|
            }
 | 
						|
 | 
						|
            return url;
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * Enables build usage.
 | 
						|
         */
 | 
						|
        on: function () {
 | 
						|
            storage.removeItem(storeName);
 | 
						|
 | 
						|
            location.reload();
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * Disables build usage.
 | 
						|
         */
 | 
						|
        off: function () {
 | 
						|
            storage.setItem(storeName, 'true');
 | 
						|
 | 
						|
            location.reload();
 | 
						|
        }
 | 
						|
    };
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Module responsible for collecting statistics
 | 
						|
 * data regarding modules that have been loader via bundle.
 | 
						|
 */
 | 
						|
define('statistician', [
 | 
						|
], function () {
 | 
						|
    'use strict';
 | 
						|
 | 
						|
    var storage,
 | 
						|
        stringify   = JSON.stringify.bind(JSON);
 | 
						|
 | 
						|
    try {
 | 
						|
        storage = window.localStorage;
 | 
						|
    } catch (e) {
 | 
						|
        storage = storageShim;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Removes duplicated entries of array, returning new one.
 | 
						|
     *
 | 
						|
     * @param {Array} arr
 | 
						|
     * @returns {Array}
 | 
						|
     */
 | 
						|
    function uniq(arr) {
 | 
						|
        return arr.filter(function (entry, i) {
 | 
						|
            return arr.indexOf(entry) >= i;
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Takes first array passed, removes all
 | 
						|
     * entries which further arrays contain.
 | 
						|
     *
 | 
						|
     * @returns {Array} Modified array
 | 
						|
     */
 | 
						|
    function difference() {
 | 
						|
        var args    = Array.prototype.slice.call(arguments),
 | 
						|
            target  = args.splice(0, 1)[0];
 | 
						|
 | 
						|
        return target.filter(function (entry) {
 | 
						|
            return !args.some(function (arr) {
 | 
						|
                return !!~arr.indexOf(entry);
 | 
						|
            });
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Stringifies 'data' parameter and sets it under 'key' namespace to localStorage.
 | 
						|
     *
 | 
						|
     * @param {*} data
 | 
						|
     * @param {String} key
 | 
						|
     */
 | 
						|
    function set(data, key) {
 | 
						|
        storage.setItem(key, stringify(data));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets item from localStorage by 'key' parameter, JSON.parse's it if defined.
 | 
						|
     * Else, returns empty array.
 | 
						|
     *
 | 
						|
     * @param   {String} key
 | 
						|
     * @returns {Array}
 | 
						|
     */
 | 
						|
    function getModules(key) {
 | 
						|
        var plain = storage.getItem(key);
 | 
						|
 | 
						|
        return plain ? JSON.parse(plain) : [];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Concats 'modules' array with one that was previously stored by 'key' parameter
 | 
						|
     * in localStorage, removes duplicated entries from resulting array and writes
 | 
						|
     * it to 'key' namespace of localStorage via 'set' function.
 | 
						|
     *
 | 
						|
     * @param {Array} modules
 | 
						|
     * @param {String} key
 | 
						|
     */
 | 
						|
    function storeModules(modules, key) {
 | 
						|
        var old = getModules(key);
 | 
						|
 | 
						|
        set(uniq(old.concat(modules)), key);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Creates Blob, writes passed data to it, then creates ObjectURL string
 | 
						|
     * with blob data. In parallel, creates 'a' element, writes resulting ObjectURL
 | 
						|
     * to it's href property and fileName parameter as it's download prop.
 | 
						|
     * Clicks on 'a' and cleans up file data.
 | 
						|
     *
 | 
						|
     * @param   {String} fileName
 | 
						|
     * @param   {Object} data
 | 
						|
     */
 | 
						|
    function upload(fileName, data) {
 | 
						|
        var a = document.createElement('a'),
 | 
						|
            blob,
 | 
						|
            url;
 | 
						|
 | 
						|
        a.style = 'display: none';
 | 
						|
        document.body.appendChild(a);
 | 
						|
 | 
						|
        blob = new Blob([JSON.stringify(data)], {
 | 
						|
            type: 'octet/stream'
 | 
						|
        });
 | 
						|
 | 
						|
        url = window.URL.createObjectURL(blob);
 | 
						|
 | 
						|
        a.href = url;
 | 
						|
        a.download = fileName;
 | 
						|
        a.click();
 | 
						|
 | 
						|
        window.URL.revokeObjectURL(url);
 | 
						|
    }
 | 
						|
 | 
						|
    return {
 | 
						|
 | 
						|
        /**
 | 
						|
         * Stores keys of 'modules' object to localStorage under 'all' namespace.
 | 
						|
         *
 | 
						|
         * @param {Object} modules
 | 
						|
         */
 | 
						|
        collect: function (modules) {
 | 
						|
            storeModules(Object.keys(modules), 'all');
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * Wraps 'module' in empty array and stores it to localStorage by 'used' namespace.
 | 
						|
         *
 | 
						|
         * @param {String} module
 | 
						|
         */
 | 
						|
        utilize: function (module) {
 | 
						|
            storeModules([module], 'used');
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * Returns modules, stores under 'all' namespace in localStorage via
 | 
						|
         * getModules function.
 | 
						|
         *
 | 
						|
         * @return {Array}
 | 
						|
         */
 | 
						|
        getAll: function () {
 | 
						|
            return getModules('all');
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * Returns modules, stores under 'used' namespace in localStorage via
 | 
						|
         * getModules function.
 | 
						|
         *
 | 
						|
         * @return {Array}
 | 
						|
         */
 | 
						|
        getUsed: function () {
 | 
						|
            return getModules('used');
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * Returns difference between arrays stored under 'all' and 'used'.
 | 
						|
         *
 | 
						|
         * @return {Array}
 | 
						|
         */
 | 
						|
        getUnused: function () {
 | 
						|
            var all     = getModules('all'),
 | 
						|
                used    = getModules('used');
 | 
						|
 | 
						|
            return difference(all, used);
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * Clears "all" and "used" namespaces of localStorage.
 | 
						|
         */
 | 
						|
        clear: function () {
 | 
						|
            storage.removeItem('all');
 | 
						|
            storage.removeItem('used');
 | 
						|
        },
 | 
						|
 | 
						|
        /**
 | 
						|
         * Create blob containing stats data and download it
 | 
						|
         */
 | 
						|
        export: function () {
 | 
						|
            upload('Magento Bundle Statistics', {
 | 
						|
                used: this.getUsed(),
 | 
						|
                unused: this.getUnused(),
 | 
						|
                all:  this.getAll()
 | 
						|
            });
 | 
						|
        }
 | 
						|
    };
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Extension of a requirejs 'load' method
 | 
						|
 * to load files from a build object.
 | 
						|
 */
 | 
						|
define('jsbuild', [
 | 
						|
    'module',
 | 
						|
    'buildTools',
 | 
						|
    'statistician'
 | 
						|
], function (module, tools, statistician) {
 | 
						|
    'use strict';
 | 
						|
 | 
						|
    var build = module.config() || {};
 | 
						|
 | 
						|
    if (!tools.isEnabled) {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    require._load = require.load;
 | 
						|
 | 
						|
    statistician.collect(build);
 | 
						|
 | 
						|
    /**
 | 
						|
     * Overrides requirejs main loading method to provide
 | 
						|
     * support of scripts initialization from a bundle object.
 | 
						|
     *
 | 
						|
     * @param {Object} context
 | 
						|
     * @param {String} moduleName
 | 
						|
     * @param {String} url
 | 
						|
     */
 | 
						|
    require.load = function (context, moduleName, url) {
 | 
						|
        var relative = tools.removeBaseUrl(url, context.config),
 | 
						|
            data     = build[relative];
 | 
						|
 | 
						|
        if (data) {
 | 
						|
            statistician.utilize(relative);
 | 
						|
 | 
						|
            new Function(data)();
 | 
						|
 | 
						|
            context.completeLoad(moduleName);
 | 
						|
        } else {
 | 
						|
            require._load.apply(require, arguments);
 | 
						|
        }
 | 
						|
    };
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Extension of a requirejs text plugin
 | 
						|
 * to load files from a build object.
 | 
						|
 */
 | 
						|
define('text', [
 | 
						|
    'module',
 | 
						|
    'buildTools',
 | 
						|
    'mage/requirejs/text'
 | 
						|
], function (module, tools, text) {
 | 
						|
    'use strict';
 | 
						|
 | 
						|
    var build = module.config() || {};
 | 
						|
 | 
						|
    if (!tools.isEnabled) {
 | 
						|
        return text;
 | 
						|
    }
 | 
						|
 | 
						|
    text._load = text.load;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Overrides load method of a 'text' plugin to provide support
 | 
						|
     * of loading files from a build object.
 | 
						|
     *
 | 
						|
     * @param {String} name
 | 
						|
     * @param {Function} req
 | 
						|
     * @param {Function} onLoad
 | 
						|
     * @param {Object} config
 | 
						|
     */
 | 
						|
    text.load = function (name, req, onLoad, config) {
 | 
						|
        var url      = req.toUrl(name),
 | 
						|
            relative = tools.removeBaseUrl(url, config),
 | 
						|
            data     = build[relative];
 | 
						|
 | 
						|
        data ?
 | 
						|
            onLoad(data) :
 | 
						|
            text._load.apply(text, arguments);
 | 
						|
    };
 | 
						|
 | 
						|
    return text;
 | 
						|
});
 |