-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutil.js
More file actions
83 lines (76 loc) · 2.24 KB
/
util.js
File metadata and controls
83 lines (76 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { writable } from "svelte/store";
export let searchQuery = writable('');
// Mulberry32 PRNG
function mulberry32(seed) {
return function () {
let t = (seed += 0x6d2b79f5);
t = Math.imul(t ^ (t >>> 15), t | 1);
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
return ((t ^ (t >>> 16)) >>> 0) / 4294967296;
};
}
// Generate a stronger random 32-bit seed
function generateSeed() {
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
const array = new Uint32Array(1);
crypto.getRandomValues(array);
return array[0];
}
// Fallback for Node.js or older browsers
return (Date.now() ^ Math.floor(Math.random() * 0xffffffff)) >>> 0;
}
// Fisher-Yates shuffle with optional seed
export function shuffleArray(array) {
const rng = mulberry32(generateSeed());
let i = array.length;
while (i > 1) {
const j = Math.floor(rng() * i--);
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
export function getSearchParameters() {
const result = {};
for (const [key, value] of new URLSearchParams(window.location.search)) {
const parsed = parseValue(value);
if (key in result) {
result[key] = Array.isArray(result[key]) ? [...result[key], parsed] : [result[key], parsed];
} else {
result[key] = parsed;
}
}
return result;
}
/**
* Parses a string value to its appropriate type.
* @param {string} value
* @returns {boolean|number|string|null|undefined}
*/
export function parseValue(value) {
if (value === "true") return true;
if (value === "false") return false;
if (value == null) return value;
const trimmed = value.trim();
if (/^-?\d+(\.\d+)?$/.test(trimmed)) return Number(trimmed);
return value;
}
/**
* Creates a URL search string from an object of parameters.
* @param {Object} params
* @returns {string}
*/
export function createSearchParameters(params) {
const searchParams = new URLSearchParams();
for (const key in params) {
const val = params[key];
if (val == null) continue;
if (Array.isArray(val)) {
for (const v of val) searchParams.append(key, v);
} else if (typeof val === "object") {
searchParams.set(key, JSON.stringify(val));
} else {
searchParams.set(key, val);
}
}
return searchParams.toString();
}