| 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 | 6×
38×
1×
1×
1×
1×
1×
1×
38×
38×
38×
38×
38×
8×
38×
48×
38×
5×
38×
38×
28×
1×
7×
7×
7×
7×
7×
4×
3×
7×
7×
7×
7×
7×
7×
14×
14×
14×
14×
8×
8×
8×
8×
7×
12×
1×
1×
1×
1×
7×
7×
7×
36×
1×
35×
35×
35×
14×
21×
3×
3×
3×
3×
3×
3×
43×
24×
19×
19×
19×
63×
63×
63×
63×
63×
63×
1×
1×
62×
19×
7×
1×
6×
6×
20×
20×
20×
6×
1×
1×
1×
| 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= |