all files / fc-er/ URL.js

97.25% Statements 106/109
79.69% Branches 51/64
100% Functions 17/17
97.85% Lines 91/93
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 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183   38×             38× 38× 38×   38×   38×   38× 48×   38×     38×   38× 28×                                 14× 14× 14× 14×                 12×                       36×   35×   35× 35× 14×   21×                       43× 24×     19× 19× 19× 63× 63×     63× 63× 63×   63×     62×     19×             20× 20× 20×                            
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Eif (protoProps) defineProperties(Constructor.prototype, protoProps); Eif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
Eif (typeof define !== 'function') {
    var define = require('amdefine')(module);
}
 
define(function (require) {
    'use strict';
 
    var util = require('./util');
 
    var URL = function () {
        function URL() {
            var path = arguments.length <= 0 || arguments[0] === undefined ? '/' : arguments[0];
            var search = arguments.length <= 1 || arguments[1] === undefined ? '' : arguments[1];
            var searchSeparator = arguments.length <= 2 || arguments[2] === undefined ? '~' : arguments[2];
 
            _classCallCheck(this, URL);
 
            this.toString = function () {
                return search ? path + searchSeparator + search : path;
            };
            this.getPath = function () {
                return path;
            };
            this.getSearch = function () {
                return search;
            };
 
            var query = URL.parseQuery(search);
 
            this.getQuery = function (key) {
                return key ? query[key] : util.mix({}, query);
            };
        }
 
        _createClass(URL, [{
            key: 'compare',
            value: function compare(another) {
                Iif (typeof another === 'string') {
                    another = URL.parse(another);
                }
 
                var result = {};
 
                var thisPath = this.getPath();
                var anotherPath = another.getPath();
                if (thisPath === anotherPath) {
                    result.path = false;
                } else {
                    result.path = {
                        key: 'path',
                        self: thisPath,
                        other: anotherPath
                    };
                }
 
                var thisQuery = this.getQuery();
                var anotherQuery = another.getQuery();
                var queryDifferenceIndex = {};
                var queryDifference = [];
                var hasQueryDifference = false;
                for (var key in thisQuery) {
                    Eif (thisQuery.hasOwnProperty(key)) {
                        var thisValue = thisQuery[key];
                        var anotherValue = anotherQuery[key];
                        if (thisValue !== anotherValue) {
                            hasQueryDifference = true;
                            var diff = {
                                key: key,
                                self: thisValue,
                                other: anotherValue
                            };
                            queryDifference.push(diff);
                            queryDifferenceIndex[key] = diff;
                        }
                    }
                }
 
                for (var _key in anotherQuery) {
                    if (anotherQuery.hasOwnProperty(_key) && !thisQuery.hasOwnProperty(_key)) {
                        hasQueryDifference = true;
                        var _diff = {
                            key: _key,
                            self: undefined,
                            other: anotherQuery[_key]
                        };
                        queryDifference.push(_diff);
                        queryDifferenceIndex[_key] = _diff;
                    }
                }
                result.queryDifference = queryDifference;
                result.query = hasQueryDifference ? queryDifferenceIndex : false;
 
                return result;
            }
        }], [{
            key: 'parse',
            value: function parse(urlHash, options) {
                if (typeof urlHash !== 'string') {
                    return urlHash;
                }
                options = util.mix({ querySeparator: '~' }, options);
 
                var querySeparatorIndex = urlHash.indexOf(options.querySeparator);
                if (querySeparatorIndex >= 0) {
                    return new URL(urlHash.slice(0, querySeparatorIndex), urlHash.slice(querySeparatorIndex + 1), options.querySeparator);
                } else {
                    return new URL(urlHash, '', options.querySeparator);
                }
            }
        }, {
            key: 'withQuery',
            value: function withQuery(path, query, options) {
                path = path + '';
                options = util.mix({ querySeparator: '~' }, options);
 
                var separator = path.indexOf(options.querySeparator) < 0 ? options.querySeparator : '&';
                var search = URL.serialize(query);
                var urlHash = path + separator + search;
 
                return URL.parse(urlHash, options);
            }
        }, {
            key: 'parseQuery',
            value: function parseQuery(str) {
                if (!str) {
                    return {};
                }
 
                var pairs = str.split('&');
                var query = {};
                for (var i = 0; i < pairs.length; i++) {
                    var pair = pairs[i];
                    Iif (!pair) {
                        continue;
                    }
                    var index = pair.indexOf('=');
                    var key = index < 0 ? decodeURIComponent(pair) : decodeURIComponent(pair.slice(0, index));
                    var value = index < 0 ? true : decodeURIComponent(pair.slice(index + 1));
 
                    if (query.hasOwnProperty(key)) {
                        Eif (value !== true) {
                            query[key] = [].concat(query[key], value);
                        }
                    } else {
                        query[key] = value;
                    }
                }
                return query;
            }
        }, {
            key: 'serialize',
            value: function serialize(query) {
                if (!query) {
                    return '';
                }
 
                var search = '';
                for (var key in query) {
                    Eif (query.hasOwnProperty(key)) {
                        var value = query[key];
                        search += '&' + encodeURIComponent(key) + '=' + encodeURIComponent(value);
                    }
                }
 
                return search.slice(1);
            }
        }, {
            key: 'empty',
            get: function get() {
                return new URL();
            }
        }]);
 
        return URL;
    }();
 
    return URL;
});
//# sourceMappingURL=data:application/json;base64,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QUFJLENBQUMsS0FBRCxFQUFRO0FBQ1IsMkJBQU8sRUFBUCxDQURRO2lCQUFaOztBQUlBLG9CQUFJLFNBQVMsRUFBVCxDQUxnQjtBQU1wQixxQkFBSyxJQUFNLEdBQU4sSUFBYSxLQUFsQixFQUF5QjtBQUNyQix3QkFBSSxNQUFNLGNBQU4sQ0FBcUIsR0FBckIsQ0FBSixFQUErQjtBQUMzQiw0QkFBTSxRQUFRLE1BQU0sR0FBTixDQUFSLENBRHFCO0FBRTNCLGtDQUFVLE1BQU0sbUJBQW1CLEdBQW5CLENBQU4sR0FBZ0MsR0FBaEMsR0FBc0MsbUJBQW1CLEtBQW5CLENBQXRDLENBRmlCO3FCQUEvQjtpQkFESjs7QUFPQSx1QkFBTyxPQUFPLEtBQVAsQ0FBYSxDQUFiLENBQVAsQ0Fib0I7Ozs7Z0NBZ0JMO0FBQ2YsdUJBQU8sSUFBSSxHQUFKLEVBQVAsQ0FEZTs7Ozs7UUE3SkQ7O0FBa0t0QixXQUFPLEdBQVAsQ0FsS3NCO0NBQW5CLENBQVAiLCJmaWxlIjoiVVJMLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHt2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUpfVxuXG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBjb25zdCB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbiAgICBjbGFzcyBVUkwge1xuICAgICAgICBjb25zdHJ1Y3RvcihwYXRoID0gJy8nLCBzZWFyY2ggPSAnJywgc2VhcmNoU2VwYXJhdG9yID0gJ34nKSB7XG4gICAgICAgICAgICB0aGlzLnRvU3RyaW5nID0gKCkgPT4gc2VhcmNoID8gKHBhdGggKyBzZWFyY2hTZXBhcmF0b3IgKyBzZWFyY2gpIDogcGF0aDtcbiAgICAgICAgICAgIHRoaXMuZ2V0UGF0aCA9ICgpID0+IHBhdGg7XG4gICAgICAgICAgICB0aGlzLmdldFNlYXJjaCA9ICgpID0+IHNlYXJjaDtcblxuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSBVUkwucGFyc2VRdWVyeShzZWFyY2gpO1xuXG4gICAgICAgICAgICB0aGlzLmdldFF1ZXJ5ID0gKGtleSkgPT4ga2V5ID8gcXVlcnlba2V5XSA6IHV0aWwubWl4KHt9LCBxdWVyeSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wYXJlKGFub3RoZXIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYW5vdGhlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBhbm90aGVyID0gVVJMLnBhcnNlKGFub3RoZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgICAgICAgICAgY29uc3QgdGhpc1BhdGggPSB0aGlzLmdldFBhdGgoKTtcbiAgICAgICAgICAgIGNvbnN0IGFub3RoZXJQYXRoID0gYW5vdGhlci5nZXRQYXRoKCk7XG4gICAgICAgICAgICBpZiAodGhpc1BhdGggPT09IGFub3RoZXJQYXRoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnBhdGggPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wYXRoID0ge1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdwYXRoJyxcbiAgICAgICAgICAgICAgICAgICAgc2VsZjogdGhpc1BhdGgsXG4gICAgICAgICAgICAgICAgICAgIG90aGVyOiBhbm90aGVyUGF0aFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRoaXNRdWVyeSA9IHRoaXMuZ2V0UXVlcnkoKTtcbiAgICAgICAgICAgIGNvbnN0IGFub3RoZXJRdWVyeSA9IGFub3RoZXIuZ2V0UXVlcnkoKTtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5RGlmZmVyZW5jZUluZGV4ID0ge307XG4gICAgICAgICAgICBjb25zdCBxdWVyeURpZmZlcmVuY2UgPSBbXTtcbiAgICAgICAgICAgIGxldCBoYXNRdWVyeURpZmZlcmVuY2UgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXNRdWVyeSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzUXVlcnkuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlzVmFsdWUgPSB0aGlzUXVlcnlba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5vdGhlclZhbHVlID0gYW5vdGhlclF1ZXJ5W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzVmFsdWUgIT09IGFub3RoZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzUXVlcnlEaWZmZXJlbmNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6IHRoaXNWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcjogYW5vdGhlclZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlEaWZmZXJlbmNlLnB1c2goZGlmZik7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeURpZmZlcmVuY2VJbmRleFtrZXldID0gZGlmZjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYW5vdGhlclF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGFub3RoZXJRdWVyeS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF0aGlzUXVlcnkuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNRdWVyeURpZmZlcmVuY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXI6IGFub3RoZXJRdWVyeVtrZXldXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5RGlmZmVyZW5jZS5wdXNoKGRpZmYpO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeURpZmZlcmVuY2VJbmRleFtrZXldID0gZGlmZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucXVlcnlEaWZmZXJlbmNlID0gcXVlcnlEaWZmZXJlbmNlO1xuICAgICAgICAgICAgcmVzdWx0LnF1ZXJ5ID0gaGFzUXVlcnlEaWZmZXJlbmNlID8gcXVlcnlEaWZmZXJlbmNlSW5kZXggOiBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRpYyBwYXJzZSh1cmxIYXNoLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybEhhc2ggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybEhhc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25zID0gdXRpbC5taXgoe3F1ZXJ5U2VwYXJhdG9yOiAnfid9LCBvcHRpb25zKTtcblxuXG4gICAgICAgICAgICBjb25zdCBxdWVyeVNlcGFyYXRvckluZGV4ID0gdXJsSGFzaC5pbmRleE9mKG9wdGlvbnMucXVlcnlTZXBhcmF0b3IpO1xuICAgICAgICAgICAgaWYgKHF1ZXJ5U2VwYXJhdG9ySW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKFxuICAgICAgICAgICAgICAgICAgICB1cmxIYXNoLnNsaWNlKDAsIHF1ZXJ5U2VwYXJhdG9ySW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICB1cmxIYXNoLnNsaWNlKHF1ZXJ5U2VwYXJhdG9ySW5kZXggKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5xdWVyeVNlcGFyYXRvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmxIYXNoLCAnJywgb3B0aW9ucy5xdWVyeVNlcGFyYXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0aWMgd2l0aFF1ZXJ5KHBhdGgsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aCArICcnO1xuICAgICAgICAgICAgb3B0aW9ucyA9IHV0aWwubWl4KHtxdWVyeVNlcGFyYXRvcjogJ34nfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHBhdGguaW5kZXhPZihvcHRpb25zLnF1ZXJ5U2VwYXJhdG9yKSA8IDBcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnMucXVlcnlTZXBhcmF0b3JcbiAgICAgICAgICAgICAgICA6ICcmJztcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaCA9IFVSTC5zZXJpYWxpemUocXVlcnkpO1xuICAgICAgICAgICAgY29uc3QgdXJsSGFzaCA9IHBhdGggKyBzZXBhcmF0b3IgKyBzZWFyY2g7XG5cbiAgICAgICAgICAgIHJldHVybiBVUkwucGFyc2UodXJsSGFzaCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0aWMgcGFyc2VRdWVyeShzdHIpIHtcbiAgICAgICAgICAgIGlmICghc3RyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYWlycyA9IHN0ci5zcGxpdCgnJicpO1xuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gcGFpcnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGluZGV4IDwgMFxuICAgICAgICAgICAgICAgICAgICA/IGRlY29kZVVSSUNvbXBvbmVudChwYWlyKVxuICAgICAgICAgICAgICAgICAgICA6IGRlY29kZVVSSUNvbXBvbmVudChwYWlyLnNsaWNlKDAsIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbmRleCA8IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIDogZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2xpY2UoaW5kZXggKyAxKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAocXVlcnkuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5W2tleV0gPSBbXS5jb25jYXQocXVlcnlba2V5XSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGljIHNlcmlhbGl6ZShxdWVyeSkge1xuICAgICAgICAgICAgaWYgKCFxdWVyeSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHNlYXJjaCA9ICcnO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcXVlcnkpIHtcbiAgICAgICAgICAgICAgICBpZiAocXVlcnkuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHF1ZXJ5W2tleV07XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaCArPSAnJicgKyBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGljIGdldCBlbXB0eSgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gVVJMO1xufSk7XG4iXX0=