@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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -0
  3. package/dist/cjs/Translators/Noop/NoopTranslator.d.ts +10 -0
  4. package/dist/cjs/Translators/Noop/NoopTranslator.d.ts.map +1 -0
  5. package/dist/cjs/Translators/Noop/NoopTranslator.js +25 -0
  6. package/dist/cjs/Translators/QueryString/QueryStringTranslator.d.ts +35 -0
  7. package/dist/cjs/Translators/QueryString/QueryStringTranslator.d.ts.map +1 -0
  8. package/dist/cjs/Translators/QueryString/QueryStringTranslator.js +267 -0
  9. package/dist/cjs/Translators/Url/UrlTranslator.d.ts +67 -0
  10. package/dist/cjs/Translators/Url/UrlTranslator.d.ts.map +1 -0
  11. package/dist/cjs/Translators/Url/UrlTranslator.js +466 -0
  12. package/dist/cjs/Translators/index.d.ts +4 -0
  13. package/dist/cjs/Translators/index.d.ts.map +1 -0
  14. package/dist/cjs/Translators/index.js +15 -0
  15. package/dist/cjs/UrlManager/UrlManager.d.ts +50 -0
  16. package/dist/cjs/UrlManager/UrlManager.d.ts.map +1 -0
  17. package/dist/cjs/UrlManager/UrlManager.js +301 -0
  18. package/dist/cjs/UrlManager/typecheck.d.ts +5 -0
  19. package/dist/cjs/UrlManager/typecheck.d.ts.map +1 -0
  20. package/dist/cjs/UrlManager/typecheck.js +75 -0
  21. package/dist/cjs/index.d.ts +5 -0
  22. package/dist/cjs/index.d.ts.map +1 -0
  23. package/dist/cjs/index.js +15 -0
  24. package/dist/cjs/linkers/index.d.ts +2 -0
  25. package/dist/cjs/linkers/index.d.ts.map +1 -0
  26. package/dist/cjs/linkers/index.js +13 -0
  27. package/dist/cjs/linkers/react/react.d.ts +8 -0
  28. package/dist/cjs/linkers/react/react.d.ts.map +1 -0
  29. package/dist/cjs/linkers/react/react.js +15 -0
  30. package/dist/cjs/types.d.ts +47 -0
  31. package/dist/cjs/types.d.ts.map +1 -0
  32. package/dist/cjs/types.js +13 -0
  33. package/dist/esm/Translators/Noop/NoopTranslator.d.ts +10 -0
  34. package/dist/esm/Translators/Noop/NoopTranslator.d.ts.map +1 -0
  35. package/dist/esm/Translators/Noop/NoopTranslator.js +20 -0
  36. package/dist/esm/Translators/QueryString/QueryStringTranslator.d.ts +35 -0
  37. package/dist/esm/Translators/QueryString/QueryStringTranslator.d.ts.map +1 -0
  38. package/dist/esm/Translators/QueryString/QueryStringTranslator.js +260 -0
  39. package/dist/esm/Translators/Url/UrlTranslator.d.ts +67 -0
  40. package/dist/esm/Translators/Url/UrlTranslator.d.ts.map +1 -0
  41. package/dist/esm/Translators/Url/UrlTranslator.js +448 -0
  42. package/dist/esm/Translators/index.d.ts +4 -0
  43. package/dist/esm/Translators/index.d.ts.map +1 -0
  44. package/dist/esm/Translators/index.js +3 -0
  45. package/dist/esm/UrlManager/UrlManager.d.ts +50 -0
  46. package/dist/esm/UrlManager/UrlManager.d.ts.map +1 -0
  47. package/dist/esm/UrlManager/UrlManager.js +256 -0
  48. package/dist/esm/UrlManager/typecheck.d.ts +5 -0
  49. package/dist/esm/UrlManager/typecheck.d.ts.map +1 -0
  50. package/dist/esm/UrlManager/typecheck.js +66 -0
  51. package/dist/esm/index.d.ts +5 -0
  52. package/dist/esm/index.d.ts.map +1 -0
  53. package/dist/esm/index.js +3 -0
  54. package/dist/esm/linkers/index.d.ts +2 -0
  55. package/dist/esm/linkers/index.d.ts.map +1 -0
  56. package/dist/esm/linkers/index.js +1 -0
  57. package/dist/esm/linkers/react/react.d.ts +8 -0
  58. package/dist/esm/linkers/react/react.d.ts.map +1 -0
  59. package/dist/esm/linkers/react/react.js +11 -0
  60. package/dist/esm/types.d.ts +47 -0
  61. package/dist/esm/types.d.ts.map +1 -0
  62. package/dist/esm/types.js +10 -0
  63. 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,4 @@
1
+ export * from './QueryString/QueryStringTranslator';
2
+ export * from './Url/UrlTranslator';
3
+ export * from './Noop/NoopTranslator';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}