state-in-url 4.3.3 → 5.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 +1 -1
- package/dist/next/useUrlState/useUrlState.d.ts +0 -30
- package/dist/next/useUrlState/useUrlState.mjs +1 -1
- package/dist/react-router/useUrlState/useUrlState.d.ts +0 -26
- package/dist/react-router/useUrlState/useUrlState.mjs +1 -1
- package/dist/remix/index.d.ts +1 -0
- package/dist/remix/index.mjs +1 -0
- package/dist/remix/useUrlState/index.d.ts +1 -0
- package/dist/remix/useUrlState/index.mjs +1 -0
- package/dist/remix/useUrlState/useUrlState.d.ts +82 -0
- package/dist/remix/useUrlState/useUrlState.mjs +1 -0
- package/dist/useUrlEncode/useUrlEncode.mjs +1 -1
- package/dist/utils.d.ts +1 -1
- package/package.json +42 -7
package/README.md
CHANGED
|
@@ -629,7 +629,7 @@ See [Contributing doc](CONTRIBUTING.md)
|
|
|
629
629
|
|
|
630
630
|
- [x] hook for `Next.js`
|
|
631
631
|
- [x] hook for `react-router`
|
|
632
|
-
- [
|
|
632
|
+
- [x] hook for `remix`
|
|
633
633
|
- [ ] hook for `svelte`
|
|
634
634
|
- [ ] hook for `astro`
|
|
635
635
|
- [ ] hook for store state in hash ?
|
|
@@ -1,28 +1,5 @@
|
|
|
1
1
|
import { useRouter } from "next/navigation";
|
|
2
2
|
import { type JSONCompatible } from "../../utils";
|
|
3
|
-
/**
|
|
4
|
-
* @deprecated .
|
|
5
|
-
* * use format `useUrlState(defaultState, { ...otherParams })`
|
|
6
|
-
*
|
|
7
|
-
* .
|
|
8
|
-
*/
|
|
9
|
-
export declare function useUrlState<T extends JSONCompatible>({ defaultState: T, searchParams, replace, scroll, useHistory, }: OldParams<T>): {
|
|
10
|
-
/**
|
|
11
|
-
* @deprecated use `urlState`
|
|
12
|
-
*/
|
|
13
|
-
state: T;
|
|
14
|
-
urlState: T;
|
|
15
|
-
/**
|
|
16
|
-
* @deprecated use `setState`
|
|
17
|
-
*/
|
|
18
|
-
updateState: (value: Partial<T> | ((currState: T) => T)) => void;
|
|
19
|
-
setState: (value: Partial<T> | ((currState: T) => T)) => void;
|
|
20
|
-
/**
|
|
21
|
-
* @deprecated use `setUrl`
|
|
22
|
-
*/
|
|
23
|
-
updateUrl: (value?: Partial<T> | ((currState: T) => T)) => void;
|
|
24
|
-
setUrl: (value?: Partial<T> | ((currState: T) => T)) => void;
|
|
25
|
-
};
|
|
26
3
|
/**
|
|
27
4
|
* NextJS hook. Returns `urlState`, `setState`, and `setUrl` functions
|
|
28
5
|
*
|
|
@@ -103,13 +80,6 @@ type RouterOptions = NonNullable<Parameters<Router["push"]>[1] | Parameters<Rout
|
|
|
103
80
|
interface Options extends RouterOptions {
|
|
104
81
|
replace?: boolean;
|
|
105
82
|
}
|
|
106
|
-
interface OldParams<T> {
|
|
107
|
-
defaultState: T;
|
|
108
|
-
searchParams?: object;
|
|
109
|
-
replace?: boolean;
|
|
110
|
-
scroll?: boolean;
|
|
111
|
-
useHistory?: boolean;
|
|
112
|
-
}
|
|
113
83
|
type Params = {
|
|
114
84
|
searchParams?: object;
|
|
115
85
|
replace?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import s from"react";import{useRouter as k,useSearchParams as C}from"next/navigation";import{parseSPObj as p}from"../../parseSPObj.mjs";import{useUrlStateBase as y}from"../../useUrlStateBase/useUrlStateBase.mjs";import{routerHistory as m,filterUnknownParams as f,isSSR as g,filterUnknownParamsClient as j}from"../../utils.mjs";function v(t,r){const a=r?.useHistory;const o=k();const S=s.useMemo(()=>({push:(...e)=>{if(a===void 0?true:!!a){m.push(...e)}else{o.push(...e)}},replace:(...e)=>{if(a===void 0?true:!!a){m.replace(...e)}else{o.replace(...e)}}}),[o]);const{state:h,updateState:l,updateUrl:c,reset:u,getState:P}=y(t,S,({parse:e})=>{return g?p(f(t,r?.searchParams),t):e(j(t,r?.searchParams))});const n=s.useMemo(()=>({...w,scroll:r?.scroll,replace:r?.replace}),[]);const U=s.useCallback((e,d)=>c(e,{...n,...d}),[c]);const i=C();s.useLayoutEffect(()=>{l(f(t,p(Object.fromEntries([...i.entries()]),t)))},[i]);const b=s.useCallback(e=>{u({...n,...e})},[u]);return{setState:l,setUrl:U,urlState:h,reset:b,getState:P}}const w={replace:true,scroll:false};export{v as useUrlState};
|
|
@@ -1,25 +1,5 @@
|
|
|
1
1
|
import { type NavigateOptions } from "react-router-dom";
|
|
2
2
|
import { type JSONCompatible } from "../../utils";
|
|
3
|
-
/**
|
|
4
|
-
* @deprecated .
|
|
5
|
-
* * use format `useUrlState(defaultState, { ...otherParams })`
|
|
6
|
-
*
|
|
7
|
-
* .
|
|
8
|
-
*/
|
|
9
|
-
export declare function useUrlState<T extends JSONCompatible>({ defaultState: T, searchParams, replace, useHistory, }: OldParams<T>): {
|
|
10
|
-
/**
|
|
11
|
-
* @deprecated use `urlState`
|
|
12
|
-
*/
|
|
13
|
-
state: T;
|
|
14
|
-
urlState: T;
|
|
15
|
-
/**
|
|
16
|
-
* @deprecated use `setState`
|
|
17
|
-
*/
|
|
18
|
-
updateState: (value: Partial<T> | ((currState: T) => T)) => void;
|
|
19
|
-
setState: (value: Partial<T> | ((currState: T) => T)) => void;
|
|
20
|
-
updateUrl: (value?: Partial<T> | ((currState: T) => T)) => void;
|
|
21
|
-
setUrl: (value?: Partial<T> | ((currState: T) => T)) => void;
|
|
22
|
-
};
|
|
23
3
|
/**
|
|
24
4
|
* React-router hook. Returns `urlState`, `setState`, and `setUrl` functions
|
|
25
5
|
*
|
|
@@ -94,12 +74,6 @@ export declare function useUrlState<T extends JSONCompatible>(defaultState: T, p
|
|
|
94
74
|
[key: string]: unknown;
|
|
95
75
|
}) => void;
|
|
96
76
|
};
|
|
97
|
-
type OldParams<T> = {
|
|
98
|
-
defaultState: T;
|
|
99
|
-
useHistory?: boolean;
|
|
100
|
-
searchParams?: object;
|
|
101
|
-
replace?: boolean;
|
|
102
|
-
} & NavigateOptions;
|
|
103
77
|
interface Params extends NavigateOptions {
|
|
104
78
|
useHistory?: boolean;
|
|
105
79
|
searchParams?: object;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useUrlState } from "./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
|
+
import{useUrlState as t}from"./useUrlState.mjs";export{t as useUrlState};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { type NavigateOptions } from "react-router-dom";
|
|
2
|
+
import { type JSONCompatible } from "../../utils";
|
|
3
|
+
/**
|
|
4
|
+
* Remix 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
|
+
* reset();
|
|
28
|
+
* reset({ replace: true });
|
|
29
|
+
* // same as setState(form) with setUrl(form)
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/remix/useUrlState}
|
|
33
|
+
*/
|
|
34
|
+
export declare function useUrlState<T extends JSONCompatible>(defaultState: T, params?: Params): {
|
|
35
|
+
/**
|
|
36
|
+
* State object. Don't mutate directly, use `setState` or `setUrl`
|
|
37
|
+
*/
|
|
38
|
+
urlState: T;
|
|
39
|
+
/**
|
|
40
|
+
* * Example:
|
|
41
|
+
* ```ts
|
|
42
|
+
* setState({ name: 'test' });
|
|
43
|
+
* // or
|
|
44
|
+
* setState(curr => ({ ...curr, name: 'test' }) );
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/remix/useUrlState#updatestate}
|
|
48
|
+
*/
|
|
49
|
+
setState: (value: Partial<T> | ((currState: T) => T)) => void;
|
|
50
|
+
/**
|
|
51
|
+
* * Example:
|
|
52
|
+
* ```ts
|
|
53
|
+
* setUrl({ name: 'test' });
|
|
54
|
+
* // or
|
|
55
|
+
* setUrl(curr => ({ ...curr, name: 'test' }), { replace: true } );
|
|
56
|
+
* // can pass optional React-Router `NavigateOptions`
|
|
57
|
+
* setUrl(curr => ({ ...curr, name: 'test' }), { preventScrollReset: false } );
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/remix/useUrlState#updateurl}
|
|
61
|
+
*/
|
|
62
|
+
setUrl: (value?: Partial<T> | ((currState: T) => T), options?: Params) => void;
|
|
63
|
+
/**
|
|
64
|
+
* * Example:
|
|
65
|
+
* ```ts
|
|
66
|
+
* reset();
|
|
67
|
+
* // or
|
|
68
|
+
* reset({ replace: false, preventScrollReset: false })
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* * Docs {@link https://github.com/asmyshlyaev177/state-in-url/tree/master/packages/urlstate/remix/useUrlState#reset}
|
|
72
|
+
*/
|
|
73
|
+
reset: (options?: NavigateOptions & {
|
|
74
|
+
[key: string]: unknown;
|
|
75
|
+
}) => void;
|
|
76
|
+
};
|
|
77
|
+
interface Params extends NavigateOptions {
|
|
78
|
+
useHistory?: boolean;
|
|
79
|
+
searchParams?: object;
|
|
80
|
+
replace?: boolean;
|
|
81
|
+
}
|
|
82
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import s from"react";import{useNavigate as g,useSearchParams as k,useHref as P}from"@remix-run/react";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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import r from"react";import{encodeState as
|
|
1
|
+
import r from"react";import{encodeState as s,decodeState as a}from"../encodeState/encodeState.mjs";import{typeOf as f}from"../utils.mjs";function i(e){const o=r.useCallback((t,c)=>{return f(t)==="object"?s(t,e,c):""},[e]);const n=r.useCallback(t=>a(t,e),[e]);return{parse:n,stringify:o}}export{i as useUrlEncode};
|
package/dist/utils.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export type UnknownObj = object | {
|
|
|
22
22
|
[key: string]: unknown;
|
|
23
23
|
};
|
|
24
24
|
export declare const isEqual: (val1: unknown, val2: unknown) => boolean;
|
|
25
|
-
export declare function filterUnknownParamsClient<T extends object>(shape: T, params
|
|
25
|
+
export declare function filterUnknownParamsClient<T extends object>(shape: T, params?: string | URLSearchParams | Record<string, string> | object): string;
|
|
26
26
|
export declare function filterUnknownParams<T extends object>(shape: T, searchParams?: object): T;
|
|
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;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "state-in-url",
|
|
3
|
-
"version": "
|
|
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
|
|
3
|
+
"version": "5.0.0",
|
|
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": {
|
|
7
7
|
"type": "git",
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
"packages/example-nextjs14",
|
|
31
31
|
"packages/example-nextjs15",
|
|
32
32
|
"packages/example-react",
|
|
33
|
-
"packages/example-react-router6"
|
|
33
|
+
"packages/example-react-router6",
|
|
34
|
+
"packages/example-remix2"
|
|
34
35
|
],
|
|
35
36
|
"files": [
|
|
36
37
|
"dist"
|
|
@@ -49,6 +50,10 @@
|
|
|
49
50
|
"types": "./dist/react-router/index.d.ts",
|
|
50
51
|
"default": "./dist/react-router/index.mjs"
|
|
51
52
|
},
|
|
53
|
+
"./remix": {
|
|
54
|
+
"types": "./dist/remix/index.d.ts",
|
|
55
|
+
"default": "./dist/remix/index.mjs"
|
|
56
|
+
},
|
|
52
57
|
"./encodeState": {
|
|
53
58
|
"types": "./dist/encodeState/index.d.ts",
|
|
54
59
|
"default": "./dist/encodeState/index.mjs"
|
|
@@ -80,11 +85,14 @@
|
|
|
80
85
|
"test:int": "wireit",
|
|
81
86
|
"test:int:ci": "wireit",
|
|
82
87
|
"test:exports": "npm run build && npx babel-node --extensions .js,.mjs,.ts,.mts --config-file ./babel.config.json -- ./packages/urlstate/exportsTest.ts",
|
|
88
|
+
"install:all": "npm install",
|
|
89
|
+
"install:ci": "npm ci",
|
|
83
90
|
"test": "wireit",
|
|
84
91
|
"tsc": "wireit",
|
|
85
92
|
"dev": "wireit",
|
|
86
93
|
"dev:lib": "wireit",
|
|
87
94
|
"dev:nextjs14": "wireit",
|
|
95
|
+
"dev:remix2": "wireit",
|
|
88
96
|
"bump": "npx standard-version --no-verify",
|
|
89
97
|
"build": "wireit",
|
|
90
98
|
"build:demo": "wireit",
|
|
@@ -99,7 +107,7 @@
|
|
|
99
107
|
"kill-vite": "wireit",
|
|
100
108
|
"kill": "wireit",
|
|
101
109
|
"rmdist": "rm -rf dist",
|
|
102
|
-
"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",
|
|
110
|
+
"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",
|
|
103
111
|
"reinstall": "npm run cleanup && npm install",
|
|
104
112
|
"setup": "playwright install --with-deps",
|
|
105
113
|
"prepack": "npm run build && cp package.json dist/package.json && npm run build:demo",
|
|
@@ -151,6 +159,7 @@
|
|
|
151
159
|
"dependencies": [
|
|
152
160
|
"dev:lib",
|
|
153
161
|
"dev:react",
|
|
162
|
+
"dev:remix2",
|
|
154
163
|
"dev:router6",
|
|
155
164
|
"dev:nextjs15"
|
|
156
165
|
],
|
|
@@ -176,6 +185,10 @@
|
|
|
176
185
|
"command": "cd packages/example-react-router6 && npm run dev",
|
|
177
186
|
"service": true
|
|
178
187
|
},
|
|
188
|
+
"dev:remix2": {
|
|
189
|
+
"command": "cd packages/example-remix2 && PORT=3003 npm run dev",
|
|
190
|
+
"service": true
|
|
191
|
+
},
|
|
179
192
|
"dev:nextjs14": {
|
|
180
193
|
"command": "cd packages/example-nextjs14 && npm run dev --turbo",
|
|
181
194
|
"service": true
|
|
@@ -196,6 +209,12 @@
|
|
|
196
209
|
"build"
|
|
197
210
|
]
|
|
198
211
|
},
|
|
212
|
+
"build:remix2": {
|
|
213
|
+
"command": "cd packages/example-remix2 && npm run build",
|
|
214
|
+
"dependencies": [
|
|
215
|
+
"build"
|
|
216
|
+
]
|
|
217
|
+
},
|
|
199
218
|
"build:demo": {
|
|
200
219
|
"dependencies": [
|
|
201
220
|
"build"
|
|
@@ -241,6 +260,17 @@
|
|
|
241
260
|
"command": "npx vite preview --port 5181 packages/example-react-router6",
|
|
242
261
|
"service": true
|
|
243
262
|
},
|
|
263
|
+
"start:remix2": {
|
|
264
|
+
"command": "cd packages/example-remix2 && npm run start",
|
|
265
|
+
"dependencies": [
|
|
266
|
+
"build:remix2"
|
|
267
|
+
],
|
|
268
|
+
"service": true
|
|
269
|
+
},
|
|
270
|
+
"start:remix2:ci": {
|
|
271
|
+
"command": "cd packages/example-remix2 && npm run start",
|
|
272
|
+
"service": true
|
|
273
|
+
},
|
|
244
274
|
"start:demo15": {
|
|
245
275
|
"dependencies": [
|
|
246
276
|
"build:next15"
|
|
@@ -257,7 +287,8 @@
|
|
|
257
287
|
"dependencies": [
|
|
258
288
|
"start:demo",
|
|
259
289
|
"start:react",
|
|
260
|
-
"start:router6"
|
|
290
|
+
"start:router6",
|
|
291
|
+
"start:remix2"
|
|
261
292
|
],
|
|
262
293
|
"service": true
|
|
263
294
|
},
|
|
@@ -266,7 +297,8 @@
|
|
|
266
297
|
"dependencies": [
|
|
267
298
|
"start:demo:ci",
|
|
268
299
|
"start:react:ci",
|
|
269
|
-
"start:router6:ci"
|
|
300
|
+
"start:router6:ci",
|
|
301
|
+
"start:remix2:ci"
|
|
270
302
|
],
|
|
271
303
|
"service": true
|
|
272
304
|
},
|
|
@@ -280,7 +312,8 @@
|
|
|
280
312
|
"build:react",
|
|
281
313
|
"build:demo:tests",
|
|
282
314
|
"build:next15",
|
|
283
|
-
"build:router6"
|
|
315
|
+
"build:router6",
|
|
316
|
+
"build:remix2"
|
|
284
317
|
]
|
|
285
318
|
},
|
|
286
319
|
"build:react": {
|
|
@@ -404,6 +437,8 @@
|
|
|
404
437
|
"decode",
|
|
405
438
|
"Next.js",
|
|
406
439
|
"react-router",
|
|
440
|
+
"remix",
|
|
441
|
+
"remixjs",
|
|
407
442
|
"url",
|
|
408
443
|
"url synchronization",
|
|
409
444
|
"url sync",
|