state-in-url 4.1.5 → 4.1.7

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 CHANGED
@@ -43,7 +43,7 @@ English | [한국어](./README.KO.md) | [简体中文](./README.CN.md)
43
43
 
44
44
  <hr />
45
45
 
46
- Add a ⭐️ and <a href="https://github.com/asmyshlyaev177" target="_blank">follow me</a> to support the project!
46
+ Add a <a href="#"><img src="https://raw.githubusercontent.com/acervenky/animated-github-badges/master/assets/starbadge.gif" width="25" height="25"></a> and <a href="https://github.com/asmyshlyaev177" target="_blank">follow me</a> to support the project!
47
47
 
48
48
  Will appreciate you feedback/opinion on [discussions](https://github.com/asmyshlyaev177/state-in-url/discussions/1)
49
49
 
@@ -25,7 +25,7 @@ export declare function useUrlState<T extends JSONCompatible>({ defaultState: T,
25
25
  *
26
26
  * @param {JSONCompatible<T>} [defaultState] Fallback (default) values for state
27
27
  * @param {Object} params - Object with other parameters
28
- * @param {NavigateOptions} params.NavigateOptions See type from `react-router-dom`
28
+ * @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/react_router.NavigateOptions.html)
29
29
  * @param {boolean} params.replace replace URL or push, default `true`
30
30
  * @param {boolean} params.useHistory use window.history for navigation, default `false`
31
31
  * @param {boolean} params.preventScrollReset keep scroll position, default `true`
@@ -62,8 +62,6 @@ export declare function useUrlState<T extends JSONCompatible>(defaultState: T, p
62
62
  * setState({ name: 'test' });
63
63
  * // or
64
64
  * setState(curr => ({ ...curr, name: 'test' }) );
65
- * // can pass optional React-Router `NavigateOptions`
66
- * setState(curr => ({ ...curr, name: 'test' }) );
67
65
  * ```
68
66
  *
69
67
  * * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/react-router/useUrlState#updatestate}
@@ -1 +1 @@
1
- import u from"react";import{TIMEOUT as b}from"../constants/constants.mjs";import{useInsertionEffect as L}from"../useInsertionEffect.mjs";import{useSharedState as P}from"../useSharedState/useSharedState.mjs";import{useUrlEncode as y}from"../useUrlEncode/useUrlEncode.mjs";import{filterUnknownParamsClient as C}from"../utils.mjs";function O(t,a,l){const{parse:s,stringify:o}=y(t),{state:m,getState:r,setState:c}=P(t,()=>l?.({parse:s})||t),p=u.useRef(void 0);L(()=>{const e=()=>{const n=s(C(t));c(n)};return window.addEventListener(E,e),()=>{window.removeEventListener(E,e),clearTimeout(p.current)}},[c]);const f=u.useRef([]),w=u.useCallback((e,n)=>{const h=typeof e=="function"?e(r()):e?{...r(),...e}:r(),S=o(h,I(t)),U=`${window.location.pathname}${S.length?"?":""}${S}${window.location.hash}`,k=`${window.location.pathname}${window.location.search}${window.location.hash}`;if(U===k)return;let i;c(h);const T=n?.replace;delete n?.replace,f.current.push([T?"replace":"push",U,n]),clearTimeout(p.current),p.current=setTimeout(()=>{queueMicrotask(()=>{for(;f.current.length;){const d=f.current.shift();d&&d?.[1]!==i?.[1]&&(i=d)}const[$,v,R]=i||{};i=void 0,$&&a[$](v,R)})},b)},[a,o,r]),g=u.useCallback(e=>{w(t,e)},[w]);return{updateState:c,updateUrl:w,state:m,reset:g,getState:r}}function I(t){const a=Object.keys(t),l=window.location.search,s=new URLSearchParams(l),o=new URLSearchParams;return s.forEach((m,r)=>!a.includes(r)&&o.set(r,m)),o}const E="popstate";export{O as useUrlStateBase};
1
+ import u from"react";import{TIMEOUT as b}from"../constants/constants.mjs";import{useInsertionEffect as v}from"../useInsertionEffect.mjs";import{useSharedState as y}from"../useSharedState/useSharedState.mjs";import{useUrlEncode as L}from"../useUrlEncode/useUrlEncode.mjs";import{filterUnknownParamsClient as P}from"../utils.mjs";function C(t,a,l){const{parse:c,stringify:n}=L(t),{state:m,getState:r,setState:s}=y(t,()=>l?.({parse:c})||t),p=u.useRef(void 0);v(()=>{const e=()=>{const o=c(P(t));s(o)};return window.addEventListener(S,e),()=>{window.removeEventListener(S,e),clearTimeout(p.current)}},[s]);const i=u.useRef([]),f=u.useCallback((e,o)=>{const w=typeof e=="function"?e(r()):e?{...r(),...e}:r(),d=n(w,I(t)),h=`${window.location.pathname}${d.length?"?":""}${d}${window.location.hash}`,$=`${window.location.pathname}${window.location.search}${window.location.hash}`;if(h===$)return;s(w);const E=o?.replace;delete o?.replace,i.current.push([E?"replace":"push",h,o]),clearTimeout(p.current),p.current=setTimeout(()=>{queueMicrotask(()=>{if(!i.current.length)return;const g=i.current.at(-1);i.current=[];const[T,k,R]=g||[];a[T](k,R)})},b)},[a,n,r]),U=u.useCallback(e=>{f(t,e)},[f]);return{updateState:s,updateUrl:f,state:m,reset:U,getState:r}}function I(t){const a=Object.keys(t),l=window.location.search,c=new URLSearchParams(l),n=new URLSearchParams;return c.forEach((m,r)=>!a.includes(r)&&n.set(r,m)),n}const S="popstate";export{C as useUrlStateBase};
package/dist/utils.d.ts CHANGED
@@ -27,8 +27,8 @@ export declare function filterUnknownParams<T extends object>(shape: T, searchPa
27
27
  export declare function filterUnknown<T extends object>(shape: T, entries: [key: string, value: string][]): string[][];
28
28
  export declare function assignValue<T extends object>(shape: T, newVal: Partial<T>): T;
29
29
  export interface Router {
30
- push: (href: string, opts: object) => void;
31
- replace: (href: string, opts: object) => void;
30
+ push: (href: string, opts?: object) => void;
31
+ replace: (href: string, opts?: object) => void;
32
32
  }
33
33
  export declare const routerHistory: Router;
34
34
  export declare const isSafari: boolean;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "state-in-url",
3
- "version": "4.1.5",
4
- "description": "Easily share complex state objects between unrelated React components, preserve types and structure, with TS validation. Deep links and url state synchronization wthout any hasssle or boilerplate.",
3
+ "version": "4.1.7",
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 and react-router@6-7.",
5
5
  "homepage": "https://state-in-url.dev",
6
6
  "repository": {
7
7
  "type": "git",
@@ -388,30 +388,57 @@
388
388
  "wireit": "^0.14.9"
389
389
  },
390
390
  "keywords": [
391
- "front-end",
392
- "state-management",
391
+ "state in url",
392
+ "useSearchParams",
393
+ "useUrlState",
394
+ "url state",
395
+ "search params",
396
+ "nuqs alternative",
397
+ "reactive",
398
+ "json",
399
+ "state sync",
393
400
  "state management",
394
- "deep links",
395
- "deep linking",
401
+ "encode",
402
+ "decode",
403
+ "Next.js",
404
+ "react-router",
405
+ "url",
396
406
  "url synchronization",
397
- "useUrlState",
398
- "state in url",
407
+ "url sync",
408
+ "state synchronization",
409
+ "synchronized state",
410
+ "state-in-url",
411
+ "store",
412
+ "react hook",
413
+ "state hook",
414
+ "url-state",
399
415
  "client components communication",
400
416
  "query string",
401
- "search params",
417
+ "query-string",
418
+ "querystring",
419
+ "search-params",
420
+ "searchparams",
421
+ "params",
422
+ "parse",
423
+ "stringify",
402
424
  "query params",
403
425
  "typescript",
404
- "workflow",
405
- "javascript",
406
426
  "hooks",
407
427
  "react.js",
408
428
  "reactjs",
409
429
  "react",
410
430
  "NextJS",
411
- "Next.js",
412
- "nuqs alternative",
413
431
  "query params parser",
414
- "query params parsing"
432
+ "query params parsing",
433
+ "shared state",
434
+ "state sharing",
435
+ "front-end",
436
+ "state-management",
437
+ "state-sync",
438
+ "search",
439
+ "encode url",
440
+ "decode url",
441
+ "fast"
415
442
  ],
416
443
  "packageManager": "npm@10.8.2"
417
444
  }