@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,256 @@
|
|
|
1
|
+
import Immutable from 'seamless-immutable';
|
|
2
|
+
class WatcherPool {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.callbacks = [];
|
|
5
|
+
// nothing to do here
|
|
6
|
+
}
|
|
7
|
+
subscribe(cb) {
|
|
8
|
+
this.callbacks.push(cb);
|
|
9
|
+
return () => (this.callbacks = this.callbacks.filter((_cb) => _cb != cb));
|
|
10
|
+
}
|
|
11
|
+
notify() {
|
|
12
|
+
this.callbacks.forEach((cb) => cb());
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class UrlManager {
|
|
16
|
+
constructor(translator, linker, globalState, localState, watcherPool, omissions = [], detached) {
|
|
17
|
+
this.linker = linker;
|
|
18
|
+
this.omissions = omissions;
|
|
19
|
+
this.detached = detached;
|
|
20
|
+
this.urlState = Immutable({});
|
|
21
|
+
this.globalState = Immutable({});
|
|
22
|
+
this.localState = Immutable({});
|
|
23
|
+
this.mergedState = Immutable({});
|
|
24
|
+
this.localState = Immutable(localState || {});
|
|
25
|
+
this.globalState = Immutable(globalState || {});
|
|
26
|
+
this.translator = translator;
|
|
27
|
+
if (watcherPool) {
|
|
28
|
+
this.watcherPool = watcherPool;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.watcherPool = new WatcherPool();
|
|
32
|
+
if (this.translator.bindExternalEvents instanceof Function) {
|
|
33
|
+
this.translator.bindExternalEvents(() => this.watcherPool.notify());
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
this.subscribe(() => {
|
|
37
|
+
this.refresh();
|
|
38
|
+
});
|
|
39
|
+
this.refresh();
|
|
40
|
+
}
|
|
41
|
+
without(obj, fullPath, values) {
|
|
42
|
+
// TODO: refactor - find way to remove updateNode function
|
|
43
|
+
const path = fullPath.slice(0, -1);
|
|
44
|
+
const lastKey = fullPath[fullPath.length - 1];
|
|
45
|
+
if (!path.length) {
|
|
46
|
+
if (!values?.length) {
|
|
47
|
+
return obj.without(lastKey);
|
|
48
|
+
}
|
|
49
|
+
return updateNode(lastKey, obj);
|
|
50
|
+
}
|
|
51
|
+
if (!obj.getIn(path)) {
|
|
52
|
+
return obj;
|
|
53
|
+
}
|
|
54
|
+
return obj.updateIn(path, (node) => {
|
|
55
|
+
return updateNode(lastKey, node);
|
|
56
|
+
});
|
|
57
|
+
function updateNode(key, node) {
|
|
58
|
+
if (node[lastKey] === undefined) {
|
|
59
|
+
return node;
|
|
60
|
+
}
|
|
61
|
+
if (node[lastKey] instanceof Array) {
|
|
62
|
+
if (!values || !values.length) {
|
|
63
|
+
return node.without(lastKey);
|
|
64
|
+
}
|
|
65
|
+
return node.set(lastKey, node[lastKey].filter((value) => {
|
|
66
|
+
return !values.some((removeValue) => {
|
|
67
|
+
return compareObjects(value, removeValue);
|
|
68
|
+
});
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
if (typeof node == 'object') {
|
|
72
|
+
return node.without(lastKey);
|
|
73
|
+
}
|
|
74
|
+
return node;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
getTranslatorUrl() {
|
|
78
|
+
if (this.detached) {
|
|
79
|
+
return this.detached.url;
|
|
80
|
+
}
|
|
81
|
+
return this.translator.getCurrentUrl();
|
|
82
|
+
}
|
|
83
|
+
refresh() {
|
|
84
|
+
this.prevState = this.mergedState;
|
|
85
|
+
this.urlState = this.omissions.reduce((state, om) => {
|
|
86
|
+
return this.without(state, om.path, om.values);
|
|
87
|
+
}, Immutable(this.translator.deserialize(this.getTranslatorUrl())));
|
|
88
|
+
this.mergedState = this.globalState.merge(this.urlState, {
|
|
89
|
+
deep: true,
|
|
90
|
+
merger: arrayConcatMerger,
|
|
91
|
+
});
|
|
92
|
+
this.mergedState = this.mergedState.merge(this.localState, {
|
|
93
|
+
deep: true,
|
|
94
|
+
merger: arrayConcatMerger,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
get state() {
|
|
98
|
+
return this.mergedState;
|
|
99
|
+
}
|
|
100
|
+
unpackPathAndState(stateOrPath, _state) {
|
|
101
|
+
const path = stateOrPath instanceof Array ? stateOrPath : typeof stateOrPath == 'string' ? stateOrPath.split('.') : [];
|
|
102
|
+
const state = !(stateOrPath instanceof Array) && typeof stateOrPath == 'object' ? stateOrPath : _state === undefined ? {} : _state;
|
|
103
|
+
return { path, state };
|
|
104
|
+
}
|
|
105
|
+
set(...args) {
|
|
106
|
+
const { path, state } = this.unpackPathAndState(args[0], args[1]);
|
|
107
|
+
const newState = path.length ? this.localState.setIn(path, removeArrayDuplicates(state)) : removeArrayDuplicates(state);
|
|
108
|
+
const omissions = removeArrayDuplicates(this.omissions.concat(path.length ? { path } : Object.keys(this.urlState).map((key) => ({ path: [key] }))));
|
|
109
|
+
return new UrlManager(this.translator, this.linker, this.globalState, newState, this.watcherPool, omissions, this.detached);
|
|
110
|
+
}
|
|
111
|
+
merge(...args) {
|
|
112
|
+
const { path, state } = this.unpackPathAndState(args[0], args[1]);
|
|
113
|
+
const newState = path.length
|
|
114
|
+
? this.localState.updateIn(path, (oldState) => {
|
|
115
|
+
if (oldState instanceof Array) {
|
|
116
|
+
const newValues = Array.isArray(state) ? state : [state];
|
|
117
|
+
return removeArrayDuplicates(oldState.concat(newValues));
|
|
118
|
+
}
|
|
119
|
+
else if (typeof oldState == 'object') {
|
|
120
|
+
if (Array.isArray(state)) {
|
|
121
|
+
return state.length ? removeArrayDuplicates([oldState].concat(state)) : oldState;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
return oldState.merge(state, { deep: true, merger: arrayConcatMerger });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else if (typeof oldState != 'undefined') {
|
|
128
|
+
// not an object or array
|
|
129
|
+
const newValues = (Array.isArray(state) ? state : [state]).filter((value) => !compareObjects(value, oldState));
|
|
130
|
+
return newValues.length ? removeArrayDuplicates([oldState].concat(newValues)) : oldState;
|
|
131
|
+
}
|
|
132
|
+
else if (typeof oldState == 'undefined') {
|
|
133
|
+
const urlState = this.urlState.getIn(path);
|
|
134
|
+
if (urlState instanceof Array && !Array.isArray(state)) {
|
|
135
|
+
return [state];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return state;
|
|
139
|
+
})
|
|
140
|
+
: this.localState.merge(state, { deep: true, merger: arrayConcatMerger });
|
|
141
|
+
return new UrlManager(this.translator, this.linker, this.globalState, newState, this.watcherPool, this.omissions, this.detached);
|
|
142
|
+
}
|
|
143
|
+
remove(_path, values) {
|
|
144
|
+
const { path } = this.unpackPathAndState(_path, {});
|
|
145
|
+
values = typeof values != 'undefined' ? (values instanceof Array ? values : [values]) : [];
|
|
146
|
+
const without = this.without(this.localState, path, values);
|
|
147
|
+
const omissions = removeArrayDuplicates(this.omissions.concat({ path, values: values }));
|
|
148
|
+
return new UrlManager(this.translator, this.linker, this.globalState, without, this.watcherPool, omissions, this.detached);
|
|
149
|
+
}
|
|
150
|
+
reset() {
|
|
151
|
+
return new UrlManager(this.translator, this.linker, this.globalState, {}, this.watcherPool, Object.keys(this.urlState).map((k) => ({ path: [k] })), this.detached);
|
|
152
|
+
}
|
|
153
|
+
withConfig(config) {
|
|
154
|
+
if (config instanceof Function) {
|
|
155
|
+
config = config(this.translator.getConfig());
|
|
156
|
+
}
|
|
157
|
+
return new UrlManager(new (Object.getPrototypeOf(this.translator).constructor)(config), this.linker, this.globalState, this.localState, this.watcherPool, this.omissions, this.detached);
|
|
158
|
+
}
|
|
159
|
+
withGlobals(globals) {
|
|
160
|
+
return new UrlManager(this.translator, this.linker, globals, this.localState, this.watcherPool, this.omissions, this.detached);
|
|
161
|
+
}
|
|
162
|
+
getTranslatorConfig() {
|
|
163
|
+
return this.translator.getConfig();
|
|
164
|
+
}
|
|
165
|
+
get href() {
|
|
166
|
+
return this.translator.serialize(this.state);
|
|
167
|
+
}
|
|
168
|
+
go(config) {
|
|
169
|
+
if (this.detached) {
|
|
170
|
+
this.detached.url = this.href;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
this.translator.go(this.href, config);
|
|
174
|
+
}
|
|
175
|
+
this.watcherPool.notify();
|
|
176
|
+
}
|
|
177
|
+
detach(reset = false) {
|
|
178
|
+
return new UrlManager(this.translator, this.linker, this.globalState, this.localState, new WatcherPool(), this.omissions, {
|
|
179
|
+
url: reset ? '' : this.getTranslatorUrl(),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
get link() {
|
|
183
|
+
if (!this.linker) {
|
|
184
|
+
return {};
|
|
185
|
+
}
|
|
186
|
+
return this.linker(this);
|
|
187
|
+
}
|
|
188
|
+
subscribe(cb) {
|
|
189
|
+
return this.watcherPool.subscribe(() => {
|
|
190
|
+
const prevState = this.prevState;
|
|
191
|
+
const state = this.mergedState;
|
|
192
|
+
cb(prevState, state);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function removeArrayDuplicates(array) {
|
|
197
|
+
if (Array.isArray(array) && array.length) {
|
|
198
|
+
return array.reduce((accu, item) => {
|
|
199
|
+
if (!accu.some((keep) => compareObjects(keep, item))) {
|
|
200
|
+
accu.push(item);
|
|
201
|
+
}
|
|
202
|
+
return accu;
|
|
203
|
+
}, [array[0]]);
|
|
204
|
+
}
|
|
205
|
+
return array;
|
|
206
|
+
}
|
|
207
|
+
function arrayConcatMerger(current, other) {
|
|
208
|
+
if (current instanceof Array && other instanceof Array) {
|
|
209
|
+
return removeArrayDuplicates([...current, ...other]);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function compareObjects(obj1, obj2) {
|
|
213
|
+
if (!obj1 && !obj2) {
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
else if ((!obj1 && obj2) || (obj1 && !obj2)) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
const primitives = ['string', 'number', 'boolean', 'undefined'];
|
|
220
|
+
const typeA = typeof obj1;
|
|
221
|
+
const typeB = typeof obj2;
|
|
222
|
+
if (typeA !== typeB)
|
|
223
|
+
return false;
|
|
224
|
+
if (primitives.includes(typeA))
|
|
225
|
+
return obj1 === obj2;
|
|
226
|
+
const isArrayA = Array.isArray(obj1);
|
|
227
|
+
const isArrayB = Array.isArray(obj2);
|
|
228
|
+
if (isArrayA !== isArrayB) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
if (isArrayA) {
|
|
232
|
+
// compare arrays
|
|
233
|
+
if (obj1.length != obj2.length)
|
|
234
|
+
return false;
|
|
235
|
+
for (let i = 0; i < obj1.length; i++) {
|
|
236
|
+
if (!compareObjects(obj1[i], obj2[i])) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
// compare object keys
|
|
243
|
+
if (!compareObjects(Object.keys(obj1).sort(), Object.keys(obj2).sort())) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
// compare object values
|
|
247
|
+
let result = true;
|
|
248
|
+
Object.keys(obj1).forEach((key) => {
|
|
249
|
+
if (!compareObjects(obj1[key], obj2[key])) {
|
|
250
|
+
result = false;
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
return result;
|
|
254
|
+
}
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function checkStateRangeValue(value: Record<string, unknown>): boolean;
|
|
2
|
+
export declare function checkStateFilter(filters: Record<string, Array<unknown>>): boolean;
|
|
3
|
+
export declare function checkStateSort(sort: unknown): boolean;
|
|
4
|
+
export declare function checkState(state: Record<string, unknown>): boolean;
|
|
5
|
+
//# sourceMappingURL=typecheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typecheck.d.ts","sourceRoot":"","sources":["../../../src/UrlManager/typecheck.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAmB5E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CA4BjF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAcrD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAkBlE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export function checkStateRangeValue(value) {
|
|
2
|
+
if (typeof value != 'object') {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
if (typeof value.low != 'number' && value.low !== undefined) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
if (typeof value.high != 'number' && value.high !== undefined) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if (typeof value.low != 'number' && typeof value.high != 'number') {
|
|
12
|
+
// at least one must be defined
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
export function checkStateFilter(filters) {
|
|
18
|
+
for (const key of Object.keys(filters)) {
|
|
19
|
+
if (typeof key !== 'string') {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const fieldFilter = filters[key];
|
|
23
|
+
const invalidFilter = fieldFilter.find((filter) => {
|
|
24
|
+
if (typeof filter == 'string') {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (typeof filter == 'number') {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
if (typeof filter == 'object' && filter !== null) {
|
|
31
|
+
return !checkStateRangeValue(filter);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
if (invalidFilter) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
export function checkStateSort(sort) {
|
|
41
|
+
const sortsAsArray = sort instanceof Array ? sort : [sort];
|
|
42
|
+
for (const sort of sortsAsArray) {
|
|
43
|
+
if (typeof sort.field != 'string') {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
if (typeof sort.direction != 'string') {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
export function checkState(state) {
|
|
53
|
+
if (typeof state.filter == 'object' && !checkStateFilter(state.filter)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if (typeof state.sort == 'object' && !checkStateSort(state.sort)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (state.page !== undefined && typeof state.page != 'number') {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
if (state.query !== undefined && typeof state.query != 'string') {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAE1B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/linkers/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './react/react';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../../src/linkers/react/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,wBAAgB,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAU9D;AAED,aAAK,UAAU,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;CAC5B,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { ImmutableObject } from 'seamless-immutable';
|
|
2
|
+
export declare enum RangeValueProperties {
|
|
3
|
+
LOW = "low",
|
|
4
|
+
HIGH = "high"
|
|
5
|
+
}
|
|
6
|
+
export declare type UrlStateRangeValue = {
|
|
7
|
+
[RangeValueProperties.LOW]: number | null;
|
|
8
|
+
[RangeValueProperties.HIGH]: number | null;
|
|
9
|
+
};
|
|
10
|
+
export declare type UrlStateFilterType = string | number | boolean | UrlStateRangeValue;
|
|
11
|
+
export declare type UrlStateFilter = {
|
|
12
|
+
[fieldName: string]: UrlStateFilterType | Array<UrlStateFilterType>;
|
|
13
|
+
};
|
|
14
|
+
export declare type UrlStateSort = {
|
|
15
|
+
field: string;
|
|
16
|
+
direction: string;
|
|
17
|
+
};
|
|
18
|
+
export declare type UrlState = {
|
|
19
|
+
page?: number;
|
|
20
|
+
pageSize?: number;
|
|
21
|
+
query?: string;
|
|
22
|
+
rq?: string;
|
|
23
|
+
oq?: string;
|
|
24
|
+
filter?: UrlStateFilter;
|
|
25
|
+
sort?: UrlStateSort | Array<UrlStateSort>;
|
|
26
|
+
tag?: string;
|
|
27
|
+
[any: string]: unknown;
|
|
28
|
+
};
|
|
29
|
+
export interface Translator {
|
|
30
|
+
getCurrentUrl(): string;
|
|
31
|
+
getConfig(): Record<string, unknown>;
|
|
32
|
+
serialize(state: UrlState | ImmutableObject<UrlState>): string;
|
|
33
|
+
deserialize(url: string): UrlState;
|
|
34
|
+
bindExternalEvents?(update: () => void): void;
|
|
35
|
+
go(url: string, config?: {
|
|
36
|
+
[any: string]: unknown;
|
|
37
|
+
}): void;
|
|
38
|
+
}
|
|
39
|
+
export interface TranslatorConfig {
|
|
40
|
+
queryParameter?: string;
|
|
41
|
+
urlRoot?: string;
|
|
42
|
+
}
|
|
43
|
+
export declare enum ParamLocationType {
|
|
44
|
+
HASH = "hash",
|
|
45
|
+
QUERY = "query"
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,oBAAY,oBAAoB;IAC/B,GAAG,QAAQ;IACX,IAAI,SAAS;CACb;AAED,oBAAY,kBAAkB,GAAG;IAChC,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C,CAAC;AAEF,oBAAY,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,kBAAkB,CAAC;AAEhF,oBAAY,cAAc,GAAG;IAC5B,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC;CACpE,CAAC;AAEF,oBAAY,YAAY,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,oBAAY,QAAQ,GAAG;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,UAAU;IAC1B,aAAa,IAAI,MAAM,CAAC;IACxB,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAErC,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;IAC/D,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC;IAEnC,kBAAkB,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAE9C,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,gBAAgB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,oBAAY,iBAAiB;IAC5B,IAAI,SAAS;IACb,KAAK,UAAU;CACf"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export var RangeValueProperties;
|
|
2
|
+
(function (RangeValueProperties) {
|
|
3
|
+
RangeValueProperties["LOW"] = "low";
|
|
4
|
+
RangeValueProperties["HIGH"] = "high";
|
|
5
|
+
})(RangeValueProperties || (RangeValueProperties = {}));
|
|
6
|
+
export var ParamLocationType;
|
|
7
|
+
(function (ParamLocationType) {
|
|
8
|
+
ParamLocationType["HASH"] = "hash";
|
|
9
|
+
ParamLocationType["QUERY"] = "query";
|
|
10
|
+
})(ParamLocationType || (ParamLocationType = {}));
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@searchspring/snap-url-manager",
|
|
3
|
+
"version": "0.20.0",
|
|
4
|
+
"description": "Snap URL Manager",
|
|
5
|
+
"main": "dist/cjs/index.js",
|
|
6
|
+
"module": "dist/esm/index.js",
|
|
7
|
+
"author": "Searchspring",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"repository": "https://github.com/searchspring/snap",
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "rm -rf ./dist && tsc && tsc -p tsconfig.cjs.json",
|
|
15
|
+
"build:docs": "typedoc --out docs src/index.ts",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"format": "prettier --write 'src/**/*.{js,jsx,ts,tsx}'",
|
|
18
|
+
"lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'",
|
|
19
|
+
"test": "jest",
|
|
20
|
+
"test:watch": "jest --watch"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"deepmerge": "^4.2.2",
|
|
24
|
+
"seamless-immutable": "^7.1.4"
|
|
25
|
+
},
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"files": [
|
|
28
|
+
"dist/**/*"
|
|
29
|
+
],
|
|
30
|
+
"gitHead": "122405b27b497c7bb6a189c30535fdc197bc3ef0"
|
|
31
|
+
}
|