state-in-url 5.2.0 → 6.0.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 +2 -0
- package/dist/react-router/useUrlState/useUrlState.d.ts +1 -1
- package/dist/react-router/useUrlState/useUrlState.js +1 -1
- package/dist/react-router/useUrlState/useUrlState.mjs +1 -1
- package/dist/react-router6/index.d.ts +1 -0
- package/dist/react-router6/index.js +1 -0
- package/dist/react-router6/index.mjs +1 -0
- package/dist/react-router6/useUrlState/index.d.ts +1 -0
- package/dist/react-router6/useUrlState/index.js +1 -0
- package/dist/react-router6/useUrlState/index.mjs +1 -0
- package/dist/react-router6/useUrlState/useUrlState.d.ts +83 -0
- package/dist/react-router6/useUrlState/useUrlState.js +1 -0
- package/dist/react-router6/useUrlState/useUrlState.mjs +1 -0
- package/package.json +37 -3
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var P=require("react");var
|
|
1
|
+
"use strict";var P=require("react");var o=require("react-router");var _=require("../../parseSPObj.js");var g=require("../../useUrlStateBase/useUrlStateBase.js");var u=require("../../utils.js");function k(e){return e&&e.__esModule?e:{default:e}}var s=k(P);function R(e,l){const p=l?.useHistory;const a=s.default.useMemo(()=>({...h,replace:l?.replace,preventScrollReset:l?.preventScrollReset}),[]);const n=o.useNavigate();const v=s.default.useMemo(()=>p?u.routerHistory:{replace:(t,r)=>n(t,{...a,...r}),push:(t,r)=>n(t,{...a,...r})},[n]);const[c]=o.useSearchParams();const d=o.useHref("/");const{state:U,updateState:i,updateUrl:f,getState:m,reset:S}=g.useUrlStateBase(e,v,({parse:t})=>t(u.filterUnknownParamsClient(e,c.entries())),d);const b=s.default.useCallback((t,r)=>f(t,{...a,...r}),[f]);s.default.useEffect(()=>{i(u.assignValue(e,u.filterUnknownParams(e,_.parseSPObj(Object.fromEntries([...c.entries()]),e))))},[c]);const q=s.default.useCallback(t=>{S({...a,...t})},[S]);return{setState:i,setUrl:b,urlState:U,reset:q,getState:m}}const h={replace:true,preventScrollReset:true};exports.useUrlState=R;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import s from"react";import{useNavigate as g,useSearchParams as k,useHref as P}from"react-router
|
|
1
|
+
import s from"react";import{useNavigate as g,useSearchParams as k,useHref as P}from"react-router";import{parseSPObj as h}from"../../parseSPObj.mjs";import{useUrlStateBase as C}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as H,filterUnknownParamsClient as R,assignValue as d,filterUnknownParams as j}from"../../utils.mjs";function w(t,a){const i=a?.useHistory;const o=s.useMemo(()=>({...y,replace:a?.replace,preventScrollReset:a?.preventScrollReset}),[]);const n=g();const m=s.useMemo(()=>i?H:{replace:(e,r)=>n(e,{...o,...r}),push:(e,r)=>n(e,{...o,...r})},[n]);const[c]=k();const f=P("/");const{state:S,updateState:l,updateUrl:u,getState:U,reset:p}=C(t,m,({parse:e})=>e(R(t,c.entries())),f);const b=s.useCallback((e,r)=>u(e,{...o,...r}),[u]);s.useEffect(()=>{l(d(t,j(t,h(Object.fromEntries([...c.entries()]),t))))},[c]);const v=s.useCallback(e=>{p({...o,...e})},[p]);return{setState:l,setUrl:b,urlState:S,reset:v,getState:U}}const y={replace:true,preventScrollReset:true};export{w as useUrlState};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useUrlState } from "./useUrlState";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState/useUrlState.js");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useUrlState as t}from"./useUrlState/useUrlState.mjs";export{t as useUrlState};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useUrlState } from "./useUrlState";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState.js");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useUrlState as t}from"./useUrlState.mjs";export{t as useUrlState};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { type NavigateOptions } from "react-router-dom";
|
|
2
|
+
import { type JSONCompatible } from "../../utils";
|
|
3
|
+
/**
|
|
4
|
+
* React-router hook. Returns `urlState`, `setState`, and `setUrl` functions
|
|
5
|
+
*
|
|
6
|
+
* @param {JSONCompatible<T>} [defaultState] Fallback (default) values for state
|
|
7
|
+
* @param {Object} params - Object with other parameters
|
|
8
|
+
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/react_router.NavigateOptions.html)
|
|
9
|
+
* @param {boolean} params.replace replace URL or push, default `true`
|
|
10
|
+
* @param {boolean} params.useHistory use window.history for navigation, default `false`
|
|
11
|
+
* @param {boolean} params.preventScrollReset keep scroll position, default `true`
|
|
12
|
+
* @returns {Object} [result] State and callbacks
|
|
13
|
+
* @returns {Object} [result.state] - current state object
|
|
14
|
+
* @returns {Function} [result.setUrl] - function to update state and url
|
|
15
|
+
* @returns {Function} [result.setState] - function to update state only
|
|
16
|
+
* @returns {Function} [result.reset] - function to reset state and url to default
|
|
17
|
+
* * Example:
|
|
18
|
+
* ```ts
|
|
19
|
+
* export const form = { name: '', age: 0 };
|
|
20
|
+
* const { urlState, setState, setUrl } = useUrlState(form, { replace: false, preventScrollReset: false });
|
|
21
|
+
*
|
|
22
|
+
* setState({ name: 'test' });
|
|
23
|
+
* setUrl({ name: 'test' }, { replace: true });
|
|
24
|
+
* // similar to React.useState
|
|
25
|
+
* setUrl(curr => ({ ...curr, name: 'test' }), { replace: true });
|
|
26
|
+
* // RESET state and url
|
|
27
|
+
* setUrl((_curr, initialState) => initialState);
|
|
28
|
+
* // Or
|
|
29
|
+
* reset();
|
|
30
|
+
* reset({ replace: true });
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/react-router/useUrlState}
|
|
34
|
+
*/
|
|
35
|
+
export declare function useUrlState<T extends JSONCompatible>(defaultState: T, params?: Params): {
|
|
36
|
+
/**
|
|
37
|
+
* State object. Don't mutate directly, use `setState` or `setUrl`
|
|
38
|
+
*/
|
|
39
|
+
urlState: T;
|
|
40
|
+
/**
|
|
41
|
+
* * Example:
|
|
42
|
+
* ```ts
|
|
43
|
+
* setState({ name: 'test' });
|
|
44
|
+
* // or
|
|
45
|
+
* setState((curr, initial) => ({ ...curr, name: 'test' }) );
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/react-router/useUrlState#updatestate}
|
|
49
|
+
*/
|
|
50
|
+
setState: (value: Partial<T> | ((currState: T, initial: T) => T)) => void;
|
|
51
|
+
/**
|
|
52
|
+
* * Example:
|
|
53
|
+
* ```ts
|
|
54
|
+
* setUrl({ name: 'test' });
|
|
55
|
+
* // or
|
|
56
|
+
* setUrl((curr, initial) => ({ ...curr, name: 'test' }), { replace: true } );
|
|
57
|
+
* // can pass optional React-Router `NavigateOptions`
|
|
58
|
+
* setUrl(curr => ({ ...curr, name: 'test' }), { preventScrollReset: false } );
|
|
59
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/react-router/useUrlState#updateurl}
|
|
62
|
+
*/
|
|
63
|
+
setUrl: (value?: Partial<T> | ((currState: T, initial: T) => T), options?: Params) => void;
|
|
64
|
+
/**
|
|
65
|
+
* * Example:
|
|
66
|
+
* ```ts
|
|
67
|
+
* reset();
|
|
68
|
+
* // or
|
|
69
|
+
* reset({ replace: false, preventScrollReset: false })
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/react-router/useUrlState#reset}
|
|
73
|
+
*/
|
|
74
|
+
reset: (options?: NavigateOptions & {
|
|
75
|
+
[key: string]: unknown;
|
|
76
|
+
}) => void;
|
|
77
|
+
};
|
|
78
|
+
interface Params extends NavigateOptions {
|
|
79
|
+
useHistory?: boolean;
|
|
80
|
+
searchParams?: object;
|
|
81
|
+
replace?: boolean;
|
|
82
|
+
}
|
|
83
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var P=require("react");var c=require("react-router-dom");var _=require("../../parseSPObj.js");var g=require("../../useUrlStateBase/useUrlStateBase.js");var u=require("../../utils.js");function k(e){return e&&e.__esModule?e:{default:e}}var s=k(P);function R(e,l){const p=l?.useHistory;const a=s.default.useMemo(()=>({...h,replace:l?.replace,preventScrollReset:l?.preventScrollReset}),[]);const n=c.useNavigate();const v=s.default.useMemo(()=>p?u.routerHistory:{replace:(t,r)=>n(t,{...a,...r}),push:(t,r)=>n(t,{...a,...r})},[n]);const[o]=c.useSearchParams();const d=c.useHref("/");const{state:U,updateState:i,updateUrl:f,getState:m,reset:S}=g.useUrlStateBase(e,v,({parse:t})=>t(u.filterUnknownParamsClient(e,o.entries())),d);const b=s.default.useCallback((t,r)=>f(t,{...a,...r}),[f]);s.default.useEffect(()=>{i(u.assignValue(e,u.filterUnknownParams(e,_.parseSPObj(Object.fromEntries([...o.entries()]),e))))},[o]);const q=s.default.useCallback(t=>{S({...a,...t})},[S]);return{setState:i,setUrl:b,urlState:U,reset:q,getState:m}}const h={replace:true,preventScrollReset:true};exports.useUrlState=R;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import s from"react";import{useNavigate as g,useSearchParams as k,useHref as P}from"react-router-dom";import{parseSPObj as h}from"../../parseSPObj.mjs";import{useUrlStateBase as C}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as H,filterUnknownParamsClient as R,assignValue as d,filterUnknownParams as j}from"../../utils.mjs";function w(t,a){const i=a?.useHistory;const o=s.useMemo(()=>({...y,replace:a?.replace,preventScrollReset:a?.preventScrollReset}),[]);const n=g();const m=s.useMemo(()=>i?H:{replace:(e,r)=>n(e,{...o,...r}),push:(e,r)=>n(e,{...o,...r})},[n]);const[c]=k();const f=P("/");const{state:S,updateState:l,updateUrl:u,getState:U,reset:p}=C(t,m,({parse:e})=>e(R(t,c.entries())),f);const b=s.useCallback((e,r)=>u(e,{...o,...r}),[u]);s.useEffect(()=>{l(d(t,j(t,h(Object.fromEntries([...c.entries()]),t))))},[c]);const v=s.useCallback(e=>{p({...o,...e})},[p]);return{setState:l,setUrl:b,urlState:S,reset:v,getState:U}}const y={replace:true,preventScrollReset:true};export{w as useUrlState};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "state-in-url",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"description": "Store state in URL as in object, types and structure are preserved, with TS validation. Same API as React.useState, wthout any hasssle or boilerplate. Next.js@14-15, react-router@6-7, and remix@2.",
|
|
5
5
|
"homepage": "https://state-in-url.dev",
|
|
6
6
|
"repository": {
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"packages/example-nextjs15",
|
|
32
32
|
"packages/example-react",
|
|
33
33
|
"packages/example-react-router6",
|
|
34
|
+
"packages/example-react-router7",
|
|
34
35
|
"packages/example-remix2"
|
|
35
36
|
],
|
|
36
37
|
"files": [
|
|
@@ -49,6 +50,11 @@
|
|
|
49
50
|
"default": "./dist/next/index.mjs",
|
|
50
51
|
"require": "./dist/next/index.js"
|
|
51
52
|
},
|
|
53
|
+
"./react-router6": {
|
|
54
|
+
"types": "./dist/react-router6/index.d.ts",
|
|
55
|
+
"default": "./dist/react-router6/index.mjs",
|
|
56
|
+
"require": "./dist/react-router6/index.js"
|
|
57
|
+
},
|
|
52
58
|
"./react-router": {
|
|
53
59
|
"types": "./dist/react-router/index.d.ts",
|
|
54
60
|
"default": "./dist/react-router/index.mjs",
|
|
@@ -118,7 +124,7 @@
|
|
|
118
124
|
"kill-vite": "wireit",
|
|
119
125
|
"kill": "wireit",
|
|
120
126
|
"rmdist": "rm -rf dist",
|
|
121
|
-
"cleanup": "rm -rf dist .wireit node_modules test-results playwright-report coverage-reports nyc_coverage packages/example-nextjs14/node_modules packages/example-nextjs14/.next packages/example-nextjs15/node_modules packages/example-nextjs15/.next packages/example-react/node_modules packages/example-react-router6/node_modules packages/example-remix2/node_modules",
|
|
127
|
+
"cleanup": "rm -rf dist .wireit node_modules test-results playwright-report coverage-reports nyc_coverage packages/example-nextjs14/node_modules packages/example-nextjs14/.next packages/example-nextjs15/node_modules packages/example-nextjs15/.next packages/example-react/node_modules packages/example-react-router6/node_modules packages/example-react-router7/node_modules packages/example-remix2/node_modules",
|
|
122
128
|
"reinstall": "npm run cleanup && npm install",
|
|
123
129
|
"setup": "playwright install --with-deps",
|
|
124
130
|
"prepack": "npm run build && cp package.json dist/package.json && npm run build:demo",
|
|
@@ -172,6 +178,7 @@
|
|
|
172
178
|
"dev:react",
|
|
173
179
|
"dev:remix2",
|
|
174
180
|
"dev:router6",
|
|
181
|
+
"dev:router7",
|
|
175
182
|
"dev:nextjs15"
|
|
176
183
|
],
|
|
177
184
|
"service": {
|
|
@@ -196,6 +203,10 @@
|
|
|
196
203
|
"command": "cd packages/example-react-router6 && npm run dev",
|
|
197
204
|
"service": true
|
|
198
205
|
},
|
|
206
|
+
"dev:router7": {
|
|
207
|
+
"command": "cd packages/example-react-router7 && npm run dev",
|
|
208
|
+
"service": true
|
|
209
|
+
},
|
|
199
210
|
"dev:remix2": {
|
|
200
211
|
"command": "cd packages/example-remix2 && PORT=3003 npm run dev",
|
|
201
212
|
"service": true
|
|
@@ -220,6 +231,12 @@
|
|
|
220
231
|
"build"
|
|
221
232
|
]
|
|
222
233
|
},
|
|
234
|
+
"build:router7": {
|
|
235
|
+
"command": "cd packages/example-react-router7 && npm run build",
|
|
236
|
+
"dependencies": [
|
|
237
|
+
"build"
|
|
238
|
+
]
|
|
239
|
+
},
|
|
223
240
|
"build:remix2": {
|
|
224
241
|
"command": "cd packages/example-remix2 && npm run build",
|
|
225
242
|
"dependencies": [
|
|
@@ -271,6 +288,17 @@
|
|
|
271
288
|
"command": "npx vite preview --port 5181 packages/example-react-router6",
|
|
272
289
|
"service": true
|
|
273
290
|
},
|
|
291
|
+
"start:router7": {
|
|
292
|
+
"command": "npx vite preview --port 5183 packages/example-react-router7",
|
|
293
|
+
"dependencies": [
|
|
294
|
+
"build:router7"
|
|
295
|
+
],
|
|
296
|
+
"service": true
|
|
297
|
+
},
|
|
298
|
+
"start:router7:ci": {
|
|
299
|
+
"command": "npx vite preview --port 5183 packages/example-react-router7",
|
|
300
|
+
"service": true
|
|
301
|
+
},
|
|
274
302
|
"start:remix2": {
|
|
275
303
|
"command": "cd packages/example-remix2 && npm run start",
|
|
276
304
|
"dependencies": [
|
|
@@ -299,6 +327,7 @@
|
|
|
299
327
|
"start:demo",
|
|
300
328
|
"start:react",
|
|
301
329
|
"start:router6",
|
|
330
|
+
"start:router7",
|
|
302
331
|
"start:remix2"
|
|
303
332
|
],
|
|
304
333
|
"service": true
|
|
@@ -309,6 +338,7 @@
|
|
|
309
338
|
"start:demo:ci",
|
|
310
339
|
"start:react:ci",
|
|
311
340
|
"start:router6:ci",
|
|
341
|
+
"start:router7:ci",
|
|
312
342
|
"start:remix2:ci"
|
|
313
343
|
],
|
|
314
344
|
"service": true
|
|
@@ -324,6 +354,7 @@
|
|
|
324
354
|
"build:demo:tests",
|
|
325
355
|
"build:next15",
|
|
326
356
|
"build:router6",
|
|
357
|
+
"build:router7",
|
|
327
358
|
"build:remix2"
|
|
328
359
|
]
|
|
329
360
|
},
|
|
@@ -488,5 +519,8 @@
|
|
|
488
519
|
"decode url",
|
|
489
520
|
"fast"
|
|
490
521
|
],
|
|
491
|
-
"packageManager": "npm@10.8.2"
|
|
522
|
+
"packageManager": "npm@10.8.2",
|
|
523
|
+
"dependencies": {
|
|
524
|
+
"react-router": "^7.7.1"
|
|
525
|
+
}
|
|
492
526
|
}
|