state-in-url 2.0.0 → 2.0.1

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.
@@ -0,0 +1 @@
1
+ export{SYMBOLS}from"./constants.mjs";
@@ -1 +1 @@
1
- export * from './encodeState';
1
+ export { decodeState, encodeState } from './encodeState';
@@ -0,0 +1 @@
1
+ export{decodeState,encodeState}from"./encodeState.mjs";
@@ -33,11 +33,3 @@ export declare const reviver: (key: string, value: unknown) => unknown;
33
33
  * * Github {@link https://github.com/asmyshlyaev177/state-in-url}
34
34
  */
35
35
  export declare function parseJSON<T extends JSONCompatible>(jsonString: string, fallbackValue?: T): T | Primitive | undefined;
36
- /**
37
- * Parses the Next.js server-side `searchParams` into an object.
38
- *
39
- * @param {object | undefined} sp - The server-side query string to parse.
40
- * @param {T} defaults - The default values to use if parsing fails.
41
- * @return {T} - The parsed object or the default values.
42
- */
43
- export declare function parseSsrQs<T extends JSONCompatible>(sp: object | undefined, defaults: T): T;
@@ -1 +1 @@
1
- import{SYMBOLS as t}from"../constants/constants.mjs";import{typeOf as r}from"../utils.mjs";function n(n){switch(r(n)){case"function":case"symbol":return"";case"date":return t.date+n.toISOString();case"string":return`${t.string}${encodeURIComponent(n)}`;case"number":return t.number+String(n);case"boolean":return t.boolean+String(n);case"object":case"array":return JSON.stringify(n,s).replaceAll('"',"'");case"null":return t.null;case"undefined":return t.undefined;default:return String(n)}}function e(t,r){return a(t.replaceAll("'",'"'),r)}const s=(t,e)=>{const s=r(e);return t&&"object"!==s&&"array"!==s?n(e):e},o=r=>r===t.null?null:r!==t.undefined?r?.startsWith?.(t.number)?Number.parseFloat(r.replace(t.number,"")):r?.startsWith?.(t.boolean)?!!r.includes("true"):r?.startsWith?.(t.date)?new Date(r.slice(1)):r?.startsWith?.(t.string)?decodeURIComponent(r).replace(/^◖/,""):c:void 0,c=Symbol("isError"),u=(t,r)=>{const n="string"==typeof r,e=n&&o(r);return e===c?r:t&&n?e:r};function a(t,r){try{return JSON.parse(t,u)}catch{const n=o(t);return n!==c?n:r}}function i(t,r){return{...r,...f(JSON.stringify(t),r)}}const l=(t,r)=>{const n="string"==typeof r,s=n&&e(r?.replaceAll?.("'",'"'));return t&&n?s:r};function f(t,r){try{return JSON.parse(t,l)}catch{const n=o(t);return n!==c?n:r}}export{e as decode,o as decodePrimitive,n as encode,c as errorSym,a as parseJSON,i as parseSsrQs,s as replacer,u as reviver};
1
+ import{SYMBOLS as e}from"../constants/constants.mjs";import{typeOf as t}from"../utils.mjs";function r(r){switch(t(r)){case"function":case"symbol":return"";case"date":return e.date+r.toISOString();case"string":return`${e.string}${encodeURIComponent(r)}`;case"number":return e.number+String(r);case"boolean":return e.boolean+String(r);case"object":case"array":return JSON.stringify(r,s).replaceAll('"',"'");case"null":return e.null;case"undefined":return e.undefined;default:return String(r)}}function n(e,t){return c(e.replaceAll("'",'"'),t)}const s=(e,n)=>{const s=t(n);return e&&"object"!==s&&"array"!==s?r(n):n},a=t=>t===e.null?null:t!==e.undefined?t?.startsWith?.(e.number)?Number.parseFloat(t.replace(e.number,"")):t?.startsWith?.(e.boolean)?!!t.includes("true"):t?.startsWith?.(e.date)?new Date(t.slice(1)):t?.startsWith?.(e.string)?decodeURIComponent(t).replace(/^◖/,""):o:void 0,o=Symbol("isError"),u=(e,t)=>{const r="string"==typeof t,n=r&&a(t);return n===o?t:e&&r?n:t};function c(e,t){try{return JSON.parse(e,u)}catch{const r=a(e);return r!==o?r:t}}export{n as decode,a as decodePrimitive,r as encode,o as errorSym,c as parseJSON,s as replacer,u as reviver};
@@ -1 +1 @@
1
- export * from './encoder';
1
+ export { decode, encode } from './encoder';
@@ -0,0 +1 @@
1
+ export{decode,encode}from"./encoder.mjs";
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { decode, encode, parseSsrQs } from './encoder';
1
+ import { decode, encode } from './encoder';
2
2
  import { decodeState, encodeState } from './encodeState';
3
- import { useUrlState } from './next/useUrlState';
3
+ import { parseSsrQs, useUrlState } from './next';
4
4
  import { useSharedState } from './useSharedState';
5
5
  import { useUrlEncode } from './useUrlEncode';
6
6
  import { useUrlStateBase } from './useUrlStateBase';
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- export{decode,encode,parseSsrQs}from"./encoder/encoder.mjs";export{decodeState,encodeState}from"./encodeState/encodeState.mjs";export{useUrlState}from"./next/useUrlState/useUrlState.mjs";export{useSharedState}from"./useSharedState/useSharedState.mjs";export{useUrlEncode}from"./useUrlEncode/useUrlEncode.mjs";export{useUrlStateBase}from"./useUrlStateBase/useUrlStateBase.mjs";export{isSSR,typeOf}from"./utils.mjs";
1
+ export{decode,encode}from"./encoder/encoder.mjs";export{decodeState,encodeState}from"./encodeState/encodeState.mjs";export{parseSsrQs}from"./next/parseSsrQs.mjs";export{useUrlState}from"./next/useUrlState/useUrlState.mjs";export{useSharedState}from"./useSharedState/useSharedState.mjs";export{useUrlEncode}from"./useUrlEncode/useUrlEncode.mjs";export{useUrlStateBase}from"./useUrlStateBase/useUrlStateBase.mjs";export{isSSR,typeOf}from"./utils.mjs";
@@ -0,0 +1,2 @@
1
+ export { parseSsrQs } from './parseSsrQs';
2
+ export { useUrlState } from './useUrlState';
@@ -0,0 +1 @@
1
+ export{parseSsrQs}from"./parseSsrQs.mjs";export{useUrlState}from"./useUrlState/useUrlState.mjs";
@@ -0,0 +1,9 @@
1
+ import { type JSONCompatible } from '../utils';
2
+ /**
3
+ * Parses the Next.js server-side `searchParams` into an object.
4
+ *
5
+ * @param {object | undefined} sp - The server-side searchParams object to parse.
6
+ * @param {T} defaults - The default values to use if parsing fails.
7
+ * @return {T} - The parsed object or the default values.
8
+ */
9
+ export declare function parseSsrQs<T extends JSONCompatible>(sp: object | undefined, defaults: T): T;
@@ -0,0 +1 @@
1
+ import{decodePrimitive as r,errorSym as t,decode as n}from"../encoder/encoder.mjs";function e(r,t){return{...t,...o(JSON.stringify(r),t)}}function o(n,e){try{return JSON.parse(n,c)}catch{const o=r(n);return o!==t?o:e}}const c=(r,t)=>{const e="string"==typeof t,o=e&&n(t?.replaceAll?.("'",'"'));return r&&e?o:t};export{e as parseSsrQs};
@@ -0,0 +1 @@
1
+ export{useUrlState}from"./useUrlState.mjs";
@@ -1 +1 @@
1
- import{useRouter as t,useSearchParams as e}from"next/navigation";import r from"react";import{parseSsrQs as a}from"../../encoder/encoder.mjs";import{useUrlStateBase as o}from"../../useUrlStateBase/useUrlStateBase.mjs";function s(s,m){const n=t(),{state:u,updateState:c,updateUrl:i,getState:p}=o(s,n,m),f=r.useCallback(((t,e)=>{i(t,{scroll:!1,...e})}),[i]),l=e();return r.useEffect((()=>{c(a(Object.fromEntries([...l.entries()]),s))}),[l]),{updateState:c,updateUrl:f,state:u,getState:p}}export{s as useUrlState};
1
+ import{useRouter as t,useSearchParams as e}from"next/navigation";import r from"react";import{parseSsrQs as a}from"../parseSsrQs.mjs";import{useUrlStateBase as s}from"../../useUrlStateBase/useUrlStateBase.mjs";function o(o,m){const p=t(),{state:u,updateState:i,updateUrl:n,getState:f}=s(o,p,m),l=r.useCallback(((t,e)=>{n(t,{scroll:!1,...e})}),[n]),c=e();return r.useEffect((()=>{i(a(Object.fromEntries([...c.entries()]),o))}),[c]),{updateState:i,updateUrl:l,state:u,getState:f}}export{o as useUrlState};
@@ -0,0 +1 @@
1
+ export{useSharedState}from"./useSharedState.mjs";
@@ -1 +1 @@
1
- export * from './useUrlEncode';
1
+ export { useUrlEncode } from './useUrlEncode';
@@ -0,0 +1 @@
1
+ export{useUrlEncode}from"./useUrlEncode.mjs";
@@ -1 +1 @@
1
- export * from './useUrlStateBase';
1
+ export { useUrlStateBase } from './useUrlStateBase';
@@ -0,0 +1 @@
1
+ export{useUrlStateBase}from"./useUrlStateBase.mjs";
@@ -1 +1 @@
1
- import t from"react";import{parseSsrQs as e}from"../encoder/encoder.mjs";import{useInsertionEffect as o}from"../useInsertionEffect.mjs";import{useSharedState as n}from"../useSharedState/useSharedState.mjs";import{useUrlEncode as r}from"../useUrlEncode/useUrlEncode.mjs";import{isSSR as s}from"../utils.mjs";function a(a,i,m){const{parse:d,stringify:p}=r(a),{state:l,getState:u,setState:w}=n(a,(()=>s()?e(m,a):d(window.location.search)));o((()=>{const t=()=>{const t=d(window.location.search);w(t)};return window.addEventListener(c,t),()=>{window.removeEventListener(c,t)}}),[w]);const f=t.useCallback(((t,e)=>{const o=window.location.search,n=`${window.location.pathname}${o.length&&!o.includes("?")?"?":""}${o}`;let r,s;"function"==typeof t?(r=t(u()),s=p(r)):(r=t??u(),s=p(r)),w(r);const a=`${window.location.pathname}${s.length?"?":""}${s}`;if(n!==a){const{replace:t,...o}=e||{};i[t?"replace":"push"](a,{...o})}}),[i,p,u]);return{updateState:w,updateUrl:f,state:l,getState:u}}const c="popstate";export{a as useUrlStateBase};
1
+ import t from"react";import{parseSsrQs as e}from"../next/parseSsrQs.mjs";import{useInsertionEffect as o}from"../useInsertionEffect.mjs";import{useSharedState as n}from"../useSharedState/useSharedState.mjs";import{useUrlEncode as a}from"../useUrlEncode/useUrlEncode.mjs";import{isSSR as s}from"../utils.mjs";function r(r,i,m){const{parse:w,stringify:l}=a(r),{state:d,getState:p,setState:h}=n(r,(()=>s()?e(m,r):w(window.location.search)));o((()=>{const t=()=>{const t=w(window.location.search);h(t)};return window.addEventListener(c,t),()=>{window.removeEventListener(c,t)}}),[h]),t.useCallback((()=>{const t=Object.keys(r),e=window.location.search,o=new URLSearchParams(e),n=new URLSearchParams;return o.forEach(((e,o)=>!t.includes(o)&&n.set(o,e))),n}),[]);const u=t.useCallback(((t,e)=>{const o=`${window.location.pathname}${window.location.search}${window.location.hash}`;let n,a;"function"==typeof t?(n=t(p()),a=l(n)):(n=t??p(),a=l(n)),h(n);const s=`${window.location.pathname}${a.length?"?":""}${a}${window.location.hash}`;if(o!==s){const{replace:t,...o}=e||{};i[t?"replace":"push"](s,{...o})}}),[i,l,p]);return{updateState:h,updateUrl:u,state:d,getState:p}}const c="popstate";export{r as useUrlStateBase};
package/package.json CHANGED
@@ -1,13 +1,16 @@
1
1
  {
2
2
  "name": "state-in-url",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Library to store state in browser URL, includes hook for NextJS, hook for pure React, and low level helpers.",
5
5
  "homepage": "https://github.com/asmyshlyaev177/state-in-url#readme",
6
6
  "keywords": [
7
7
  "state-management",
8
+ "state management",
8
9
  "Next.js",
9
10
  "client components communication",
11
+ "signals alternative",
10
12
  "query string",
13
+ "search params",
11
14
  "typescript",
12
15
  "react.js",
13
16
  "workflow",
@@ -49,35 +52,38 @@
49
52
  "default": "./dist/index.mjs"
50
53
  },
51
54
  "./next": {
52
- "types": "./dist/next/useUrlState/index.d.ts",
53
- "default": "./dist/next/useUrlState/useUrlState.mjs"
55
+ "types": "./dist/next/index.d.ts",
56
+ "default": "./dist/next/index.mjs"
54
57
  },
55
58
  "./encodeState": {
56
- "types": "./dist/next/encodeState/index.d.ts",
57
- "default": "./dist/next/encodeState/encodeState.mjs"
59
+ "types": "./dist/encodeState/index.d.ts",
60
+ "default": "./dist/encodeState/index.mjs"
58
61
  },
59
62
  "./encoder": {
60
- "types": "./dist/next/encoder/index.d.ts",
61
- "default": "./dist/next/encoder/encoder.mjs"
63
+ "types": "./dist/encoder/index.d.ts",
64
+ "default": "./dist/encoder/index.mjs"
62
65
  },
63
66
  "./useSharedState": {
64
- "types": "./dist/next/useSharedState/index.d.ts",
65
- "default": "./dist/next/useSharedState/useSharedState.mjs"
67
+ "types": "./dist/useSharedState/index.d.ts",
68
+ "default": "./dist/useSharedState/index.mjs"
66
69
  },
67
70
  "./useUrlEncode": {
68
- "types": "./dist/next/useUrlEncode/index.d.ts",
69
- "default": "./dist/next/useUrlEncode/useUrlEncode.mjs"
71
+ "types": "./dist/useUrlEncode/index.d.ts",
72
+ "default": "./dist/useUrlEncode/index.mjs"
70
73
  },
71
74
  "./useUrlStateBase": {
72
- "types": "./dist/next/useUrlStateBase/index.d.ts",
73
- "default": "./dist/next/useUrlStateBase/useUrlStateBase.mjs"
75
+ "types": "./dist/useUrlStateBase/index.d.ts",
76
+ "default": "./dist/useUrlStateBase/index.mjs"
77
+ },
78
+ "./utils": {
79
+ "types": "./dist/utils.d.ts",
80
+ "default": "./dist/utils.mjs"
74
81
  }
75
82
  },
76
83
  "types": "./dist/index.d.ts",
77
84
  "scripts": {
78
85
  "test:unit": "wireit",
79
86
  "test:int": "wireit",
80
- "test:int:watch": "npx chokidar-cli 'packages/**/*.ts' 'packages/**/*.tsx' -i '.next' -t 500 -c 'npx playwright test -j 2 --project=chromium'",
81
87
  "test": "wireit",
82
88
  "tsc": "wireit",
83
89
  "dev": "wireit",
@@ -100,7 +106,7 @@
100
106
  "tsc",
101
107
  "test:unit"
102
108
  ],
103
- "command": "npm run test:int -- --retries=1"
109
+ "command": "npm run test:int -- --retries=2 --project=chromium"
104
110
  },
105
111
  "kill-next": {
106
112
  "command": "ps aux | grep .next | grep -v grep | awk '{print $2}' | xargs kill -9 2>&1; exit 0"
@@ -215,11 +221,11 @@
215
221
  "@testing-library/jest-dom": "^6.4.2",
216
222
  "@testing-library/react": "^16.0.0",
217
223
  "@testing-library/react-hooks": "^8.0.1",
224
+ "@types/glob": "^8.1.0",
218
225
  "@types/jest": "^29.5.12",
219
226
  "@types/node": "^20.11.24",
220
227
  "@types/react": "^18.3.3",
221
228
  "@types/react-dom": "^18.3.0",
222
- "chokidar-cli": "^3.0.0",
223
229
  "commitizen": "^4.3.0",
224
230
  "cross-env": "^7.0.3",
225
231
  "cz": "^1.8.2",