state-in-url 7.0.0 → 8.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.
- package/README.es.md +51 -1
- package/README.fr.md +51 -1
- package/README.ja.md +50 -1
- package/README.ko.md +51 -3
- package/README.md +47 -0
- package/README.pt-BR.md +51 -1
- package/README.ru.md +51 -1
- package/README.vi.md +51 -1
- package/README.zh-CN.md +50 -3
- package/dist/astro/index.cjs +1 -0
- package/dist/astro/useUrlState/{index.js → index.cjs} +1 -1
- package/dist/constants/constants.cjs +1 -0
- package/dist/constants/constants.mjs +1 -1
- package/dist/constants/index.cjs +1 -0
- package/dist/encodeState/encodeState.cjs +1 -0
- package/dist/encodeState/index.cjs +1 -0
- package/dist/encoder/encoder.cjs +1 -0
- package/dist/encoder/index.cjs +1 -0
- package/dist/index.cjs +1 -0
- package/dist/next/index.cjs +1 -0
- package/dist/next/useUrlState/index.cjs +1 -0
- package/dist/next/useUrlState/useUrlState.cjs +1 -0
- package/dist/next/useUrlState/useUrlState.mjs +1 -1
- package/dist/package.json +44 -24
- package/dist/parseSPObj.cjs +1 -0
- package/dist/react/index.cjs +1 -0
- package/dist/react/useUrlState/index.cjs +1 -0
- package/dist/react/useUrlState/useUrlState.cjs +1 -0
- package/dist/react-router/index.cjs +1 -0
- package/dist/react-router/useUrlState/index.cjs +1 -0
- package/dist/react-router/useUrlState/useUrlState.cjs +1 -0
- package/dist/react-router/useUrlState/useUrlState.d.ts +1 -1
- package/dist/react-router/useUrlState/useUrlState.mjs +1 -1
- package/dist/react-router6/index.cjs +1 -0
- package/dist/react-router6/useUrlState/index.cjs +1 -0
- package/dist/react-router6/useUrlState/useUrlState.cjs +1 -0
- package/dist/react-router6/useUrlState/useUrlState.d.ts +1 -1
- package/dist/react-router6/useUrlState/useUrlState.mjs +1 -1
- package/dist/remix/index.cjs +1 -0
- package/dist/remix/useUrlState/index.cjs +1 -0
- package/dist/remix/useUrlState/useUrlState.cjs +1 -0
- package/dist/remix/useUrlState/useUrlState.d.ts +1 -1
- package/dist/remix/useUrlState/useUrlState.mjs +1 -1
- package/dist/useIsomorphicLayoutEffect.cjs +1 -0
- package/dist/useIsomorphicLayoutEffect.mjs +1 -1
- package/dist/useLinkProps/hrefWithState.cjs +1 -0
- package/dist/useLinkProps/index.cjs +1 -0
- package/dist/useLinkProps/useLinkProps.cjs +1 -0
- package/dist/useLinkProps/useLinkProps.mjs +1 -1
- package/dist/useSharedState/index.cjs +1 -0
- package/dist/useSharedState/useSharedState.cjs +1 -0
- package/dist/useUrlEncode/index.cjs +1 -0
- package/dist/useUrlEncode/useUrlEncode.cjs +1 -0
- package/dist/useUrlStateBase/index.cjs +1 -0
- package/dist/useUrlStateBase/useUrlStateBase.cjs +1 -0
- package/dist/useUrlStateBase/useUrlStateBase.mjs +1 -1
- package/dist/utils.cjs +1 -0
- package/dist/utils.d.ts +2 -1
- package/dist/utils.mjs +1 -1
- package/package.json +44 -24
- package/skills/astro-setup/SKILL.md +1 -1
- package/skills/feature-state-hook/SKILL.md +1 -1
- package/skills/form-library-integration/SKILL.md +1 -1
- package/skills/input-handling/SKILL.md +1 -1
- package/skills/nextjs-ssr/SKILL.md +1 -1
- package/skills/react-no-router/SKILL.md +1 -1
- package/skills/react-router-remix-setup/SKILL.md +55 -1
- package/skills/shared-state-no-url/SKILL.md +1 -1
- package/dist/astro/index.js +0 -1
- package/dist/constants/constants.js +0 -1
- package/dist/constants/index.js +0 -1
- package/dist/encodeState/encodeState.js +0 -1
- package/dist/encodeState/index.js +0 -1
- package/dist/encoder/encoder.js +0 -1
- package/dist/encoder/index.js +0 -1
- package/dist/index.js +0 -1
- package/dist/next/index.js +0 -1
- package/dist/next/useUrlState/index.js +0 -1
- package/dist/next/useUrlState/useUrlState.js +0 -1
- package/dist/parseSPObj.js +0 -1
- package/dist/react/index.js +0 -1
- package/dist/react/useUrlState/index.js +0 -1
- package/dist/react/useUrlState/useUrlState.js +0 -1
- package/dist/react-router/index.js +0 -1
- package/dist/react-router/useUrlState/index.js +0 -1
- package/dist/react-router/useUrlState/useUrlState.js +0 -1
- package/dist/react-router6/index.js +0 -1
- package/dist/react-router6/useUrlState/index.js +0 -1
- package/dist/react-router6/useUrlState/useUrlState.js +0 -1
- package/dist/remix/index.js +0 -1
- package/dist/remix/useUrlState/index.js +0 -1
- package/dist/remix/useUrlState/useUrlState.js +0 -1
- package/dist/useIsomorphicLayoutEffect.js +0 -1
- package/dist/useLinkProps/hrefWithState.js +0 -1
- package/dist/useLinkProps/index.js +0 -1
- package/dist/useLinkProps/useLinkProps.js +0 -1
- package/dist/useSharedState/index.js +0 -1
- package/dist/useSharedState/useSharedState.js +0 -1
- package/dist/useUrlEncode/index.js +0 -1
- package/dist/useUrlEncode/useUrlEncode.js +0 -1
- package/dist/useUrlStateBase/index.js +0 -1
- package/dist/useUrlStateBase/useUrlStateBase.js +0 -1
- package/dist/utils.js +0 -1
- /package/dist/{subscribers.js → subscribers.cjs} +0 -0
package/README.vi.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<!-- i18n:start -->
|
|
2
2
|
[English](./README.md) · [简体中文](./README.zh-CN.md) · [日本語](./README.ja.md) · [한국어](./README.ko.md) · [Русский](./README.ru.md) · [Español](./README.es.md) · [Português (BR)](./README.pt-BR.md) · [Français](./README.fr.md) · Tiếng Việt
|
|
3
|
-
<!-- i18n:meta locale=vi source=README.md source-blob=
|
|
3
|
+
<!-- i18n:meta locale=vi source=README.md source-blob=8b11ee8f8c8b83c207a940455766e24376508130 status=translated -->
|
|
4
4
|
<!-- i18n:end -->
|
|
5
5
|
|
|
6
6
|
<div align="center">
|
|
@@ -138,6 +138,7 @@ Bản so sánh đầy đủ — cùng một tính năng trong cả hai, các l
|
|
|
138
138
|
- [Cài đặt](#cài-đặt)
|
|
139
139
|
- [1. Cài đặt package](#1-cài-đặt-package)
|
|
140
140
|
- [2. Sửa tsconfig.json](#2-sửa-tsconfigjson)
|
|
141
|
+
- [3. Ghi chú: gói này chỉ phân giải dưới dạng ESM](#3-ghi-chú-gói-này-chỉ-phân-giải-dưới-dạng-esm)
|
|
141
142
|
- [Dùng với AI coding agent](#dùng-với-ai-coding-agent)
|
|
142
143
|
- [useUrlState](#useurlstate)
|
|
143
144
|
- [Hook useUrlState cho Next.js](#hook-useurlstate-cho-nextjs)
|
|
@@ -197,6 +198,20 @@ pnpm add state-in-url
|
|
|
197
198
|
Trong `tsconfig.json`, trong `compilerOptions`, đặt `"moduleResolution": "Bundler"`, hoặc `"moduleResolution": "Node16"`, hoặc `"moduleResolution": "NodeNext"`.
|
|
198
199
|
Có thể cần đặt `"module": "ES2022"`, hoặc `"module": "ESNext"`
|
|
199
200
|
|
|
201
|
+
### 3. Ghi chú: gói này chỉ phân giải dưới dạng ESM
|
|
202
|
+
|
|
203
|
+
Next.js, Vite, Astro và Remix đóng gói nó mà không cần cấu hình gì, và `require()`
|
|
204
|
+
từ Node thuần hoạt động trên Node `^20.19` hoặc `>=22.12`, nơi `require(esm)`
|
|
205
|
+
không còn cần cờ.
|
|
206
|
+
|
|
207
|
+
`dist/` cũng kèm theo một bản build CommonJS với đuôi `.cjs`, nhưng bản đồ
|
|
208
|
+
`exports` không trỏ tới nó, nên không có phân giải nào vô tình rơi vào đó. Nó dành
|
|
209
|
+
cho các trường hợp biên — Node cũ, hoặc Jest không dùng cờ — và chỉ có thể truy cập
|
|
210
|
+
bằng đường dẫn tường minh.
|
|
211
|
+
|
|
212
|
+
**Dù theo cách nào, Jest cũng cần một dòng cấu hình** — xem mục 5 trong
|
|
213
|
+
[Lưu ý](#lưu-ý).
|
|
214
|
+
|
|
200
215
|
## Dùng với AI coding agent
|
|
201
216
|
|
|
202
217
|
`state-in-url` kèm theo các file skill cho [@tanstack/intent](https://tanstack.com/intent/latest/docs/overview), để các AI agent (Claude Code, Cursor, Copilot, Codex, v.v.) tải đúng pattern và tránh các lỗi thường gặp khi dùng thư viện. Sau khi cài `state-in-url`, chạy một lần trong dự án của bạn:
|
|
@@ -982,6 +997,41 @@ export const useUserState = () => {
|
|
|
982
997
|
2. Máy chủ Vercel giới hạn kích thước header (chuỗi truy vấn và những thứ khác) ở **14KB**, vì vậy hãy giữ state trong URL dưới ~5000 từ. <https://vercel.com/docs/errors/URL_TOO_LONG>
|
|
983
998
|
3. Đã thử nghiệm với `next.js` 14/15/16 với app router, không có kế hoạch hỗ trợ pages.
|
|
984
999
|
|
|
1000
|
+
4. **Vitest + react-router 7**: nếu một test render component bên trong `<BrowserRouter>` ném ra `useNavigate() may be used only in the context of a <Router> component` trong khi provider đang ở ngay đó, hãy nâng lên `react-router@8` hoặc đưa gói này vào inline:
|
|
1001
|
+
|
|
1002
|
+
```ts
|
|
1003
|
+
// vitest.config.ts
|
|
1004
|
+
test: { server: { deps: { inline: ['state-in-url'] } } }
|
|
1005
|
+
```
|
|
1006
|
+
|
|
1007
|
+
Vitest đưa `node_modules` ra ngoài, nên Node nạp `state-in-url` còn Vite nạp file test của bạn. Trong `react-router@7`, điều kiện export `node` trỏ `module`/`module-sync` tới `index.mjs` và `default` tới `index.js`, và hai bộ phân giải chọn hai thứ khác nhau — thế là react-router được nạp hai lần, React context của nó tồn tại hai bản, và provider ghi vào bản mà hook không đọc. Inline đưa cả hai phía về cùng bộ phân giải của Vite.
|
|
1008
|
+
|
|
1009
|
+
`react-router@8` trỏ `default` và `module-sync` tới cùng một file, nên không bộ phân giải nào có thể bất đồng và bạn không cần làm gì cả. Thông báo lỗi không bao giờ nhắc tới `state-in-url`, đó là lý do mục này nằm ở đây.
|
|
1010
|
+
|
|
1011
|
+
5. **Jest**: gói này chỉ phân giải dưới dạng ESM, còn Jest mặc định chạy test dưới dạng CommonJS, nên một lệnh `require()` thuần sẽ thất bại với `Must use import to load ES Module`. Jest không kế thừa `require(esm)` không cần cờ của Node — nó dùng API `vm` đồng bộ của riêng mình — nên trên **Node 24.9+** hãy truyền cờ cho nó:
|
|
1012
|
+
|
|
1013
|
+
```json
|
|
1014
|
+
// package.json
|
|
1015
|
+
"scripts": { "test": "NODE_OPTIONS=--experimental-vm-modules jest" }
|
|
1016
|
+
```
|
|
1017
|
+
|
|
1018
|
+
Nếu bạn không muốn truyền cờ, `dist/` cũng có sẵn một bản build CommonJS. Nó được cố ý để ngoài bản đồ `exports` nên không gì phân giải tới đó một cách tình cờ — hãy trỏ Jest tới nó một cách tường minh:
|
|
1019
|
+
|
|
1020
|
+
```js
|
|
1021
|
+
// jest.config.js
|
|
1022
|
+
moduleNameMapper: {
|
|
1023
|
+
'^state-in-url$': '<rootDir>/node_modules/state-in-url/dist/index.cjs',
|
|
1024
|
+
'^state-in-url/utils$': '<rootDir>/node_modules/state-in-url/dist/utils.cjs',
|
|
1025
|
+
'^state-in-url/(.*)$': '<rootDir>/node_modules/state-in-url/dist/$1/index.cjs',
|
|
1026
|
+
},
|
|
1027
|
+
```
|
|
1028
|
+
|
|
1029
|
+
Cách này thay thế bằng bản build CJS cho toàn bộ tiến trình test, và như vậy là an toàn. Đừng trộn cả hai trong cùng một tiến trình — gói này giữ kho trạng thái dùng chung ở phạm vi module, nên hai bản sao nghĩa là hai kho, và `useSharedState` sẽ lặng lẽ ngừng chia sẻ.
|
|
1030
|
+
|
|
1031
|
+
Một khác biệt nữa: `jest.mock()` không áp dụng cho ES module. Hãy dùng `jest.unstable_mockModule()` nếu bạn mock gói này.
|
|
1032
|
+
|
|
1033
|
+
Vitest, Next.js, Vite, Astro và Remix đều không cần cấu hình Jest này. Bước bổ sung duy nhất của Vitest là `server.deps.inline` ở trên, và chỉ với `react-router@7`.
|
|
1034
|
+
|
|
985
1035
|
## Khác
|
|
986
1036
|
|
|
987
1037
|
### Đóng góp và/hoặc chạy cục bộ
|
package/README.zh-CN.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<!-- i18n:start -->
|
|
2
2
|
[English](./README.md) · 简体中文 · [日本語](./README.ja.md) · [한국어](./README.ko.md) · [Русский](./README.ru.md) · [Español](./README.es.md) · [Português (BR)](./README.pt-BR.md) · [Français](./README.fr.md) · [Tiếng Việt](./README.vi.md)
|
|
3
|
-
<!-- i18n:meta locale=zh-CN source=README.md source-blob=
|
|
3
|
+
<!-- i18n:meta locale=zh-CN source=README.md source-blob=8b11ee8f8c8b83c207a940455766e24376508130 status=translated -->
|
|
4
4
|
<!-- i18n:end -->
|
|
5
5
|
|
|
6
6
|
<div align="center">
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
- **兼容**: 将保持第三方查询参数不变
|
|
96
96
|
- **灵活**: 可以在同一页面上使用多个状态对象,只需使用不同的键
|
|
97
97
|
- **快速**: 最少的重新渲染,大约[1ms](https://github.com/asmyshlyaev177/state-in-url/blob/87c8c7c995c5cd7d9e7aa039c30bfe64b24abe4b/packages/urlstate/encoder/encoder.test.ts#L185)来编码和解码大对象
|
|
98
|
-
- **服务器端渲染**: 可以在服务器组件中使用,支持 Next.js 14 和
|
|
98
|
+
- **服务器端渲染**: 可以在服务器组件中使用,支持 Next.js 14、15 和 16
|
|
99
99
|
- **轻量级**: 零依赖,库小于 2KB
|
|
100
100
|
- **开发体验**: 良好的开发者体验、文档、JSDoc 注释和示例
|
|
101
101
|
- **框架灵活性**: 为 `Next.js`、`react-router`、`Remix` 和 `Astro` 提供 hooks,以及用于其他框架或纯 JS 的辅助函数
|
|
@@ -138,6 +138,7 @@ nuqs 也是一个不错的库——如果你希望每个值都是一条可读的
|
|
|
138
138
|
- [安装](#安装)
|
|
139
139
|
- [1. 安装包](#1-安装包)
|
|
140
140
|
- [2. 编辑 tsconfig.json](#2-编辑-tsconfigjson)
|
|
141
|
+
- [3. 说明:本包仅以 ESM 方式解析](#3-说明本包仅以-esm-方式解析)
|
|
141
142
|
- [与 AI 编程代理一起使用](#与-ai-编程代理一起使用)
|
|
142
143
|
- [useUrlState](#useurlstate)
|
|
143
144
|
- [用于 Next.js 的 useUrlState hook](#用于-nextjs-的-useurlstate-hook)
|
|
@@ -197,6 +198,17 @@ pnpm add state-in-url
|
|
|
197
198
|
在 `tsconfig.json` 的 `compilerOptions` 中设置 `"moduleResolution": "Bundler"`,或 `"moduleResolution": "Node16"`,或 `"moduleResolution": "NodeNext"`。
|
|
198
199
|
可能需要设置 `"module": "ES2022"`,或 `"module": "ESNext"`
|
|
199
200
|
|
|
201
|
+
### 3. 说明:本包仅以 ESM 方式解析
|
|
202
|
+
|
|
203
|
+
Next.js、Vite、Astro 和 Remix 无需任何配置即可打包它;在 `require(esm)` 已无需标志的
|
|
204
|
+
Node `^20.19` 或 `>=22.12` 上,纯 Node 的 `require()` 同样可用。
|
|
205
|
+
|
|
206
|
+
`dist/` 中还会附带一份扩展名为 `.cjs` 的 CommonJS 构建产物,但 `exports` 映射并不指向它,
|
|
207
|
+
因此解析不会意外落到它上面。它是为边缘情况准备的——较旧的 Node,或者不想加标志的
|
|
208
|
+
Jest——只能通过明确的路径引用。
|
|
209
|
+
|
|
210
|
+
**无论哪种方式,Jest 都需要一行配置**——参见[注意事项](#注意事项)第 5 条。
|
|
211
|
+
|
|
200
212
|
## 与 AI 编程代理一起使用
|
|
201
213
|
|
|
202
214
|
`state-in-url` 附带适用于 [@tanstack/intent](https://tanstack.com/intent/latest/docs/overview) 的技能文件,因此 AI 代理(Claude Code、Cursor、Copilot、Codex 等)在使用该库时会加载正确的模式并避免常见错误。安装 `state-in-url` 后,在项目中运行一次:
|
|
@@ -980,7 +992,42 @@ export const useUserState = () => {
|
|
|
980
992
|
|
|
981
993
|
1. 只能传递可序列化的值,`Function`、`BigInt` 或 `Symbol` 不起作用,可能像 `ArrayBuffer` 这样的东西也不行。所有可以序列化为 JSON 的内容都可以工作。
|
|
982
994
|
2. Vercel 服务器将标头大小(查询字符串和其他内容)限制为 **14KB**,因此请将 URL 状态保持在约 5000 个字以下。<https://vercel.com/docs/errors/URL_TOO_LONG>
|
|
983
|
-
3. 已在带有 app router 的 `next.js` 14/15 中测试,没有计划支持 pages。
|
|
995
|
+
3. 已在带有 app router 的 `next.js` 14/15/16 中测试,没有计划支持 pages。
|
|
996
|
+
|
|
997
|
+
4. **Vitest + react-router 7**:如果某个测试在 `<BrowserRouter>` 内渲染组件时抛出 `useNavigate() may be used only in the context of a <Router> component`,而 provider 明明就在那里,那么要么升级到 `react-router@8`,要么把本包内联:
|
|
998
|
+
|
|
999
|
+
```ts
|
|
1000
|
+
// vitest.config.ts
|
|
1001
|
+
test: { server: { deps: { inline: ['state-in-url'] } } }
|
|
1002
|
+
```
|
|
1003
|
+
|
|
1004
|
+
Vitest 会把 `node_modules` 外部化,于是 `state-in-url` 由 Node 加载,而你的测试文件由 Vite 加载。在 `react-router@7` 中,`node` 导出条件把 `module`/`module-sync` 指向 `index.mjs`,把 `default` 指向 `index.js`,两个解析器各选其一——于是 react-router 被加载了两次,它的 React context 也存在两份,provider 写入的是 hook 读不到的那一份。内联能让双方都走 Vite 的解析器。
|
|
1005
|
+
|
|
1006
|
+
`react-router@8` 把 `default` 和 `module-sync` 指向同一个文件,因此任何解析器都不会产生分歧,也就不需要做什么。错误信息里从不出现 `state-in-url`,所以这条说明放在这里。
|
|
1007
|
+
|
|
1008
|
+
5. **Jest**:本包仅以 ESM 方式解析,而 Jest 默认以 CommonJS 运行测试,因此直接 `require()` 会失败并报 `Must use import to load ES Module`。Jest 不会继承 Node 已无需标志的 `require(esm)`——它使用自己的同步 `vm` API——所以在 **Node 24.9+** 上要给它加上标志:
|
|
1009
|
+
|
|
1010
|
+
```json
|
|
1011
|
+
// package.json
|
|
1012
|
+
"scripts": { "test": "NODE_OPTIONS=--experimental-vm-modules jest" }
|
|
1013
|
+
```
|
|
1014
|
+
|
|
1015
|
+
如果你不想加标志,`dist/` 里也附带了一份 CommonJS 构建产物。它被刻意排除在 `exports` 映射之外,因此不会有解析意外落到它上面——请显式地把 Jest 指向它:
|
|
1016
|
+
|
|
1017
|
+
```js
|
|
1018
|
+
// jest.config.js
|
|
1019
|
+
moduleNameMapper: {
|
|
1020
|
+
'^state-in-url$': '<rootDir>/node_modules/state-in-url/dist/index.cjs',
|
|
1021
|
+
'^state-in-url/utils$': '<rootDir>/node_modules/state-in-url/dist/utils.cjs',
|
|
1022
|
+
'^state-in-url/(.*)$': '<rootDir>/node_modules/state-in-url/dist/$1/index.cjs',
|
|
1023
|
+
},
|
|
1024
|
+
```
|
|
1025
|
+
|
|
1026
|
+
这会在整个测试进程中替换为 CJS 构建产物,是安全的做法。不要在同一个进程里混用两者——本包把共享状态的存储放在模块作用域,两份副本就意味着两个存储,`useSharedState` 会悄无声息地停止共享。
|
|
1027
|
+
|
|
1028
|
+
还有一点不同:`jest.mock()` 对 ES 模块无效。如果要 mock 本包,请使用 `jest.unstable_mockModule()`。
|
|
1029
|
+
|
|
1030
|
+
Vitest、Next.js、Vite、Astro 和 Remix 都不需要这些 Jest 配置。Vitest 唯一需要的额外步骤是上面的 `server.deps.inline`,而且仅在使用 `react-router@7` 时。
|
|
984
1031
|
|
|
985
1032
|
## 其他
|
|
986
1033
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("../react/useUrlState/useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("../../react/useUrlState/useUrlState.
|
|
1
|
+
"use strict";var e=require("../../react/useUrlState/useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("../utils.cjs");const i={date:"\u23F2",undefined:"\u2219undefined"};const t=e.isWebKit?330:70;exports.SYMBOLS=i;exports.TIMEOUT=t;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{isWebKit as e}from"../utils.mjs";const n={date:"\u23F2",undefined:"\u2219undefined"};const t=e?330:70;export{n as SYMBOLS,t as TIMEOUT};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var r=require("./constants.cjs");exports.SYMBOLS=r.SYMBOLS;exports.TIMEOUT=r.TIMEOUT;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var i=require("../encoder/encoder.cjs");var d=require("../utils.cjs");function u(c,s,r){const t=new URLSearchParams(d.getParams(r));const n=Object.keys(c||{});for(let o=0;o<n.length;o++){const e=n[o];const a=c[e];const f=s?.[e];if(JSON.stringify(a)!==JSON.stringify(f)){t.set(e,i.encode(a))}else{t.delete(e)}}return t.toString()}function S(c,s){const r=Object.assign({},s||{});const t=d.getParams(c);for(const[n,o]of t){const e=s?.[n];r[n]=i.decode(o,e)??e}return r}exports.decodeState=S;exports.encodeState=u;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./encodeState.cjs");exports.decodeState=e.decodeState;exports.encodeState=e.encodeState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var n=require("../constants/constants.cjs");var u=require("../utils.cjs");const O=/['"]/g;const p={"'":"%27",'"':"'"};const v=/'|%27/g;const y={"'":'"',"%27":"'"};const g=new RegExp(`^(${n.SYMBOLS.undefined}|${n.SYMBOLS.date})`);function m(e){if(typeof e==="function"||typeof e==="symbol")return"";if(B(e)){return e}return JSON.stringify(c("",e)).replace(O,r=>p[r])}function c(e,r){const t=u.typeOf(r);if(t!=="object"&&t!=="array"){return d(r)}if(t==="object"){const i=r;const o={};for(const s of Object.keys(i)){o[s]=c(e,i[s])}return o}if(t==="array"){return r.map(i=>c(e,i))}return r}const d=e=>{switch(u.typeOf(e)){case"date":return n.SYMBOLS.date+new Date(e).toISOString();case"undefined":return n.SYMBOLS.undefined;default:return e}};function l(e,r){return f(e.replace(v,t=>y[t]),r)}function f(e,r){try{return JSON.parse(e,a)}catch{return r}}function a(e,r){return typeof r==="string"?S(r):r}const S=e=>{if(e===n.SYMBOLS.undefined)return void 0;if(e?.startsWith?.(n.SYMBOLS.date))return new Date(e.slice(1));return e};const B=e=>g.test(String(e));exports.decode=l;exports.decodePrimitive=S;exports.encode=m;exports.encodePrimitive=d;exports.parseJSON=f;exports.reviver=a;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./encoder.cjs");exports.decode=e.decode;exports.encode=e.encode;
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./encoder/encoder.cjs");var r=require("./encodeState/encodeState.cjs");var a=require("./useLinkProps/useLinkProps.cjs");var s=require("./useSharedState/useSharedState.cjs");var u=require("./useUrlEncode/useUrlEncode.cjs");var d=require("./useUrlStateBase/useUrlStateBase.cjs");var t=require("./utils.cjs");exports.decode=e.decode;exports.encode=e.encode;exports.decodeState=r.decodeState;exports.encodeState=r.encodeState;exports.useLinkProps=a.useLinkProps;exports.useSharedState=s.useSharedState;exports.useUrlEncode=u.useUrlEncode;exports.useUrlStateBase=d.useUrlStateBase;exports.isSSR=t.isSSR;exports.typeOf=t.typeOf;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState/useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var g=require("react");var h=require("next/navigation");var p=require("../../parseSPObj.cjs");var k=require("../../useUrlStateBase/useUrlStateBase.cjs");var a=require("../../utils.cjs");function q(t){return t&&t.__esModule?t:{default:t}}var s=q(g);function y(t,r){const n=s.default.useMemo(()=>r?.useHistory===void 0?true:!!r?.useHistory,[]);const u=h.useRouter();const d=s.default.useMemo(()=>({push:(...e)=>{if(n){a.routerHistory.push(...e)}else{u.push(...e)}},replace:(...e)=>{if(n){a.routerHistory.replace(...e)}else{u.replace(...e)}}}),[u]);const{state:S,updateState:c,updateUrl:i,reset:f,getState:U,pendingUrlUpdate:b}=k.useUrlStateBase(t,d,({parse:e})=>{return a.isSSR?p.parseSPObj(a.filterUnknownParams(t,r?.searchParams),t):e(a.filterUnknownParamsClient(t,r?.searchParams||a.getSearch()))});const o=s.default.useCallback(()=>{if(b())return;c(a.filterUnknownParams(t,p.parseSPObj(Object.fromEntries(a.getParams(a.getSearch()).entries()),t)))},[]);s.default.useEffect(()=>{o();return a.subscribeToUrl(o)},[o]);const l=s.default.useMemo(()=>{const e={..._};if(r?.scroll!==void 0)e.scroll=r.scroll;if(r?.replace!==void 0)e.replace=r.replace;return e},[r?.scroll,r?.replace]);const m=s.default.useCallback((e,P)=>i(e,{...l,...P}),[i,l]);const v=s.default.useCallback(e=>{f({...l,...e})},[f,l]);return{setState:c,setUrl:m,urlState:S,reset:v,getState:U}}const _={replace:true,scroll:false};exports.useUrlState=y;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import r from"react";import{useRouter as y}from"next/navigation";import{parseSPObj as p}from"../../parseSPObj.mjs";import{useUrlStateBase as C}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as m,isSSR as v,filterUnknownParams as f,filterUnknownParamsClient as H,getSearch as S,getParams as M,subscribeToUrl as j}from"../../utils.mjs";function w(s,t){const c=r.useMemo(()=>t?.useHistory===void 0?true:!!t?.useHistory,[]);const a=y();const U=r.useMemo(()=>({push:(...e)=>{if(c){m.push(...e)}else{a.push(...e)}},replace:(...e)=>{if(c){m.replace(...e)}else{a.replace(...e)}}}),[a]);const{state:b,updateState:u,updateUrl:n,reset:i,getState:d,pendingUrlUpdate:h}=C(s,U,({parse:e})=>{return v?p(f(s,t?.searchParams),s):e(H(s,t?.searchParams||S()))});const l=r.useCallback(()=>{if(h())return;u(f(s,p(Object.fromEntries(M(S()).entries()),s)))},[]);r.useEffect(()=>{l();return j(l)},[l]);const o=r.useMemo(()=>{const e={...E};if(t?.scroll!==void 0)e.scroll=t.scroll;if(t?.replace!==void 0)e.replace=t.replace;return e},[t?.scroll,t?.replace]);const P=r.useCallback((e,k)=>n(e,{...o,...k}),[n,o]);const g=r.useCallback(e=>{i({...o,...e})},[i,o]);return{setState:u,setUrl:P,urlState:b,reset:g,getState:d}}const E={replace:true,scroll:false};export{w as useUrlState};
|
|
1
|
+
import r from"react";import{useRouter as y}from"next/navigation.js";import{parseSPObj as p}from"../../parseSPObj.mjs";import{useUrlStateBase as C}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as m,isSSR as v,filterUnknownParams as f,filterUnknownParamsClient as H,getSearch as S,getParams as M,subscribeToUrl as j}from"../../utils.mjs";function w(s,t){const c=r.useMemo(()=>t?.useHistory===void 0?true:!!t?.useHistory,[]);const a=y();const U=r.useMemo(()=>({push:(...e)=>{if(c){m.push(...e)}else{a.push(...e)}},replace:(...e)=>{if(c){m.replace(...e)}else{a.replace(...e)}}}),[a]);const{state:b,updateState:u,updateUrl:n,reset:i,getState:d,pendingUrlUpdate:h}=C(s,U,({parse:e})=>{return v?p(f(s,t?.searchParams),s):e(H(s,t?.searchParams||S()))});const l=r.useCallback(()=>{if(h())return;u(f(s,p(Object.fromEntries(M(S()).entries()),s)))},[]);r.useEffect(()=>{l();return j(l)},[l]);const o=r.useMemo(()=>{const e={...E};if(t?.scroll!==void 0)e.scroll=t.scroll;if(t?.replace!==void 0)e.replace=t.replace;return e},[t?.scroll,t?.replace]);const P=r.useCallback((e,k)=>n(e,{...o,...k}),[n,o]);const g=r.useCallback(e=>{i({...o,...e})},[i,o]);return{setState:u,setUrl:P,urlState:b,reset:g,getState:d}}const E={replace:true,scroll:false};export{w as useUrlState};
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "state-in-url",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.1",
|
|
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-16, react-router@6-7, remix@2, and Astro.",
|
|
5
5
|
"homepage": "https://state-in-url.dev",
|
|
6
6
|
"repository": {
|
|
@@ -30,93 +30,97 @@
|
|
|
30
30
|
"skills",
|
|
31
31
|
"!skills/_artifacts"
|
|
32
32
|
],
|
|
33
|
-
"
|
|
34
|
-
"
|
|
33
|
+
"type": "module",
|
|
34
|
+
"main": "./dist/index.mjs",
|
|
35
35
|
"exports": {
|
|
36
36
|
".": {
|
|
37
|
-
"require": "./dist/index.js",
|
|
38
37
|
"types": "./dist/index.d.ts",
|
|
39
38
|
"default": "./dist/index.mjs"
|
|
40
39
|
},
|
|
41
40
|
"./next": {
|
|
42
|
-
"require": "./dist/next/index.js",
|
|
43
41
|
"types": "./dist/next/index.d.ts",
|
|
44
42
|
"default": "./dist/next/index.mjs"
|
|
45
43
|
},
|
|
46
44
|
"./react": {
|
|
47
|
-
"require": "./dist/react/index.js",
|
|
48
45
|
"types": "./dist/react/index.d.ts",
|
|
49
46
|
"default": "./dist/react/index.mjs"
|
|
50
47
|
},
|
|
51
48
|
"./react-router6": {
|
|
52
|
-
"require": "./dist/react-router6/index.js",
|
|
53
49
|
"types": "./dist/react-router6/index.d.ts",
|
|
54
50
|
"default": "./dist/react-router6/index.mjs"
|
|
55
51
|
},
|
|
56
52
|
"./react-router": {
|
|
57
|
-
"require": "./dist/react-router/index.js",
|
|
58
53
|
"types": "./dist/react-router/index.d.ts",
|
|
59
54
|
"default": "./dist/react-router/index.mjs"
|
|
60
55
|
},
|
|
61
56
|
"./remix": {
|
|
62
|
-
"require": "./dist/remix/index.js",
|
|
63
57
|
"types": "./dist/remix/index.d.ts",
|
|
64
58
|
"default": "./dist/remix/index.mjs"
|
|
65
59
|
},
|
|
66
60
|
"./astro": {
|
|
67
|
-
"require": "./dist/astro/index.js",
|
|
68
61
|
"types": "./dist/astro/index.d.ts",
|
|
69
62
|
"default": "./dist/astro/index.mjs"
|
|
70
63
|
},
|
|
71
64
|
"./encodeState": {
|
|
72
|
-
"require": "./dist/encodeState/index.js",
|
|
73
65
|
"types": "./dist/encodeState/index.d.ts",
|
|
74
66
|
"default": "./dist/encodeState/index.mjs"
|
|
75
67
|
},
|
|
76
68
|
"./encoder": {
|
|
77
|
-
"require": "./dist/encoder/index.js",
|
|
78
69
|
"types": "./dist/encoder/index.d.ts",
|
|
79
70
|
"default": "./dist/encoder/index.mjs"
|
|
80
71
|
},
|
|
81
72
|
"./useSharedState": {
|
|
82
|
-
"require": "./dist/useSharedState/index.js",
|
|
83
73
|
"types": "./dist/useSharedState/index.d.ts",
|
|
84
74
|
"default": "./dist/useSharedState/index.mjs"
|
|
85
75
|
},
|
|
86
76
|
"./useLinkProps": {
|
|
87
|
-
"require": "./dist/useLinkProps/index.js",
|
|
88
77
|
"types": "./dist/useLinkProps/index.d.ts",
|
|
89
78
|
"default": "./dist/useLinkProps/index.mjs"
|
|
90
79
|
},
|
|
91
80
|
"./useUrlEncode": {
|
|
92
|
-
"require": "./dist/useUrlEncode/index.js",
|
|
93
81
|
"types": "./dist/useUrlEncode/index.d.ts",
|
|
94
82
|
"default": "./dist/useUrlEncode/index.mjs"
|
|
95
83
|
},
|
|
96
84
|
"./useUrlStateBase": {
|
|
97
|
-
"require": "./dist/useUrlStateBase/index.js",
|
|
98
85
|
"types": "./dist/useUrlStateBase/index.d.ts",
|
|
99
86
|
"default": "./dist/useUrlStateBase/index.mjs"
|
|
100
87
|
},
|
|
101
88
|
"./utils": {
|
|
102
|
-
"require": "./dist/utils.js",
|
|
103
89
|
"types": "./dist/utils.d.ts",
|
|
104
90
|
"default": "./dist/utils.mjs"
|
|
105
91
|
}
|
|
106
92
|
},
|
|
107
93
|
"types": "./dist/index.d.ts",
|
|
94
|
+
"engines": {
|
|
95
|
+
"node": "^20.19.0 || >=22.12.0"
|
|
96
|
+
},
|
|
97
|
+
"peerDependencies": {
|
|
98
|
+
"react": ">=17",
|
|
99
|
+
"next": ">=14",
|
|
100
|
+
"react-router": ">=6",
|
|
101
|
+
"react-router-dom": ">=6",
|
|
102
|
+
"@remix-run/react": ">=2"
|
|
103
|
+
},
|
|
104
|
+
"peerDependenciesMeta": {
|
|
105
|
+
"next": {
|
|
106
|
+
"optional": true
|
|
107
|
+
},
|
|
108
|
+
"react-router": {
|
|
109
|
+
"optional": true
|
|
110
|
+
},
|
|
111
|
+
"react-router-dom": {
|
|
112
|
+
"optional": true
|
|
113
|
+
},
|
|
114
|
+
"@remix-run/react": {
|
|
115
|
+
"optional": true
|
|
116
|
+
}
|
|
117
|
+
},
|
|
108
118
|
"scripts": {
|
|
109
|
-
"i18n": "node scripts/i18n/cli.mjs",
|
|
110
|
-
"i18n:init": "node scripts/i18n/cli.mjs init",
|
|
111
|
-
"i18n:toc": "node scripts/i18n/cli.mjs toc",
|
|
112
|
-
"i18n:check": "node scripts/i18n/cli.mjs check",
|
|
113
|
-
"i18n:copy": "node scripts/i18n/copy.mjs",
|
|
114
|
-
"i18n:copy:init": "node scripts/i18n/copy.mjs init",
|
|
115
|
-
"i18n:copy:check": "node scripts/i18n/copy.mjs check",
|
|
116
119
|
"test:unit": "wireit",
|
|
117
120
|
"test:int": "wireit",
|
|
118
121
|
"test:int:ci": "wireit",
|
|
119
122
|
"test:exports": "pnpm run build && npx babel-node --extensions .js,.mjs,.ts,.mts --config-file ./babel.config.json -- ./packages/urlstate/exportsTest.ts",
|
|
123
|
+
"test:consumers": "node scripts/check-consumers.mjs",
|
|
120
124
|
"test": "wireit",
|
|
121
125
|
"dev": "wireit",
|
|
122
126
|
"dev:lib": "wireit",
|
|
@@ -152,6 +156,13 @@
|
|
|
152
156
|
"pin-gh-deps": "pin-github-action -i .github/workflows/tests.yml .github/workflows/lighthouse.yml",
|
|
153
157
|
"prepare": "pnpm exec husky",
|
|
154
158
|
"dev:astro": "wireit",
|
|
159
|
+
"i18n": "node scripts/i18n/cli.mjs",
|
|
160
|
+
"i18n:init": "node scripts/i18n/cli.mjs init",
|
|
161
|
+
"i18n:toc": "node scripts/i18n/cli.mjs toc",
|
|
162
|
+
"i18n:check": "node scripts/i18n/cli.mjs check",
|
|
163
|
+
"i18n:copy": "node scripts/i18n/copy.mjs",
|
|
164
|
+
"i18n:copy:init": "node scripts/i18n/copy.mjs init",
|
|
165
|
+
"i18n:copy:check": "node scripts/i18n/copy.mjs check",
|
|
155
166
|
"kill-astro": "wireit"
|
|
156
167
|
},
|
|
157
168
|
"wireit": {
|
|
@@ -556,9 +567,11 @@
|
|
|
556
567
|
"@types/react": "^18.3.25",
|
|
557
568
|
"@types/react-dom": "^18.3.7",
|
|
558
569
|
"@vitest/coverage-istanbul": "^2.1.9",
|
|
570
|
+
"@yarnpkg/cli-dist": "^4.10.3",
|
|
559
571
|
"auto-changelog": "^2.4.0",
|
|
560
572
|
"babel-plugin-module-resolver": "^5.0.2",
|
|
561
573
|
"baseline-browser-mapping": "^2.8.32",
|
|
574
|
+
"bun": "^1.3.0",
|
|
562
575
|
"chokidar": "^4.0.3",
|
|
563
576
|
"commitizen": "^4.3.0",
|
|
564
577
|
"commitlint": "^19.8.1",
|
|
@@ -667,8 +680,15 @@
|
|
|
667
680
|
"@remix-run/react>react-dom": "18.3.1",
|
|
668
681
|
"@types/node": "^24"
|
|
669
682
|
},
|
|
683
|
+
"peerDependencyRules": {
|
|
684
|
+
"allowedVersions": {
|
|
685
|
+
"@remix-run/react>react": "19",
|
|
686
|
+
"@remix-run/react>react-dom": "19"
|
|
687
|
+
}
|
|
688
|
+
},
|
|
670
689
|
"onlyBuiltDependencies": [
|
|
671
690
|
"@parcel/watcher",
|
|
691
|
+
"bun",
|
|
672
692
|
"core-js",
|
|
673
693
|
"esbuild",
|
|
674
694
|
"less",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var c=require("./encoder/encoder.cjs");function s(r,e){return{...e,...o(JSON.stringify(r),e)}}function o(r,e){try{return JSON.parse(r,u)}catch{return e}}const u=(r,e)=>{const t=typeof e==="string";const n=t&&c.decode(e?.replace?.(/'/g,'"'));return r&&t?n:e};exports.parseSPObj=s;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState/useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var P=require("react");var o=require("../../parseSPObj.cjs");var m=require("../../useUrlStateBase/useUrlStateBase.cjs");var t=require("../../utils.cjs");function g(e){return e&&e.__esModule?e:{default:e}}var a=g(P);function k(e,s){const{state:f,updateState:n,updateUrl:c,reset:i,getState:S,pendingUrlUpdate:p}=m.useUrlStateBase(e,t.routerHistory,({parse:r})=>t.isSSR?o.parseSPObj(t.filterUnknownParams(e,s?.searchParams),e):r(t.filterUnknownParamsClient(e,s?.searchParams||t.getSearch())));const l=a.default.useCallback(()=>{if(p())return;n(t.filterUnknownParams(e,o.parseSPObj(Object.fromEntries(t.getParams(t.getSearch()).entries()),e)))},[]);a.default.useEffect(()=>{l();return t.subscribeToUrl(l)},[l]);const u=a.default.useMemo(()=>({replace:s?.replace??true}),[s?.replace]);const U=a.default.useCallback((r,b)=>c(r,{...u,...b}),[c,u]);const d=a.default.useCallback(r=>{i({...u,...r})},[i,u]);return{setState:n,setUrl:U,urlState:f,reset:d,getState:S}}exports.useUrlState=k;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState/useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var P=require("react");var o=require("react-router");var _=require("../../parseSPObj.cjs");var k=require("../../useUrlStateBase/useUrlStateBase.cjs");var u=require("../../utils.cjs");function j(e){return e&&e.__esModule?e:{default:e}}var s=j(P);function C(e,r){const v=r?.useHistory;const l=s.default.useMemo(()=>({...i,replace:r?.replace??i.replace,preventScrollReset:r?.preventScrollReset??i.preventScrollReset}),[r?.replace,r?.preventScrollReset]);const n=o.useNavigate();const d=s.default.useMemo(()=>v?u.routerHistory:{replace:(t,a)=>n(t,{...l,...a,replace:true}),push:(t,a)=>n(t,{...l,...a,replace:false})},[n]);const[c]=o.useSearchParams();const U=o.useHref("/");const{state:m,updateState:p,updateUrl:f,getState:R,reset:S,pendingUrlUpdate:b}=k.useUrlStateBase(e,d,({parse:t})=>t(u.filterUnknownParamsClient(e,c.entries())),U);const g=s.default.useCallback((t,a)=>f(t,{...l,...a}),[f]);s.default.useEffect(()=>{if(!b()){p(u.assignValue(e,u.filterUnknownParams(e,_.parseSPObj(Object.fromEntries([...c.entries()]),e))))}},[c]);const q=s.default.useCallback(t=>{S({...l,...t})},[S]);return{setState:p,setUrl:g,urlState:m,reset:q,getState:R}}const i={replace:true,preventScrollReset:true};exports.useUrlState=C;
|
|
@@ -5,7 +5,7 @@ import { type JSONCompatible } from '../../utils';
|
|
|
5
5
|
*
|
|
6
6
|
* @param {JSONCompatible<T>} [defaultState] Fallback (default) values for state
|
|
7
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/
|
|
8
|
+
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/react-router.NavigateOptions.html)
|
|
9
9
|
* @param {boolean} params.replace replace URL or push, default `true`
|
|
10
10
|
* @param {boolean} params.useHistory use window.history for navigation, default `false`
|
|
11
11
|
* @param {boolean} params.preventScrollReset keep scroll position, default `true`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import a from"react";import{useNavigate as d,useSearchParams as k,useHref as P}from"react-router";import{parseSPObj as C}from"../../parseSPObj.mjs";import{useUrlStateBase as H}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as h,filterUnknownParamsClient as j,assignValue as w,filterUnknownParams as y}from"../../utils.mjs";function E(t,r){const m=r?.useHistory;const o=a.useMemo(()=>({...c,replace:r?.replace??c.replace,preventScrollReset:r?.preventScrollReset??c.preventScrollReset}),[r?.replace,r?.preventScrollReset]);const l=d();const f=a.useMemo(()=>m?h:{replace:(e,s)=>l(e,{...o,...s,replace:true}),push:(e,s)=>l(e,{...o,...s,replace:false})},[l]);const[n]=k();const S=P("/");const{state:U,updateState:p,updateUrl:u,getState:v,reset:i,pendingUrlUpdate:g}=H(t,f,({parse:e})=>e(j(t,n.entries())),S);const R=a.useCallback((e,s)=>u(e,{...o,...s}),[u]);a.useEffect(()=>{if(!g()){p(w(t,y(t,C(Object.fromEntries([...n.entries()]),t))))}},[n]);const b=a.useCallback(e=>{i({...o,...e})},[i]);return{setState:p,setUrl:R,urlState:U,reset:b,getState:v}}const c={replace:true,preventScrollReset:true};export{E as useUrlState};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState/useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var O=require("react");var o=require("react-router-dom");var P=require("../../parseSPObj.cjs");var _=require("../../useUrlStateBase/useUrlStateBase.cjs");var u=require("../../utils.cjs");function k(t){return t&&t.__esModule?t:{default:t}}var s=k(O);function j(t,r){const d=r?.useHistory;const l=s.default.useMemo(()=>{const e={...S};if(r?.replace!==void 0)e.replace=r.replace;if(r?.preventScrollReset!==void 0)e.preventScrollReset=r.preventScrollReset;return e},[r?.replace,r?.preventScrollReset]);const n=o.useNavigate();const v=s.default.useMemo(()=>d?u.routerHistory:{replace:(e,a)=>n(e,{...l,...a,replace:true}),push:(e,a)=>n(e,{...l,...a,replace:false})},[n]);const[c]=o.useSearchParams();const U=o.useHref("/");const{state:m,updateState:i,updateUrl:p,getState:R,reset:f,pendingUrlUpdate:b}=_.useUrlStateBase(t,v,({parse:e})=>e(u.filterUnknownParamsClient(t,c.entries())),U);const g=s.default.useCallback((e,a)=>p(e,{...l,...a}),[p]);s.default.useEffect(()=>{if(!b()){i(u.assignValue(t,u.filterUnknownParams(t,P.parseSPObj(Object.fromEntries([...c.entries()]),t))))}},[c]);const q=s.default.useCallback(e=>{f({...l,...e})},[f]);return{setState:i,setUrl:g,urlState:m,reset:q,getState:R}}const S={replace:true,preventScrollReset:true};exports.defaultOpts=S;exports.useUrlState=j;
|
|
@@ -5,7 +5,7 @@ import { type JSONCompatible } from '../../utils';
|
|
|
5
5
|
*
|
|
6
6
|
* @param {JSONCompatible<T>} [defaultState] Fallback (default) values for state
|
|
7
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/
|
|
8
|
+
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/react-router.NavigateOptions.html)
|
|
9
9
|
* @param {boolean} params.replace replace URL or push, default `true`
|
|
10
10
|
* @param {boolean} params.useHistory use window.history for navigation, default `false`
|
|
11
11
|
* @param {boolean} params.preventScrollReset keep scroll position, default `true`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import a from"react";import{useNavigate as b,useSearchParams as k,useHref as P}from"react-router-dom";import{parseSPObj as C}from"../../parseSPObj.mjs";import{useUrlStateBase as H}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as O,filterUnknownParamsClient as h,assignValue as j,filterUnknownParams as w}from"../../utils.mjs";function y(r,t){const f=t?.useHistory;const o=a.useMemo(()=>{const e={...i};if(t?.replace!==void 0)e.replace=t.replace;if(t?.preventScrollReset!==void 0)e.preventScrollReset=t.preventScrollReset;return e},[t?.replace,t?.preventScrollReset]);const l=b();const m=a.useMemo(()=>f?O:{replace:(e,s)=>l(e,{...o,...s,replace:true}),push:(e,s)=>l(e,{...o,...s,replace:false})},[l]);const[n]=k();const S=P("/");const{state:v,updateState:c,updateUrl:p,getState:U,reset:u,pendingUrlUpdate:d}=H(r,m,({parse:e})=>e(h(r,n.entries())),S);const R=a.useCallback((e,s)=>p(e,{...o,...s}),[p]);a.useEffect(()=>{if(!d()){c(j(r,w(r,C(Object.fromEntries([...n.entries()]),r))))}},[n]);const g=a.useCallback(e=>{u({...o,...e})},[u]);return{setState:c,setUrl:R,urlState:v,reset:g,getState:U}}const i={replace:true,preventScrollReset:true};export{i as defaultOpts,y as useUrlState};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState/useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlState.cjs");exports.useUrlState=e.useUrlState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var O=require("react");var p=require("@remix-run/react");var P=require("../../parseSPObj.cjs");var _=require("../../useUrlStateBase/useUrlStateBase.cjs");var u=require("../../utils.cjs");function k(e){return e&&e.__esModule?e:{default:e}}var s=k(O);function j(e,r){const d=r?.useHistory;const l=s.default.useMemo(()=>({...n,replace:r?.replace??n.replace,preventScrollReset:r?.preventScrollReset??n.preventScrollReset}),[r?.replace,r?.preventScrollReset]);const c=p.useNavigate();const v=s.default.useMemo(()=>d?u.routerHistory:{replace:(t,a)=>c(t,{...l,...a,replace:true}),push:(t,a)=>c(t,{...l,...a,replace:false})},[c]);const[o]=p.useSearchParams();const U=p.useHref("/");const{state:m,updateState:i,updateUrl:f,getState:b,reset:S,pendingUrlUpdate:R}=_.useUrlStateBase(e,v,({parse:t})=>t(u.filterUnknownParamsClient(e,o.entries())),U);const g=s.default.useCallback((t,a)=>f(t,{...l,...a}),[f]);s.default.useEffect(()=>{if(!R()){i(u.assignValue(e,u.filterUnknownParams(e,P.parseSPObj(Object.fromEntries([...o.entries()]),e))))}},[o]);const q=s.default.useCallback(t=>{S({...l,...t})},[S]);return{setState:i,setUrl:g,urlState:m,reset:q,getState:b}}const n={replace:true,preventScrollReset:true};exports.defaultOpts=n;exports.useUrlState=j;
|
|
@@ -5,7 +5,7 @@ import { type JSONCompatible } from '../../utils';
|
|
|
5
5
|
*
|
|
6
6
|
* @param {JSONCompatible<T>} [defaultState] Fallback (default) values for state
|
|
7
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/
|
|
8
|
+
* @param {NavigateOptions} params.NavigateOptions See type from [`react-router-dom`](https://api.reactrouter.com/v7/interfaces/react-router.NavigateOptions.html)
|
|
9
9
|
* @param {boolean} params.replace replace URL or push, default `true`
|
|
10
10
|
* @param {boolean} params.useHistory use window.history for navigation, default `false`
|
|
11
11
|
* @param {boolean} params.preventScrollReset keep scroll position, default `true`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import a from"react";import{useNavigate as g,useSearchParams as k,useHref as P}from"@remix-run/react";import{parseSPObj as C}from"../../parseSPObj.mjs";import{useUrlStateBase as H}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as O,filterUnknownParamsClient as h,assignValue as j,filterUnknownParams as w}from"../../utils.mjs";function y(t,r){const m=r?.useHistory;const o=a.useMemo(()=>({...l,replace:r?.replace??l.replace,preventScrollReset:r?.preventScrollReset??l.preventScrollReset}),[r?.replace,r?.preventScrollReset]);const n=g();const f=a.useMemo(()=>m?O:{replace:(e,s)=>n(e,{...o,...s}),push:(e,s)=>n(e,{...o,...s})},[n]);const[c]=k();const S=P("/");const{state:U,updateState:p,updateUrl:u,getState:v,reset:i,pendingUrlUpdate:R}=H(t,f,({parse:e})=>e(h(t,c.entries())),S);const b=a.useCallback((e,s)=>u(e,{...o,...s}),[u]);a.useEffect(()=>{if(!R()){p(j(t,w(t,C(Object.fromEntries([...c.entries()]),t))))}},[c]);const d=a.useCallback(e=>{i({...o,...e})},[i]);return{setState:p,setUrl:b,urlState:U,reset:d,getState:v}}const l={replace:true,preventScrollReset:true};export{l as defaultOpts,y as useUrlState};
|
|
1
|
+
import a from"react";import{useNavigate as g,useSearchParams as k,useHref as P}from"@remix-run/react";import{parseSPObj as C}from"../../parseSPObj.mjs";import{useUrlStateBase as H}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as O,filterUnknownParamsClient as h,assignValue as j,filterUnknownParams as w}from"../../utils.mjs";function y(t,r){const m=r?.useHistory;const o=a.useMemo(()=>({...l,replace:r?.replace??l.replace,preventScrollReset:r?.preventScrollReset??l.preventScrollReset}),[r?.replace,r?.preventScrollReset]);const n=g();const f=a.useMemo(()=>m?O:{replace:(e,s)=>n(e,{...o,...s,replace:true}),push:(e,s)=>n(e,{...o,...s,replace:false})},[n]);const[c]=k();const S=P("/");const{state:U,updateState:p,updateUrl:u,getState:v,reset:i,pendingUrlUpdate:R}=H(t,f,({parse:e})=>e(h(t,c.entries())),S);const b=a.useCallback((e,s)=>u(e,{...o,...s}),[u]);a.useEffect(()=>{if(!R()){p(j(t,w(t,C(Object.fromEntries([...c.entries()]),t))))}},[c]);const d=a.useCallback(e=>{i({...o,...e})},[i]);return{setState:p,setUrl:b,urlState:U,reset:d,getState:v}}const l={replace:true,preventScrollReset:true};export{l as defaultOpts,y as useUrlState};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var u=require("react");function f(e){return e&&e.__esModule?e:{default:e}}var t=f(u);const o=typeof window==="undefined"?t.default.useEffect:t.default.useLayoutEffect;exports.useIsomorphicLayoutEffect=o;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import o from"react";const e=typeof window==="undefined"?o.useEffect:o.useLayoutEffect;export{e as useIsomorphicLayoutEffect};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var l=require("../encodeState/encodeState.cjs");var m=require("../utils.cjs");function o(e,r){const t=e.indexOf(r);return t===-1?[e,""]:[e.slice(0,t),e.slice(t+1)]}function q(e,r,t,a){const[i,c]=o(e,"#");const[u,f]=o(i,"?");const n=m.getOtherParams(r,a);for(const[S,d]of new URLSearchParams(f)){n.set(S,d)}const s=l.encodeState(t,r,n);const h=s?`?${s}`:"";const $=c?`#${c}`:"";return`${u}${h}${$}`}exports.hrefWithState=q;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var s=require("./useLinkProps.cjs");exports.useLinkProps=s.useLinkProps;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var n=require("react");var u=require("../encodeState/encodeState.cjs");var i=require("../subscribers.cjs");var o=require("../utils.cjs");var s=require("./hrefWithState.cjs");function l(e){return e&&e.__esModule?e:{default:e}}var c=l(n);const f=/^[a-z][a-z\d+\-.]*:|^\/\//i;function d(e){return e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||!!e.currentTarget?.target}function h(e){return i.stateMap.get(e)??u.decodeState(o.filterUnknownParamsClient(e,window.location.search),e)}function v(e,t){return c.default.useCallback(r=>({href:r,onClick:a=>{if(f.test(r)||d(a))return;a.preventDefault();t(s.hrefWithState(r,e,h(e),window.location.search))}}),[e,t])}exports.useLinkProps=v;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import n from"react";import{decodeState as a}from"../encodeState/encodeState.mjs";import{stateMap as i}from"../subscribers.mjs";import{filterUnknownParamsClient as f}from"../utils.mjs";import{hrefWithState as c}from"./hrefWithState.mjs";const m=/^[a-z][a-z\d+\-.]*:|^\/\//i;function u(e){return e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||!!e.currentTarget?.target}function l(e){return i.get(e)??a(f(e,window.location.search),e)}function s(e,r){return n.useCallback(t=>({href:t,onClick:o=>{if(m.test(t)||u(o))return;o.preventDefault();r(c(t,e,l(e),window.location.search))}}),[e,r])}export{s as useLinkProps};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useSharedState.cjs");exports.useSharedState=e.useSharedState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var b=require("react");var e=require("../subscribers.cjs");var M=require("../useIsomorphicLayoutEffect.cjs");var i=require("../utils.cjs");function g(s){return s&&s.__esModule?s:{default:s}}var a=g(b);function v(s,c){const t=a.default.useRef(s);const[l,o]=a.default.useState(()=>{if(i.isSSR){return c?c?.():t.current}const r=e.stateMap.get(t.current);if(!r){const u=c?.()||t.current;e.stateMap.set(t.current,u);return u}else{return r}});const d=a.default.useCallback(r=>{const u=e.stateMap.get(t.current);const n=typeof r==="function";const f=n?r(u,s):{...u,...r};if(i.isEqual(u,f))return void 0;e.stateMap.set(t.current,f);e.subscribers.get(t.current).forEach(S=>S())},[]);M.useIsomorphicLayoutEffect(()=>{const r=()=>{o(e.stateMap.get(t.current)||t.current)};const u=e.subscribers.add(t.current,r);o(n=>e.stateMap.get(t.current)??n);return u},[]);const p=a.default.useCallback(()=>e.stateMap.get(t.current)||t.current,[]);return{state:l,getState:p,setState:d}}exports.useSharedState=v;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlEncode.cjs");exports.useUrlEncode=e.useUrlEncode;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var c=require("react");var u=require("../encodeState/encodeState.cjs");function l(e){return e&&e.__esModule?e:{default:e}}var a=l(c);function d(e){const n=a.default.useCallback((t,o)=>{return u.encodeState(t,e,o)},[e]);const r=a.default.useCallback(t=>u.decodeState(t,e),[e]);return{parse:r,stringify:n}}exports.useUrlEncode=d;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("./useUrlStateBase.cjs");exports.useUrlStateBase=e.useUrlStateBase;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var M=require("react");var O=require("../constants/constants.cjs");var P=require("../useIsomorphicLayoutEffect.cjs");var R=require("../useSharedState/useSharedState.cjs");var j=require("../useUrlEncode/useUrlEncode.cjs");var n=require("../utils.cjs");function D(t){return t&&t.__esModule?t:{default:t}}var l=D(M);let f;let s;let a;let v;let m=0;const S=()=>window.location.pathname+window.location.search;function d(){a=void 0;v?.();v=void 0}function g(){if(!a)return void 0;const t=S();if(t===a.from&&t!==a.to){return a}d();return void 0}function H(t,e){const o=g()?.from??S();if(o===t){d();return}a={from:o,to:t,search:e};v??=n.subscribeToUrl(d)}function V(t){if(t.pathname!==window.location.pathname)return;const e=g();const o=t.pathname+t.search;if(e?.to===o)return;const c=o===S();if(c&&!e)return;const i=c?"replace":t.method;t.router[i](t.url,t.opts);H(o,t.search)}function W(t,e,o,c){const{parse:i,stringify:E}=j.useUrlEncode(t);const{state:L,getState:u,setState:h}=R.useSharedState(t,()=>o?.({parse:i})||t);const p=l.default.useRef();if(p.current===void 0)p.current=n.getSearch();P.useIsomorphicLayoutEffect(()=>{const r=()=>{h(i(n.filterUnknownParamsClient(t,n.getSearch())))};window.addEventListener(n.popstateEv,r);if(p.current!==n.getSearch())r();return()=>{window.removeEventListener(n.popstateEv,r)}},[]);l.default.useEffect(()=>{m+=1;return()=>{m-=1;if(m===0)d()}},[]);const w=l.default.useCallback((r,y)=>{const U=typeof r==="function"?r(u(),t):{...u(),...r};h(U);const $=s?.search??g()?.search??window.location.search;const q=E(U,n.getOtherParams(t,$));const T=q.length?`?${q}`:"";const _=x(window.location.pathname,c);const b=`${_}${T}${window.location.hash}`;if(b===`${_}${$}${window.location.hash}`)return;const{replace:C,...I}=y||{};clearTimeout(f);s={router:e,method:C?"replace":"push",url:b,pathname:window.location.pathname,search:T,opts:I};f=setTimeout(()=>{f=void 0;if(!s)return;const B=s;s=void 0;V(B)},O.TIMEOUT)},[e,E,u]);const k=l.default.useCallback(r=>w(t,r),[w]);return{updateState:h,updateUrl:w,state:L,reset:k,getState:u,pendingUrlUpdate:()=>f!==void 0}}function x(t,e){if(!e||e==="/"){return t}return t.slice(e.length)}exports.useUrlStateBase=W;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import u from"react";import{TIMEOUT as
|
|
1
|
+
import u from"react";import{TIMEOUT as x}from"../constants/constants.mjs";import{useIsomorphicLayoutEffect as B}from"../useIsomorphicLayoutEffect.mjs";import{useSharedState as H}from"../useSharedState/useSharedState.mjs";import{useUrlEncode as M}from"../useUrlEncode/useUrlEncode.mjs";import{getSearch as h,popstateEv as L,filterUnknownParamsClient as V,getOtherParams as W,subscribeToUrl as _}from"../utils.mjs";let f;let a;let n;let w;let v=0;const g=()=>window.location.pathname+window.location.search;function l(){n=void 0;w?.();w=void 0}function S(){if(!n)return void 0;const t=g();if(t===n.from&&t!==n.to){return n}l();return void 0}function q(t,o){const r=S()?.from??g();if(r===t){l();return}n={from:r,to:t,search:o};w??=_(l)}function z(t){if(t.pathname!==window.location.pathname)return;const o=S();const r=t.pathname+t.search;if(o?.to===r)return;const i=r===g();if(i&&!o)return;const s=i?"replace":t.method;t.router[s](t.url,t.opts);q(r,t.search)}function A(t,o,r,i){const{parse:s,stringify:U}=M(t);const{state:y,getState:c,setState:m}=H(t,()=>r?.({parse:s})||t);const p=u.useRef();if(p.current===void 0)p.current=h();B(()=>{const e=()=>{m(s(V(t,h())))};window.addEventListener(L,e);if(p.current!==h())e();return()=>{window.removeEventListener(L,e)}},[]);u.useEffect(()=>{v+=1;return()=>{v-=1;if(v===0)l()}},[]);const d=u.useCallback((e,O)=>{const $=typeof e==="function"?e(c(),t):{...c(),...e};m($);const E=a?.search??S()?.search??window.location.search;const T=U($,W(t,E));const b=T.length?`?${T}`:"";const k=D(window.location.pathname,i);const C=`${k}${b}${window.location.hash}`;if(C===`${k}${E}${window.location.hash}`)return;const{replace:P,...R}=O||{};clearTimeout(f);a={router:o,method:P?"replace":"push",url:C,pathname:window.location.pathname,search:b,opts:R};f=setTimeout(()=>{f=void 0;if(!a)return;const j=a;a=void 0;z(j)},x)},[o,U,c]);const I=u.useCallback(e=>d(t,e),[d]);return{updateState:m,updateUrl:d,state:y,reset:I,getState:c,pendingUrlUpdate:()=>f!==void 0}}function D(t,o){if(!o||o==="/"){return t}return t.slice(o.length)}export{A as useUrlStateBase};
|
package/dist/utils.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const a=n=>{if(n===null)return"null";const t=typeof n;if(t!=="object")return t;if(Array.isArray(n))return"array";if(n instanceof Date)return"date";return"object"};const w=n=>{const t=a(n);return t!=="object"&&t!=="array"};const i=typeof window==="undefined";const y=n=>{if(n instanceof URLSearchParams){return n}if(typeof n==="string"){const t=n.indexOf("?");return new URLSearchParams(t===-1?n:n.slice(t+1))}return new URLSearchParams};const p=(n,t)=>{if(n.length!==t.length)return false;return n.every((e,s)=>c(e,t[s]))};const g=(n,t)=>{const e=Object.keys(n);const s=Object.keys(t);if(e.length!==s.length)return false;return e.every(r=>c(n[r],t[r]))};const c=(n,t)=>{if(n===t)return true;if(n==null||t==null)return false;const e=a(n);const s=a(t);if(e!==s)return false;if(w(n))return false;if(e==="array"){return p(n,t)}if(e==="object"){return g(n,t)}return JSON.stringify(n)===JSON.stringify(t)};function S(n,t){const e=new URLSearchParams;const s=f(n,[...new URLSearchParams(t||"").entries()]);for(const[r,o]of s){e.set(r,o)}return e.toString()}function b(n,t){const e=Object.keys(n);const s=new URLSearchParams;for(const[r,o]of new URLSearchParams(t)){if(!e.includes(r))s.set(r,o)}return s}function m(n,t){const e=t instanceof URLSearchParams?[...t.entries()]:Object.entries(t||{});return Object.fromEntries(f(n,e))}function f(n,t){const e=Object.keys(n);const s=[];for(let r=0;r<t.length;r++){if(e.includes(t[r]?.[0])){s.push([t[r][0].replace(/\+/g," "),t[r][1]])}}return s}function P(n,t){const e=Object.assign({},n);for(const[s]of Object.entries(n)){const r=s;const o=t[r]!==void 0;e[r]=o?t[r]:n[r]}return e}const U={push:n=>{if(typeof window!=="undefined"){window.history.pushState(null,"",n)}},replace:n=>{if(typeof window!=="undefined"){window.history.replaceState(null,"",n)}}};const d=n=>/AppleWebKit\/[6-9]\d\d/.test(n);const O=d(!i&&navigator?.userAgent||"");const u="popstate";function j(){return i?"":window.location.search}const l=new Set;let h=false;function v(){if(h||i)return;h=true;for(const n of["pushState","replaceState"]){const t=window.history[n];window.history[n]=function e(...s){const r=t.apply(this,s);queueMicrotask(()=>{for(const o of[...l])o()});return r}}}function k(n){if(i)return()=>void 0;v();l.add(n);window.addEventListener(u,n);return()=>{l.delete(n);window.removeEventListener(u,n)}}exports.assignValue=P;exports.filterUnknown=f;exports.filterUnknownParams=m;exports.filterUnknownParamsClient=S;exports.getOtherParams=b;exports.getParams=y;exports.getSearch=j;exports.isEqual=c;exports.isPrimitive=w;exports.isSSR=i;exports.isWebKit=O;exports.isWebKitUserAgent=d;exports.popstateEv=u;exports.routerHistory=U;exports.subscribeToUrl=k;exports.typeOf=a;
|