zustand-querystring 0.0.16 → 0.0.17
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/dist/{chunk-QIA7KKX4.mjs → chunk-4CDMBGCR.mjs} +3 -7
- package/dist/{chunk-QPGVZKLE.mjs → chunk-77OZJNG4.mjs} +4 -1
- package/dist/chunk-STY4LBQG.mjs +64 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +73 -12
- package/dist/index.mjs +12 -3
- package/dist/middleware.js +6 -7
- package/dist/middleware.mjs +2 -2
- package/dist/parser.js +4 -1
- package/dist/parser.mjs +1 -1
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +204 -0
- package/dist/utils.mjs +7 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parse,
|
|
3
3
|
stringify
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-77OZJNG4.mjs";
|
|
5
5
|
|
|
6
6
|
// src/middleware.ts
|
|
7
7
|
import { mergeWith, isEqual, cloneDeep } from "lodash-es";
|
|
@@ -58,11 +58,7 @@ var queryStringImpl = (fn, options) => (set, get, api) => {
|
|
|
58
58
|
var _a;
|
|
59
59
|
const match = querystring2.match(stateMatcher);
|
|
60
60
|
if (match) {
|
|
61
|
-
|
|
62
|
-
if (!m.startsWith("$")) {
|
|
63
|
-
m = "$" + m;
|
|
64
|
-
}
|
|
65
|
-
return parse(m);
|
|
61
|
+
return parse((_a = match[1]) != null ? _a : match[2]);
|
|
66
62
|
}
|
|
67
63
|
return null;
|
|
68
64
|
};
|
|
@@ -132,7 +128,7 @@ var queryStringImpl = (fn, options) => (set, get, api) => {
|
|
|
132
128
|
}
|
|
133
129
|
const newCompacted = compact(newMerged, initialState);
|
|
134
130
|
if (Object.keys(newCompacted).length) {
|
|
135
|
-
const stringified = stringify(newCompacted)
|
|
131
|
+
const stringified = stringify(newCompacted);
|
|
136
132
|
const newQueryState = `${defaultedOptions.key}=${stringified};;`;
|
|
137
133
|
let newQueryString = "";
|
|
138
134
|
if (currentParsed) {
|
|
@@ -7,7 +7,7 @@ function encodeString(str, regexp) {
|
|
|
7
7
|
return encodeURI(str.replace(regexp, "/$1"));
|
|
8
8
|
}
|
|
9
9
|
function trim(res) {
|
|
10
|
-
return typeof res === "string" ? res.replace(/;+$/g, "") : res;
|
|
10
|
+
return typeof res === "string" ? res.replace(/;+$/g, "").replace(/^\$/, "") : res;
|
|
11
11
|
}
|
|
12
12
|
function stringify(input, recursive) {
|
|
13
13
|
if (!recursive) {
|
|
@@ -41,6 +41,9 @@ function stringify(input, recursive) {
|
|
|
41
41
|
return "=" + encodeString(input.toString(), valueStringifyRegexp);
|
|
42
42
|
}
|
|
43
43
|
function parse(str) {
|
|
44
|
+
if (!str.startsWith("$")) {
|
|
45
|
+
str = "$" + str;
|
|
46
|
+
}
|
|
44
47
|
let pos = 0;
|
|
45
48
|
str = decodeURI(str);
|
|
46
49
|
function readToken(regexp) {
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parse,
|
|
3
|
+
stringify
|
|
4
|
+
} from "./chunk-77OZJNG4.mjs";
|
|
5
|
+
|
|
6
|
+
// src/utils.ts
|
|
7
|
+
var escapeStringRegexp = (string) => {
|
|
8
|
+
if (typeof string !== "string") {
|
|
9
|
+
throw new TypeError("Expected a string");
|
|
10
|
+
}
|
|
11
|
+
return string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
|
|
12
|
+
};
|
|
13
|
+
var parseQueryString = (key, querystring) => {
|
|
14
|
+
var _a;
|
|
15
|
+
const stateMatcher = new RegExp(`${key}=(.*);;|${key}=(.*)$`);
|
|
16
|
+
const match = querystring.match(stateMatcher);
|
|
17
|
+
if (match) {
|
|
18
|
+
return parse((_a = match[1]) != null ? _a : match[2]);
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
};
|
|
22
|
+
var createURL = ({
|
|
23
|
+
baseUrl,
|
|
24
|
+
key,
|
|
25
|
+
state
|
|
26
|
+
}) => {
|
|
27
|
+
const escapedKey = escapeStringRegexp(key);
|
|
28
|
+
const stringified = stringify(state);
|
|
29
|
+
const newQueryState = `${key}=${stringified};;`;
|
|
30
|
+
const match = baseUrl.indexOf("?");
|
|
31
|
+
const currentQueryString = match >= 0 ? baseUrl.substring(match) : "";
|
|
32
|
+
const currentParsed = parseQueryString(escapedKey, currentQueryString);
|
|
33
|
+
const splitMatcher = new RegExp(`${escapedKey}=.*;;|${escapedKey}=.*$`);
|
|
34
|
+
const splitIgnored = currentQueryString.split(splitMatcher);
|
|
35
|
+
let ignored = "";
|
|
36
|
+
for (let str of splitIgnored) {
|
|
37
|
+
if (!str || str === "?" || str === "&") {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (str.startsWith("&") || str.startsWith("?")) {
|
|
41
|
+
str = str.substring(1);
|
|
42
|
+
}
|
|
43
|
+
if (str.endsWith("&")) {
|
|
44
|
+
str = str.substring(0, str.length - 1);
|
|
45
|
+
}
|
|
46
|
+
ignored += (ignored ? "&" : "?") + str;
|
|
47
|
+
}
|
|
48
|
+
let newQueryString = "";
|
|
49
|
+
if (currentParsed) {
|
|
50
|
+
newQueryString = currentQueryString.replace(splitMatcher, newQueryState);
|
|
51
|
+
} else if (ignored) {
|
|
52
|
+
newQueryString = ignored + "&" + newQueryState;
|
|
53
|
+
} else {
|
|
54
|
+
newQueryString = "?" + newQueryState;
|
|
55
|
+
}
|
|
56
|
+
if (currentQueryString) {
|
|
57
|
+
return baseUrl.replace(currentQueryString, newQueryString);
|
|
58
|
+
}
|
|
59
|
+
return baseUrl + newQueryString;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export {
|
|
63
|
+
createURL
|
|
64
|
+
};
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -19,7 +19,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
// src/index.ts
|
|
20
20
|
var src_exports = {};
|
|
21
21
|
__export(src_exports, {
|
|
22
|
-
|
|
22
|
+
createURL: () => createURL,
|
|
23
|
+
parse: () => parse,
|
|
24
|
+
querystring: () => querystring,
|
|
25
|
+
stringify: () => stringify
|
|
23
26
|
});
|
|
24
27
|
module.exports = __toCommonJS(src_exports);
|
|
25
28
|
|
|
@@ -32,7 +35,7 @@ function encodeString(str, regexp) {
|
|
|
32
35
|
return encodeURI(str.replace(regexp, "/$1"));
|
|
33
36
|
}
|
|
34
37
|
function trim(res) {
|
|
35
|
-
return typeof res === "string" ? res.replace(/;+$/g, "") : res;
|
|
38
|
+
return typeof res === "string" ? res.replace(/;+$/g, "").replace(/^\$/, "") : res;
|
|
36
39
|
}
|
|
37
40
|
function stringify(input, recursive) {
|
|
38
41
|
if (!recursive) {
|
|
@@ -66,6 +69,9 @@ function stringify(input, recursive) {
|
|
|
66
69
|
return "=" + encodeString(input.toString(), valueStringifyRegexp);
|
|
67
70
|
}
|
|
68
71
|
function parse(str) {
|
|
72
|
+
if (!str.startsWith("$")) {
|
|
73
|
+
str = "$" + str;
|
|
74
|
+
}
|
|
69
75
|
let pos = 0;
|
|
70
76
|
str = decodeURI(str);
|
|
71
77
|
function readToken(regexp) {
|
|
@@ -191,15 +197,11 @@ var queryStringImpl = (fn, options) => (set, get, api) => {
|
|
|
191
197
|
const escapedKey = escapeStringRegexp(defaultedOptions.key);
|
|
192
198
|
const stateMatcher = new RegExp(`${escapedKey}=(.*);;|${escapedKey}=(.*)$`);
|
|
193
199
|
const splitMatcher = new RegExp(`${escapedKey}=.*;;|${escapedKey}=.*$`);
|
|
194
|
-
const
|
|
200
|
+
const parseQueryString2 = (querystring2) => {
|
|
195
201
|
var _a;
|
|
196
202
|
const match = querystring2.match(stateMatcher);
|
|
197
203
|
if (match) {
|
|
198
|
-
|
|
199
|
-
if (!m.startsWith("$")) {
|
|
200
|
-
m = "$" + m;
|
|
201
|
-
}
|
|
202
|
-
return parse(m);
|
|
204
|
+
return parse((_a = match[1]) != null ? _a : match[2]);
|
|
203
205
|
}
|
|
204
206
|
return null;
|
|
205
207
|
};
|
|
@@ -219,7 +221,7 @@ var queryStringImpl = (fn, options) => (set, get, api) => {
|
|
|
219
221
|
if (!queryString) {
|
|
220
222
|
return initialState;
|
|
221
223
|
}
|
|
222
|
-
const parsed =
|
|
224
|
+
const parsed = parseQueryString2(queryString);
|
|
223
225
|
if (!parsed) {
|
|
224
226
|
return initialState;
|
|
225
227
|
}
|
|
@@ -248,7 +250,7 @@ var queryStringImpl = (fn, options) => (set, get, api) => {
|
|
|
248
250
|
const setQuery = () => {
|
|
249
251
|
const selectedState = getSelectedState(get(), location.pathname);
|
|
250
252
|
const currentQueryString = location.search;
|
|
251
|
-
const currentParsed =
|
|
253
|
+
const currentParsed = parseQueryString2(currentQueryString);
|
|
252
254
|
const newMerged = {
|
|
253
255
|
...currentParsed,
|
|
254
256
|
...selectedState
|
|
@@ -269,7 +271,7 @@ var queryStringImpl = (fn, options) => (set, get, api) => {
|
|
|
269
271
|
}
|
|
270
272
|
const newCompacted = compact(newMerged, initialState);
|
|
271
273
|
if (Object.keys(newCompacted).length) {
|
|
272
|
-
const stringified = stringify(newCompacted)
|
|
274
|
+
const stringified = stringify(newCompacted);
|
|
273
275
|
const newQueryState = `${defaultedOptions.key}=${stringified};;`;
|
|
274
276
|
let newQueryString = "";
|
|
275
277
|
if (currentParsed) {
|
|
@@ -318,7 +320,66 @@ var queryStringImpl = (fn, options) => (set, get, api) => {
|
|
|
318
320
|
return fn(set, get, api);
|
|
319
321
|
};
|
|
320
322
|
var querystring = queryStringImpl;
|
|
323
|
+
|
|
324
|
+
// src/utils.ts
|
|
325
|
+
var escapeStringRegexp2 = (string) => {
|
|
326
|
+
if (typeof string !== "string") {
|
|
327
|
+
throw new TypeError("Expected a string");
|
|
328
|
+
}
|
|
329
|
+
return string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
|
|
330
|
+
};
|
|
331
|
+
var parseQueryString = (key, querystring2) => {
|
|
332
|
+
var _a;
|
|
333
|
+
const stateMatcher = new RegExp(`${key}=(.*);;|${key}=(.*)$`);
|
|
334
|
+
const match = querystring2.match(stateMatcher);
|
|
335
|
+
if (match) {
|
|
336
|
+
return parse((_a = match[1]) != null ? _a : match[2]);
|
|
337
|
+
}
|
|
338
|
+
return null;
|
|
339
|
+
};
|
|
340
|
+
var createURL = ({
|
|
341
|
+
baseUrl,
|
|
342
|
+
key,
|
|
343
|
+
state
|
|
344
|
+
}) => {
|
|
345
|
+
const escapedKey = escapeStringRegexp2(key);
|
|
346
|
+
const stringified = stringify(state);
|
|
347
|
+
const newQueryState = `${key}=${stringified};;`;
|
|
348
|
+
const match = baseUrl.indexOf("?");
|
|
349
|
+
const currentQueryString = match >= 0 ? baseUrl.substring(match) : "";
|
|
350
|
+
const currentParsed = parseQueryString(escapedKey, currentQueryString);
|
|
351
|
+
const splitMatcher = new RegExp(`${escapedKey}=.*;;|${escapedKey}=.*$`);
|
|
352
|
+
const splitIgnored = currentQueryString.split(splitMatcher);
|
|
353
|
+
let ignored = "";
|
|
354
|
+
for (let str of splitIgnored) {
|
|
355
|
+
if (!str || str === "?" || str === "&") {
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
if (str.startsWith("&") || str.startsWith("?")) {
|
|
359
|
+
str = str.substring(1);
|
|
360
|
+
}
|
|
361
|
+
if (str.endsWith("&")) {
|
|
362
|
+
str = str.substring(0, str.length - 1);
|
|
363
|
+
}
|
|
364
|
+
ignored += (ignored ? "&" : "?") + str;
|
|
365
|
+
}
|
|
366
|
+
let newQueryString = "";
|
|
367
|
+
if (currentParsed) {
|
|
368
|
+
newQueryString = currentQueryString.replace(splitMatcher, newQueryState);
|
|
369
|
+
} else if (ignored) {
|
|
370
|
+
newQueryString = ignored + "&" + newQueryState;
|
|
371
|
+
} else {
|
|
372
|
+
newQueryString = "?" + newQueryState;
|
|
373
|
+
}
|
|
374
|
+
if (currentQueryString) {
|
|
375
|
+
return baseUrl.replace(currentQueryString, newQueryString);
|
|
376
|
+
}
|
|
377
|
+
return baseUrl + newQueryString;
|
|
378
|
+
};
|
|
321
379
|
// Annotate the CommonJS export names for ESM import in node:
|
|
322
380
|
0 && (module.exports = {
|
|
323
|
-
|
|
381
|
+
createURL,
|
|
382
|
+
parse,
|
|
383
|
+
querystring,
|
|
384
|
+
stringify
|
|
324
385
|
});
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
querystring
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import
|
|
3
|
+
} from "./chunk-4CDMBGCR.mjs";
|
|
4
|
+
import {
|
|
5
|
+
createURL
|
|
6
|
+
} from "./chunk-STY4LBQG.mjs";
|
|
7
|
+
import {
|
|
8
|
+
parse,
|
|
9
|
+
stringify
|
|
10
|
+
} from "./chunk-77OZJNG4.mjs";
|
|
5
11
|
export {
|
|
6
|
-
|
|
12
|
+
createURL,
|
|
13
|
+
parse,
|
|
14
|
+
querystring,
|
|
15
|
+
stringify
|
|
7
16
|
};
|
package/dist/middleware.js
CHANGED
|
@@ -32,7 +32,7 @@ function encodeString(str, regexp) {
|
|
|
32
32
|
return encodeURI(str.replace(regexp, "/$1"));
|
|
33
33
|
}
|
|
34
34
|
function trim(res) {
|
|
35
|
-
return typeof res === "string" ? res.replace(/;+$/g, "") : res;
|
|
35
|
+
return typeof res === "string" ? res.replace(/;+$/g, "").replace(/^\$/, "") : res;
|
|
36
36
|
}
|
|
37
37
|
function stringify(input, recursive) {
|
|
38
38
|
if (!recursive) {
|
|
@@ -66,6 +66,9 @@ function stringify(input, recursive) {
|
|
|
66
66
|
return "=" + encodeString(input.toString(), valueStringifyRegexp);
|
|
67
67
|
}
|
|
68
68
|
function parse(str) {
|
|
69
|
+
if (!str.startsWith("$")) {
|
|
70
|
+
str = "$" + str;
|
|
71
|
+
}
|
|
69
72
|
let pos = 0;
|
|
70
73
|
str = decodeURI(str);
|
|
71
74
|
function readToken(regexp) {
|
|
@@ -195,11 +198,7 @@ var queryStringImpl = (fn, options) => (set, get, api) => {
|
|
|
195
198
|
var _a;
|
|
196
199
|
const match = querystring2.match(stateMatcher);
|
|
197
200
|
if (match) {
|
|
198
|
-
|
|
199
|
-
if (!m.startsWith("$")) {
|
|
200
|
-
m = "$" + m;
|
|
201
|
-
}
|
|
202
|
-
return parse(m);
|
|
201
|
+
return parse((_a = match[1]) != null ? _a : match[2]);
|
|
203
202
|
}
|
|
204
203
|
return null;
|
|
205
204
|
};
|
|
@@ -269,7 +268,7 @@ var queryStringImpl = (fn, options) => (set, get, api) => {
|
|
|
269
268
|
}
|
|
270
269
|
const newCompacted = compact(newMerged, initialState);
|
|
271
270
|
if (Object.keys(newCompacted).length) {
|
|
272
|
-
const stringified = stringify(newCompacted)
|
|
271
|
+
const stringified = stringify(newCompacted);
|
|
273
272
|
const newQueryState = `${defaultedOptions.key}=${stringified};;`;
|
|
274
273
|
let newQueryString = "";
|
|
275
274
|
if (currentParsed) {
|
package/dist/middleware.mjs
CHANGED
package/dist/parser.js
CHANGED
|
@@ -31,7 +31,7 @@ function encodeString(str, regexp) {
|
|
|
31
31
|
return encodeURI(str.replace(regexp, "/$1"));
|
|
32
32
|
}
|
|
33
33
|
function trim(res) {
|
|
34
|
-
return typeof res === "string" ? res.replace(/;+$/g, "") : res;
|
|
34
|
+
return typeof res === "string" ? res.replace(/;+$/g, "").replace(/^\$/, "") : res;
|
|
35
35
|
}
|
|
36
36
|
function stringify(input, recursive) {
|
|
37
37
|
if (!recursive) {
|
|
@@ -65,6 +65,9 @@ function stringify(input, recursive) {
|
|
|
65
65
|
return "=" + encodeString(input.toString(), valueStringifyRegexp);
|
|
66
66
|
}
|
|
67
67
|
function parse(str) {
|
|
68
|
+
if (!str.startsWith("$")) {
|
|
69
|
+
str = "$" + str;
|
|
70
|
+
}
|
|
68
71
|
let pos = 0;
|
|
69
72
|
str = decodeURI(str);
|
|
70
73
|
function readToken(regexp) {
|
package/dist/parser.mjs
CHANGED
package/dist/utils.d.ts
ADDED
package/dist/utils.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/utils.ts
|
|
20
|
+
var utils_exports = {};
|
|
21
|
+
__export(utils_exports, {
|
|
22
|
+
createURL: () => createURL
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(utils_exports);
|
|
25
|
+
|
|
26
|
+
// src/parser.ts
|
|
27
|
+
var keyStringifyRegexp = /([=:@$/])/g;
|
|
28
|
+
var valueStringifyRegexp = /([&;/])/g;
|
|
29
|
+
var keyParseRegexp = /[=:@$]/;
|
|
30
|
+
var valueParseRegexp = /[&;]/;
|
|
31
|
+
function encodeString(str, regexp) {
|
|
32
|
+
return encodeURI(str.replace(regexp, "/$1"));
|
|
33
|
+
}
|
|
34
|
+
function trim(res) {
|
|
35
|
+
return typeof res === "string" ? res.replace(/;+$/g, "").replace(/^\$/, "") : res;
|
|
36
|
+
}
|
|
37
|
+
function stringify(input, recursive) {
|
|
38
|
+
if (!recursive) {
|
|
39
|
+
return trim(stringify(input, true));
|
|
40
|
+
}
|
|
41
|
+
if (typeof input === "function") {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (typeof input === "number" || input === true || input === false || input === null) {
|
|
45
|
+
return ":" + input;
|
|
46
|
+
}
|
|
47
|
+
const res = [];
|
|
48
|
+
if (Array.isArray(input)) {
|
|
49
|
+
for (const elem of input) {
|
|
50
|
+
typeof elem === "undefined" ? res.push(":null") : res.push(stringify(elem, true));
|
|
51
|
+
}
|
|
52
|
+
return "@" + res.join("&") + ";";
|
|
53
|
+
}
|
|
54
|
+
if (typeof input === "object") {
|
|
55
|
+
for (const [key, value] of Object.entries(input)) {
|
|
56
|
+
const stringifiedValue = stringify(value, true);
|
|
57
|
+
if (stringifiedValue) {
|
|
58
|
+
res.push(encodeString(key, keyStringifyRegexp) + stringifiedValue);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return "$" + res.join("&") + ";";
|
|
62
|
+
}
|
|
63
|
+
if (typeof input === "undefined") {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
return "=" + encodeString(input.toString(), valueStringifyRegexp);
|
|
67
|
+
}
|
|
68
|
+
function parse(str) {
|
|
69
|
+
if (!str.startsWith("$")) {
|
|
70
|
+
str = "$" + str;
|
|
71
|
+
}
|
|
72
|
+
let pos = 0;
|
|
73
|
+
str = decodeURI(str);
|
|
74
|
+
function readToken(regexp) {
|
|
75
|
+
let token = "";
|
|
76
|
+
for (; pos !== str.length; ++pos) {
|
|
77
|
+
if (str.charAt(pos) === "/") {
|
|
78
|
+
pos += 1;
|
|
79
|
+
if (pos === str.length) {
|
|
80
|
+
token += ";";
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
} else if (str.charAt(pos).match(regexp)) {
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
token += str.charAt(pos);
|
|
87
|
+
}
|
|
88
|
+
return token;
|
|
89
|
+
}
|
|
90
|
+
function parseToken() {
|
|
91
|
+
const type = str.charAt(pos++);
|
|
92
|
+
if (type === "=") {
|
|
93
|
+
return readToken(valueParseRegexp);
|
|
94
|
+
}
|
|
95
|
+
if (type === ":") {
|
|
96
|
+
const value = readToken(valueParseRegexp);
|
|
97
|
+
if (value === "true") {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
if (value === "false") {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
const parsedValue = parseFloat(value);
|
|
104
|
+
return isNaN(parsedValue) ? null : parsedValue;
|
|
105
|
+
}
|
|
106
|
+
if (type === "@") {
|
|
107
|
+
const res = [];
|
|
108
|
+
loop: {
|
|
109
|
+
if (pos >= str.length || str.charAt(pos) === ";") {
|
|
110
|
+
break loop;
|
|
111
|
+
}
|
|
112
|
+
while (1) {
|
|
113
|
+
res.push(parseToken());
|
|
114
|
+
if (pos >= str.length || str.charAt(pos) === ";") {
|
|
115
|
+
break loop;
|
|
116
|
+
}
|
|
117
|
+
pos += 1;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
pos += 1;
|
|
121
|
+
return res;
|
|
122
|
+
}
|
|
123
|
+
if (type === "$") {
|
|
124
|
+
const res = {};
|
|
125
|
+
loop: {
|
|
126
|
+
if (pos >= str.length || str.charAt(pos) === ";") {
|
|
127
|
+
break loop;
|
|
128
|
+
}
|
|
129
|
+
while (1) {
|
|
130
|
+
var name = readToken(keyParseRegexp);
|
|
131
|
+
res[name] = parseToken();
|
|
132
|
+
if (pos >= str.length || str.charAt(pos) === ";") {
|
|
133
|
+
break loop;
|
|
134
|
+
}
|
|
135
|
+
pos += 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
pos += 1;
|
|
139
|
+
return res;
|
|
140
|
+
}
|
|
141
|
+
throw new Error("Unexpected char " + type);
|
|
142
|
+
}
|
|
143
|
+
return parseToken();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// src/utils.ts
|
|
147
|
+
var escapeStringRegexp = (string) => {
|
|
148
|
+
if (typeof string !== "string") {
|
|
149
|
+
throw new TypeError("Expected a string");
|
|
150
|
+
}
|
|
151
|
+
return string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
|
|
152
|
+
};
|
|
153
|
+
var parseQueryString = (key, querystring) => {
|
|
154
|
+
var _a;
|
|
155
|
+
const stateMatcher = new RegExp(`${key}=(.*);;|${key}=(.*)$`);
|
|
156
|
+
const match = querystring.match(stateMatcher);
|
|
157
|
+
if (match) {
|
|
158
|
+
return parse((_a = match[1]) != null ? _a : match[2]);
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
};
|
|
162
|
+
var createURL = ({
|
|
163
|
+
baseUrl,
|
|
164
|
+
key,
|
|
165
|
+
state
|
|
166
|
+
}) => {
|
|
167
|
+
const escapedKey = escapeStringRegexp(key);
|
|
168
|
+
const stringified = stringify(state);
|
|
169
|
+
const newQueryState = `${key}=${stringified};;`;
|
|
170
|
+
const match = baseUrl.indexOf("?");
|
|
171
|
+
const currentQueryString = match >= 0 ? baseUrl.substring(match) : "";
|
|
172
|
+
const currentParsed = parseQueryString(escapedKey, currentQueryString);
|
|
173
|
+
const splitMatcher = new RegExp(`${escapedKey}=.*;;|${escapedKey}=.*$`);
|
|
174
|
+
const splitIgnored = currentQueryString.split(splitMatcher);
|
|
175
|
+
let ignored = "";
|
|
176
|
+
for (let str of splitIgnored) {
|
|
177
|
+
if (!str || str === "?" || str === "&") {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (str.startsWith("&") || str.startsWith("?")) {
|
|
181
|
+
str = str.substring(1);
|
|
182
|
+
}
|
|
183
|
+
if (str.endsWith("&")) {
|
|
184
|
+
str = str.substring(0, str.length - 1);
|
|
185
|
+
}
|
|
186
|
+
ignored += (ignored ? "&" : "?") + str;
|
|
187
|
+
}
|
|
188
|
+
let newQueryString = "";
|
|
189
|
+
if (currentParsed) {
|
|
190
|
+
newQueryString = currentQueryString.replace(splitMatcher, newQueryState);
|
|
191
|
+
} else if (ignored) {
|
|
192
|
+
newQueryString = ignored + "&" + newQueryState;
|
|
193
|
+
} else {
|
|
194
|
+
newQueryString = "?" + newQueryState;
|
|
195
|
+
}
|
|
196
|
+
if (currentQueryString) {
|
|
197
|
+
return baseUrl.replace(currentQueryString, newQueryString);
|
|
198
|
+
}
|
|
199
|
+
return baseUrl + newQueryString;
|
|
200
|
+
};
|
|
201
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
202
|
+
0 && (module.exports = {
|
|
203
|
+
createURL
|
|
204
|
+
});
|
package/dist/utils.mjs
ADDED