@searchspring/snap-url-manager 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +228 -0
- package/dist/cjs/Translators/Noop/NoopTranslator.d.ts +10 -0
- package/dist/cjs/Translators/Noop/NoopTranslator.d.ts.map +1 -0
- package/dist/cjs/Translators/Noop/NoopTranslator.js +25 -0
- package/dist/cjs/Translators/QueryString/QueryStringTranslator.d.ts +35 -0
- package/dist/cjs/Translators/QueryString/QueryStringTranslator.d.ts.map +1 -0
- package/dist/cjs/Translators/QueryString/QueryStringTranslator.js +267 -0
- package/dist/cjs/Translators/Url/UrlTranslator.d.ts +67 -0
- package/dist/cjs/Translators/Url/UrlTranslator.d.ts.map +1 -0
- package/dist/cjs/Translators/Url/UrlTranslator.js +466 -0
- package/dist/cjs/Translators/index.d.ts +4 -0
- package/dist/cjs/Translators/index.d.ts.map +1 -0
- package/dist/cjs/Translators/index.js +15 -0
- package/dist/cjs/UrlManager/UrlManager.d.ts +50 -0
- package/dist/cjs/UrlManager/UrlManager.d.ts.map +1 -0
- package/dist/cjs/UrlManager/UrlManager.js +301 -0
- package/dist/cjs/UrlManager/typecheck.d.ts +5 -0
- package/dist/cjs/UrlManager/typecheck.d.ts.map +1 -0
- package/dist/cjs/UrlManager/typecheck.js +75 -0
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +15 -0
- package/dist/cjs/linkers/index.d.ts +2 -0
- package/dist/cjs/linkers/index.d.ts.map +1 -0
- package/dist/cjs/linkers/index.js +13 -0
- package/dist/cjs/linkers/react/react.d.ts +8 -0
- package/dist/cjs/linkers/react/react.d.ts.map +1 -0
- package/dist/cjs/linkers/react/react.js +15 -0
- package/dist/cjs/types.d.ts +47 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +13 -0
- package/dist/esm/Translators/Noop/NoopTranslator.d.ts +10 -0
- package/dist/esm/Translators/Noop/NoopTranslator.d.ts.map +1 -0
- package/dist/esm/Translators/Noop/NoopTranslator.js +20 -0
- package/dist/esm/Translators/QueryString/QueryStringTranslator.d.ts +35 -0
- package/dist/esm/Translators/QueryString/QueryStringTranslator.d.ts.map +1 -0
- package/dist/esm/Translators/QueryString/QueryStringTranslator.js +260 -0
- package/dist/esm/Translators/Url/UrlTranslator.d.ts +67 -0
- package/dist/esm/Translators/Url/UrlTranslator.d.ts.map +1 -0
- package/dist/esm/Translators/Url/UrlTranslator.js +448 -0
- package/dist/esm/Translators/index.d.ts +4 -0
- package/dist/esm/Translators/index.d.ts.map +1 -0
- package/dist/esm/Translators/index.js +3 -0
- package/dist/esm/UrlManager/UrlManager.d.ts +50 -0
- package/dist/esm/UrlManager/UrlManager.d.ts.map +1 -0
- package/dist/esm/UrlManager/UrlManager.js +256 -0
- package/dist/esm/UrlManager/typecheck.d.ts +5 -0
- package/dist/esm/UrlManager/typecheck.d.ts.map +1 -0
- package/dist/esm/UrlManager/typecheck.js +66 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/linkers/index.d.ts +2 -0
- package/dist/esm/linkers/index.d.ts.map +1 -0
- package/dist/esm/linkers/index.js +1 -0
- package/dist/esm/linkers/react/react.d.ts +8 -0
- package/dist/esm/linkers/react/react.d.ts.map +1 -0
- package/dist/esm/linkers/react/react.js +11 -0
- package/dist/esm/types.d.ts +47 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +10 -0
- package/package.json +31 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
14
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
15
|
+
if (ar || !(i in from)) {
|
|
16
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
17
|
+
ar[i] = from[i];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
21
|
+
};
|
|
22
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
23
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.UrlTranslator = void 0;
|
|
27
|
+
var deepmerge_1 = __importDefault(require("deepmerge"));
|
|
28
|
+
var types_1 = require("../../types");
|
|
29
|
+
var defaultConfig = {
|
|
30
|
+
urlRoot: '',
|
|
31
|
+
settings: {
|
|
32
|
+
corePrefix: '',
|
|
33
|
+
customType: types_1.ParamLocationType.HASH,
|
|
34
|
+
rootParams: true,
|
|
35
|
+
},
|
|
36
|
+
parameters: {
|
|
37
|
+
core: {
|
|
38
|
+
query: { name: 'q', type: types_1.ParamLocationType.QUERY },
|
|
39
|
+
oq: { name: 'oq', type: types_1.ParamLocationType.QUERY },
|
|
40
|
+
rq: { name: 'rq', type: types_1.ParamLocationType.QUERY },
|
|
41
|
+
tag: { name: 'tag', type: types_1.ParamLocationType.QUERY },
|
|
42
|
+
page: { name: 'page', type: types_1.ParamLocationType.QUERY },
|
|
43
|
+
pageSize: { name: 'pageSize', type: types_1.ParamLocationType.HASH },
|
|
44
|
+
sort: { name: 'sort', type: types_1.ParamLocationType.HASH },
|
|
45
|
+
filter: { name: 'filter', type: types_1.ParamLocationType.HASH },
|
|
46
|
+
},
|
|
47
|
+
custom: {},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
var CORE_FIELDS = ['query', 'oq', 'rq', 'tag', 'page', 'pageSize', 'sort', 'filter'];
|
|
51
|
+
var UrlTranslator = /** @class */ (function () {
|
|
52
|
+
function UrlTranslator(config) {
|
|
53
|
+
var _this = this;
|
|
54
|
+
if (config === void 0) { config = {}; }
|
|
55
|
+
this.reverseMapping = {};
|
|
56
|
+
this.config = (0, deepmerge_1.default)(defaultConfig, config);
|
|
57
|
+
Object.keys(this.config.parameters.core).forEach(function (param) {
|
|
58
|
+
var _a, _b, _c;
|
|
59
|
+
// param prefix
|
|
60
|
+
if (_this.config.settings.corePrefix) {
|
|
61
|
+
_this.config.parameters.core[param].name = _this.config.settings.corePrefix + _this.config.parameters.core[param].name;
|
|
62
|
+
}
|
|
63
|
+
// global type override
|
|
64
|
+
var paramType = _this.config.settings.coreType;
|
|
65
|
+
if (paramType && Object.values(types_1.ParamLocationType).includes(paramType)) {
|
|
66
|
+
_this.config.parameters.core[param].type = (((_a = config === null || config === void 0 ? void 0 : config.parameters) === null || _a === void 0 ? void 0 : _a.core) && ((_c = (_b = config === null || config === void 0 ? void 0 : config.parameters) === null || _b === void 0 ? void 0 : _b.core[param]) === null || _c === void 0 ? void 0 : _c.type)) || paramType;
|
|
67
|
+
}
|
|
68
|
+
// create reverse mapping for quick lookup later
|
|
69
|
+
_this.reverseMapping[_this.config.parameters.core[param].name] = param;
|
|
70
|
+
});
|
|
71
|
+
var implicit = this.config.settings.customType;
|
|
72
|
+
if (implicit && !Object.values(types_1.ParamLocationType).includes(implicit)) {
|
|
73
|
+
// invalid type specified - falling back to hash as implicit type
|
|
74
|
+
this.config.settings.customType = types_1.ParamLocationType.HASH;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
UrlTranslator.prototype.bindExternalEvents = function (update) {
|
|
78
|
+
window.addEventListener('popstate', update);
|
|
79
|
+
};
|
|
80
|
+
UrlTranslator.prototype.getCurrentUrl = function () {
|
|
81
|
+
return window.location.search + window.location.hash;
|
|
82
|
+
};
|
|
83
|
+
UrlTranslator.prototype.getConfig = function () {
|
|
84
|
+
return (0, deepmerge_1.default)({}, this.config);
|
|
85
|
+
};
|
|
86
|
+
UrlTranslator.prototype.deserialize = function (url) {
|
|
87
|
+
var params = this.parseUrlParams(url);
|
|
88
|
+
return this.paramsToState(params);
|
|
89
|
+
};
|
|
90
|
+
UrlTranslator.prototype.parseUrlParams = function (url) {
|
|
91
|
+
var queryString = url.includes('?') ? (url.split('?').pop() || '').split('#').shift() || '' : '';
|
|
92
|
+
var hashString = url.includes('#') ? url.substring(url.indexOf('#') + 1) || '' : '';
|
|
93
|
+
return __spreadArray(__spreadArray([], this.parseHashString(hashString), true), this.parseQueryString(queryString), true);
|
|
94
|
+
};
|
|
95
|
+
UrlTranslator.prototype.parseQueryString = function (queryString) {
|
|
96
|
+
var _this = this;
|
|
97
|
+
var justQueryString = queryString.split('?').pop() || '';
|
|
98
|
+
return justQueryString
|
|
99
|
+
.split('&')
|
|
100
|
+
.filter(function (v) { return v; })
|
|
101
|
+
.map(function (kvPair) {
|
|
102
|
+
var _a = kvPair.split('=').map(function (v) { return decodeURIComponent(v.replace(/\+/g, ' ')); }), key = _a[0], value = _a[1];
|
|
103
|
+
return { key: key.split('.'), value: value, type: types_1.ParamLocationType.QUERY };
|
|
104
|
+
})
|
|
105
|
+
.filter(function (param) {
|
|
106
|
+
// remove core fields that do not contain a value
|
|
107
|
+
var isCoreField = _this.reverseMapping[param.key[0]];
|
|
108
|
+
return !isCoreField || (isCoreField && param.value);
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
UrlTranslator.prototype.parseHashString = function (hashString) {
|
|
112
|
+
var _this = this;
|
|
113
|
+
var params = [];
|
|
114
|
+
var justHashString = hashString.split('#').join('/') || '';
|
|
115
|
+
justHashString
|
|
116
|
+
.split('/')
|
|
117
|
+
.filter(function (v) { return v; })
|
|
118
|
+
.map(function (hashEntries) {
|
|
119
|
+
return hashEntries.split(':').map(function (v) { return decodeHashComponent(v); });
|
|
120
|
+
})
|
|
121
|
+
.filter(function (param) {
|
|
122
|
+
// remove core fields that do not contain a value
|
|
123
|
+
var key = param[0], value = param[1];
|
|
124
|
+
var isCoreField = _this.reverseMapping[key];
|
|
125
|
+
return !isCoreField || (isCoreField && value);
|
|
126
|
+
})
|
|
127
|
+
.forEach(function (decodedHashEntries) {
|
|
128
|
+
if (decodedHashEntries.length == 1) {
|
|
129
|
+
params.push({ key: [decodedHashEntries[0]], value: undefined, type: types_1.ParamLocationType.HASH });
|
|
130
|
+
}
|
|
131
|
+
else if (decodedHashEntries.length && decodedHashEntries.length <= 3) {
|
|
132
|
+
var _a = decodedHashEntries.reverse(), value = _a[0], keys = _a.slice(1);
|
|
133
|
+
params.push({ key: keys.reverse(), value: value, type: types_1.ParamLocationType.HASH });
|
|
134
|
+
}
|
|
135
|
+
else if (decodedHashEntries.length && decodedHashEntries.length == 4) {
|
|
136
|
+
// range filter
|
|
137
|
+
var path0 = decodedHashEntries[0], path1 = decodedHashEntries[1], low = decodedHashEntries[2], high = decodedHashEntries[3];
|
|
138
|
+
params.push({ key: [path0, path1, 'low'], value: low, type: types_1.ParamLocationType.HASH });
|
|
139
|
+
params.push({ key: [path0, path1, 'high'], value: high, type: types_1.ParamLocationType.HASH });
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return params;
|
|
143
|
+
};
|
|
144
|
+
// parse params into state
|
|
145
|
+
UrlTranslator.prototype.paramsToState = function (params) {
|
|
146
|
+
var _this = this;
|
|
147
|
+
var coreOtherParams = [], coreFilterParams = [], coreSortParams = [], otherParams = [];
|
|
148
|
+
params === null || params === void 0 ? void 0 : params.forEach(function (param) {
|
|
149
|
+
var coreStateKey = _this.reverseMapping[param.key[0]];
|
|
150
|
+
var coreConfig = _this.config.parameters.core[coreStateKey];
|
|
151
|
+
var customStateKey = _this.config.parameters.custom[param.key[0]];
|
|
152
|
+
if (coreStateKey) {
|
|
153
|
+
// core state
|
|
154
|
+
switch (coreStateKey) {
|
|
155
|
+
case 'filter': {
|
|
156
|
+
if (coreConfig.type == param.type)
|
|
157
|
+
coreFilterParams.push(param);
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
case 'sort': {
|
|
161
|
+
if (coreConfig.type == param.type)
|
|
162
|
+
coreSortParams.push(param);
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
default: {
|
|
166
|
+
if (coreConfig.type == param.type)
|
|
167
|
+
coreOtherParams.push(param);
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else if (!CORE_FIELDS.includes(param.key[0])) {
|
|
173
|
+
// custom state
|
|
174
|
+
if (!customStateKey) {
|
|
175
|
+
// unrecognized state - store in custom config map (as implicit type)
|
|
176
|
+
_this.config.parameters.custom[param.key[0]] = {
|
|
177
|
+
type: param.type || _this.config.settings.customType,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
otherParams.push(param);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
return __assign(__assign(__assign(__assign({}, this.parseCoreOther(coreOtherParams)), this.parseCoreFilter(coreFilterParams)), this.parseCoreSort(coreSortParams)), this.parseOther(otherParams));
|
|
184
|
+
};
|
|
185
|
+
UrlTranslator.prototype.parseCoreOther = function (otherParams) {
|
|
186
|
+
var _this = this;
|
|
187
|
+
var state = {};
|
|
188
|
+
var numberTypeParams = ['page', 'pageSize'];
|
|
189
|
+
if (!otherParams) {
|
|
190
|
+
return {};
|
|
191
|
+
}
|
|
192
|
+
otherParams.forEach(function (param) {
|
|
193
|
+
var coreKey = _this.reverseMapping[param.key[0]];
|
|
194
|
+
if (numberTypeParams.includes(coreKey)) {
|
|
195
|
+
var numValue = Number(param.value);
|
|
196
|
+
if (coreKey == 'page' && numValue > 1) {
|
|
197
|
+
state[coreKey] = numValue;
|
|
198
|
+
}
|
|
199
|
+
else if (coreKey != 'page') {
|
|
200
|
+
state[coreKey] = numValue;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
state[coreKey] = param.value;
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
return state;
|
|
208
|
+
};
|
|
209
|
+
UrlTranslator.prototype.parseCoreFilter = function (filterParams) {
|
|
210
|
+
var valueFilterParams = filterParams.filter(function (p) { return p.key.length == 2; });
|
|
211
|
+
var rangeFilterParams = filterParams.filter(function (p) { return p.key.length == 3; });
|
|
212
|
+
var valueFilters = valueFilterParams.reduce(function (state, param) {
|
|
213
|
+
var _a;
|
|
214
|
+
var currentValue = (state.filter || {})[param.key[1]] || [];
|
|
215
|
+
return {
|
|
216
|
+
filter: __assign(__assign({}, state.filter), (_a = {}, _a[param.key[1]] = __spreadArray(__spreadArray([], (Array.isArray(currentValue) ? currentValue : [currentValue]), true), [param.value], false), _a)),
|
|
217
|
+
};
|
|
218
|
+
}, {});
|
|
219
|
+
var rangeFilters = rangeFilterParams.reduce(function (state, param, index) {
|
|
220
|
+
// ranges should come in pairs!
|
|
221
|
+
// use index to build pairs, ignore non pairs
|
|
222
|
+
// build set as encountered - only return full sets (low + high)
|
|
223
|
+
var _a, _b;
|
|
224
|
+
var newState = state;
|
|
225
|
+
var nextRangeParam = rangeFilterParams[index + 1];
|
|
226
|
+
if (index % 2 == 0 &&
|
|
227
|
+
nextRangeParam &&
|
|
228
|
+
nextRangeParam.key[1] == param.key[1] &&
|
|
229
|
+
param.key[2] == types_1.RangeValueProperties.LOW &&
|
|
230
|
+
nextRangeParam.key[2] == types_1.RangeValueProperties.HIGH) {
|
|
231
|
+
var currentValue = (state.filter || {})[param.key[1]] || [];
|
|
232
|
+
newState = {
|
|
233
|
+
filter: __assign(__assign({}, state.filter), (_a = {}, _a[param.key[1]] = __spreadArray(__spreadArray([], (Array.isArray(currentValue) ? currentValue : [currentValue]), true), [
|
|
234
|
+
(_b = {},
|
|
235
|
+
_b[types_1.RangeValueProperties.LOW] = isNaN(+param.value) ? null : +param.value,
|
|
236
|
+
_b[types_1.RangeValueProperties.HIGH] = isNaN(+nextRangeParam.value) ? null : +nextRangeParam.value,
|
|
237
|
+
_b),
|
|
238
|
+
], false), _a)),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return newState;
|
|
242
|
+
}, {});
|
|
243
|
+
return __assign({}, (valueFilters.filter || rangeFilters.filter
|
|
244
|
+
? {
|
|
245
|
+
filter: __assign(__assign({}, valueFilters.filter), rangeFilters.filter),
|
|
246
|
+
}
|
|
247
|
+
: {}));
|
|
248
|
+
};
|
|
249
|
+
UrlTranslator.prototype.parseCoreSort = function (sortParams) {
|
|
250
|
+
if (!sortParams.length) {
|
|
251
|
+
return {};
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
sort: sortParams.map(function (param) { return ({
|
|
255
|
+
field: param.key[1],
|
|
256
|
+
direction: param.value,
|
|
257
|
+
}); }),
|
|
258
|
+
};
|
|
259
|
+
};
|
|
260
|
+
UrlTranslator.prototype.parseOther = function (otherParams) {
|
|
261
|
+
var state = {};
|
|
262
|
+
otherParams.forEach(function (param) {
|
|
263
|
+
var node = state;
|
|
264
|
+
param.key.forEach(function (key, i) {
|
|
265
|
+
var isLast = i == param.key.length - 1;
|
|
266
|
+
if (isLast) {
|
|
267
|
+
node[key] = node[key] || [];
|
|
268
|
+
param.value && node[key].push(param.value);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
node[key] = node[key] || {};
|
|
272
|
+
node = node[key];
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
return state;
|
|
277
|
+
};
|
|
278
|
+
UrlTranslator.prototype.serialize = function (state) {
|
|
279
|
+
var root = this.config.urlRoot.includes('?')
|
|
280
|
+
? this.config.urlRoot.split('?')[0]
|
|
281
|
+
: this.config.urlRoot.includes('#')
|
|
282
|
+
? this.config.urlRoot.split('#')[0]
|
|
283
|
+
: this.config.urlRoot;
|
|
284
|
+
var rootUrlParams = this.config.settings.rootParams ? this.parseUrlParams(this.config.urlRoot) : [];
|
|
285
|
+
var stateParams = this.stateToParams(state);
|
|
286
|
+
var params = __spreadArray(__spreadArray([], rootUrlParams, true), stateParams, true);
|
|
287
|
+
var queryParams = params.filter(function (p) { return p.type == types_1.ParamLocationType.QUERY; });
|
|
288
|
+
var hashParams = params.filter(function (p) { return p.type == types_1.ParamLocationType.HASH; });
|
|
289
|
+
var paramString = (queryParams.length
|
|
290
|
+
? '?' +
|
|
291
|
+
queryParams
|
|
292
|
+
.map(function (param) {
|
|
293
|
+
var keyString = encodeURIComponent(param.key.join('.'));
|
|
294
|
+
var valueString = param.value ? '=' + encodeURIComponent(param.value) : '';
|
|
295
|
+
return keyString + valueString;
|
|
296
|
+
})
|
|
297
|
+
.join('&')
|
|
298
|
+
: this.config.urlRoot
|
|
299
|
+
? ''
|
|
300
|
+
: window.location.pathname) +
|
|
301
|
+
(hashParams.length
|
|
302
|
+
? '#/' +
|
|
303
|
+
hashParams
|
|
304
|
+
.map(function (param) {
|
|
305
|
+
var keyString = param.key.map(function (k) { return encodeHashComponent(k); }).join(':');
|
|
306
|
+
var valueString = param.value ? ':' + encodeHashComponent(param.value) : '';
|
|
307
|
+
return keyString + valueString;
|
|
308
|
+
})
|
|
309
|
+
.join('/')
|
|
310
|
+
: '');
|
|
311
|
+
return "".concat(root).concat(paramString);
|
|
312
|
+
};
|
|
313
|
+
// encode state into params
|
|
314
|
+
UrlTranslator.prototype.stateToParams = function (state) {
|
|
315
|
+
return __spreadArray(__spreadArray(__spreadArray(__spreadArray([], this.encodeCoreOther(state, ['filter', 'sort']), true), this.encodeCoreFilters(state), true), this.encodeCoreSorts(state), true), this.encodeOther(state), true);
|
|
316
|
+
};
|
|
317
|
+
UrlTranslator.prototype.encodeCoreFilters = function (state) {
|
|
318
|
+
var filterConfig = this.config.parameters.core.filter;
|
|
319
|
+
if (!state.filter || !filterConfig) {
|
|
320
|
+
return [];
|
|
321
|
+
}
|
|
322
|
+
return Object.keys(state.filter).flatMap(function (key) {
|
|
323
|
+
if (!state.filter || !state.filter[key]) {
|
|
324
|
+
return [];
|
|
325
|
+
}
|
|
326
|
+
var filter = state.filter[key];
|
|
327
|
+
return (filter instanceof Array ? filter : [filter]).flatMap(function (value) {
|
|
328
|
+
var _a, _b, _c, _d;
|
|
329
|
+
if (typeof value == 'string' || typeof value == 'number' || typeof value == 'boolean') {
|
|
330
|
+
return [
|
|
331
|
+
{
|
|
332
|
+
key: [filterConfig.name, key],
|
|
333
|
+
value: '' + value,
|
|
334
|
+
type: filterConfig.type,
|
|
335
|
+
},
|
|
336
|
+
];
|
|
337
|
+
}
|
|
338
|
+
else if (typeof value == 'object' &&
|
|
339
|
+
typeof value[types_1.RangeValueProperties.LOW] != 'undefined' &&
|
|
340
|
+
typeof value[types_1.RangeValueProperties.HIGH] != 'undefined') {
|
|
341
|
+
if (filterConfig.type == types_1.ParamLocationType.QUERY) {
|
|
342
|
+
return [
|
|
343
|
+
{
|
|
344
|
+
key: [filterConfig.name, key, types_1.RangeValueProperties.LOW],
|
|
345
|
+
value: '' + ((_a = value[types_1.RangeValueProperties.LOW]) !== null && _a !== void 0 ? _a : '*'),
|
|
346
|
+
type: filterConfig.type,
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
key: [filterConfig.name, key, types_1.RangeValueProperties.HIGH],
|
|
350
|
+
value: '' + ((_b = value[types_1.RangeValueProperties.HIGH]) !== null && _b !== void 0 ? _b : '*'),
|
|
351
|
+
type: filterConfig.type,
|
|
352
|
+
},
|
|
353
|
+
];
|
|
354
|
+
}
|
|
355
|
+
else if (filterConfig.type == types_1.ParamLocationType.HASH) {
|
|
356
|
+
return [
|
|
357
|
+
{
|
|
358
|
+
key: [filterConfig.name, key, '' + ((_c = value[types_1.RangeValueProperties.LOW]) !== null && _c !== void 0 ? _c : '*')],
|
|
359
|
+
value: '' + ((_d = value[types_1.RangeValueProperties.HIGH]) !== null && _d !== void 0 ? _d : '*'),
|
|
360
|
+
type: filterConfig.type,
|
|
361
|
+
},
|
|
362
|
+
];
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return [];
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
};
|
|
369
|
+
UrlTranslator.prototype.encodeCoreSorts = function (state) {
|
|
370
|
+
var sortConfig = this.config.parameters.core.sort;
|
|
371
|
+
if (!state.sort || !sortConfig) {
|
|
372
|
+
return [];
|
|
373
|
+
}
|
|
374
|
+
return (state.sort instanceof Array ? state.sort : [state.sort]).map(function (sort) {
|
|
375
|
+
return {
|
|
376
|
+
key: [sortConfig.name, sort.field],
|
|
377
|
+
value: sort.direction,
|
|
378
|
+
type: sortConfig.type,
|
|
379
|
+
};
|
|
380
|
+
});
|
|
381
|
+
};
|
|
382
|
+
UrlTranslator.prototype.encodeCoreOther = function (state, except) {
|
|
383
|
+
var _this = this;
|
|
384
|
+
var params = [];
|
|
385
|
+
Object.keys(state)
|
|
386
|
+
// sorting to determine order of params in URL
|
|
387
|
+
.sort(function (a, b) {
|
|
388
|
+
return CORE_FIELDS.indexOf(a) - CORE_FIELDS.indexOf(b);
|
|
389
|
+
})
|
|
390
|
+
.map(function (param) {
|
|
391
|
+
if (CORE_FIELDS.includes(param) && !except.includes(param)) {
|
|
392
|
+
var paramConfig = _this.config.parameters.core[param];
|
|
393
|
+
if (param == 'page' && state[param] == 1) {
|
|
394
|
+
// do not include page 1
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
params.push({ key: [paramConfig.name], value: '' + state[param], type: paramConfig.type });
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
return params;
|
|
402
|
+
};
|
|
403
|
+
UrlTranslator.prototype.encodeOther = function (state) {
|
|
404
|
+
var _this = this;
|
|
405
|
+
var params = [];
|
|
406
|
+
var addRecursive = function (obj, currentPath) {
|
|
407
|
+
Object.keys(obj).forEach(function (key) {
|
|
408
|
+
if (currentPath.length == 0 && CORE_FIELDS.includes(key)) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
var value = obj[key];
|
|
412
|
+
if (value instanceof Array) {
|
|
413
|
+
var customConfig = _this.config.parameters.custom[currentPath[0] || key];
|
|
414
|
+
var type_1 = (customConfig === null || customConfig === void 0 ? void 0 : customConfig.type) || _this.config.settings.customType;
|
|
415
|
+
if (value.length) {
|
|
416
|
+
params = params.concat(value.map(function (v) {
|
|
417
|
+
return { key: __spreadArray(__spreadArray([], currentPath, true), [key], false), value: v, type: type_1 };
|
|
418
|
+
}));
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
params = params.concat({ key: __spreadArray(__spreadArray([], currentPath, true), [key], false), value: undefined, type: type_1 });
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
else if (typeof value == 'object' && Object.keys(value).length) {
|
|
425
|
+
addRecursive(value, __spreadArray(__spreadArray([], currentPath, true), [key], false));
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
var customConfig = _this.config.parameters.custom[currentPath[0] || key];
|
|
429
|
+
var type = (customConfig === null || customConfig === void 0 ? void 0 : customConfig.type) || _this.config.settings.customType;
|
|
430
|
+
var stringValue = (typeof value == 'object' ? undefined : value);
|
|
431
|
+
params = params.concat([{ key: __spreadArray(__spreadArray([], currentPath, true), [key], false), value: stringValue, type: type }]);
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
};
|
|
435
|
+
addRecursive(state, []);
|
|
436
|
+
return params;
|
|
437
|
+
};
|
|
438
|
+
UrlTranslator.prototype.go = function (url, config) {
|
|
439
|
+
var currentUrl = this.getCurrentUrl();
|
|
440
|
+
if (url != currentUrl) {
|
|
441
|
+
if ((config === null || config === void 0 ? void 0 : config.history) == 'replace') {
|
|
442
|
+
history.replaceState(null, '', url);
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
history.pushState(null, '', url);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
return UrlTranslator;
|
|
450
|
+
}());
|
|
451
|
+
exports.UrlTranslator = UrlTranslator;
|
|
452
|
+
function decodeHashComponent(string) {
|
|
453
|
+
if (typeof string == 'string') {
|
|
454
|
+
string = string.replace(/%2425/g, '$$25');
|
|
455
|
+
string = string.replace(/\$25/g, '%');
|
|
456
|
+
string = decodeURIComponent(string);
|
|
457
|
+
}
|
|
458
|
+
return string;
|
|
459
|
+
}
|
|
460
|
+
function encodeHashComponent(string) {
|
|
461
|
+
if (typeof string == 'string') {
|
|
462
|
+
string = encodeURIComponent(string);
|
|
463
|
+
string = string.replace(/%/g, '$$25');
|
|
464
|
+
}
|
|
465
|
+
return string;
|
|
466
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Translators/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./QueryString/QueryStringTranslator"), exports);
|
|
14
|
+
__exportStar(require("./Url/UrlTranslator"), exports);
|
|
15
|
+
__exportStar(require("./Noop/NoopTranslator"), exports);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Translator, UrlState } from '../types';
|
|
2
|
+
import type { ImmutableObject } from 'seamless-immutable';
|
|
3
|
+
declare type omission = {
|
|
4
|
+
path: Array<string>;
|
|
5
|
+
values?: Array<any>;
|
|
6
|
+
};
|
|
7
|
+
declare class WatcherPool {
|
|
8
|
+
private callbacks;
|
|
9
|
+
constructor();
|
|
10
|
+
subscribe(cb: () => void): () => (() => void)[];
|
|
11
|
+
notify(): void;
|
|
12
|
+
}
|
|
13
|
+
export declare class UrlManager {
|
|
14
|
+
linker?: (urlManager: UrlManager) => Record<string, unknown>;
|
|
15
|
+
private omissions;
|
|
16
|
+
detached?: {
|
|
17
|
+
url: string;
|
|
18
|
+
};
|
|
19
|
+
private translator;
|
|
20
|
+
private urlState;
|
|
21
|
+
private globalState;
|
|
22
|
+
private localState;
|
|
23
|
+
private mergedState;
|
|
24
|
+
private prevState?;
|
|
25
|
+
private watcherPool;
|
|
26
|
+
constructor(translator: Translator, linker?: (urlManager: UrlManager) => Record<string, unknown>, globalState?: UrlState | ImmutableObject<UrlState>, localState?: UrlState | ImmutableObject<UrlState>, watcherPool?: WatcherPool, omissions?: Array<omission>, detached?: {
|
|
27
|
+
url: string;
|
|
28
|
+
});
|
|
29
|
+
private without;
|
|
30
|
+
private getTranslatorUrl;
|
|
31
|
+
refresh(): void;
|
|
32
|
+
get state(): ImmutableObject<UrlState>;
|
|
33
|
+
private unpackPathAndState;
|
|
34
|
+
set(...args: Array<unknown>): UrlManager;
|
|
35
|
+
merge(...args: Array<unknown>): UrlManager;
|
|
36
|
+
remove(_path: Array<string> | string, values?: Array<any> | any): UrlManager;
|
|
37
|
+
reset(): UrlManager;
|
|
38
|
+
withConfig(config: Record<string, unknown> | ((config: Record<string, unknown>) => Record<string, unknown>)): UrlManager;
|
|
39
|
+
withGlobals(globals: UrlState | ImmutableObject<UrlState>): UrlManager;
|
|
40
|
+
getTranslatorConfig(): Record<string, unknown>;
|
|
41
|
+
get href(): string;
|
|
42
|
+
go(config?: {
|
|
43
|
+
[any: string]: unknown;
|
|
44
|
+
}): void;
|
|
45
|
+
detach(reset?: boolean): UrlManager;
|
|
46
|
+
get link(): Record<string, any>;
|
|
47
|
+
subscribe(cb: (prev: ImmutableObject<UrlState>, next?: ImmutableObject<UrlState>) => void): () => void;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=UrlManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UrlManager.d.ts","sourceRoot":"","sources":["../../../src/UrlManager/UrlManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,aAAK,QAAQ,GAAG;IACf,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;CACpB,CAAC;AAEF,cAAM,WAAW;IAChB,OAAO,CAAC,SAAS,CAAyB;;IAM1C,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI;IAMxB,MAAM;CAGN;AAED,qBAAa,UAAU;IAcd,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAInE,OAAO,CAAC,SAAS;IACV,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;IAlBlC,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,QAAQ,CAAyE;IACzF,OAAO,CAAC,WAAW,CAAyE;IAC5F,OAAO,CAAC,UAAU,CAAyE;IAC3F,OAAO,CAAC,WAAW,CAAyE;IAE5F,OAAO,CAAC,SAAS,CAAC,CAA4B;IAE9C,OAAO,CAAC,WAAW,CAAc;gBAGhC,UAAU,EAAE,UAAU,EACf,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,WAAW,CAAC,EAAE,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,EAClD,UAAU,CAAC,EAAE,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,EACjD,WAAW,CAAC,EAAE,WAAW,EACjB,SAAS,GAAE,KAAK,CAAC,QAAQ,CAAM,EAChC,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;IAwBlC,OAAO,CAAC,OAAO;IAkDf,OAAO,CAAC,gBAAgB;IAQxB,OAAO,IAAI,IAAI;IAiBf,IAAI,KAAK,IAAI,eAAe,CAAC,QAAQ,CAAC,CAErC;IAED,OAAO,CAAC,kBAAkB;IAQ1B,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,UAAU;IAWxC,KAAK,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,UAAU;IAgC1C,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,UAAU;IAU5E,KAAK,IAAI,UAAU;IAYnB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,UAAU;IAgBxH,WAAW,CAAC,OAAO,EAAE,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,UAAU;IAItE,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI9C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,EAAE,CAAC,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI;IAU7C,MAAM,CAAC,KAAK,UAAQ,GAAG,UAAU;IAMjC,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAM9B;IAED,SAAS,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;CAQtG"}
|