use-prms 0.2.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/README.md +320 -0
- package/dist/hash.cjs +505 -0
- package/dist/hash.cjs.map +1 -0
- package/dist/hash.d.cts +1 -0
- package/dist/hash.d.ts +1 -0
- package/dist/hash.js +475 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.cjs +502 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +341 -0
- package/dist/index.d.ts +341 -0
- package/dist/index.js +472 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
package/dist/hash.cjs
ADDED
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
// src/core.ts
|
|
6
|
+
function parseMultiParams(source) {
|
|
7
|
+
const searchParams = typeof source === "string" ? new URLSearchParams(source) : source;
|
|
8
|
+
const result = {};
|
|
9
|
+
const keys = new Set(searchParams.keys());
|
|
10
|
+
for (const key of keys) {
|
|
11
|
+
result[key] = searchParams.getAll(key);
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
function serializeMultiParams(params) {
|
|
16
|
+
const searchParams = new URLSearchParams();
|
|
17
|
+
for (const [key, values] of Object.entries(params)) {
|
|
18
|
+
for (const value of values) {
|
|
19
|
+
if (value === "") {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
searchParams.append(key, value);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
let result = searchParams.toString();
|
|
26
|
+
const valuelessKeys = Object.entries(params).filter(([_, values]) => values.includes("")).map(([key, _]) => encodeURIComponent(key));
|
|
27
|
+
if (valuelessKeys.length > 0) {
|
|
28
|
+
const valuelessPart = valuelessKeys.join("&");
|
|
29
|
+
result = result ? `${result}&${valuelessPart}` : valuelessPart;
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
var queryStrategy = {
|
|
34
|
+
getRaw() {
|
|
35
|
+
if (typeof window === "undefined") return "";
|
|
36
|
+
return window.location.search;
|
|
37
|
+
},
|
|
38
|
+
parse() {
|
|
39
|
+
if (typeof window === "undefined") return {};
|
|
40
|
+
return parseMultiParams(window.location.search);
|
|
41
|
+
},
|
|
42
|
+
buildUrl(base, params) {
|
|
43
|
+
base.search = serializeMultiParams(params);
|
|
44
|
+
return base.toString();
|
|
45
|
+
},
|
|
46
|
+
subscribe(callback) {
|
|
47
|
+
if (typeof window === "undefined") return () => {
|
|
48
|
+
};
|
|
49
|
+
window.addEventListener("popstate", callback);
|
|
50
|
+
return () => window.removeEventListener("popstate", callback);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var hashStrategy = {
|
|
54
|
+
getRaw() {
|
|
55
|
+
if (typeof window === "undefined") return "";
|
|
56
|
+
return window.location.hash;
|
|
57
|
+
},
|
|
58
|
+
parse() {
|
|
59
|
+
if (typeof window === "undefined") return {};
|
|
60
|
+
const hash = window.location.hash;
|
|
61
|
+
const hashString = hash.startsWith("#") ? hash.slice(1) : hash;
|
|
62
|
+
return parseMultiParams(hashString);
|
|
63
|
+
},
|
|
64
|
+
buildUrl(base, params) {
|
|
65
|
+
base.hash = serializeMultiParams(params);
|
|
66
|
+
return base.toString();
|
|
67
|
+
},
|
|
68
|
+
subscribe(callback) {
|
|
69
|
+
if (typeof window === "undefined") return () => {
|
|
70
|
+
};
|
|
71
|
+
window.addEventListener("hashchange", callback);
|
|
72
|
+
window.addEventListener("popstate", callback);
|
|
73
|
+
return () => {
|
|
74
|
+
window.removeEventListener("hashchange", callback);
|
|
75
|
+
window.removeEventListener("popstate", callback);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
var defaultStrategy = queryStrategy;
|
|
80
|
+
function getDefaultStrategy() {
|
|
81
|
+
return defaultStrategy;
|
|
82
|
+
}
|
|
83
|
+
function setDefaultStrategy(strategy) {
|
|
84
|
+
defaultStrategy = strategy;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// src/params.ts
|
|
88
|
+
function stringParam(init) {
|
|
89
|
+
return {
|
|
90
|
+
encode: (value) => value === init ? void 0 : value,
|
|
91
|
+
decode: (encoded) => encoded === void 0 ? init : encoded
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function defStringParam(init) {
|
|
95
|
+
return {
|
|
96
|
+
encode: (value) => value === init ? void 0 : value,
|
|
97
|
+
decode: (encoded) => encoded ?? init
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
var boolParam = {
|
|
101
|
+
encode: (value) => value ? "" : void 0,
|
|
102
|
+
decode: (encoded) => encoded !== void 0
|
|
103
|
+
};
|
|
104
|
+
function intParam(init) {
|
|
105
|
+
return {
|
|
106
|
+
encode: (value) => value === init ? void 0 : value.toString(),
|
|
107
|
+
decode: (encoded) => encoded !== void 0 ? parseInt(encoded, 10) : init
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
var optIntParam = {
|
|
111
|
+
encode: (value) => value === null ? void 0 : value.toString(),
|
|
112
|
+
decode: (encoded) => encoded !== void 0 ? parseInt(encoded, 10) : null
|
|
113
|
+
};
|
|
114
|
+
function floatParam(init) {
|
|
115
|
+
return {
|
|
116
|
+
encode: (value) => value === init ? void 0 : value.toString(),
|
|
117
|
+
decode: (encoded) => encoded !== void 0 ? parseFloat(encoded) : init
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function enumParam(init, values) {
|
|
121
|
+
const validSet = new Set(values);
|
|
122
|
+
return {
|
|
123
|
+
encode: (value) => {
|
|
124
|
+
if (!validSet.has(value)) {
|
|
125
|
+
console.warn(`Invalid enum value: ${value}, expected one of ${values.join(", ")}`);
|
|
126
|
+
return void 0;
|
|
127
|
+
}
|
|
128
|
+
return value === init ? void 0 : value;
|
|
129
|
+
},
|
|
130
|
+
decode: (encoded) => {
|
|
131
|
+
if (encoded === void 0) return init;
|
|
132
|
+
if (!validSet.has(encoded)) {
|
|
133
|
+
console.warn(`Invalid enum value: ${encoded}, expected one of ${values.join(", ")}. Using default: ${init}`);
|
|
134
|
+
return init;
|
|
135
|
+
}
|
|
136
|
+
return encoded;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function stringsParam(init = [], delimiter = " ") {
|
|
141
|
+
const initEncoded = init.join(delimiter);
|
|
142
|
+
return {
|
|
143
|
+
encode: (values) => {
|
|
144
|
+
const encoded = values.join(delimiter);
|
|
145
|
+
if (encoded === initEncoded) return void 0;
|
|
146
|
+
return encoded;
|
|
147
|
+
},
|
|
148
|
+
decode: (encoded) => {
|
|
149
|
+
if (encoded === void 0) return init;
|
|
150
|
+
if (encoded === "") return [];
|
|
151
|
+
return encoded.split(delimiter);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function numberArrayParam(init = []) {
|
|
156
|
+
const isEqual = (a, b) => a.length === b.length && a.every((v, i) => v === b[i]);
|
|
157
|
+
return {
|
|
158
|
+
encode: (values) => {
|
|
159
|
+
if (isEqual(values, init)) return void 0;
|
|
160
|
+
return values.map((v) => v.toString()).join(",");
|
|
161
|
+
},
|
|
162
|
+
decode: (encoded) => {
|
|
163
|
+
if (encoded === void 0) return init;
|
|
164
|
+
if (encoded === "") return [];
|
|
165
|
+
return encoded.split(",").map((v) => parseFloat(v));
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function paginationParam(defaultPageSize, validPageSizes) {
|
|
170
|
+
return {
|
|
171
|
+
encode: ({ offset, pageSize }) => {
|
|
172
|
+
if (offset === 0 && pageSize === defaultPageSize) return void 0;
|
|
173
|
+
if (offset === 0) return ` ${pageSize}`;
|
|
174
|
+
if (pageSize === defaultPageSize) return String(offset);
|
|
175
|
+
return `${offset} ${pageSize}`;
|
|
176
|
+
},
|
|
177
|
+
decode: (encoded) => {
|
|
178
|
+
if (!encoded) return { offset: 0, pageSize: defaultPageSize };
|
|
179
|
+
const parts = encoded.split(" ");
|
|
180
|
+
const offset = parts[0] === "" ? 0 : parseInt(parts[0], 10) || 0;
|
|
181
|
+
let pageSize = parts[1] ? parseInt(parts[1], 10) : defaultPageSize;
|
|
182
|
+
if (validPageSizes && !validPageSizes.includes(pageSize)) {
|
|
183
|
+
pageSize = defaultPageSize;
|
|
184
|
+
}
|
|
185
|
+
return { offset, pageSize };
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function normalizeCodeMap(codeMap) {
|
|
190
|
+
if (Array.isArray(codeMap)) return codeMap;
|
|
191
|
+
return Object.entries(codeMap);
|
|
192
|
+
}
|
|
193
|
+
function codeParam(init, codeMap) {
|
|
194
|
+
const entries = normalizeCodeMap(codeMap);
|
|
195
|
+
const valueToCode = new Map(entries);
|
|
196
|
+
const codeToValue = new Map(entries.map(([v, c]) => [c, v]));
|
|
197
|
+
return {
|
|
198
|
+
encode: (value) => {
|
|
199
|
+
if (value === init) return void 0;
|
|
200
|
+
return valueToCode.get(value) ?? value;
|
|
201
|
+
},
|
|
202
|
+
decode: (encoded) => {
|
|
203
|
+
if (encoded === void 0) return init;
|
|
204
|
+
return codeToValue.get(encoded) ?? init;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function codesParam(allValues, codeMap, separator = "") {
|
|
209
|
+
const entries = normalizeCodeMap(codeMap);
|
|
210
|
+
const valueToCode = new Map(entries);
|
|
211
|
+
const codeToValue = new Map(entries.map(([v, c]) => [c, v]));
|
|
212
|
+
return {
|
|
213
|
+
encode: (values) => {
|
|
214
|
+
if (values.length === allValues.length && allValues.every((v) => values.includes(v))) {
|
|
215
|
+
return void 0;
|
|
216
|
+
}
|
|
217
|
+
return values.map((v) => valueToCode.get(v) ?? v).join(separator);
|
|
218
|
+
},
|
|
219
|
+
decode: (encoded) => {
|
|
220
|
+
if (encoded === void 0) return [...allValues];
|
|
221
|
+
if (encoded === "") return [];
|
|
222
|
+
const codes = separator ? encoded.split(separator) : encoded.split("");
|
|
223
|
+
return codes.map((c) => codeToValue.get(c)).filter((v) => v !== void 0);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// src/multiParams.ts
|
|
229
|
+
function multiStringParam(init = []) {
|
|
230
|
+
return {
|
|
231
|
+
encode: (values) => {
|
|
232
|
+
if (values.length === 0 && init.length === 0) return [];
|
|
233
|
+
if (arraysEqual(values, init)) return [];
|
|
234
|
+
return values;
|
|
235
|
+
},
|
|
236
|
+
decode: (encoded) => {
|
|
237
|
+
if (encoded.length === 0) return init;
|
|
238
|
+
return encoded;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function multiIntParam(init = []) {
|
|
243
|
+
return {
|
|
244
|
+
encode: (values) => {
|
|
245
|
+
if (values.length === 0 && init.length === 0) return [];
|
|
246
|
+
if (arraysEqual(values, init)) return [];
|
|
247
|
+
return values.map((v) => v.toString());
|
|
248
|
+
},
|
|
249
|
+
decode: (encoded) => {
|
|
250
|
+
if (encoded.length === 0) return init;
|
|
251
|
+
return encoded.map((v) => parseInt(v, 10));
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
function multiFloatParam(init = []) {
|
|
256
|
+
return {
|
|
257
|
+
encode: (values) => {
|
|
258
|
+
if (values.length === 0 && init.length === 0) return [];
|
|
259
|
+
if (arraysEqual(values, init)) return [];
|
|
260
|
+
return values.map((v) => v.toString());
|
|
261
|
+
},
|
|
262
|
+
decode: (encoded) => {
|
|
263
|
+
if (encoded.length === 0) return init;
|
|
264
|
+
return encoded.map((v) => parseFloat(v));
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function arraysEqual(a, b) {
|
|
269
|
+
return a.length === b.length && a.every((v, i) => v === b[i]);
|
|
270
|
+
}
|
|
271
|
+
var snapshotCache = /* @__PURE__ */ new WeakMap();
|
|
272
|
+
function getSnapshot(strategy) {
|
|
273
|
+
const raw = strategy.getRaw();
|
|
274
|
+
const cached = snapshotCache.get(strategy);
|
|
275
|
+
if (cached && cached.raw === raw) {
|
|
276
|
+
return cached.snapshot;
|
|
277
|
+
}
|
|
278
|
+
const snapshot = strategy.parse();
|
|
279
|
+
snapshotCache.set(strategy, { raw, snapshot });
|
|
280
|
+
return snapshot;
|
|
281
|
+
}
|
|
282
|
+
function getServerSnapshot() {
|
|
283
|
+
return {};
|
|
284
|
+
}
|
|
285
|
+
function multiToSingle(multi) {
|
|
286
|
+
if (multi.length === 0) return void 0;
|
|
287
|
+
return multi[0];
|
|
288
|
+
}
|
|
289
|
+
function useUrlParam(key, param, push = false) {
|
|
290
|
+
const strategy = getDefaultStrategy();
|
|
291
|
+
const paramRef = react.useRef(param);
|
|
292
|
+
paramRef.current = param;
|
|
293
|
+
const urlParams = react.useSyncExternalStore(
|
|
294
|
+
(cb) => strategy.subscribe(cb),
|
|
295
|
+
() => getSnapshot(strategy),
|
|
296
|
+
getServerSnapshot
|
|
297
|
+
);
|
|
298
|
+
const encoded = multiToSingle(urlParams[key] ?? []);
|
|
299
|
+
const cacheRef = react.useRef(null);
|
|
300
|
+
if (cacheRef.current === null || cacheRef.current.encoded !== encoded || cacheRef.current.param !== param) {
|
|
301
|
+
cacheRef.current = { encoded, param, decoded: param.decode(encoded) };
|
|
302
|
+
}
|
|
303
|
+
const value = cacheRef.current.decoded;
|
|
304
|
+
const setValue = react.useCallback(
|
|
305
|
+
(newValue) => {
|
|
306
|
+
if (typeof window === "undefined") return;
|
|
307
|
+
const currentParams = strategy.parse();
|
|
308
|
+
const encoded2 = paramRef.current.encode(newValue);
|
|
309
|
+
if (encoded2 === void 0) {
|
|
310
|
+
delete currentParams[key];
|
|
311
|
+
} else {
|
|
312
|
+
currentParams[key] = [encoded2];
|
|
313
|
+
}
|
|
314
|
+
const url = new URL(window.location.href);
|
|
315
|
+
const newUrl = strategy.buildUrl(url, currentParams);
|
|
316
|
+
const method = push ? "pushState" : "replaceState";
|
|
317
|
+
window.history[method]({}, "", newUrl);
|
|
318
|
+
window.dispatchEvent(new PopStateEvent("popstate"));
|
|
319
|
+
},
|
|
320
|
+
[key, push, strategy]
|
|
321
|
+
);
|
|
322
|
+
return [value, setValue];
|
|
323
|
+
}
|
|
324
|
+
function useUrlParams(params, push = false) {
|
|
325
|
+
const strategy = getDefaultStrategy();
|
|
326
|
+
const urlParams = react.useSyncExternalStore(
|
|
327
|
+
(cb) => strategy.subscribe(cb),
|
|
328
|
+
() => getSnapshot(strategy),
|
|
329
|
+
getServerSnapshot
|
|
330
|
+
);
|
|
331
|
+
const values = Object.fromEntries(
|
|
332
|
+
Object.entries(params).map(([key, param]) => [
|
|
333
|
+
key,
|
|
334
|
+
param.decode(multiToSingle(urlParams[key] ?? []))
|
|
335
|
+
])
|
|
336
|
+
);
|
|
337
|
+
const setValues = react.useCallback(
|
|
338
|
+
(updates) => {
|
|
339
|
+
if (typeof window === "undefined") return;
|
|
340
|
+
const currentParams = strategy.parse();
|
|
341
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
342
|
+
const param = params[key];
|
|
343
|
+
if (!param) continue;
|
|
344
|
+
const encoded = param.encode(value);
|
|
345
|
+
if (encoded === void 0) {
|
|
346
|
+
delete currentParams[key];
|
|
347
|
+
} else {
|
|
348
|
+
currentParams[key] = [encoded];
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
const url = new URL(window.location.href);
|
|
352
|
+
const newUrl = strategy.buildUrl(url, currentParams);
|
|
353
|
+
const method = push ? "pushState" : "replaceState";
|
|
354
|
+
window.history[method]({}, "", newUrl);
|
|
355
|
+
window.dispatchEvent(new PopStateEvent("popstate"));
|
|
356
|
+
},
|
|
357
|
+
[params, push, strategy]
|
|
358
|
+
);
|
|
359
|
+
return { values, setValues };
|
|
360
|
+
}
|
|
361
|
+
function useMultiUrlParam(key, param, push = false) {
|
|
362
|
+
const strategy = getDefaultStrategy();
|
|
363
|
+
const paramRef = react.useRef(param);
|
|
364
|
+
paramRef.current = param;
|
|
365
|
+
const urlParams = react.useSyncExternalStore(
|
|
366
|
+
(cb) => strategy.subscribe(cb),
|
|
367
|
+
() => getSnapshot(strategy),
|
|
368
|
+
getServerSnapshot
|
|
369
|
+
);
|
|
370
|
+
const value = param.decode(urlParams[key] ?? []);
|
|
371
|
+
const setValue = react.useCallback(
|
|
372
|
+
(newValue) => {
|
|
373
|
+
if (typeof window === "undefined") return;
|
|
374
|
+
const currentParams = strategy.parse();
|
|
375
|
+
const encoded = paramRef.current.encode(newValue);
|
|
376
|
+
if (encoded.length === 0) {
|
|
377
|
+
delete currentParams[key];
|
|
378
|
+
} else {
|
|
379
|
+
currentParams[key] = encoded;
|
|
380
|
+
}
|
|
381
|
+
const url = new URL(window.location.href);
|
|
382
|
+
const newUrl = strategy.buildUrl(url, currentParams);
|
|
383
|
+
const method = push ? "pushState" : "replaceState";
|
|
384
|
+
window.history[method]({}, "", newUrl);
|
|
385
|
+
window.dispatchEvent(new PopStateEvent("popstate"));
|
|
386
|
+
},
|
|
387
|
+
[key, push, strategy]
|
|
388
|
+
);
|
|
389
|
+
return [value, setValue];
|
|
390
|
+
}
|
|
391
|
+
function useMultiUrlParams(params, push = false) {
|
|
392
|
+
const strategy = getDefaultStrategy();
|
|
393
|
+
const urlParams = react.useSyncExternalStore(
|
|
394
|
+
(cb) => strategy.subscribe(cb),
|
|
395
|
+
() => getSnapshot(strategy),
|
|
396
|
+
getServerSnapshot
|
|
397
|
+
);
|
|
398
|
+
const values = Object.fromEntries(
|
|
399
|
+
Object.entries(params).map(([key, param]) => [
|
|
400
|
+
key,
|
|
401
|
+
param.decode(urlParams[key] ?? [])
|
|
402
|
+
])
|
|
403
|
+
);
|
|
404
|
+
const setValues = react.useCallback(
|
|
405
|
+
(updates) => {
|
|
406
|
+
if (typeof window === "undefined") return;
|
|
407
|
+
const currentParams = strategy.parse();
|
|
408
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
409
|
+
const param = params[key];
|
|
410
|
+
if (!param) continue;
|
|
411
|
+
const encoded = param.encode(value);
|
|
412
|
+
if (encoded.length === 0) {
|
|
413
|
+
delete currentParams[key];
|
|
414
|
+
} else {
|
|
415
|
+
currentParams[key] = encoded;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
const url = new URL(window.location.href);
|
|
419
|
+
const newUrl = strategy.buildUrl(url, currentParams);
|
|
420
|
+
const method = push ? "pushState" : "replaceState";
|
|
421
|
+
window.history[method]({}, "", newUrl);
|
|
422
|
+
window.dispatchEvent(new PopStateEvent("popstate"));
|
|
423
|
+
},
|
|
424
|
+
[params, push, strategy]
|
|
425
|
+
);
|
|
426
|
+
return { values, setValues };
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// src/index.ts
|
|
430
|
+
function serializeParams(params) {
|
|
431
|
+
const searchParams = new URLSearchParams();
|
|
432
|
+
for (const [key, value] of Object.entries(params)) {
|
|
433
|
+
if (value === void 0) {
|
|
434
|
+
continue;
|
|
435
|
+
} else if (value === "") {
|
|
436
|
+
continue;
|
|
437
|
+
} else {
|
|
438
|
+
searchParams.set(key, value);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
let result = searchParams.toString();
|
|
442
|
+
const valuelessKeys = Object.entries(params).filter(([_, value]) => value === "").map(([key, _]) => encodeURIComponent(key));
|
|
443
|
+
if (valuelessKeys.length > 0) {
|
|
444
|
+
const valuelessPart = valuelessKeys.join("&");
|
|
445
|
+
result = result ? `${result}&${valuelessPart}` : valuelessPart;
|
|
446
|
+
}
|
|
447
|
+
return result;
|
|
448
|
+
}
|
|
449
|
+
function parseParams(source) {
|
|
450
|
+
const searchParams = typeof source === "string" ? new URLSearchParams(source) : source;
|
|
451
|
+
const result = {};
|
|
452
|
+
for (const [key, value] of searchParams.entries()) {
|
|
453
|
+
if (!(key in result)) {
|
|
454
|
+
result[key] = value;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
return result;
|
|
458
|
+
}
|
|
459
|
+
function getCurrentParams() {
|
|
460
|
+
if (typeof window === "undefined") return {};
|
|
461
|
+
return parseParams(window.location.search);
|
|
462
|
+
}
|
|
463
|
+
function updateUrl(params, push = false) {
|
|
464
|
+
if (typeof window === "undefined") return;
|
|
465
|
+
const url = new URL(window.location.href);
|
|
466
|
+
const search = serializeParams(params);
|
|
467
|
+
url.search = search;
|
|
468
|
+
const method = push ? "pushState" : "replaceState";
|
|
469
|
+
window.history[method]({}, "", url.toString());
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// src/hash.ts
|
|
473
|
+
setDefaultStrategy(hashStrategy);
|
|
474
|
+
|
|
475
|
+
exports.boolParam = boolParam;
|
|
476
|
+
exports.codeParam = codeParam;
|
|
477
|
+
exports.codesParam = codesParam;
|
|
478
|
+
exports.defStringParam = defStringParam;
|
|
479
|
+
exports.enumParam = enumParam;
|
|
480
|
+
exports.floatParam = floatParam;
|
|
481
|
+
exports.getCurrentParams = getCurrentParams;
|
|
482
|
+
exports.getDefaultStrategy = getDefaultStrategy;
|
|
483
|
+
exports.hashStrategy = hashStrategy;
|
|
484
|
+
exports.intParam = intParam;
|
|
485
|
+
exports.multiFloatParam = multiFloatParam;
|
|
486
|
+
exports.multiIntParam = multiIntParam;
|
|
487
|
+
exports.multiStringParam = multiStringParam;
|
|
488
|
+
exports.numberArrayParam = numberArrayParam;
|
|
489
|
+
exports.optIntParam = optIntParam;
|
|
490
|
+
exports.paginationParam = paginationParam;
|
|
491
|
+
exports.parseMultiParams = parseMultiParams;
|
|
492
|
+
exports.parseParams = parseParams;
|
|
493
|
+
exports.queryStrategy = queryStrategy;
|
|
494
|
+
exports.serializeMultiParams = serializeMultiParams;
|
|
495
|
+
exports.serializeParams = serializeParams;
|
|
496
|
+
exports.setDefaultStrategy = setDefaultStrategy;
|
|
497
|
+
exports.stringParam = stringParam;
|
|
498
|
+
exports.stringsParam = stringsParam;
|
|
499
|
+
exports.updateUrl = updateUrl;
|
|
500
|
+
exports.useMultiUrlParam = useMultiUrlParam;
|
|
501
|
+
exports.useMultiUrlParams = useMultiUrlParams;
|
|
502
|
+
exports.useUrlParam = useUrlParam;
|
|
503
|
+
exports.useUrlParams = useUrlParams;
|
|
504
|
+
//# sourceMappingURL=hash.cjs.map
|
|
505
|
+
//# sourceMappingURL=hash.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core.ts","../src/params.ts","../src/multiParams.ts","../src/useUrlParam.ts","../src/index.ts","../src/hash.ts"],"names":["useRef","useSyncExternalStore","useCallback","encoded"],"mappings":"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","file":"hash.cjs","sourcesContent":["/**\n * Core multi-value operations and location strategies\n */\n\n/**\n * Multi-value encoded representation\n * An array of strings representing multiple values for a single URL parameter key\n */\nexport type MultiEncoded = string[]\n\n/**\n * Location strategy interface for abstracting URL storage location\n * (query string vs hash fragment)\n */\nexport interface LocationStrategy {\n /** Get raw string from location (for caching comparison) */\n getRaw(): string\n /** Parse current location to multi-value params */\n parse(): Record<string, MultiEncoded>\n /** Build URL string with updated params */\n buildUrl(base: URL, params: Record<string, MultiEncoded>): string\n /** Subscribe to location changes, returns unsubscribe function */\n subscribe(callback: () => void): () => void\n}\n\n/**\n * Parse URL string to multi-value params\n * Each key maps to an array of all values for that key\n */\nexport function parseMultiParams(source: string | URLSearchParams): Record<string, MultiEncoded> {\n const searchParams = typeof source === 'string'\n ? new URLSearchParams(source)\n : source\n\n const result: Record<string, MultiEncoded> = {}\n const keys = new Set(searchParams.keys())\n\n for (const key of keys) {\n result[key] = searchParams.getAll(key)\n }\n\n return result\n}\n\n/**\n * Serialize multi-value params to URL string format\n * Repeated keys are serialized as separate entries: key=a&key=b\n */\nexport function serializeMultiParams(params: Record<string, MultiEncoded>): string {\n const searchParams = new URLSearchParams()\n\n for (const [key, values] of Object.entries(params)) {\n for (const value of values) {\n if (value === '') {\n // Valueless params handled separately\n continue\n }\n searchParams.append(key, value)\n }\n }\n\n let result = searchParams.toString()\n\n // Handle valueless params (empty string values) manually\n const valuelessKeys = Object.entries(params)\n .filter(([_, values]) => values.includes(''))\n .map(([key, _]) => encodeURIComponent(key))\n\n if (valuelessKeys.length > 0) {\n const valuelessPart = valuelessKeys.join('&')\n result = result ? `${result}&${valuelessPart}` : valuelessPart\n }\n\n return result\n}\n\n/**\n * Query string location strategy\n * Reads/writes to window.location.search\n */\nexport const queryStrategy: LocationStrategy = {\n getRaw(): string {\n if (typeof window === 'undefined') return ''\n return window.location.search\n },\n\n parse(): Record<string, MultiEncoded> {\n if (typeof window === 'undefined') return {}\n return parseMultiParams(window.location.search)\n },\n\n buildUrl(base: URL, params: Record<string, MultiEncoded>): string {\n base.search = serializeMultiParams(params)\n return base.toString()\n },\n\n subscribe(callback: () => void): () => void {\n if (typeof window === 'undefined') return () => {}\n window.addEventListener('popstate', callback)\n return () => window.removeEventListener('popstate', callback)\n },\n}\n\n/**\n * Hash fragment location strategy\n * Reads/writes to window.location.hash\n * Hash is parsed as URLSearchParams format: #key=value&key2=value2\n */\nexport const hashStrategy: LocationStrategy = {\n getRaw(): string {\n if (typeof window === 'undefined') return ''\n return window.location.hash\n },\n\n parse(): Record<string, MultiEncoded> {\n if (typeof window === 'undefined') return {}\n const hash = window.location.hash\n // Remove leading # if present\n const hashString = hash.startsWith('#') ? hash.slice(1) : hash\n return parseMultiParams(hashString)\n },\n\n buildUrl(base: URL, params: Record<string, MultiEncoded>): string {\n base.hash = serializeMultiParams(params)\n return base.toString()\n },\n\n subscribe(callback: () => void): () => void {\n if (typeof window === 'undefined') return () => {}\n // Listen to both hashchange and popstate for hash navigation\n window.addEventListener('hashchange', callback)\n window.addEventListener('popstate', callback)\n return () => {\n window.removeEventListener('hashchange', callback)\n window.removeEventListener('popstate', callback)\n }\n },\n}\n\n// Default strategy (can be changed by entry points like hash.ts)\nlet defaultStrategy: LocationStrategy = queryStrategy\n\n/**\n * Get the current default location strategy\n */\nexport function getDefaultStrategy(): LocationStrategy {\n return defaultStrategy\n}\n\n/**\n * Set the default location strategy\n * Called by entry points (e.g., hash.ts sets this to hashStrategy)\n */\nexport function setDefaultStrategy(strategy: LocationStrategy): void {\n defaultStrategy = strategy\n}\n","/**\n * Built-in parameter types with smart defaults and minimal encoding\n */\n\nimport type { Encoded, Param } from './index.js'\n\n/**\n * Optional string parameter.\n * - undefined → not present\n * - empty string → ?key=\n * - non-empty → ?key=value\n */\nexport function stringParam(init?: string): Param<string | undefined> {\n return {\n encode: (value) => value === init ? undefined : value,\n decode: (encoded) => encoded === undefined ? init : encoded,\n }\n}\n\n/**\n * Required string parameter with default.\n * Omitted from URL when equal to default.\n */\nexport function defStringParam(init: string): Param<string> {\n return {\n encode: (value) => value === init ? undefined : value,\n decode: (encoded) => encoded ?? init,\n }\n}\n\n/**\n * Boolean parameter.\n * - true → ?key (valueless)\n * - false → not present\n */\nexport const boolParam: Param<boolean> = {\n encode: (value) => value ? '' : undefined,\n decode: (encoded) => encoded !== undefined,\n}\n\n/**\n * Integer parameter with default.\n * Omitted from URL when equal to default.\n */\nexport function intParam(init: number): Param<number> {\n return {\n encode: (value) => value === init ? undefined : value.toString(),\n decode: (encoded) => encoded !== undefined ? parseInt(encoded, 10) : init,\n }\n}\n\n/**\n * Optional integer parameter.\n * - null → not present\n * - number → ?key=123\n */\nexport const optIntParam: Param<number | null> = {\n encode: (value) => value === null ? undefined : value.toString(),\n decode: (encoded) => encoded !== undefined ? parseInt(encoded, 10) : null,\n}\n\n/**\n * Float parameter with default.\n * Omitted from URL when equal to default.\n */\nexport function floatParam(init: number): Param<number> {\n return {\n encode: (value) => value === init ? undefined : value.toString(),\n decode: (encoded) => encoded !== undefined ? parseFloat(encoded) : init,\n }\n}\n\n/**\n * Enum parameter with validation.\n * Omitted from URL when equal to default.\n * Invalid values fall back to default with console warning.\n */\nexport function enumParam<T extends string>(\n init: T,\n values: readonly T[]\n): Param<T> {\n const validSet = new Set(values)\n\n return {\n encode: (value) => {\n if (!validSet.has(value)) {\n console.warn(`Invalid enum value: ${value}, expected one of ${values.join(', ')}`)\n return undefined\n }\n return value === init ? undefined : value\n },\n decode: (encoded) => {\n if (encoded === undefined) return init\n if (!validSet.has(encoded as T)) {\n console.warn(`Invalid enum value: ${encoded}, expected one of ${values.join(', ')}. Using default: ${init}`)\n return init\n }\n return encoded as T\n },\n }\n}\n\n/**\n * String array parameter with delimiter.\n * Omitted from URL when equal to default.\n * Empty array encodes as empty string (?key=)\n */\nexport function stringsParam(\n init: string[] = [],\n delimiter = ' '\n): Param<string[]> {\n const initEncoded = init.join(delimiter)\n\n return {\n encode: (values) => {\n const encoded = values.join(delimiter)\n if (encoded === initEncoded) return undefined\n return encoded\n },\n decode: (encoded) => {\n if (encoded === undefined) return init\n if (encoded === '') return []\n return encoded.split(delimiter)\n },\n }\n}\n\n/**\n * Number array parameter.\n * Omitted from URL when equal to default.\n * Uses comma delimiter.\n */\nexport function numberArrayParam(init: number[] = []): Param<number[]> {\n const isEqual = (a: number[], b: number[]) =>\n a.length === b.length && a.every((v, i) => v === b[i])\n\n return {\n encode: (values) => {\n if (isEqual(values, init)) return undefined\n return values.map(v => v.toString()).join(',')\n },\n decode: (encoded) => {\n if (encoded === undefined) return init\n if (encoded === '') return []\n return encoded.split(',').map(v => parseFloat(v))\n },\n }\n}\n\n/**\n * Pagination parameter combining offset and page size.\n * Uses space (which encodes as + in URLs) as delimiter.\n *\n * Encoding rules:\n * - offset=0, pageSize=default → not present (undefined)\n * - offset=0, pageSize=custom → \" pageSize\" (e.g., \" 20\" → +20 in URL)\n * - offset>0, pageSize=default → \"offset\" (e.g., \"100\")\n * - offset>0, pageSize=custom → \"offset pageSize\" (e.g., \"100 20\" → 100+20 in URL)\n *\n * @param defaultPageSize - The default page size (omitted from URL when used)\n * @param validPageSizes - Optional array of valid page sizes for validation\n */\nexport type Pagination = { offset: number; pageSize: number }\n\nexport function paginationParam(\n defaultPageSize: number,\n validPageSizes?: readonly number[],\n): Param<Pagination> {\n return {\n encode: ({ offset, pageSize }) => {\n if (offset === 0 && pageSize === defaultPageSize) return undefined\n if (offset === 0) return ` ${pageSize}` // Space prefix → +pageSize in URL\n if (pageSize === defaultPageSize) return String(offset)\n return `${offset} ${pageSize}` // Space encodes as + in URL\n },\n decode: (encoded) => {\n if (!encoded) return { offset: 0, pageSize: defaultPageSize }\n const parts = encoded.split(' ') // URL + decodes to space\n // Handle \" pageSize\" case (offset 0 with custom page size)\n const offset = parts[0] === '' ? 0 : parseInt(parts[0], 10) || 0\n let pageSize = parts[1] ? parseInt(parts[1], 10) : defaultPageSize\n // Validate page size if validation array provided\n if (validPageSizes && !validPageSizes.includes(pageSize)) {\n pageSize = defaultPageSize\n }\n return { offset, pageSize }\n },\n }\n}\n\n/**\n * Code mapping for enum values - maps full values to short codes for compact URLs.\n * Can be specified as:\n * - Array of [value, code] tuples: [['Rides', 'r'], ['Minutes', 'm']]\n * - Object mapping values to codes: { Rides: 'r', Minutes: 'm' }\n */\nexport type CodeMap<T extends string> = [T, string][] | Record<T, string>\n\nfunction normalizeCodeMap<T extends string>(codeMap: CodeMap<T>): [T, string][] {\n if (Array.isArray(codeMap)) return codeMap\n return Object.entries(codeMap) as [T, string][]\n}\n\n/**\n * Single-value enum parameter with short code mapping.\n * Maps full enum values to abbreviated codes for compact URLs.\n * Omitted from URL when equal to default.\n *\n * @example\n * // ?y=r for \"Rides\", ?y=m for \"Minutes\", omitted for default \"Rides\"\n * codeParam('Rides', [['Rides', 'r'], ['Minutes', 'm']])\n * // or with object syntax:\n * codeParam('Rides', { Rides: 'r', Minutes: 'm' })\n */\nexport function codeParam<T extends string>(\n init: T,\n codeMap: CodeMap<T>,\n): Param<T> {\n const entries = normalizeCodeMap(codeMap)\n const valueToCode = new Map(entries)\n const codeToValue = new Map(entries.map(([v, c]) => [c, v]))\n\n return {\n encode: (value) => {\n if (value === init) return undefined\n return valueToCode.get(value) ?? value\n },\n decode: (encoded) => {\n if (encoded === undefined) return init\n return codeToValue.get(encoded) ?? init\n },\n }\n}\n\n/**\n * Multi-value parameter with short code mapping.\n * Maps full values to abbreviated codes for compact URLs.\n * Omitted from URL when all values are selected.\n *\n * @param allValues - Array of all possible values (used to detect \"all selected\")\n * @param codeMap - Mapping from values to short codes\n * @param separator - Delimiter between codes (default: '' for most compact URLs)\n *\n * @example\n * // Regions: ?r=nj for NYC+JC, ?r=njh or omitted for all three\n * codesParam(['NYC', 'JC', 'HOB'], [['NYC', 'n'], ['JC', 'j'], ['HOB', 'h']])\n * // or with object syntax and custom separator:\n * codesParam(['NYC', 'JC', 'HOB'], { NYC: 'n', JC: 'j', HOB: 'h' }, ',')\n */\nexport function codesParam<T extends string>(\n allValues: readonly T[],\n codeMap: CodeMap<T>,\n separator: string = '',\n): Param<T[]> {\n const entries = normalizeCodeMap(codeMap)\n const valueToCode = new Map(entries)\n const codeToValue = new Map(entries.map(([v, c]) => [c, v]))\n\n return {\n encode: (values) => {\n // Omit when all values selected\n if (values.length === allValues.length && allValues.every(v => values.includes(v))) {\n return undefined\n }\n return values.map(v => valueToCode.get(v) ?? v).join(separator)\n },\n decode: (encoded) => {\n if (encoded === undefined) return [...allValues]\n if (encoded === '') return []\n const codes = separator ? encoded.split(separator) : encoded.split('')\n return codes.map(c => codeToValue.get(c)).filter((v): v is T => v !== undefined)\n },\n }\n}\n","/**\n * Multi-value parameter types for handling repeated URL params\n * e.g., ?tag=a&tag=b&tag=c\n */\n\nimport type { MultiEncoded } from './core.js'\n\n/**\n * A bidirectional converter between a typed value and its multi-value URL representation.\n * Similar to Param<T> but works with string[] instead of string | undefined.\n */\nexport type MultiParam<T> = {\n encode: (value: T) => MultiEncoded\n decode: (encoded: MultiEncoded) => T\n}\n\n/**\n * Multi-value string array parameter.\n * Each string becomes a separate URL param with the same key.\n *\n * @example\n * // ?tag=a&tag=b&tag=c → ['a', 'b', 'c']\n * const [tags, setTags] = useMultiUrlParam('tag', multiStringParam())\n */\nexport function multiStringParam(init: string[] = []): MultiParam<string[]> {\n return {\n encode: (values) => {\n if (values.length === 0 && init.length === 0) return []\n if (arraysEqual(values, init)) return []\n return values\n },\n decode: (encoded) => {\n if (encoded.length === 0) return init\n return encoded\n },\n }\n}\n\n/**\n * Multi-value integer array parameter.\n * Each number becomes a separate URL param with the same key.\n *\n * @example\n * // ?id=1&id=2&id=3 → [1, 2, 3]\n * const [ids, setIds] = useMultiUrlParam('id', multiIntParam())\n */\nexport function multiIntParam(init: number[] = []): MultiParam<number[]> {\n return {\n encode: (values) => {\n if (values.length === 0 && init.length === 0) return []\n if (arraysEqual(values, init)) return []\n return values.map(v => v.toString())\n },\n decode: (encoded) => {\n if (encoded.length === 0) return init\n return encoded.map(v => parseInt(v, 10))\n },\n }\n}\n\n/**\n * Multi-value float array parameter.\n * Each number becomes a separate URL param with the same key.\n *\n * @example\n * // ?val=1.5&val=2.7 → [1.5, 2.7]\n * const [vals, setVals] = useMultiUrlParam('val', multiFloatParam())\n */\nexport function multiFloatParam(init: number[] = []): MultiParam<number[]> {\n return {\n encode: (values) => {\n if (values.length === 0 && init.length === 0) return []\n if (arraysEqual(values, init)) return []\n return values.map(v => v.toString())\n },\n decode: (encoded) => {\n if (encoded.length === 0) return init\n return encoded.map(v => parseFloat(v))\n },\n }\n}\n\n/** Helper to compare arrays for equality */\nfunction arraysEqual<T>(a: T[], b: T[]): boolean {\n return a.length === b.length && a.every((v, i) => v === b[i])\n}\n","/**\n * React hooks for managing URL parameters\n */\n\nimport { useCallback, useRef, useSyncExternalStore } from 'react'\nimport type { Param } from './index.js'\nimport type { LocationStrategy, MultiEncoded } from './core.js'\nimport { getDefaultStrategy, serializeMultiParams } from './core.js'\nimport type { MultiParam } from './multiParams.js'\n\n/**\n * Cached snapshot to prevent infinite loops in useSyncExternalStore\n * Keyed by strategy (so query and hash don't share cache)\n */\nconst snapshotCache = new WeakMap<LocationStrategy, {\n raw: string\n snapshot: Record<string, MultiEncoded>\n}>()\n\n/**\n * Get URL snapshot for a given strategy\n * Returns cached snapshot if URL hasn't changed\n */\nfunction getSnapshot(strategy: LocationStrategy): Record<string, MultiEncoded> {\n const raw = strategy.getRaw()\n const cached = snapshotCache.get(strategy)\n\n if (cached && cached.raw === raw) {\n return cached.snapshot\n }\n\n const snapshot = strategy.parse()\n snapshotCache.set(strategy, { raw, snapshot })\n return snapshot\n}\n\n/**\n * Server-side snapshot (always empty)\n */\nfunction getServerSnapshot(): Record<string, MultiEncoded> {\n return {}\n}\n\n/**\n * Convert single-value Encoded to multi-value MultiEncoded\n */\nfunction singleToMulti(encoded: string | undefined): MultiEncoded {\n if (encoded === undefined) return []\n return [encoded]\n}\n\n/**\n * Convert multi-value MultiEncoded to single-value Encoded\n */\nfunction multiToSingle(multi: MultiEncoded): string | undefined {\n if (multi.length === 0) return undefined\n return multi[0]\n}\n\n/**\n * React hook for managing a single URL query parameter.\n *\n * @param key - Query parameter key\n * @param param - Param encoder/decoder\n * @param push - Use pushState (true) or replaceState (false) when updating\n * @returns Tuple of [value, setValue]\n *\n * @example\n * ```tsx\n * const [zoom, setZoom] = useUrlParam('z', boolParam)\n * const [device, setDevice] = useUrlParam('d', stringParam('default'))\n * ```\n */\nexport function useUrlParam<T>(\n key: string,\n param: Param<T>,\n push = false\n): [T, (value: T) => void] {\n const strategy = getDefaultStrategy()\n\n // Use ref to avoid recreating setValue when param changes\n const paramRef = useRef(param)\n paramRef.current = param\n\n // Subscribe to URL changes\n const urlParams = useSyncExternalStore(\n (cb) => strategy.subscribe(cb),\n () => getSnapshot(strategy),\n getServerSnapshot\n )\n\n // Memoize decoded value based on encoded string AND param identity\n // Re-decode if either the URL param string changes OR the param object changes\n // (e.g., deviceIdsParam depends on devices array which loads asynchronously)\n const encoded = multiToSingle(urlParams[key] ?? [])\n const cacheRef = useRef<{ encoded: typeof encoded; param: Param<T>; decoded: T } | null>(null)\n\n if (cacheRef.current === null || cacheRef.current.encoded !== encoded || cacheRef.current.param !== param) {\n cacheRef.current = { encoded, param, decoded: param.decode(encoded) }\n }\n const value = cacheRef.current.decoded\n\n // Update URL when value changes\n const setValue = useCallback(\n (newValue: T) => {\n if (typeof window === 'undefined') return\n\n const currentParams = strategy.parse()\n const encoded = paramRef.current.encode(newValue)\n\n // Update this parameter (single → multi)\n if (encoded === undefined) {\n delete currentParams[key]\n } else {\n currentParams[key] = [encoded]\n }\n\n // Build and update URL\n const url = new URL(window.location.href)\n const newUrl = strategy.buildUrl(url, currentParams)\n\n const method = push ? 'pushState' : 'replaceState'\n window.history[method]({}, '', newUrl)\n\n // Trigger events to notify other hooks\n window.dispatchEvent(new PopStateEvent('popstate'))\n },\n [key, push, strategy]\n )\n\n return [value, setValue]\n}\n\n/**\n * React hook for managing multiple URL query parameters together.\n * Updates are batched into a single history entry.\n *\n * @param params - Object mapping keys to Param types\n * @param push - Use pushState (true) or replaceState (false) when updating\n * @returns Object with decoded values and update function\n *\n * @example\n * ```tsx\n * const { values, setValues } = useUrlParams({\n * zoom: boolParam,\n * device: stringParam('default'),\n * count: intParam(10)\n * })\n *\n * // Update multiple params at once\n * setValues({ zoom: true, count: 20 })\n * ```\n */\nexport function useUrlParams<P extends Record<string, Param<any>>>(\n params: P,\n push = false\n): {\n values: { [K in keyof P]: P[K] extends Param<infer T> ? T : never }\n setValues: (updates: Partial<{ [K in keyof P]: P[K] extends Param<infer T> ? T : never }>) => void\n} {\n const strategy = getDefaultStrategy()\n\n // Subscribe to URL changes\n const urlParams = useSyncExternalStore(\n (cb) => strategy.subscribe(cb),\n () => getSnapshot(strategy),\n getServerSnapshot\n )\n\n // Decode all values from URL\n const values = Object.fromEntries(\n Object.entries(params).map(([key, param]) => [\n key,\n param.decode(multiToSingle(urlParams[key] ?? []))\n ])\n ) as { [K in keyof P]: P[K] extends Param<infer T> ? T : never }\n\n // Update multiple parameters at once\n const setValues = useCallback(\n (updates: Partial<{ [K in keyof P]: P[K] extends Param<infer T> ? T : never }>) => {\n if (typeof window === 'undefined') return\n\n const currentParams = strategy.parse()\n\n // Apply all updates\n for (const [key, value] of Object.entries(updates)) {\n const param = params[key]\n if (!param) continue\n\n const encoded = param.encode(value)\n if (encoded === undefined) {\n delete currentParams[key]\n } else {\n currentParams[key] = [encoded]\n }\n }\n\n // Build and update URL once\n const url = new URL(window.location.href)\n const newUrl = strategy.buildUrl(url, currentParams)\n\n const method = push ? 'pushState' : 'replaceState'\n window.history[method]({}, '', newUrl)\n\n // Trigger events to notify other hooks\n window.dispatchEvent(new PopStateEvent('popstate'))\n },\n [params, push, strategy]\n )\n\n return { values, setValues }\n}\n\n/**\n * React hook for managing a single multi-value URL parameter.\n * Supports repeated params like ?tag=a&tag=b&tag=c\n *\n * @param key - Query parameter key\n * @param param - MultiParam encoder/decoder\n * @param push - Use pushState (true) or replaceState (false) when updating\n * @returns Tuple of [value, setValue]\n *\n * @example\n * ```tsx\n * const [tags, setTags] = useMultiUrlParam('tag', multiStringParam())\n * // URL: ?tag=a&tag=b → tags = ['a', 'b']\n * ```\n */\nexport function useMultiUrlParam<T>(\n key: string,\n param: MultiParam<T>,\n push = false\n): [T, (value: T) => void] {\n const strategy = getDefaultStrategy()\n\n // Use ref to avoid recreating setValue when param changes\n const paramRef = useRef(param)\n paramRef.current = param\n\n // Subscribe to URL changes\n const urlParams = useSyncExternalStore(\n (cb) => strategy.subscribe(cb),\n () => getSnapshot(strategy),\n getServerSnapshot\n )\n\n // Decode current value from URL\n const value = param.decode(urlParams[key] ?? [])\n\n // Update URL when value changes\n const setValue = useCallback(\n (newValue: T) => {\n if (typeof window === 'undefined') return\n\n const currentParams = strategy.parse()\n const encoded = paramRef.current.encode(newValue)\n\n // Update this parameter\n if (encoded.length === 0) {\n delete currentParams[key]\n } else {\n currentParams[key] = encoded\n }\n\n // Build and update URL\n const url = new URL(window.location.href)\n const newUrl = strategy.buildUrl(url, currentParams)\n\n const method = push ? 'pushState' : 'replaceState'\n window.history[method]({}, '', newUrl)\n\n // Trigger events to notify other hooks\n window.dispatchEvent(new PopStateEvent('popstate'))\n },\n [key, push, strategy]\n )\n\n return [value, setValue]\n}\n\n/**\n * React hook for managing multiple multi-value URL parameters together.\n * Updates are batched into a single history entry.\n *\n * @param params - Object mapping keys to MultiParam types\n * @param push - Use pushState (true) or replaceState (false) when updating\n * @returns Object with decoded values and update function\n *\n * @example\n * ```tsx\n * const { values, setValues } = useMultiUrlParams({\n * tags: multiStringParam(),\n * ids: multiIntParam()\n * })\n *\n * // Update multiple multi-value params at once\n * setValues({ tags: ['a', 'b'], ids: [1, 2, 3] })\n * ```\n */\nexport function useMultiUrlParams<P extends Record<string, MultiParam<any>>>(\n params: P,\n push = false\n): {\n values: { [K in keyof P]: P[K] extends MultiParam<infer T> ? T : never }\n setValues: (updates: Partial<{ [K in keyof P]: P[K] extends MultiParam<infer T> ? T : never }>) => void\n} {\n const strategy = getDefaultStrategy()\n\n // Subscribe to URL changes\n const urlParams = useSyncExternalStore(\n (cb) => strategy.subscribe(cb),\n () => getSnapshot(strategy),\n getServerSnapshot\n )\n\n // Decode all values from URL\n const values = Object.fromEntries(\n Object.entries(params).map(([key, param]) => [\n key,\n param.decode(urlParams[key] ?? [])\n ])\n ) as { [K in keyof P]: P[K] extends MultiParam<infer T> ? T : never }\n\n // Update multiple parameters at once\n const setValues = useCallback(\n (updates: Partial<{ [K in keyof P]: P[K] extends MultiParam<infer T> ? T : never }>) => {\n if (typeof window === 'undefined') return\n\n const currentParams = strategy.parse()\n\n // Apply all updates\n for (const [key, value] of Object.entries(updates)) {\n const param = params[key]\n if (!param) continue\n\n const encoded = param.encode(value)\n if (encoded.length === 0) {\n delete currentParams[key]\n } else {\n currentParams[key] = encoded\n }\n }\n\n // Build and update URL once\n const url = new URL(window.location.href)\n const newUrl = strategy.buildUrl(url, currentParams)\n\n const method = push ? 'pushState' : 'replaceState'\n window.history[method]({}, '', newUrl)\n\n // Trigger events to notify other hooks\n window.dispatchEvent(new PopStateEvent('popstate'))\n },\n [params, push, strategy]\n )\n\n return { values, setValues }\n}\n","/**\n * Core types and utilities for URL parameter management\n */\n\n// Re-export core types and strategies\nexport type { MultiEncoded, LocationStrategy } from './core.js'\nexport {\n parseMultiParams,\n serializeMultiParams,\n queryStrategy,\n hashStrategy,\n getDefaultStrategy,\n setDefaultStrategy,\n} from './core.js'\n\n/**\n * Encodes a value to a URL query parameter string.\n * - undefined: parameter not present in URL\n * - \"\": valueless parameter (e.g., ?z)\n * - string: parameter with value (e.g., ?z=foo)\n */\nexport type Encoded = string | undefined\n\n/**\n * A bidirectional converter between a typed value and its URL representation.\n */\nexport type Param<T> = {\n encode: (value: T) => Encoded\n decode: (encoded: Encoded) => T\n}\n\n/**\n * Serialize query parameters to URL string.\n * Uses URLSearchParams for proper form-urlencoded format (space → +)\n * Handles valueless params (empty string → ?key without =) manually\n *\n * @deprecated For multi-value support, use serializeMultiParams instead\n */\nexport function serializeParams(params: Record<string, Encoded>): string {\n const searchParams = new URLSearchParams()\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) {\n // Skip undefined values\n continue\n } else if (value === '') {\n // Valueless param: ?key without =\n // URLSearchParams doesn't support this, so we'll handle manually\n continue\n } else {\n searchParams.set(key, value)\n }\n }\n\n let result = searchParams.toString()\n\n // Handle valueless params manually\n const valuelessKeys = Object.entries(params)\n .filter(([_, value]) => value === '')\n .map(([key, _]) => encodeURIComponent(key))\n\n if (valuelessKeys.length > 0) {\n const valuelessPart = valuelessKeys.join('&')\n result = result ? `${result}&${valuelessPart}` : valuelessPart\n }\n\n return result\n}\n\n/**\n * Parse query parameters from URL string or URLSearchParams.\n * Note: URLSearchParams treats ?z and ?z= identically (both as empty string).\n * Note: For repeated params, only the first value is returned.\n *\n * @deprecated For multi-value support, use parseMultiParams instead\n */\nexport function parseParams(source: string | URLSearchParams): Record<string, Encoded> {\n const searchParams = typeof source === 'string'\n ? new URLSearchParams(source)\n : source\n\n const result: Record<string, Encoded> = {}\n\n for (const [key, value] of searchParams.entries()) {\n // Only take first value for each key (backward compat)\n if (!(key in result)) {\n result[key] = value\n }\n }\n\n return result\n}\n\n/**\n * Get current URL query parameters (browser only)\n */\nexport function getCurrentParams(): Record<string, Encoded> {\n if (typeof window === 'undefined') return {}\n return parseParams(window.location.search)\n}\n\n/**\n * Update URL without reloading (browser only)\n * @param params - New query parameters\n * @param push - Use pushState (true) or replaceState (false)\n */\nexport function updateUrl(params: Record<string, Encoded>, push = false): void {\n if (typeof window === 'undefined') return\n\n const url = new URL(window.location.href)\n const search = serializeParams(params)\n url.search = search\n\n const method = push ? 'pushState' : 'replaceState'\n window.history[method]({}, '', url.toString())\n}\n\nexport * from './params.js'\nexport * from './multiParams.js'\nexport * from './useUrlParam.js'\n","/**\n * Hash params entry point\n *\n * This module sets the default location strategy to hash (window.location.hash)\n * and re-exports everything from the main module.\n *\n * Usage:\n * ```typescript\n * // Instead of:\n * import { useUrlParam, stringParam } from 'use-prms'\n *\n * // Use:\n * import { useUrlParam, stringParam } from 'use-prms/hash'\n *\n * // Same API, but reads/writes to URL hash instead of query string\n * // e.g., #name=foo instead of ?name=foo\n * ```\n */\n\nimport { setDefaultStrategy, hashStrategy } from './core.js'\n\n// Set hash as the default strategy for this entry point\nsetDefaultStrategy(hashStrategy)\n\n// Re-export everything from main module\nexport * from './index.js'\n"]}
|
package/dist/hash.d.cts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CodeMap, Encoded, LocationStrategy, MultiEncoded, MultiParam, Pagination, Param, boolParam, codeParam, codesParam, defStringParam, enumParam, floatParam, getCurrentParams, getDefaultStrategy, hashStrategy, intParam, multiFloatParam, multiIntParam, multiStringParam, numberArrayParam, optIntParam, paginationParam, parseMultiParams, parseParams, queryStrategy, serializeMultiParams, serializeParams, setDefaultStrategy, stringParam, stringsParam, updateUrl, useMultiUrlParam, useMultiUrlParams, useUrlParam, useUrlParams } from './index.cjs';
|
package/dist/hash.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CodeMap, Encoded, LocationStrategy, MultiEncoded, MultiParam, Pagination, Param, boolParam, codeParam, codesParam, defStringParam, enumParam, floatParam, getCurrentParams, getDefaultStrategy, hashStrategy, intParam, multiFloatParam, multiIntParam, multiStringParam, numberArrayParam, optIntParam, paginationParam, parseMultiParams, parseParams, queryStrategy, serializeMultiParams, serializeParams, setDefaultStrategy, stringParam, stringsParam, updateUrl, useMultiUrlParam, useMultiUrlParams, useUrlParam, useUrlParams } from './index.js';
|