@native-router/react 1.0.2 → 1.1.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 CHANGED
@@ -77,3 +77,18 @@ See [demos](/demos/) for a complete example.
77
77
  ## Documentation
78
78
 
79
79
  [API](https://native-router.github.io/react/modules.html)
80
+
81
+ import { Router } from '@native-router/react';
82
+
83
+ const routes = [
84
+ {
85
+ path: '/admin',
86
+ children: [...]
87
+ }
88
+ ];
89
+
90
+ function App() {
91
+ return <Router routes={routes} />;
92
+ }
93
+ ```
94
+
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./server-64ccd715.cjs"),r=require("@native-router/core"),t=require("react"),o=require("react/jsx-runtime");require("history"),require("@native-router/core/util");const u=t.createContext({loading:!1});exports.HashRouter=e.HashRouter,exports.HistoryRouter=e.HistoryRouter,exports.MemoryRouter=e.MemoryRouter,exports.Router=e.Router,exports.View=e.View,exports.createRouter=e.createRouter,exports.defaultResolveView=e.resolveView,exports.resolveClientView=e.resolveClientView,exports.useData=e.useData,exports.useLoading=e.useLoading,exports.useMatched=e.useMatched,exports.useRouter=e.useRouter,exports.useView=e.useView,exports.Link=function(u){let{to:s,...n}=u;const i=e.useRouter(),c=t.useRef(!1);return o.jsx("a",{...n,href:r.createHref(i,s),onClick:function(e){e.preventDefault(),c.current||(c.current=!0,r.navigate(i,s).finally((()=>c.current=!1)))}})},exports.PrefetchLink=function(s){let{to:n,children:i,...c}=s;const a=e.useRouter(),l=t.useRef(),[f,x]=t.useState(!1),[p,v]=t.useState(),[R,d]=t.useState(),h=r.toLocation(a,n);function w(){x(!0),l.current=r.resolve(a,h).then((e=>(d(e),e))).catch((e=>{throw v(e),e})).finally((()=>x(!1)))}t.useEffect((()=>{l.current=void 0}),[n,a]);const y=t.useMemo((()=>({loading:f,error:p,view:R})),[f,p,R]);return o.jsx(u.Provider,{value:y,children:o.jsx("a",{...c,href:r.createHref(a,n),onMouseEnter:function(){l.current||w()},onClick:function(e){e.preventDefault(),l.current||w(),r.commit(a,l.current,h).finally((()=>l.current=void 0))},children:i})})},exports.usePrefetch=function(){return t.useContext(u)};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ssr-CsvbhYZu.cjs"),t=require("@native-router/core"),r=require("react"),o=require("react/jsx-runtime");const u=r.createContext({loading:!1});exports.HashRouter=e.HashRouter,exports.HistoryRouter=e.HistoryRouter,exports.MemoryRouter=e.MemoryRouter,exports.Router=e.Router,exports.View=e.View,exports.createRouter=e.createRouter,exports.defaultResolveView=e.resolveView,exports.resolveClientView=e.resolveClientView,exports.useData=e.useData,exports.useLoading=e.useLoading,exports.useMatched=e.useMatched,exports.useRouter=e.useRouter,exports.useView=e.useView,exports.Link=function({to:u,...s}){const n=e.useRouter(),i=r.useRef(!1);return o.jsx("a",{...s,href:t.createHref(n,u),onClick:function(e){e.preventDefault(),i.current||(i.current=!0,t.navigate(n,u).finally(()=>i.current=!1))}})},exports.PrefetchLink=function({to:s,children:n,...i}){const c=e.useRouter(),a=r.useRef(void 0),[l,f]=r.useState(!1),[x,p]=r.useState(),[R,d]=r.useState(),v=t.toLocation(c,s);function h(){f(!0),a.current=t.resolve(c,v).then(e=>(d(e),e)).catch(e=>{throw p(e),e}).finally(()=>f(!1))}r.useEffect(()=>{a.current=void 0},[s,c]);const w=r.useMemo(()=>({loading:l,error:x,view:R}),[l,x,R]);return o.jsx(u.Provider,{value:w,children:o.jsx("a",{...i,href:t.createHref(c,s),onMouseEnter:function(){a.current||h()},onClick:function(e){e.preventDefault(),a.current||h(),t.commit(c,a.current,v).finally(()=>a.current=void 0)},children:n})})},exports.usePrefetch=function(){return r.useContext(u)};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/components/PrefetchLink.tsx","../src/components/Link.tsx"],"sourcesContent":["import {commit, createHref, resolve, toLocation} from '@native-router/core';\nimport type {LinkProps} from '@@/types';\nimport {\n createContext,\n MouseEvent,\n ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport {useRouter} from './Router';\n\ntype PrefetchLinkContext = {loading: boolean; error?: Error; view?: ReactNode};\n\nconst Context = createContext<PrefetchLinkContext>({loading: false});\n\n/**\n * Get the prefetch context. Use for render a preview view.\n * @group Hooks\n */\nexport function usePrefetch() {\n return useContext(Context);\n}\n\n/**\n * Link support hover prefetch.\n * @param props\n * @group Components\n */\nexport default function PrefetchLink({to, children, ...rest}: LinkProps) {\n const router = useRouter();\n const viewPromiseRef = useRef<undefined | Promise<ReactNode>>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error>();\n const [view, setView] = useState<ReactNode>();\n const location = toLocation(router, to);\n\n function prefetchIt() {\n setLoading(true);\n viewPromiseRef.current = resolve(router, location)\n .then((v) => {\n setView(v);\n return v;\n })\n .catch((e) => {\n setError(e);\n throw e;\n })\n .finally(() => setLoading(false));\n }\n\n function handlePrefetch() {\n if (viewPromiseRef.current) return;\n prefetchIt();\n }\n\n function handleClick(e: MouseEvent<HTMLAnchorElement>) {\n e.preventDefault();\n if (!viewPromiseRef.current) {\n prefetchIt();\n }\n commit(router, viewPromiseRef.current!, location).finally(\n () => (viewPromiseRef.current = undefined)\n );\n }\n\n useEffect(() => {\n viewPromiseRef.current = undefined;\n }, [to, router]);\n\n const linkContext = useMemo(\n () => ({loading, error, view}),\n [loading, error, view]\n );\n\n return (\n <Context.Provider value={linkContext}>\n <a\n {...rest}\n href={createHref(router, to)}\n onMouseEnter={handlePrefetch}\n onClick={handleClick}\n >\n {children}\n </a>\n </Context.Provider>\n );\n}\n","import {createHref, navigate} from '@native-router/core';\nimport type {LinkProps} from '@@/types';\nimport {useRef, type MouseEvent} from 'react';\nimport {useRouter} from './Router';\n\n/**\n * Link for navigate in app.\n * @param props\n * @group Components\n */\nexport default function Link({to, ...rest}: LinkProps) {\n const router = useRouter();\n const lock = useRef(false);\n\n function handleClick(e: MouseEvent<HTMLAnchorElement>) {\n e.preventDefault();\n\n if (lock.current) return;\n lock.current = true;\n navigate(router, to).finally(() => (lock.current = false));\n }\n return (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a {...rest} href={createHref(router, to)} onClick={handleClick} />\n );\n}\n"],"names":["Context","createContext","loading","_ref","to","rest","router","useRouter","lock","useRef","href","createHref","onClick","e","preventDefault","current","navigate","finally","children","viewPromiseRef","setLoading","useState","error","setError","view","setView","location","toLocation","prefetchIt","resolve","then","v","catch","useEffect","undefined","linkContext","useMemo","_jsx","Provider","value","onMouseEnter","useContext"],"mappings":"mQAgBA,MAAMA,EAA6CC,EAAAA,cAAA,CAACC,SAAS,obCN7D,SAA4BC,GAAC,IAAAC,GAACA,KAAOC,GAAgBF,EACnD,MAAMG,EAASC,EAAAA,YACTC,EAAOC,UAAO,GASpB,aAEE,IAAA,IAAOJ,EAAMK,KAAMC,EAAAA,WAAWL,EAAQF,GAAKQ,QAT7C,SAAqBC,GACnBA,EAAEC,iBAEEN,EAAKO,UACTP,EAAKO,SAAU,EACfC,WAASV,EAAQF,GAAIa,SAAQ,IAAOT,EAAKO,SAAU,IACrD,GAKF,uBDMA,SAAoCZ,GAAC,IAAAC,GAACA,EAAAA,SAAIc,KAAab,GAAgBF,EACrE,MAAMG,EAASC,EAAAA,YACTY,EAAiBV,EAAAA,UAChBP,EAASkB,GAAcC,YAAS,IAChCC,EAAOC,GAAYF,EAAgBA,YACnCG,EAAMC,GAAWJ,EAAoBA,WACtCK,EAAWC,EAAAA,WAAWrB,EAAQF,GAEpC,SAASwB,IACPR,GAAW,GACXD,EAAeJ,QAAUc,UAAQvB,EAAQoB,GACtCI,MAAYC,IACXN,EAAQM,GACDA,KAERC,OAAanB,IAENA,MADNU,EAASV,GACHA,CAAAA,IAEPI,SAAQ,IAAMG,GAAW,IAC9B,CAiBAa,EAAAA,WAAU,KACRd,EAAeJ,aAAUmB,CAAAA,GACxB,CAAC9B,EAAIE,IAEF6B,MAAAA,EAAcC,EAAAA,SAClB,KAAO,CAAClC,UAASoB,QAAOE,UACxB,CAACtB,EAASoB,EAAOE,IAIjBa,OAAAA,EAAAA,IAACrC,EAAQsC,SAAQ,CAACC,MAAOJ,EAAYjB,eACnC,IAAA,IACMb,EACJK,KAAMC,EAAAA,WAAWL,EAAQF,GACzBoC,aA7BN,WACMrB,EAAeJ,SACRa,GACb,EA2BMhB,QAzBN,SAAqBC,GACnBA,EAAEC,iBACGK,EAAeJ,SACPa,IAENtB,EAAAA,OAAAA,EAAQa,EAAeJ,QAAUW,GAAUT,SAChD,IAAOE,EAAeJ,aAAUmB,GAEpC,EAiB2BhB,cAM7B,sBAnEO,WACL,OAAOuB,EAAAA,WAAWzC,EACpB"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/components/PrefetchLink.tsx","../src/components/Link.tsx"],"sourcesContent":["import {commit, createHref, resolve, toLocation} from '@native-router/core';\nimport type {LinkProps} from '@@/types';\nimport {\n createContext,\n MouseEvent,\n ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport {useRouter} from './Router';\n\ntype PrefetchLinkContext = {loading: boolean; error?: Error; view?: ReactNode};\n\nconst Context = createContext<PrefetchLinkContext>({loading: false});\n\n/**\n * Get the prefetch context. Use for render a preview view.\n * @group Hooks\n */\nexport function usePrefetch() {\n return useContext(Context);\n}\n\n/**\n * Link support hover prefetch.\n * @param props\n * @group Components\n */\nexport default function PrefetchLink({to, children, ...rest}: LinkProps) {\n const router = useRouter();\n const viewPromiseRef = useRef<undefined | Promise<ReactNode>>(undefined);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error>();\n const [view, setView] = useState<ReactNode>();\n const location = toLocation(router, to);\n\n function prefetchIt() {\n setLoading(true);\n viewPromiseRef.current = resolve(router, location)\n .then((v) => {\n setView(v);\n return v;\n })\n .catch((e) => {\n setError(e);\n throw e;\n })\n .finally(() => setLoading(false));\n }\n\n function handlePrefetch() {\n if (viewPromiseRef.current) return;\n prefetchIt();\n }\n\n function handleClick(e: MouseEvent<HTMLAnchorElement>) {\n e.preventDefault();\n if (!viewPromiseRef.current) {\n prefetchIt();\n }\n commit(router, viewPromiseRef.current!, location).finally(\n () => (viewPromiseRef.current = undefined)\n );\n }\n\n useEffect(() => {\n viewPromiseRef.current = undefined;\n }, [to, router]);\n\n const linkContext = useMemo(\n () => ({loading, error, view}),\n [loading, error, view]\n );\n\n return (\n <Context.Provider value={linkContext}>\n <a\n {...rest}\n href={createHref(router, to)}\n onMouseEnter={handlePrefetch}\n onClick={handleClick}\n >\n {children}\n </a>\n </Context.Provider>\n );\n}\n","import {createHref, navigate} from '@native-router/core';\nimport type {LinkProps} from '@@/types';\nimport {useRef, type MouseEvent} from 'react';\nimport {useRouter} from './Router';\n\n/**\n * Link for navigate in app.\n * @param props\n * @group Components\n */\nexport default function Link({to, ...rest}: LinkProps) {\n const router = useRouter();\n const lock = useRef(false);\n\n function handleClick(e: MouseEvent<HTMLAnchorElement>) {\n e.preventDefault();\n\n if (lock.current) return;\n lock.current = true;\n navigate(router, to).finally(() => (lock.current = false));\n }\n return (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a {...rest} href={createHref(router, to)} onClick={handleClick} />\n );\n}\n"],"names":["Context","createContext","loading","to","rest","router","useRouter","lock","useRef","href","createHref","onClick","e","preventDefault","current","navigate","finally","children","viewPromiseRef","setLoading","useState","error","setError","view","setView","location","toLocation","prefetchIt","resolve","then","v","catch","useEffect","undefined","linkContext","useMemo","_jsx","Provider","value","onMouseEnter","commit","useContext"],"mappings":"yMAgBA,MAAMA,EAAUC,EAAAA,cAAmC,CAACC,SAAS,obCN7D,UAA6BC,GAACA,KAAOC,IACnC,MAAMC,EAASC,EAAAA,YACTC,EAAOC,EAAAA,QAAO,GASpB,aAEE,IAAA,IAAOJ,EAAMK,KAAMC,EAAAA,WAAWL,EAAQF,GAAKQ,QAT7C,SAAqBC,GACnBA,EAAEC,iBAEEN,EAAKO,UACTP,EAAKO,SAAU,EACfC,EAAAA,SAASV,EAAQF,GAAIa,QAAQ,IAAOT,EAAKO,SAAU,GACrD,GAKF,uBDMA,UAAqCX,GAACA,EAAAA,SAAIc,KAAab,IACrD,MAAMC,EAASC,EAAAA,YACTY,EAAiBV,EAAAA,gBAChBN,EAASiB,GAAcC,EAAAA,UAAS,IAChCC,EAAOC,GAAYF,cACnBG,EAAMC,GAAWJ,aAClBK,EAAWC,EAAAA,WAAWrB,EAAQF,GAEpC,SAASwB,IACPR,GAAW,GACXD,EAAeJ,QAAUc,UAAQvB,EAAQoB,GACtCI,KAAMC,IACLN,EAAQM,GACDA,IAERC,MAAOnB,IAEN,MADAU,EAASV,GACHA,IAEPI,QAAQ,IAAMG,GAAW,GAC9B,CAiBAa,EAAAA,UAAU,KACRd,EAAeJ,aAAUmB,GACxB,CAAC9B,EAAIE,IAER,MAAM6B,EAAcC,EAAAA,QAClB,KAAA,CAAQjC,UAASmB,QAAOE,SACxB,CAACrB,EAASmB,EAAOE,IAGnB,OACEa,EAAAA,IAACpC,EAAQqC,SAAQ,CAACC,MAAOJ,EAAYjB,eACnC,IAAA,IACMb,EACJK,KAAMC,EAAAA,WAAWL,EAAQF,GACzBoC,aA7BN,WACMrB,EAAeJ,SACnBa,GACF,EA2BMhB,QAzBN,SAAqBC,GACnBA,EAAEC,iBACGK,EAAeJ,SAClBa,IAEFa,SAAOnC,EAAQa,EAAeJ,QAAUW,GAAUT,QAChD,IAAOE,EAAeJ,eAE1B,EAiB2BG,cAM7B,sBAnEO,WACL,OAAOwB,EAAAA,WAAWzC,EACpB"}
package/dist/index.js CHANGED
@@ -1,94 +1,5 @@
1
- import { u as useRouter } from './server-ce7b3571.js';
2
- export { g as HashRouter, H as HistoryRouter, M as MemoryRouter, R as Router, V as View, f as createRouter, r as defaultResolveView, e as resolveClientView, b as useData, c as useLoading, d as useMatched, a as useView } from './server-ce7b3571.js';
3
- import { createHref, navigate, toLocation, commit, resolve } from '@native-router/core';
4
- import { useRef, useState, useEffect, useMemo, createContext, useContext } from 'react';
5
- import { jsx } from 'react/jsx-runtime';
6
- import 'history';
7
- import '@native-router/core/util';
8
-
9
- function Link(_ref) {
10
- let {
11
- to,
12
- ...rest
13
- } = _ref;
14
- const router = useRouter();
15
- const lock = useRef(false);
16
- function handleClick(e) {
17
- e.preventDefault();
18
- if (lock.current)
19
- return;
20
- lock.current = true;
21
- navigate(router, to).finally(() => lock.current = false);
22
- }
23
- return (
24
- // eslint-disable-next-line jsx-a11y/anchor-has-content
25
- /* @__PURE__ */ jsx("a", {
26
- ...rest,
27
- href: createHref(router, to),
28
- onClick: handleClick
29
- })
30
- );
31
- }
32
-
33
- const Context = /* @__PURE__ */ createContext({
34
- loading: false
35
- });
36
- function usePrefetch() {
37
- return useContext(Context);
38
- }
39
- function PrefetchLink(_ref) {
40
- let {
41
- to,
42
- children,
43
- ...rest
44
- } = _ref;
45
- const router = useRouter();
46
- const viewPromiseRef = useRef();
47
- const [loading, setLoading] = useState(false);
48
- const [error, setError] = useState();
49
- const [view, setView] = useState();
50
- const location = toLocation(router, to);
51
- function prefetchIt() {
52
- setLoading(true);
53
- viewPromiseRef.current = resolve(router, location).then((v) => {
54
- setView(v);
55
- return v;
56
- }).catch((e) => {
57
- setError(e);
58
- throw e;
59
- }).finally(() => setLoading(false));
60
- }
61
- function handlePrefetch() {
62
- if (viewPromiseRef.current)
63
- return;
64
- prefetchIt();
65
- }
66
- function handleClick(e) {
67
- e.preventDefault();
68
- if (!viewPromiseRef.current) {
69
- prefetchIt();
70
- }
71
- commit(router, viewPromiseRef.current, location).finally(() => viewPromiseRef.current = void 0);
72
- }
73
- useEffect(() => {
74
- viewPromiseRef.current = void 0;
75
- }, [to, router]);
76
- const linkContext = useMemo(() => ({
77
- loading,
78
- error,
79
- view
80
- }), [loading, error, view]);
81
- return /* @__PURE__ */ jsx(Context.Provider, {
82
- value: linkContext,
83
- children: /* @__PURE__ */ jsx("a", {
84
- ...rest,
85
- href: createHref(router, to),
86
- onMouseEnter: handlePrefetch,
87
- onClick: handleClick,
88
- children
89
- })
90
- });
91
- }
92
-
93
- export { Link, PrefetchLink, usePrefetch, useRouter };
1
+ import{u as r}from"./ssr-CiHFLO3B.js";export{H as HashRouter,a as HistoryRouter,M as MemoryRouter,R as Router,V as View,c as createRouter,b as defaultResolveView,d as resolveClientView,e as useData,f as useLoading,g as useMatched,h as useView}from"./ssr-CiHFLO3B.js";import{createHref as t,navigate as n,toLocation as o,commit as u,resolve as i}from"@native-router/core";import{useRef as s,useState as l,useEffect as m,useMemo as v,createContext as p,useContext as w}from"react";import{jsx as y}from"react/jsx-runtime";function j({to:e,...o}){const u=r(),a=s(!1);
2
+ /* @__PURE__ */
3
+ return y("a",{...o,href:t(u,e),onClick:function(r){r.preventDefault(),a.current||(a.current=!0,n(u,e).finally(()=>a.current=!1))}})}const x=/* @__PURE__ */p({loading:!1});function C(){return w(x)}function D({to:e,children:n,...a}){const c=r(),f=s(void 0),[d,h]=l(!1),[p,R]=l(),[w,V]=l(),g=o(c,e);function M(){h(!0),f.current=i(c,g).then(r=>(V(r),r)).catch(r=>{throw R(r),r}).finally(()=>h(!1))}m(()=>{f.current=void 0},[e,c]);const j=v(()=>({loading:d,error:p,view:w}),[d,p,w]);/* @__PURE__ */
4
+ return y(x.Provider,{value:j,children:/* @__PURE__ */y("a",{...a,href:t(c,e),onMouseEnter:function(){f.current||M()},onClick:function(r){r.preventDefault(),f.current||M(),u(c,f.current,g).finally(()=>f.current=void 0)},children:n})})}export{j as Link,D as PrefetchLink,C as usePrefetch,r as useRouter};
94
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/Link.tsx","../src/components/PrefetchLink.tsx"],"sourcesContent":["import {createHref, navigate} from '@native-router/core';\nimport type {LinkProps} from '@@/types';\nimport {useRef, type MouseEvent} from 'react';\nimport {useRouter} from './Router';\n\n/**\n * Link for navigate in app.\n * @param props\n * @group Components\n */\nexport default function Link({to, ...rest}: LinkProps) {\n const router = useRouter();\n const lock = useRef(false);\n\n function handleClick(e: MouseEvent<HTMLAnchorElement>) {\n e.preventDefault();\n\n if (lock.current) return;\n lock.current = true;\n navigate(router, to).finally(() => (lock.current = false));\n }\n return (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a {...rest} href={createHref(router, to)} onClick={handleClick} />\n );\n}\n","import {commit, createHref, resolve, toLocation} from '@native-router/core';\nimport type {LinkProps} from '@@/types';\nimport {\n createContext,\n MouseEvent,\n ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport {useRouter} from './Router';\n\ntype PrefetchLinkContext = {loading: boolean; error?: Error; view?: ReactNode};\n\nconst Context = createContext<PrefetchLinkContext>({loading: false});\n\n/**\n * Get the prefetch context. Use for render a preview view.\n * @group Hooks\n */\nexport function usePrefetch() {\n return useContext(Context);\n}\n\n/**\n * Link support hover prefetch.\n * @param props\n * @group Components\n */\nexport default function PrefetchLink({to, children, ...rest}: LinkProps) {\n const router = useRouter();\n const viewPromiseRef = useRef<undefined | Promise<ReactNode>>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error>();\n const [view, setView] = useState<ReactNode>();\n const location = toLocation(router, to);\n\n function prefetchIt() {\n setLoading(true);\n viewPromiseRef.current = resolve(router, location)\n .then((v) => {\n setView(v);\n return v;\n })\n .catch((e) => {\n setError(e);\n throw e;\n })\n .finally(() => setLoading(false));\n }\n\n function handlePrefetch() {\n if (viewPromiseRef.current) return;\n prefetchIt();\n }\n\n function handleClick(e: MouseEvent<HTMLAnchorElement>) {\n e.preventDefault();\n if (!viewPromiseRef.current) {\n prefetchIt();\n }\n commit(router, viewPromiseRef.current!, location).finally(\n () => (viewPromiseRef.current = undefined)\n );\n }\n\n useEffect(() => {\n viewPromiseRef.current = undefined;\n }, [to, router]);\n\n const linkContext = useMemo(\n () => ({loading, error, view}),\n [loading, error, view]\n );\n\n return (\n <Context.Provider value={linkContext}>\n <a\n {...rest}\n href={createHref(router, to)}\n onMouseEnter={handlePrefetch}\n onClick={handleClick}\n >\n {children}\n </a>\n </Context.Provider>\n );\n}\n"],"names":["Link","_ref","to","rest","router","useRouter","lock","useRef","handleClick","e","preventDefault","current","navigate","finally","href","createHref","onClick","Context","loading","usePrefetch","useContext","PrefetchLink","children","viewPromiseRef","setLoading","useState","error","setError","view","setView","location","toLocation","prefetchIt","resolve","then","v","catch","handlePrefetch","commit","undefined","useEffect","linkContext","useMemo","_jsx","Provider","value","onMouseEnter"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/components/Link.tsx","../src/components/PrefetchLink.tsx"],"sourcesContent":["import {createHref, navigate} from '@native-router/core';\nimport type {LinkProps} from '@@/types';\nimport {useRef, type MouseEvent} from 'react';\nimport {useRouter} from './Router';\n\n/**\n * Link for navigate in app.\n * @param props\n * @group Components\n */\nexport default function Link({to, ...rest}: LinkProps) {\n const router = useRouter();\n const lock = useRef(false);\n\n function handleClick(e: MouseEvent<HTMLAnchorElement>) {\n e.preventDefault();\n\n if (lock.current) return;\n lock.current = true;\n navigate(router, to).finally(() => (lock.current = false));\n }\n return (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a {...rest} href={createHref(router, to)} onClick={handleClick} />\n );\n}\n","import {commit, createHref, resolve, toLocation} from '@native-router/core';\nimport type {LinkProps} from '@@/types';\nimport {\n createContext,\n MouseEvent,\n ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport {useRouter} from './Router';\n\ntype PrefetchLinkContext = {loading: boolean; error?: Error; view?: ReactNode};\n\nconst Context = createContext<PrefetchLinkContext>({loading: false});\n\n/**\n * Get the prefetch context. Use for render a preview view.\n * @group Hooks\n */\nexport function usePrefetch() {\n return useContext(Context);\n}\n\n/**\n * Link support hover prefetch.\n * @param props\n * @group Components\n */\nexport default function PrefetchLink({to, children, ...rest}: LinkProps) {\n const router = useRouter();\n const viewPromiseRef = useRef<undefined | Promise<ReactNode>>(undefined);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error>();\n const [view, setView] = useState<ReactNode>();\n const location = toLocation(router, to);\n\n function prefetchIt() {\n setLoading(true);\n viewPromiseRef.current = resolve(router, location)\n .then((v) => {\n setView(v);\n return v;\n })\n .catch((e) => {\n setError(e);\n throw e;\n })\n .finally(() => setLoading(false));\n }\n\n function handlePrefetch() {\n if (viewPromiseRef.current) return;\n prefetchIt();\n }\n\n function handleClick(e: MouseEvent<HTMLAnchorElement>) {\n e.preventDefault();\n if (!viewPromiseRef.current) {\n prefetchIt();\n }\n commit(router, viewPromiseRef.current!, location).finally(\n () => (viewPromiseRef.current = undefined)\n );\n }\n\n useEffect(() => {\n viewPromiseRef.current = undefined;\n }, [to, router]);\n\n const linkContext = useMemo(\n () => ({loading, error, view}),\n [loading, error, view]\n );\n\n return (\n <Context.Provider value={linkContext}>\n <a\n {...rest}\n href={createHref(router, to)}\n onMouseEnter={handlePrefetch}\n onClick={handleClick}\n >\n {children}\n </a>\n </Context.Provider>\n );\n}\n"],"names":["Link","to","rest","router","useRouter","lock","useRef","href","createHref","onClick","e","preventDefault","current","navigate","finally","Context","createContext","loading","usePrefetch","useContext","PrefetchLink","children","viewPromiseRef","setLoading","useState","error","setError","view","setView","location","toLocation","prefetchIt","resolve","then","v","catch","useEffect","undefined","linkContext","useMemo","_jsx","Provider","value","onMouseEnter","commit"],"mappings":"ugBAUA,SAAwBA,GAAKC,GAACA,KAAOC,IACnC,MAAMC,EAASC,IACTC,EAAOC,GAAO;;AASpB,SAEE,IAAA,IAAOJ,EAAMK,KAAMC,EAAWL,EAAQF,GAAKQ,QAT7C,SAAqBC,GACnBA,EAAEC,iBAEEN,EAAKO,UACTP,EAAKO,SAAU,EACfC,EAASV,EAAQF,GAAIa,QAAQ,IAAOT,EAAKO,SAAU,GACrD,GAKF,CCTA,MAAMG,iBAAUC,EAAmC,CAACC,SAAS,IAMtD,SAASC,IACd,OAAOC,EAAWJ,EACpB,CAOA,SAAwBK,GAAanB,GAACA,EAAAA,SAAIoB,KAAanB,IACrD,MAAMC,EAASC,IACTkB,EAAiBhB,WAChBW,EAASM,GAAcC,GAAS,IAChCC,EAAOC,GAAYF,KACnBG,EAAMC,GAAWJ,IAClBK,EAAWC,EAAW3B,EAAQF,GAEpC,SAAS8B,IACPR,GAAW,GACXD,EAAeV,QAAUoB,EAAQ7B,EAAQ0B,GACtCI,KAAMC,IACLN,EAAQM,GACDA,IAERC,MAAOzB,IAEN,MADAgB,EAAShB,GACHA,IAEPI,QAAQ,IAAMS,GAAW,GAC9B,CAiBAa,EAAU,KACRd,EAAeV,aAAUyB,GACxB,CAACpC,EAAIE,IAER,MAAMmC,EAAcC,EAClB,KAAA,CAAQtB,UAASQ,QAAOE,SACxB,CAACV,EAASQ,EAAOE;AAGnB,OACEa,EAACzB,EAAQ0B,SAAQ,CAACC,MAAOJ,EAAYjB,0BACnC,IAAA,IACMnB,EACJK,KAAMC,EAAWL,EAAQF,GACzB0C,aA7BN,WACMrB,EAAeV,SACnBmB,GACF,EA2BMtB,QAzBN,SAAqBC,GACnBA,EAAEC,iBACGW,EAAeV,SAClBmB,IAEFa,EAAOzC,EAAQmB,EAAeV,QAAUiB,GAAUf,QAChD,IAAOQ,EAAeV,eAE1B,EAiB2BS,cAM7B"}
package/dist/server.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./server-64ccd715.cjs");require("history"),require("@native-router/core"),require("@native-router/core/util"),require("react"),require("react/jsx-runtime"),exports.resolveServerView=e.resolveServerView;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ssr-CsvbhYZu.cjs");exports.resolveServerView=e.resolveServerView;
2
2
  //# sourceMappingURL=server.cjs.map
File without changes
package/dist/server.js CHANGED
@@ -1,7 +1,2 @@
1
- export { h as resolveServerView } from './server-ce7b3571.js';
2
- import 'history';
3
- import '@native-router/core';
4
- import '@native-router/core/util';
5
- import 'react';
6
- import 'react/jsx-runtime';
1
+ export{r as resolveServerView}from"./ssr-CiHFLO3B.js";
7
2
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
1
+ {"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import{createMemoryHistory as n,createBrowserHistory as t,createHashHistory as r}from"history";import{getCurrentView as e,listen as i,create as o,setOptions as u,resolve as a,toLocation as c}from"@native-router/core";import{splitProps as s,uniqId as l,isString as d}from"@native-router/core/util";import{useContext as f,createContext as h,useMemo as m,useState as v,useEffect as p}from"react";import{jsx as y,jsxs as P,Fragment as g}from"react/jsx-runtime";const w=/* @__PURE__ */h(null);function b(n){/* @__PURE__ */
2
+ return y(w.Provider,{...n})}function x(){return f(w)}function A(){return x()}const E=/* @__PURE__ */h([void 0,{}]);function K(){return f(E)}function R({children:n,name:t,data:r}){const e=K()[1],i=m(()=>[r,t?{...e,[t]:r}:e],[r,t,e]);/* @__PURE__ */
3
+ return y(E.Provider,{value:i,children:n})}const S=/* @__PURE__ */h(void 0);function j(){return f(S)}function k(n){const[t,r]=K();return n?r[n]:t}const H=/* @__PURE__ */h(void 0);function I(){return f(H)}function M(n,t){return _(n,t,(n,t)=>n?.(t))}const O=/* @__PURE__ */new WeakMap;function V(n,t){const r=new Array(n.length);return _(n,t,(n,t)=>Promise.resolve(n?.(t)).then(n=>r[t.index]=n)).then(n=>(O.set(n,r),n))}function _(n,{router:t,location:r},e){return Promise.all(n.map(({params:i,route:o},u)=>{const a={matched:n,params:i,index:u,router:t,location:r};return Promise.all([e(o.data,a),function(){if(!o.component)return A;const n=o.component(a);return Promise.resolve(n).then(n=>"default"in n?n.default:n)}()]).then(([n,t])=>/* @__PURE__ */y(R,{data:n,name:o.name,children:/* @__PURE__ */y(S.Provider,{value:a,children:/* @__PURE__ */y(t,{})})}))})).then(n=>n.reverse().reduce((n,t)=>/* @__PURE__ */y(b,{value:n,children:t})))}const L=/* @__PURE__ */h(null);function W({router:n,children:t}){const[r,o]=v(e(n));return p(()=>i(n,o),[n]),/* @__PURE__ */y(L.Provider,{value:n,children:"undefined"===t?r:/* @__PURE__ */y(b,{value:r,children:t})})}function $(n,t,{resolveView:r=M,...e}={}){return o(n,t,r,e)}function C({routes:n,children:t,...r},e){const[i,o]=s(r,["baseUrl","currentView"]),a=m(()=>$(n,e(),i),[n,e,...Object.keys(i),...Object.values(i)]),[c,d]=v();u(a,{...o,onLoadingChange(n){d(n&&{key:l(),status:n})}});const f=m(()=>/* @__PURE__ */y(W,{router:a,children:t}),[a,t]);/* @__PURE__ */
4
+ return y(H.Provider,{value:c,children:f})}function D(n){return C(n,t)}function J(n){return C(n,r)}function N({initialEntries:t,initialIndex:r,...e}){return C(e,m(()=>()=>n({initialEntries:t,initialIndex:r}),[t,r]))}function T(){return f(L)}const U="_nativeRouterReactSSRData";function q(n,t,r){return a(n,t).then(e=>{const i=function(n){return O.get(n)}(e);/* @__PURE__ */
5
+ return P(g,{children:[/* @__PURE__ */y(W,{router:n,children:e}),/* @__PURE__ */y("script",{...r?.scriptAttributes,suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:`window.${r?.hydrateKey||U} = ${JSON.stringify({data:i,location:t})};`}})]})})}function z(t,r,{scriptAttributes:e,hydrateKey:i,...u}={}){const a=o(t,n({initialEntries:[r]}),V,u);return q(a,d(r)?c(a,r):r,{scriptAttributes:e,hydrateKey:i})}function B(t,r){const{data:e,location:i}=window[r?.hydrateKey||U],u=o(t,n({initialEntries:[i]}),function(n){return(t,r)=>_(t,r,(t,r)=>n[r.index])}(e),r);return a(u,i)}export{J as H,N as M,W as R,A as V,D as a,M as b,$ as c,B as d,k as e,I as f,j as g,x as h,z as r,T as u};
6
+ //# sourceMappingURL=ssr-CiHFLO3B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssr-CiHFLO3B.js","sources":["../src/context.tsx","../src/resolve-view.tsx","../src/components/Router.tsx","../src/ssr.tsx"],"sourcesContent":["import {createContext, ReactNode, useContext, useMemo} from 'react';\nimport type {Context, LoadStatus, Route} from './types';\n\nconst ViewContext = createContext<ReactNode>(null);\n\nexport function ViewProvider(props: {children: ReactNode; value: ReactNode}) {\n return <ViewContext.Provider {...props} />;\n}\n\n/**\n * @group Hooks\n * @see {@link View View Component}\n */\nexport function useView() {\n return useContext(ViewContext);\n}\n\n/**\n * Used for route component to render child route component.\n * It just render the return of {@link useView}\n * @group Components\n */\nexport function View() {\n return useView();\n}\n\nconst DataContext = createContext<[any, Record<string, any>]>([undefined, {}]);\n\nfunction useDataContext() {\n return useContext(DataContext);\n}\n\n/**\n * @group Hooks\n */\nexport function useNamedData() {\n return useDataContext()[1];\n}\n\nexport function DataProvider({\n children,\n name,\n data\n}: {\n children: ReactNode;\n data: any;\n name?: string;\n}) {\n const namedData = useNamedData();\n const value = useMemo(\n () => [data, name ? {...namedData, [name]: data} : namedData] as [any, any],\n [data, name, namedData]\n );\n return <DataContext.Provider value={value}>{children}</DataContext.Provider>;\n}\n\nexport const MatchedContext = createContext<Context<Route> | undefined>(\n undefined\n);\n\n/**\n * @group Hooks\n */\nexport function useMatched() {\n return useContext(MatchedContext)!;\n}\n\n/**\n * @group Hooks\n */\nexport function useData(name?: string) {\n const [data, namedData] = useDataContext();\n return name ? namedData[name] : data;\n}\n\nexport const LoadingContext = createContext<LoadStatus | undefined>(undefined);\n\n/**\n * @group Hooks\n */\nexport function useLoading() {\n return useContext(LoadingContext);\n}\n","import type {ComponentType, ReactElement} from 'react';\nimport type {Context, ResolveViewContext, Route} from '@@/types';\nimport type {Matched} from '@native-router/core';\nimport {DataProvider, MatchedContext, View, ViewProvider} from './context';\n\n/**\n * The default implementation of resolve view\n * @param matched the matched result\n * @param viewContext resolved view context\n * @returns the resolve view\n * @see {@link create router->create}\n */\nexport default function resolveView(\n matched: Matched<Route>[],\n ctx: ResolveViewContext<Route>\n) {\n return resolveViewBase(matched, ctx, (data, dataCtx) => data?.(dataCtx));\n}\n\nconst viewDataMap = new WeakMap<ReactElement, any[]>();\n\nexport function resolveViewServer(\n matched: Matched<Route>[],\n ctx: ResolveViewContext<Route>\n) {\n const dataResults = new Array(matched.length);\n return resolveViewBase(matched, ctx, (data, dataCtx) =>\n Promise.resolve(data?.(dataCtx)).then(\n (result) => (dataResults[dataCtx.index] = result)\n )\n ).then((view) => {\n viewDataMap.set(view, dataResults);\n return view;\n });\n}\n\nexport function createHydrateResolveView(data: any[]) {\n return (matched: Matched<Route>[], ctx: ResolveViewContext<Route>) =>\n resolveViewBase(matched, ctx, (_, dataCtx) => data[dataCtx.index]);\n}\n\nexport function getViewData(view: ReactElement) {\n return viewDataMap.get(view);\n}\n\nfunction resolveViewBase(\n matched: Matched<Route>[],\n {router, location}: ResolveViewContext<Route>,\n resolveData: (\n dataFetcher: ((ctx: Context<Route>) => any) | undefined,\n ctx: Context<Route>\n ) => any\n) {\n return Promise.all(\n matched.map(({params, route}, index) => {\n const ctx = {\n matched: matched!,\n params,\n index,\n router,\n location\n };\n function resolveComponent(): ComponentType | Promise<ComponentType> {\n if (!route.component) return View;\n const r = route.component(ctx);\n return Promise.resolve(r).then((m) => ('default' in m ? m.default : m));\n }\n\n return Promise.all([\n resolveData(route.data, ctx),\n resolveComponent()\n ]).then(([data, C]) => (\n <DataProvider data={data} name={route.name}>\n <MatchedContext.Provider value={ctx}>\n <C />\n </MatchedContext.Provider>\n </DataProvider>\n ));\n })\n ).then((views) =>\n views\n .reverse()\n .reduce((acc, view) => <ViewProvider value={acc}>{view}</ViewProvider>)\n );\n}\n","import {\n ReactNode,\n createContext,\n useContext,\n useEffect,\n useState,\n useMemo\n} from 'react';\nimport {\n History,\n createBrowserHistory,\n createHashHistory,\n createMemoryHistory,\n MemoryHistoryOptions\n} from 'history';\nimport type {LoadStatus, Route} from '@@/types';\nimport {LoadingContext, ViewProvider} from '@@/context';\nimport {create, getCurrentView, listen, setOptions} from '@native-router/core';\nimport type {Options, ResolveView, RouterInstance} from '@native-router/core';\nimport {splitProps, uniqId} from '@native-router/core/util';\nimport defaultResolve from '@@/resolve-view';\n\nconst RouterContext = createContext<RouterInstance<Route, ReactNode> | null>(\n null\n);\n\ntype Props = {\n children: ReactNode;\n routes: Route[] | Route;\n resolveView?: typeof defaultResolve;\n} & Omit<Options<ReactNode>, 'onLoadingChange'>;\n\n/**\n * Base Router Component.\n * @group Components\n */\nexport function Router({\n router,\n children\n}: {\n children: ReactNode;\n router: RouterInstance<Route, ReactNode>;\n}) {\n const [view, setView] = useState<ReactNode>(getCurrentView(router));\n\n useEffect(() => listen(router, setView), [router]);\n return (\n <RouterContext.Provider value={router}>\n {children === 'undefined' ? (\n view\n ) : (\n <ViewProvider value={view}>{children}</ViewProvider>\n )}\n </RouterContext.Provider>\n );\n}\n\nexport function createRouter(\n routes: Route | Route[],\n history: History,\n {\n resolveView = defaultResolve,\n ...options\n }: Options<ReactNode> & {resolveView?: ResolveView<Route, ReactNode>} = {}\n): RouterInstance<Route, ReactNode> {\n return create(routes, history, resolveView, options);\n}\n\nfunction useNewRouter(\n {routes, children, ...options}: Props,\n createHistory: () => History\n) {\n const [tracked, rest] = splitProps(options, ['baseUrl', 'currentView']);\n const router = useMemo(\n () => createRouter(routes, createHistory(), tracked),\n [routes, createHistory, ...Object.keys(tracked), ...Object.values(tracked)]\n );\n\n const [loading, setLoading] = useState<LoadStatus>();\n setOptions(router, {\n ...rest,\n onLoadingChange(status) {\n setLoading(status && {key: uniqId(), status});\n }\n });\n\n const r = useMemo(\n () => <Router router={router}>{children}</Router>,\n [router, children]\n );\n\n return <LoadingContext.Provider value={loading}>{r}</LoadingContext.Provider>;\n}\n\n/**\n * History mode Router Component.\n * @group Components\n */\nexport function HistoryRouter(props: Props) {\n return useNewRouter(props, createBrowserHistory);\n}\n\n/**\n * Hash mode Router Component.\n * @group Components\n */\nexport function HashRouter(props: Props) {\n return useNewRouter(props, createHashHistory);\n}\n\n/**\n * Memory mode Router Component.\n * @group Components\n */\nexport function MemoryRouter({\n initialEntries,\n initialIndex,\n ...props\n}: Props & MemoryHistoryOptions) {\n const createHistory = useMemo(\n () => () => createMemoryHistory({initialEntries, initialIndex}),\n [initialEntries, initialIndex]\n );\n return useNewRouter(props, createHistory);\n}\n\n/**\n * Get Router instance.\n * @group Hooks\n * @returns Router Instance\n */\nexport function useRouter() {\n return useContext(RouterContext)!;\n}\n","import {createMemoryHistory} from 'history';\nimport {ReactElement, ReactNode} from 'react';\nimport {create, resolve, toLocation} from '@native-router/core';\nimport type {Location, Options, RouterInstance} from '@native-router/core';\nimport {isString} from '@native-router/core/util';\nimport {Router} from './components/Router';\nimport {\n createHydrateResolveView,\n getViewData,\n resolveViewServer\n} from './resolve-view';\nimport type {Route} from './types';\n\nconst defaultHydrateKey = '_nativeRouterReactSSRData';\n\nexport function resolveServerViewBase(\n router: RouterInstance<Route, ReactNode>,\n location: Location,\n options?: {\n scriptAttributes?: Record<string, string>;\n hydrateKey?: string;\n }\n) {\n return resolve<Route, ReactNode>(router, location).then((view) => {\n const data = getViewData(view as ReactElement);\n return (\n <>\n <Router router={router}>{view}</Router>\n <script\n {...options?.scriptAttributes}\n suppressHydrationWarning\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: `window.${\n options?.hydrateKey || defaultHydrateKey\n } = ${JSON.stringify({data, location})};`\n }}\n />\n </>\n );\n });\n}\n\nexport function resolveServerView(\n routes: Route | Route[],\n location: Location | string,\n {\n scriptAttributes,\n hydrateKey,\n ...options\n }: Options<ReactElement> & {\n scriptAttributes?: Record<string, string>;\n hydrateKey?: string;\n } = {}\n) {\n const router = create(\n routes,\n createMemoryHistory({initialEntries: [location]}),\n resolveViewServer,\n options\n );\n\n return resolveServerViewBase(\n router,\n isString(location) ? toLocation(router, location) : location,\n {\n scriptAttributes,\n hydrateKey\n }\n );\n}\n\nexport function resolveClientView(\n routes: Route | Route[],\n options?: Options<ReactElement> & {\n hydrateKey?: string;\n }\n) {\n const {data, location} = (window as any)[\n options?.hydrateKey || defaultHydrateKey\n ] as {data: any[]; location: Location};\n const router = create(\n routes,\n createMemoryHistory({initialEntries: [location]}),\n createHydrateResolveView(data),\n options\n );\n return resolve(router, location);\n}\n"],"names":["ViewContext","ViewProvider","props","_jsx","Provider","useView","useContext","View","DataContext","createContext","undefined","useDataContext","DataProvider","children","name","data","namedData","value","useMemo","MatchedContext","useMatched","useData","LoadingContext","useLoading","resolveView","matched","ctx","resolveViewBase","dataCtx","viewDataMap","WeakMap","resolveViewServer","dataResults","Array","length","Promise","resolve","then","result","index","view","set","router","location","resolveData","all","map","params","route","component","r","m","default","resolveComponent","C","views","reverse","reduce","acc","RouterContext","Router","setView","useState","getCurrentView","useEffect","listen","createRouter","routes","history","defaultResolve","options","create","useNewRouter","createHistory","tracked","rest","splitProps","Object","keys","values","loading","setLoading","setOptions","onLoadingChange","status","key","uniqId","HistoryRouter","createBrowserHistory","HashRouter","createHashHistory","MemoryRouter","initialEntries","initialIndex","createMemoryHistory","useRouter","defaultHydrateKey","resolveServerViewBase","get","getViewData","_Fragment","scriptAttributes","suppressHydrationWarning","dangerouslySetInnerHTML","__html","hydrateKey","JSON","stringify","resolveServerView","isString","toLocation","resolveClientView","window","_","createHydrateResolveView"],"mappings":"ycAGA,MAAMA,mBAAuC,MAEtC,SAASC,EAAaC;AAC3B,OAAOC,EAACH,EAAYI,SAAQ,IAAKF,GACnC,CAMO,SAASG,IACd,OAAOC,EAAWN,EACpB,CAOO,SAASO,IACd,OAAOF,GACT,CAEA,MAAMG,iBAAcC,EAA0C,MAACC,EAAW,CAAA,IAE1E,SAASC,IACP,OAAOL,EAAWE,EACpB,CASO,SAASI,GAAaC,SAC3BA,EAAAA,KACAC,EAAAA,KACAC,IAMA,MAAMC,EAZCL,IAAiB,GAalBM,EAAQC,EACZ,IAAM,CAACH,EAAMD,EAAO,IAAIE,EAAWF,CAACA,GAAOC,GAAQC,GACnD,CAACD,EAAMD,EAAME;AAEf,OAAOb,EAACK,EAAYJ,SAAQ,CAACa,QAAaJ,YAC5C,CAEO,MAAMM,2BAON,SAASC,IACd,OAAOd,EAAWa,EACpB,CAKO,SAASE,EAAQP,GACtB,MAAOC,EAAMC,GAAaL,IAC1B,OAAOG,EAAOE,EAAUF,GAAQC,CAClC,CAEO,MAAMO,2BAKN,SAASC,IACd,OAAOjB,EAAWgB,EACpB,CCtEA,SAAwBE,EACtBC,EACAC,GAEA,OAAOC,EAAgBF,EAASC,EAAK,CAACX,EAAMa,IAAYb,IAAOa,GACjE,CAEA,MAAMC,qBAAkBC,QAEjB,SAASC,EACdN,EACAC,GAEA,MAAMM,EAAc,IAAIC,MAAMR,EAAQS,QACtC,OAAOP,EAAgBF,EAASC,EAAK,CAACX,EAAMa,IAC1CO,QAAQC,QAAQrB,IAAOa,IAAUS,KAC9BC,GAAYN,EAAYJ,EAAQW,OAASD,IAE5CD,KAAMG,IACNX,EAAYY,IAAID,EAAMR,GACfQ,GAEX,CAWA,SAASb,EACPF,GACAiB,OAACA,EAAAA,SAAQC,GACTC,GAKA,OAAOT,QAAQU,IACbpB,EAAQqB,IAAI,EAAEC,SAAQC,SAAQT,KAC5B,MAAMb,EAAM,CACVD,UACAsB,SACAR,QACAG,SACAC,YAQF,OAAOR,QAAQU,IAAI,CACjBD,EAAYI,EAAMjC,KAAMW,GAP1B,WACE,IAAKsB,EAAMC,UAAW,OAAO1C,EAC7B,MAAM2C,EAAIF,EAAMC,UAAUvB,GAC1B,OAAOS,QAAQC,QAAQc,GAAGb,QAAa,YAAac,EAAIA,EAAEC,QAAUD,EACtE,CAIEE,KACChB,KAAK,EAAEtB,EAAMuC,sBACb1C,EAAY,CAACG,OAAYD,KAAMkC,EAAMlC,KAAKD,wBACzCV,EAACgB,EAAef,SAAQ,CAACa,MAAOS,EAAIb,wBAClCV,EAACmD,EAAC,CAAA,WAKVjB,KAAMkB,GACNA,EACGC,UACAC,OAAO,CAACC,EAAKlB,qBAAUvC,EAAY,CAACgB,MAAOyC,EAAI7C,SAAE2B,KAExD,CC9DA,MAAMmB,mBACJ,MAaK,SAASC,GAAOlB,OACrBA,EAAAA,SACA7B,IAKA,MAAO2B,EAAMqB,GAAWC,EAAoBC,EAAerB,IAG3D,OADAsB,EAAU,IAAMC,EAAOvB,EAAQmB,GAAU,CAACnB,mBAExCvC,EAACwD,EAAcvD,SAAQ,CAACa,MAAOyB,EAAO7B,SACtB,cAAbA,EACC2B,mBAECvC,EAAY,CAACgB,MAAOuB,EAAK3B,cAIlC,CAEO,SAASqD,EACdC,EACAC,GACA5C,YACEA,EAAc6C,KACXC,GACmE,IAExE,OAAOC,EAAOJ,EAAQC,EAAS5C,EAAa8C,EAC9C,CAEA,SAASE,GACPL,OAACA,EAAAA,SAAQtD,KAAayD,GACtBG,GAEA,MAAOC,EAASC,GAAQC,EAAWN,EAAS,CAAC,UAAW,gBAClD5B,EAASxB,EACb,IAAMgD,EAAaC,EAAQM,IAAiBC,GAC5C,CAACP,EAAQM,KAAkBI,OAAOC,KAAKJ,MAAaG,OAAOE,OAAOL,MAG7DM,EAASC,GAAcnB,IAC9BoB,EAAWxC,EAAQ,IACdiC,EACHQ,eAAAA,CAAgBC,GACdH,EAAWG,GAAU,CAACC,IAAKC,IAAUF,UACvC,IAGF,MAAMlC,EAAIhC,EACR,mBAAMf,EAACyD,EAAM,CAAClB,SAAe7B,aAC7B,CAAC6B,EAAQ7B;AAGX,OAAOV,EAACmB,EAAelB,SAAQ,CAACa,MAAO+D,EAAQnE,SAAEqC,GACnD,CAMO,SAASqC,EAAcrF,GAC5B,OAAOsE,EAAatE,EAAOsF,EAC7B,CAMO,SAASC,EAAWvF,GACzB,OAAOsE,EAAatE,EAAOwF,EAC7B,CAMO,SAASC,GAAaC,eAC3BA,EAAAA,aACAC,KACG3F,IAMH,OAAOsE,EAAatE,EAJEgB,EACpB,IAAM,IAAM4E,EAAoB,CAACF,iBAAgBC,iBACjD,CAACD,EAAgBC,IAGrB,CAOO,SAASE,IACd,OAAOzF,EAAWqD,EACpB,CCxHA,MAAMqC,EAAoB,4BAEnB,SAASC,EACdvD,EACAC,EACA2B,GAKA,OAAOlC,EAA0BM,EAAQC,GAAUN,KAAMG,IACvD,MAAMzB,EFiBH,SAAqByB,GAC1B,OAAOX,EAAYqE,IAAI1D,EACzB,CEnBiB2D,CAAY3D;AACzB,SACE4D,EAAA,CAAAvF,SAAA,gBACEV,EAACyD,EAAM,CAAClB,SAAe7B,SAAE2B,mBACzBrC,EAAA,SAAA,IACMmE,GAAS+B,iBACbC,0BAAwB,EAExBC,wBAAyB,CACvBC,OAAQ,UACNlC,GAASmC,YAAcT,OACnBU,KAAKC,UAAU,CAAC5F,OAAM4B,uBAMxC,CAEO,SAASiE,EACdzC,EACAxB,GACA0D,iBACEA,EAAAA,WACAI,KACGnC,GAID,IAEJ,MAAM5B,EAAS6B,EACbJ,EACA2B,EAAoB,CAACF,eAAgB,CAACjD,KACtCZ,EACAuC,GAGF,OAAO2B,EACLvD,EACAmE,EAASlE,GAAYmE,EAAWpE,EAAQC,GAAYA,EACpD,CACE0D,mBACAI,cAGN,CAEO,SAASM,EACd5C,EACAG,GAIA,MAAMvD,KAACA,EAAAA,SAAM4B,GAAaqE,OACxB1C,GAASmC,YAAcT,GAEnBtD,EAAS6B,EACbJ,EACA2B,EAAoB,CAACF,eAAgB,CAACjD,KF/CnC,SAAkC5B,GACvC,MAAO,CAACU,EAA2BC,IACjCC,EAAgBF,EAASC,EAAK,CAACuF,EAAGrF,IAAYb,EAAKa,EAAQW,OAC/D,CE6CI2E,CAAyBnG,GACzBuD,GAEF,OAAOlC,EAAQM,EAAQC,EACzB"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("history"),t=require("@native-router/core"),r=require("@native-router/core/util"),n=require("react"),o=require("react/jsx-runtime"),i=n.createContext(null);function s(e){return o.jsx(i.Provider,{...e})}function u(){return n.useContext(i)}function c(){return u()}const a=n.createContext([void 0,{}]);function l(){return n.useContext(a)}function d({children:e,name:t,data:r}){const i=l()[1],s=n.useMemo(()=>[r,t?{...i,[t]:r}:i],[r,t,i]);return o.jsx(a.Provider,{value:s,children:e})}const x=n.createContext(void 0);const f=n.createContext(void 0);function h(e,t){return y(e,t,(e,t)=>e?.(t))}const p=new WeakMap;function v(e,t){const r=new Array(e.length);return y(e,t,(e,t)=>Promise.resolve(e?.(t)).then(e=>r[t.index]=e)).then(e=>(p.set(e,r),e))}function y(e,{router:t,location:r},n){return Promise.all(e.map(({params:i,route:s},u)=>{const a={matched:e,params:i,index:u,router:t,location:r};return Promise.all([n(s.data,a),function(){if(!s.component)return c;const e=s.component(a);return Promise.resolve(e).then(e=>"default"in e?e.default:e)}()]).then(([e,t])=>o.jsx(d,{data:e,name:s.name,children:o.jsx(x.Provider,{value:a,children:o.jsx(t,{})})}))})).then(e=>e.reverse().reduce((e,t)=>o.jsx(s,{value:e,children:t})))}const m=n.createContext(null);function j({router:e,children:r}){const[i,u]=n.useState(t.getCurrentView(e));return n.useEffect(()=>t.listen(e,u),[e]),o.jsx(m.Provider,{value:e,children:"undefined"===r?i:o.jsx(s,{value:i,children:r})})}function w(e,r,{resolveView:n=h,...o}={}){return t.create(e,r,n,o)}function C({routes:e,children:i,...s},u){const[c,a]=r.splitProps(s,["baseUrl","currentView"]),l=n.useMemo(()=>w(e,u(),c),[e,u,...Object.keys(c),...Object.values(c)]),[d,x]=n.useState();t.setOptions(l,{...a,onLoadingChange(e){x(e&&{key:r.uniqId(),status:e})}});const h=n.useMemo(()=>o.jsx(j,{router:l,children:i}),[l,i]);return o.jsx(f.Provider,{value:d,children:h})}const g="_nativeRouterReactSSRData";function M(e,r,n){return t.resolve(e,r).then(t=>{const i=function(e){return p.get(e)}(t);return o.jsxs(o.Fragment,{children:[o.jsx(j,{router:e,children:t}),o.jsx("script",{...n?.scriptAttributes,suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:`window.${n?.hydrateKey||g} = ${JSON.stringify({data:i,location:r})};`}})]})})}exports.HashRouter=function(t){return C(t,e.createHashHistory)},exports.HistoryRouter=function(t){return C(t,e.createBrowserHistory)},exports.MemoryRouter=function({initialEntries:t,initialIndex:r,...o}){return C(o,n.useMemo(()=>()=>e.createMemoryHistory({initialEntries:t,initialIndex:r}),[t,r]))},exports.Router=j,exports.View=c,exports.createRouter=w,exports.resolveClientView=function(r,n){const{data:o,location:i}=window[n?.hydrateKey||g],s=t.create(r,e.createMemoryHistory({initialEntries:[i]}),function(e){return(t,r)=>y(t,r,(t,r)=>e[r.index])}(o),n);return t.resolve(s,i)},exports.resolveServerView=function(n,o,{scriptAttributes:i,hydrateKey:s,...u}={}){const c=t.create(n,e.createMemoryHistory({initialEntries:[o]}),v,u);return M(c,r.isString(o)?t.toLocation(c,o):o,{scriptAttributes:i,hydrateKey:s})},exports.resolveView=h,exports.useData=function(e){const[t,r]=l();return e?r[e]:t},exports.useLoading=function(){return n.useContext(f)},exports.useMatched=function(){return n.useContext(x)},exports.useRouter=function(){return n.useContext(m)},exports.useView=u;
2
+ //# sourceMappingURL=ssr-CsvbhYZu.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssr-CsvbhYZu.cjs","sources":["../src/context.tsx","../src/resolve-view.tsx","../src/components/Router.tsx","../src/ssr.tsx"],"sourcesContent":["import {createContext, ReactNode, useContext, useMemo} from 'react';\nimport type {Context, LoadStatus, Route} from './types';\n\nconst ViewContext = createContext<ReactNode>(null);\n\nexport function ViewProvider(props: {children: ReactNode; value: ReactNode}) {\n return <ViewContext.Provider {...props} />;\n}\n\n/**\n * @group Hooks\n * @see {@link View View Component}\n */\nexport function useView() {\n return useContext(ViewContext);\n}\n\n/**\n * Used for route component to render child route component.\n * It just render the return of {@link useView}\n * @group Components\n */\nexport function View() {\n return useView();\n}\n\nconst DataContext = createContext<[any, Record<string, any>]>([undefined, {}]);\n\nfunction useDataContext() {\n return useContext(DataContext);\n}\n\n/**\n * @group Hooks\n */\nexport function useNamedData() {\n return useDataContext()[1];\n}\n\nexport function DataProvider({\n children,\n name,\n data\n}: {\n children: ReactNode;\n data: any;\n name?: string;\n}) {\n const namedData = useNamedData();\n const value = useMemo(\n () => [data, name ? {...namedData, [name]: data} : namedData] as [any, any],\n [data, name, namedData]\n );\n return <DataContext.Provider value={value}>{children}</DataContext.Provider>;\n}\n\nexport const MatchedContext = createContext<Context<Route> | undefined>(\n undefined\n);\n\n/**\n * @group Hooks\n */\nexport function useMatched() {\n return useContext(MatchedContext)!;\n}\n\n/**\n * @group Hooks\n */\nexport function useData(name?: string) {\n const [data, namedData] = useDataContext();\n return name ? namedData[name] : data;\n}\n\nexport const LoadingContext = createContext<LoadStatus | undefined>(undefined);\n\n/**\n * @group Hooks\n */\nexport function useLoading() {\n return useContext(LoadingContext);\n}\n","import type {ComponentType, ReactElement} from 'react';\nimport type {Context, ResolveViewContext, Route} from '@@/types';\nimport type {Matched} from '@native-router/core';\nimport {DataProvider, MatchedContext, View, ViewProvider} from './context';\n\n/**\n * The default implementation of resolve view\n * @param matched the matched result\n * @param viewContext resolved view context\n * @returns the resolve view\n * @see {@link create router->create}\n */\nexport default function resolveView(\n matched: Matched<Route>[],\n ctx: ResolveViewContext<Route>\n) {\n return resolveViewBase(matched, ctx, (data, dataCtx) => data?.(dataCtx));\n}\n\nconst viewDataMap = new WeakMap<ReactElement, any[]>();\n\nexport function resolveViewServer(\n matched: Matched<Route>[],\n ctx: ResolveViewContext<Route>\n) {\n const dataResults = new Array(matched.length);\n return resolveViewBase(matched, ctx, (data, dataCtx) =>\n Promise.resolve(data?.(dataCtx)).then(\n (result) => (dataResults[dataCtx.index] = result)\n )\n ).then((view) => {\n viewDataMap.set(view, dataResults);\n return view;\n });\n}\n\nexport function createHydrateResolveView(data: any[]) {\n return (matched: Matched<Route>[], ctx: ResolveViewContext<Route>) =>\n resolveViewBase(matched, ctx, (_, dataCtx) => data[dataCtx.index]);\n}\n\nexport function getViewData(view: ReactElement) {\n return viewDataMap.get(view);\n}\n\nfunction resolveViewBase(\n matched: Matched<Route>[],\n {router, location}: ResolveViewContext<Route>,\n resolveData: (\n dataFetcher: ((ctx: Context<Route>) => any) | undefined,\n ctx: Context<Route>\n ) => any\n) {\n return Promise.all(\n matched.map(({params, route}, index) => {\n const ctx = {\n matched: matched!,\n params,\n index,\n router,\n location\n };\n function resolveComponent(): ComponentType | Promise<ComponentType> {\n if (!route.component) return View;\n const r = route.component(ctx);\n return Promise.resolve(r).then((m) => ('default' in m ? m.default : m));\n }\n\n return Promise.all([\n resolveData(route.data, ctx),\n resolveComponent()\n ]).then(([data, C]) => (\n <DataProvider data={data} name={route.name}>\n <MatchedContext.Provider value={ctx}>\n <C />\n </MatchedContext.Provider>\n </DataProvider>\n ));\n })\n ).then((views) =>\n views\n .reverse()\n .reduce((acc, view) => <ViewProvider value={acc}>{view}</ViewProvider>)\n );\n}\n","import {\n ReactNode,\n createContext,\n useContext,\n useEffect,\n useState,\n useMemo\n} from 'react';\nimport {\n History,\n createBrowserHistory,\n createHashHistory,\n createMemoryHistory,\n MemoryHistoryOptions\n} from 'history';\nimport type {LoadStatus, Route} from '@@/types';\nimport {LoadingContext, ViewProvider} from '@@/context';\nimport {create, getCurrentView, listen, setOptions} from '@native-router/core';\nimport type {Options, ResolveView, RouterInstance} from '@native-router/core';\nimport {splitProps, uniqId} from '@native-router/core/util';\nimport defaultResolve from '@@/resolve-view';\n\nconst RouterContext = createContext<RouterInstance<Route, ReactNode> | null>(\n null\n);\n\ntype Props = {\n children: ReactNode;\n routes: Route[] | Route;\n resolveView?: typeof defaultResolve;\n} & Omit<Options<ReactNode>, 'onLoadingChange'>;\n\n/**\n * Base Router Component.\n * @group Components\n */\nexport function Router({\n router,\n children\n}: {\n children: ReactNode;\n router: RouterInstance<Route, ReactNode>;\n}) {\n const [view, setView] = useState<ReactNode>(getCurrentView(router));\n\n useEffect(() => listen(router, setView), [router]);\n return (\n <RouterContext.Provider value={router}>\n {children === 'undefined' ? (\n view\n ) : (\n <ViewProvider value={view}>{children}</ViewProvider>\n )}\n </RouterContext.Provider>\n );\n}\n\nexport function createRouter(\n routes: Route | Route[],\n history: History,\n {\n resolveView = defaultResolve,\n ...options\n }: Options<ReactNode> & {resolveView?: ResolveView<Route, ReactNode>} = {}\n): RouterInstance<Route, ReactNode> {\n return create(routes, history, resolveView, options);\n}\n\nfunction useNewRouter(\n {routes, children, ...options}: Props,\n createHistory: () => History\n) {\n const [tracked, rest] = splitProps(options, ['baseUrl', 'currentView']);\n const router = useMemo(\n () => createRouter(routes, createHistory(), tracked),\n [routes, createHistory, ...Object.keys(tracked), ...Object.values(tracked)]\n );\n\n const [loading, setLoading] = useState<LoadStatus>();\n setOptions(router, {\n ...rest,\n onLoadingChange(status) {\n setLoading(status && {key: uniqId(), status});\n }\n });\n\n const r = useMemo(\n () => <Router router={router}>{children}</Router>,\n [router, children]\n );\n\n return <LoadingContext.Provider value={loading}>{r}</LoadingContext.Provider>;\n}\n\n/**\n * History mode Router Component.\n * @group Components\n */\nexport function HistoryRouter(props: Props) {\n return useNewRouter(props, createBrowserHistory);\n}\n\n/**\n * Hash mode Router Component.\n * @group Components\n */\nexport function HashRouter(props: Props) {\n return useNewRouter(props, createHashHistory);\n}\n\n/**\n * Memory mode Router Component.\n * @group Components\n */\nexport function MemoryRouter({\n initialEntries,\n initialIndex,\n ...props\n}: Props & MemoryHistoryOptions) {\n const createHistory = useMemo(\n () => () => createMemoryHistory({initialEntries, initialIndex}),\n [initialEntries, initialIndex]\n );\n return useNewRouter(props, createHistory);\n}\n\n/**\n * Get Router instance.\n * @group Hooks\n * @returns Router Instance\n */\nexport function useRouter() {\n return useContext(RouterContext)!;\n}\n","import {createMemoryHistory} from 'history';\nimport {ReactElement, ReactNode} from 'react';\nimport {create, resolve, toLocation} from '@native-router/core';\nimport type {Location, Options, RouterInstance} from '@native-router/core';\nimport {isString} from '@native-router/core/util';\nimport {Router} from './components/Router';\nimport {\n createHydrateResolveView,\n getViewData,\n resolveViewServer\n} from './resolve-view';\nimport type {Route} from './types';\n\nconst defaultHydrateKey = '_nativeRouterReactSSRData';\n\nexport function resolveServerViewBase(\n router: RouterInstance<Route, ReactNode>,\n location: Location,\n options?: {\n scriptAttributes?: Record<string, string>;\n hydrateKey?: string;\n }\n) {\n return resolve<Route, ReactNode>(router, location).then((view) => {\n const data = getViewData(view as ReactElement);\n return (\n <>\n <Router router={router}>{view}</Router>\n <script\n {...options?.scriptAttributes}\n suppressHydrationWarning\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: `window.${\n options?.hydrateKey || defaultHydrateKey\n } = ${JSON.stringify({data, location})};`\n }}\n />\n </>\n );\n });\n}\n\nexport function resolveServerView(\n routes: Route | Route[],\n location: Location | string,\n {\n scriptAttributes,\n hydrateKey,\n ...options\n }: Options<ReactElement> & {\n scriptAttributes?: Record<string, string>;\n hydrateKey?: string;\n } = {}\n) {\n const router = create(\n routes,\n createMemoryHistory({initialEntries: [location]}),\n resolveViewServer,\n options\n );\n\n return resolveServerViewBase(\n router,\n isString(location) ? toLocation(router, location) : location,\n {\n scriptAttributes,\n hydrateKey\n }\n );\n}\n\nexport function resolveClientView(\n routes: Route | Route[],\n options?: Options<ReactElement> & {\n hydrateKey?: string;\n }\n) {\n const {data, location} = (window as any)[\n options?.hydrateKey || defaultHydrateKey\n ] as {data: any[]; location: Location};\n const router = create(\n routes,\n createMemoryHistory({initialEntries: [location]}),\n createHydrateResolveView(data),\n options\n );\n return resolve(router, location);\n}\n"],"names":["ViewContext","ViewProvider","props","_jsx","Provider","useView","useContext","View","DataContext","createContext","undefined","useDataContext","DataProvider","children","name","data","namedData","value","useMemo","MatchedContext","LoadingContext","resolveView","matched","ctx","resolveViewBase","dataCtx","viewDataMap","WeakMap","resolveViewServer","dataResults","Array","length","Promise","resolve","then","result","index","view","set","router","location","resolveData","all","map","params","route","component","r","m","default","resolveComponent","C","views","reverse","reduce","acc","RouterContext","Router","setView","useState","getCurrentView","useEffect","listen","createRouter","routes","history","defaultResolve","options","create","useNewRouter","createHistory","tracked","rest","splitProps","Object","keys","values","loading","setLoading","setOptions","onLoadingChange","status","key","uniqId","defaultHydrateKey","resolveServerViewBase","get","getViewData","_Fragment","scriptAttributes","suppressHydrationWarning","dangerouslySetInnerHTML","__html","hydrateKey","JSON","stringify","createHashHistory","createBrowserHistory","initialEntries","initialIndex","createMemoryHistory","window","_","createHydrateResolveView","isString","toLocation"],"mappings":"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"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@native-router/react",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -39,11 +39,8 @@
39
39
  "doc:gen": "typedoc",
40
40
  "build:demo": "cross-env BABEL_ENV=development BUILD_DEMO=true vite build",
41
41
  "deploy": "npm run doc:gen && npm run build:demo && gh-pages -d dist",
42
- "test": "cross-env NODE_ENV=test c8 mocha",
42
+ "test": "vitest run",
43
43
  "test:watch": "npm test -- --watch",
44
- "preversion": "npm run build",
45
- "postversion": "npm publish",
46
- "postpublish": "git push --follow-tags && npm run deploy",
47
44
  "serve": "vite preview"
48
45
  },
49
46
  "repository": {
@@ -61,8 +58,8 @@
61
58
  "node": ">=14"
62
59
  },
63
60
  "peerDependencies": {
64
- "react": "^17.0.0 || ^18.0.0",
65
- "react-dom": "^17.0.0 || ^18.0.0"
61
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
62
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
66
63
  },
67
64
  "dependencies": {
68
65
  "@native-router/core": "^1.0.3",
@@ -76,15 +73,18 @@
76
73
  "@linaria/babel-preset": "^5.0.2",
77
74
  "@linaria/core": "^5.0.1",
78
75
  "@linaria/vite": "^5.0.2",
79
- "@testing-library/react": "^14.0.0",
76
+ "@testing-library/dom": "^10.4.1",
77
+ "@testing-library/react": "^14.3.1",
80
78
  "@types/mocha": "^10.0.1",
81
79
  "@types/node": "^20.6.5",
82
- "@types/react": "^18.2.22",
83
- "@types/react-dom": "^18.2.7",
80
+ "@types/react": "^19.0.0",
81
+ "@types/react-dom": "^19.0.0",
84
82
  "@types/sinon": "^10.0.16",
85
83
  "@typescript-eslint/eslint-plugin": "^6.7.2",
86
84
  "@typescript-eslint/parser": "^6.7.2",
87
85
  "@vitejs/plugin-react": "^4.1.0",
86
+ "@vitest/coverage-v8": "^4.0.18",
87
+ "@vitest/ui": "^4.0.18",
88
88
  "babel-plugin-module-resolver": "^5.0.0",
89
89
  "c8": "^8.0.1",
90
90
  "commitizen": "^4.3.0",
@@ -110,8 +110,8 @@
110
110
  "lint-staged": "^14.0.1",
111
111
  "mocha": "^10.2.0",
112
112
  "prettier": "^3.0.3",
113
- "react": "^18.2.0",
114
- "react-dom": "^18.2.0",
113
+ "react": "^19.0.0",
114
+ "react-dom": "^19.0.0",
115
115
  "should": "^13.2.3",
116
116
  "should-sinon": "0.0.6",
117
117
  "sinon": "^16.0.0",
@@ -121,6 +121,7 @@
121
121
  "typedoc-plugin-mark-react-functional-components": "^0.2.2",
122
122
  "typedoc-plugin-missing-exports": "^2.1.0",
123
123
  "typescript": "^5.2.2",
124
- "vite": "^4.4.9"
124
+ "vite": "^7.3.1",
125
+ "vitest": "^4.0.18"
125
126
  }
126
127
  }
@@ -1,2 +0,0 @@
1
- "use strict";const e=require("history"),t=require("@native-router/core"),r=require("@native-router/core/util"),n=require("react"),o=require("react/jsx-runtime"),i=n.createContext(null);function s(e){return o.jsx(i.Provider,{...e})}function u(){return n.useContext(i)}function c(){return u()}const a=n.createContext([void 0,{}]);function l(){return n.useContext(a)}function d(e){let{children:t,name:r,data:i}=e;const s=l()[1],u=n.useMemo((()=>[i,r?{...s,[r]:i}:s]),[i,r,s]);return o.jsx(a.Provider,{value:u,children:t})}const x=n.createContext(void 0);const h=n.createContext(void 0);function f(e,t){return y(e,t,((e,t)=>e?.(t)))}const v=new WeakMap;function p(e,t){const r=new Array(e.length);return y(e,t,((e,t)=>Promise.resolve(e?.(t)).then((e=>r[t.index]=e)))).then((e=>(v.set(e,r),e)))}function y(e,t,r){let{router:n,location:i}=t;return Promise.all(e.map(((t,s)=>{let{params:u,route:a}=t;const l={matched:e,params:u,index:s,router:n,location:i};return Promise.all([r(a.data,l),function(){if(!a.component)return c;const e=a.component(l);return Promise.resolve(e).then((e=>"default"in e?e.default:e))}()]).then((e=>{let[t,r]=e;return o.jsx(d,{data:t,name:a.name,children:o.jsx(x.Provider,{value:l,children:o.jsx(r,{})})})}))}))).then((e=>e.reverse().reduce(((e,t)=>o.jsx(s,{value:e,children:t})))))}const m=n.createContext(null);function j(e){let{router:r,children:i}=e;const[u,c]=n.useState(t.getCurrentView(r));return n.useEffect((()=>t.listen(r,c)),[r]),o.jsx(m.Provider,{value:r,children:"undefined"===i?u:o.jsx(s,{value:u,children:i})})}function w(e,r){let{resolveView:n=f,...o}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.create(e,r,n,o)}function g(e,i){let{routes:s,children:u,...c}=e;const[a,l]=r.splitProps(c,["baseUrl","currentView"]),d=n.useMemo((()=>w(s,i(),a)),[s,i,...Object.keys(a),...Object.values(a)]),[x,f]=n.useState();t.setOptions(d,{...l,onLoadingChange(e){f(e&&{key:r.uniqId(),status:e})}});const v=n.useMemo((()=>o.jsx(j,{router:d,children:u})),[d,u]);return o.jsx(h.Provider,{value:x,children:v})}const C="_nativeRouterReactSSRData";function M(e,r,n){return t.resolve(e,r).then((t=>{const i=function(e){return v.get(e)}(t);return o.jsxs(o.Fragment,{children:[o.jsx(j,{router:e,children:t}),o.jsx("script",{...n?.scriptAttributes,suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:`window.${n?.hydrateKey||C} = ${JSON.stringify({data:i,location:r})};`}})]})}))}exports.HashRouter=function(t){return g(t,e.createHashHistory)},exports.HistoryRouter=function(t){return g(t,e.createBrowserHistory)},exports.MemoryRouter=function(t){let{initialEntries:r,initialIndex:o,...i}=t;return g(i,n.useMemo((()=>()=>e.createMemoryHistory({initialEntries:r,initialIndex:o})),[r,o]))},exports.Router=j,exports.View=c,exports.createRouter=w,exports.resolveClientView=function(r,n){const{data:o,location:i}=window[n?.hydrateKey||C],s=t.create(r,e.createMemoryHistory({initialEntries:[i]}),function(e){return(t,r)=>y(t,r,((t,r)=>e[r.index]))}(o),n);return t.resolve(s,i)},exports.resolveServerView=function(n,o){let{scriptAttributes:i,hydrateKey:s,...u}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const c=t.create(n,e.createMemoryHistory({initialEntries:[o]}),p,u);return M(c,r.isString(o)?t.toLocation(c,o):o,{scriptAttributes:i,hydrateKey:s})},exports.resolveView=f,exports.useData=function(e){const[t,r]=l();return e?r[e]:t},exports.useLoading=function(){return n.useContext(h)},exports.useMatched=function(){return n.useContext(x)},exports.useRouter=function(){return n.useContext(m)},exports.useView=u;
2
- //# sourceMappingURL=server-64ccd715.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-64ccd715.cjs","sources":["../src/context.tsx","../src/resolve-view.tsx","../src/components/Router.tsx","../src/ssr.tsx"],"sourcesContent":["import {createContext, ReactNode, useContext, useMemo} from 'react';\nimport type {Context, LoadStatus, Route} from './types';\n\nconst ViewContext = createContext<ReactNode>(null);\n\nexport function ViewProvider(props: {children: ReactNode; value: ReactNode}) {\n return <ViewContext.Provider {...props} />;\n}\n\n/**\n * @group Hooks\n * @see {@link View View Component}\n */\nexport function useView() {\n return useContext(ViewContext);\n}\n\n/**\n * Used for route component to render child route component.\n * It just render the return of {@link useView}\n * @group Components\n */\nexport function View() {\n return useView();\n}\n\nconst DataContext = createContext<[any, Record<string, any>]>([undefined, {}]);\n\nfunction useDataContext() {\n return useContext(DataContext);\n}\n\n/**\n * @group Hooks\n */\nexport function useNamedData() {\n return useDataContext()[1];\n}\n\nexport function DataProvider({\n children,\n name,\n data\n}: {\n children: ReactNode;\n data: any;\n name?: string;\n}) {\n const namedData = useNamedData();\n const value = useMemo(\n () => [data, name ? {...namedData, [name]: data} : namedData] as [any, any],\n [data, name, namedData]\n );\n return <DataContext.Provider value={value}>{children}</DataContext.Provider>;\n}\n\nexport const MatchedContext = createContext<Context<Route> | undefined>(\n undefined\n);\n\n/**\n * @group Hooks\n */\nexport function useMatched() {\n return useContext(MatchedContext)!;\n}\n\n/**\n * @group Hooks\n */\nexport function useData(name?: string) {\n const [data, namedData] = useDataContext();\n return name ? namedData[name] : data;\n}\n\nexport const LoadingContext = createContext<LoadStatus | undefined>(undefined);\n\n/**\n * @group Hooks\n */\nexport function useLoading() {\n return useContext(LoadingContext);\n}\n","import type {ComponentType, ReactElement} from 'react';\nimport type {Context, ResolveViewContext, Route} from '@@/types';\nimport type {Matched} from '@native-router/core';\nimport {DataProvider, MatchedContext, View, ViewProvider} from './context';\n\n/**\n * The default implementation of resolve view\n * @param matched the matched result\n * @param viewContext resolved view context\n * @returns the resolve view\n * @see {@link create router->create}\n */\nexport default function resolveView(\n matched: Matched<Route>[],\n ctx: ResolveViewContext<Route>\n) {\n return resolveViewBase(matched, ctx, (data, dataCtx) => data?.(dataCtx));\n}\n\nconst viewDataMap = new WeakMap<ReactElement, any[]>();\n\nexport function resolveViewServer(\n matched: Matched<Route>[],\n ctx: ResolveViewContext<Route>\n) {\n const dataResults = new Array(matched.length);\n return resolveViewBase(matched, ctx, (data, dataCtx) =>\n Promise.resolve(data?.(dataCtx)).then(\n (result) => (dataResults[dataCtx.index] = result)\n )\n ).then((view) => {\n viewDataMap.set(view, dataResults);\n return view;\n });\n}\n\nexport function createHydrateResolveView(data: any[]) {\n return (matched: Matched<Route>[], ctx: ResolveViewContext<Route>) =>\n resolveViewBase(matched, ctx, (_, dataCtx) => data[dataCtx.index]);\n}\n\nexport function getViewData(view: ReactElement) {\n return viewDataMap.get(view);\n}\n\nfunction resolveViewBase(\n matched: Matched<Route>[],\n {router, location}: ResolveViewContext<Route>,\n resolveData: (\n dataFetcher: ((ctx: Context<Route>) => any) | undefined,\n ctx: Context<Route>\n ) => any\n) {\n return Promise.all(\n matched.map(({params, route}, index) => {\n const ctx = {\n matched: matched!,\n params,\n index,\n router,\n location\n };\n function resolveComponent(): ComponentType | Promise<ComponentType> {\n if (!route.component) return View;\n const r = route.component(ctx);\n return Promise.resolve(r).then((m) => ('default' in m ? m.default : m));\n }\n\n return Promise.all([\n resolveData(route.data, ctx),\n resolveComponent()\n ]).then(([data, C]) => (\n <DataProvider data={data} name={route.name}>\n <MatchedContext.Provider value={ctx}>\n <C />\n </MatchedContext.Provider>\n </DataProvider>\n ));\n })\n ).then((views) =>\n views\n .reverse()\n .reduce((acc, view) => <ViewProvider value={acc}>{view}</ViewProvider>)\n );\n}\n","import {\n ReactNode,\n createContext,\n useContext,\n useEffect,\n useState,\n useMemo\n} from 'react';\nimport {\n History,\n createBrowserHistory,\n createHashHistory,\n createMemoryHistory,\n MemoryHistoryOptions\n} from 'history';\nimport type {LoadStatus, Route} from '@@/types';\nimport {LoadingContext, ViewProvider} from '@@/context';\nimport {create, getCurrentView, listen, setOptions} from '@native-router/core';\nimport type {Options, ResolveView, RouterInstance} from '@native-router/core';\nimport {splitProps, uniqId} from '@native-router/core/util';\nimport defaultResolve from '@@/resolve-view';\n\nconst RouterContext = createContext<RouterInstance<Route, ReactNode> | null>(\n null\n);\n\ntype Props = {\n children: ReactNode;\n routes: Route[] | Route;\n resolveView?: typeof defaultResolve;\n} & Omit<Options<ReactNode>, 'onLoadingChange'>;\n\n/**\n * Base Router Component.\n * @group Components\n */\nexport function Router({\n router,\n children\n}: {\n children: ReactNode;\n router: RouterInstance<Route, ReactNode>;\n}) {\n const [view, setView] = useState<ReactNode>(getCurrentView(router));\n\n useEffect(() => listen(router, setView), [router]);\n return (\n <RouterContext.Provider value={router}>\n {children === 'undefined' ? (\n view\n ) : (\n <ViewProvider value={view}>{children}</ViewProvider>\n )}\n </RouterContext.Provider>\n );\n}\n\nexport function createRouter(\n routes: Route | Route[],\n history: History,\n {\n resolveView = defaultResolve,\n ...options\n }: Options<ReactNode> & {resolveView?: ResolveView<Route, ReactNode>} = {}\n): RouterInstance<Route, ReactNode> {\n return create(routes, history, resolveView, options);\n}\n\nfunction useNewRouter(\n {routes, children, ...options}: Props,\n createHistory: () => History\n) {\n const [tracked, rest] = splitProps(options, ['baseUrl', 'currentView']);\n const router = useMemo(\n () => createRouter(routes, createHistory(), tracked),\n [routes, createHistory, ...Object.keys(tracked), ...Object.values(tracked)]\n );\n\n const [loading, setLoading] = useState<LoadStatus>();\n setOptions(router, {\n ...rest,\n onLoadingChange(status) {\n setLoading(status && {key: uniqId(), status});\n }\n });\n\n const r = useMemo(\n () => <Router router={router}>{children}</Router>,\n [router, children]\n );\n\n return <LoadingContext.Provider value={loading}>{r}</LoadingContext.Provider>;\n}\n\n/**\n * History mode Router Component.\n * @group Components\n */\nexport function HistoryRouter(props: Props) {\n return useNewRouter(props, createBrowserHistory);\n}\n\n/**\n * Hash mode Router Component.\n * @group Components\n */\nexport function HashRouter(props: Props) {\n return useNewRouter(props, createHashHistory);\n}\n\n/**\n * Memory mode Router Component.\n * @group Components\n */\nexport function MemoryRouter({\n initialEntries,\n initialIndex,\n ...props\n}: Props & MemoryHistoryOptions) {\n const createHistory = useMemo(\n () => () => createMemoryHistory({initialEntries, initialIndex}),\n [initialEntries, initialIndex]\n );\n return useNewRouter(props, createHistory);\n}\n\n/**\n * Get Router instance.\n * @group Hooks\n * @returns Router Instance\n */\nexport function useRouter() {\n return useContext(RouterContext)!;\n}\n","import {createMemoryHistory} from 'history';\nimport {ReactElement, ReactNode} from 'react';\nimport {create, resolve, toLocation} from '@native-router/core';\nimport type {Location, Options, RouterInstance} from '@native-router/core';\nimport {isString} from '@native-router/core/util';\nimport {Router} from './components/Router';\nimport {\n createHydrateResolveView,\n getViewData,\n resolveViewServer\n} from './resolve-view';\nimport type {Route} from './types';\n\nconst defaultHydrateKey = '_nativeRouterReactSSRData';\n\nexport function resolveServerViewBase(\n router: RouterInstance<Route, ReactNode>,\n location: Location,\n options?: {\n scriptAttributes?: Record<string, string>;\n hydrateKey?: string;\n }\n) {\n return resolve<Route, ReactNode>(router, location).then((view) => {\n const data = getViewData(view as ReactElement);\n return (\n <>\n <Router router={router}>{view}</Router>\n <script\n {...options?.scriptAttributes}\n suppressHydrationWarning\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: `window.${\n options?.hydrateKey || defaultHydrateKey\n } = ${JSON.stringify({data, location})};`\n }}\n />\n </>\n );\n });\n}\n\nexport function resolveServerView(\n routes: Route | Route[],\n location: Location | string,\n {\n scriptAttributes,\n hydrateKey,\n ...options\n }: Options<ReactElement> & {\n scriptAttributes?: Record<string, string>;\n hydrateKey?: string;\n } = {}\n) {\n const router = create(\n routes,\n createMemoryHistory({initialEntries: [location]}),\n resolveViewServer,\n options\n );\n\n return resolveServerViewBase(\n router,\n isString(location) ? toLocation(router, location) : location,\n {\n scriptAttributes,\n hydrateKey\n }\n );\n}\n\nexport function resolveClientView(\n routes: Route | Route[],\n options?: Options<ReactElement> & {\n hydrateKey?: string;\n }\n) {\n const {data, location} = (window as any)[\n options?.hydrateKey || defaultHydrateKey\n ] as {data: any[]; location: Location};\n const router = create(\n routes,\n createMemoryHistory({initialEntries: [location]}),\n createHydrateResolveView(data),\n options\n );\n return resolve(router, location);\n}\n"],"names":["ViewContext","ViewProvider","props","_jsx","Provider","useView","useContext","View","DataContext","createContext","undefined","useDataContext","DataProvider","_ref","children","name","data","namedData","value","useMemo","MatchedContext","LoadingContext","resolveView","matched","ctx","resolveViewBase","dataCtx","viewDataMap","WeakMap","resolveViewServer","dataResults","Array","length","Promise","resolve","then","result","index","view","set","resolveData","router","location","all","map","_ref2","params","route","component","r","m","default","resolveComponent","_ref3","C","views","reverse","reduce","acc","RouterContext","Router","setView","useState","getCurrentView","useEffect","listen","createRouter","routes","history","defaultResolve","options","arguments","create","useNewRouter","createHistory","tracked","rest","splitProps","Object","keys","values","loading","setLoading","setOptions","onLoadingChange","status","key","uniqId","defaultHydrateKey","resolveServerViewBase","get","getViewData","_Fragment","scriptAttributes","suppressHydrationWarning","dangerouslySetInnerHTML","__html","hydrateKey","JSON","stringify","createHashHistory","createBrowserHistory","initialEntries","initialIndex","createMemoryHistory","resolveClientView","window","_","createHydrateResolveView","resolveServerView","isString","toLocation"],"mappings":"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"}
@@ -1,231 +0,0 @@
1
- import { createMemoryHistory, createBrowserHistory, createHashHistory } from 'history';
2
- import { getCurrentView, listen, create, setOptions, toLocation, resolve } from '@native-router/core';
3
- import { splitProps, uniqId, isString } from '@native-router/core/util';
4
- import { useContext, createContext, useMemo, useState, useEffect } from 'react';
5
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
-
7
- const ViewContext = /* @__PURE__ */ createContext(null);
8
- function ViewProvider(props) {
9
- return /* @__PURE__ */ jsx(ViewContext.Provider, {
10
- ...props
11
- });
12
- }
13
- function useView() {
14
- return useContext(ViewContext);
15
- }
16
- function View() {
17
- return useView();
18
- }
19
- const DataContext = /* @__PURE__ */ createContext([void 0, {}]);
20
- function useDataContext() {
21
- return useContext(DataContext);
22
- }
23
- function useNamedData() {
24
- return useDataContext()[1];
25
- }
26
- function DataProvider(_ref) {
27
- let {
28
- children,
29
- name,
30
- data
31
- } = _ref;
32
- const namedData = useNamedData();
33
- const value = useMemo(() => [data, name ? {
34
- ...namedData,
35
- [name]: data
36
- } : namedData], [data, name, namedData]);
37
- return /* @__PURE__ */ jsx(DataContext.Provider, {
38
- value,
39
- children
40
- });
41
- }
42
- const MatchedContext = /* @__PURE__ */ createContext(void 0);
43
- function useMatched() {
44
- return useContext(MatchedContext);
45
- }
46
- function useData(name) {
47
- const [data, namedData] = useDataContext();
48
- return name ? namedData[name] : data;
49
- }
50
- const LoadingContext = /* @__PURE__ */ createContext(void 0);
51
- function useLoading() {
52
- return useContext(LoadingContext);
53
- }
54
-
55
- function resolveView(matched, ctx) {
56
- return resolveViewBase(matched, ctx, (data, dataCtx) => data?.(dataCtx));
57
- }
58
- const viewDataMap = /* @__PURE__ */ new WeakMap();
59
- function resolveViewServer(matched, ctx) {
60
- const dataResults = new Array(matched.length);
61
- return resolveViewBase(matched, ctx, (data, dataCtx) => Promise.resolve(data?.(dataCtx)).then((result) => dataResults[dataCtx.index] = result)).then((view) => {
62
- viewDataMap.set(view, dataResults);
63
- return view;
64
- });
65
- }
66
- function createHydrateResolveView(data) {
67
- return (matched, ctx) => resolveViewBase(matched, ctx, (_, dataCtx) => data[dataCtx.index]);
68
- }
69
- function getViewData(view) {
70
- return viewDataMap.get(view);
71
- }
72
- function resolveViewBase(matched, _ref, resolveData) {
73
- let {
74
- router,
75
- location
76
- } = _ref;
77
- return Promise.all(matched.map((_ref2, index) => {
78
- let {
79
- params,
80
- route
81
- } = _ref2;
82
- const ctx = {
83
- matched,
84
- params,
85
- index,
86
- router,
87
- location
88
- };
89
- function resolveComponent() {
90
- if (!route.component)
91
- return View;
92
- const r = route.component(ctx);
93
- return Promise.resolve(r).then((m) => "default" in m ? m.default : m);
94
- }
95
- return Promise.all([resolveData(route.data, ctx), resolveComponent()]).then((_ref3) => {
96
- let [data, C] = _ref3;
97
- return /* @__PURE__ */ jsx(DataProvider, {
98
- data,
99
- name: route.name,
100
- children: /* @__PURE__ */ jsx(MatchedContext.Provider, {
101
- value: ctx,
102
- children: /* @__PURE__ */ jsx(C, {})
103
- })
104
- });
105
- });
106
- })).then((views) => views.reverse().reduce((acc, view) => /* @__PURE__ */ jsx(ViewProvider, {
107
- value: acc,
108
- children: view
109
- })));
110
- }
111
-
112
- const RouterContext = /* @__PURE__ */ createContext(null);
113
- function Router(_ref) {
114
- let {
115
- router,
116
- children
117
- } = _ref;
118
- const [view, setView] = useState(getCurrentView(router));
119
- useEffect(() => listen(router, setView), [router]);
120
- return /* @__PURE__ */ jsx(RouterContext.Provider, {
121
- value: router,
122
- children: children === "undefined" ? view : /* @__PURE__ */ jsx(ViewProvider, {
123
- value: view,
124
- children
125
- })
126
- });
127
- }
128
- function createRouter(routes, history) {
129
- let {
130
- resolveView: resolveView$1 = resolveView,
131
- ...options
132
- } = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
133
- return create(routes, history, resolveView$1, options);
134
- }
135
- function useNewRouter(_ref2, createHistory) {
136
- let {
137
- routes,
138
- children,
139
- ...options
140
- } = _ref2;
141
- const [tracked, rest] = splitProps(options, ["baseUrl", "currentView"]);
142
- const router = useMemo(() => createRouter(routes, createHistory(), tracked), [routes, createHistory, ...Object.keys(tracked), ...Object.values(tracked)]);
143
- const [loading, setLoading] = useState();
144
- setOptions(router, {
145
- ...rest,
146
- onLoadingChange(status) {
147
- setLoading(status && {
148
- key: uniqId(),
149
- status
150
- });
151
- }
152
- });
153
- const r = useMemo(() => /* @__PURE__ */ jsx(Router, {
154
- router,
155
- children
156
- }), [router, children]);
157
- return /* @__PURE__ */ jsx(LoadingContext.Provider, {
158
- value: loading,
159
- children: r
160
- });
161
- }
162
- function HistoryRouter(props) {
163
- return useNewRouter(props, createBrowserHistory);
164
- }
165
- function HashRouter(props) {
166
- return useNewRouter(props, createHashHistory);
167
- }
168
- function MemoryRouter(_ref3) {
169
- let {
170
- initialEntries,
171
- initialIndex,
172
- ...props
173
- } = _ref3;
174
- const createHistory = useMemo(() => () => createMemoryHistory({
175
- initialEntries,
176
- initialIndex
177
- }), [initialEntries, initialIndex]);
178
- return useNewRouter(props, createHistory);
179
- }
180
- function useRouter() {
181
- return useContext(RouterContext);
182
- }
183
-
184
- const defaultHydrateKey = "_nativeRouterReactSSRData";
185
- function resolveServerViewBase(router, location, options) {
186
- return resolve(router, location).then((view) => {
187
- const data = getViewData(view);
188
- return /* @__PURE__ */ jsxs(Fragment, {
189
- children: [/* @__PURE__ */ jsx(Router, {
190
- router,
191
- children: view
192
- }), /* @__PURE__ */ jsx("script", {
193
- ...options?.scriptAttributes,
194
- suppressHydrationWarning: true,
195
- dangerouslySetInnerHTML: {
196
- __html: `window.${options?.hydrateKey || defaultHydrateKey} = ${JSON.stringify({
197
- data,
198
- location
199
- })};`
200
- }
201
- })]
202
- });
203
- });
204
- }
205
- function resolveServerView(routes, location) {
206
- let {
207
- scriptAttributes,
208
- hydrateKey,
209
- ...options
210
- } = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
211
- const router = create(routes, createMemoryHistory({
212
- initialEntries: [location]
213
- }), resolveViewServer, options);
214
- return resolveServerViewBase(router, isString(location) ? toLocation(router, location) : location, {
215
- scriptAttributes,
216
- hydrateKey
217
- });
218
- }
219
- function resolveClientView(routes, options) {
220
- const {
221
- data,
222
- location
223
- } = window[options?.hydrateKey || defaultHydrateKey];
224
- const router = create(routes, createMemoryHistory({
225
- initialEntries: [location]
226
- }), createHydrateResolveView(data), options);
227
- return resolve(router, location);
228
- }
229
-
230
- export { HistoryRouter as H, MemoryRouter as M, Router as R, View as V, useView as a, useData as b, useLoading as c, useMatched as d, resolveClientView as e, createRouter as f, HashRouter as g, resolveServerView as h, resolveView as r, useRouter as u };
231
- //# sourceMappingURL=server-ce7b3571.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-ce7b3571.js","sources":["../src/context.tsx","../src/resolve-view.tsx","../src/components/Router.tsx","../src/ssr.tsx"],"sourcesContent":["import {createContext, ReactNode, useContext, useMemo} from 'react';\nimport type {Context, LoadStatus, Route} from './types';\n\nconst ViewContext = createContext<ReactNode>(null);\n\nexport function ViewProvider(props: {children: ReactNode; value: ReactNode}) {\n return <ViewContext.Provider {...props} />;\n}\n\n/**\n * @group Hooks\n * @see {@link View View Component}\n */\nexport function useView() {\n return useContext(ViewContext);\n}\n\n/**\n * Used for route component to render child route component.\n * It just render the return of {@link useView}\n * @group Components\n */\nexport function View() {\n return useView();\n}\n\nconst DataContext = createContext<[any, Record<string, any>]>([undefined, {}]);\n\nfunction useDataContext() {\n return useContext(DataContext);\n}\n\n/**\n * @group Hooks\n */\nexport function useNamedData() {\n return useDataContext()[1];\n}\n\nexport function DataProvider({\n children,\n name,\n data\n}: {\n children: ReactNode;\n data: any;\n name?: string;\n}) {\n const namedData = useNamedData();\n const value = useMemo(\n () => [data, name ? {...namedData, [name]: data} : namedData] as [any, any],\n [data, name, namedData]\n );\n return <DataContext.Provider value={value}>{children}</DataContext.Provider>;\n}\n\nexport const MatchedContext = createContext<Context<Route> | undefined>(\n undefined\n);\n\n/**\n * @group Hooks\n */\nexport function useMatched() {\n return useContext(MatchedContext)!;\n}\n\n/**\n * @group Hooks\n */\nexport function useData(name?: string) {\n const [data, namedData] = useDataContext();\n return name ? namedData[name] : data;\n}\n\nexport const LoadingContext = createContext<LoadStatus | undefined>(undefined);\n\n/**\n * @group Hooks\n */\nexport function useLoading() {\n return useContext(LoadingContext);\n}\n","import type {ComponentType, ReactElement} from 'react';\nimport type {Context, ResolveViewContext, Route} from '@@/types';\nimport type {Matched} from '@native-router/core';\nimport {DataProvider, MatchedContext, View, ViewProvider} from './context';\n\n/**\n * The default implementation of resolve view\n * @param matched the matched result\n * @param viewContext resolved view context\n * @returns the resolve view\n * @see {@link create router->create}\n */\nexport default function resolveView(\n matched: Matched<Route>[],\n ctx: ResolveViewContext<Route>\n) {\n return resolveViewBase(matched, ctx, (data, dataCtx) => data?.(dataCtx));\n}\n\nconst viewDataMap = new WeakMap<ReactElement, any[]>();\n\nexport function resolveViewServer(\n matched: Matched<Route>[],\n ctx: ResolveViewContext<Route>\n) {\n const dataResults = new Array(matched.length);\n return resolveViewBase(matched, ctx, (data, dataCtx) =>\n Promise.resolve(data?.(dataCtx)).then(\n (result) => (dataResults[dataCtx.index] = result)\n )\n ).then((view) => {\n viewDataMap.set(view, dataResults);\n return view;\n });\n}\n\nexport function createHydrateResolveView(data: any[]) {\n return (matched: Matched<Route>[], ctx: ResolveViewContext<Route>) =>\n resolveViewBase(matched, ctx, (_, dataCtx) => data[dataCtx.index]);\n}\n\nexport function getViewData(view: ReactElement) {\n return viewDataMap.get(view);\n}\n\nfunction resolveViewBase(\n matched: Matched<Route>[],\n {router, location}: ResolveViewContext<Route>,\n resolveData: (\n dataFetcher: ((ctx: Context<Route>) => any) | undefined,\n ctx: Context<Route>\n ) => any\n) {\n return Promise.all(\n matched.map(({params, route}, index) => {\n const ctx = {\n matched: matched!,\n params,\n index,\n router,\n location\n };\n function resolveComponent(): ComponentType | Promise<ComponentType> {\n if (!route.component) return View;\n const r = route.component(ctx);\n return Promise.resolve(r).then((m) => ('default' in m ? m.default : m));\n }\n\n return Promise.all([\n resolveData(route.data, ctx),\n resolveComponent()\n ]).then(([data, C]) => (\n <DataProvider data={data} name={route.name}>\n <MatchedContext.Provider value={ctx}>\n <C />\n </MatchedContext.Provider>\n </DataProvider>\n ));\n })\n ).then((views) =>\n views\n .reverse()\n .reduce((acc, view) => <ViewProvider value={acc}>{view}</ViewProvider>)\n );\n}\n","import {\n ReactNode,\n createContext,\n useContext,\n useEffect,\n useState,\n useMemo\n} from 'react';\nimport {\n History,\n createBrowserHistory,\n createHashHistory,\n createMemoryHistory,\n MemoryHistoryOptions\n} from 'history';\nimport type {LoadStatus, Route} from '@@/types';\nimport {LoadingContext, ViewProvider} from '@@/context';\nimport {create, getCurrentView, listen, setOptions} from '@native-router/core';\nimport type {Options, ResolveView, RouterInstance} from '@native-router/core';\nimport {splitProps, uniqId} from '@native-router/core/util';\nimport defaultResolve from '@@/resolve-view';\n\nconst RouterContext = createContext<RouterInstance<Route, ReactNode> | null>(\n null\n);\n\ntype Props = {\n children: ReactNode;\n routes: Route[] | Route;\n resolveView?: typeof defaultResolve;\n} & Omit<Options<ReactNode>, 'onLoadingChange'>;\n\n/**\n * Base Router Component.\n * @group Components\n */\nexport function Router({\n router,\n children\n}: {\n children: ReactNode;\n router: RouterInstance<Route, ReactNode>;\n}) {\n const [view, setView] = useState<ReactNode>(getCurrentView(router));\n\n useEffect(() => listen(router, setView), [router]);\n return (\n <RouterContext.Provider value={router}>\n {children === 'undefined' ? (\n view\n ) : (\n <ViewProvider value={view}>{children}</ViewProvider>\n )}\n </RouterContext.Provider>\n );\n}\n\nexport function createRouter(\n routes: Route | Route[],\n history: History,\n {\n resolveView = defaultResolve,\n ...options\n }: Options<ReactNode> & {resolveView?: ResolveView<Route, ReactNode>} = {}\n): RouterInstance<Route, ReactNode> {\n return create(routes, history, resolveView, options);\n}\n\nfunction useNewRouter(\n {routes, children, ...options}: Props,\n createHistory: () => History\n) {\n const [tracked, rest] = splitProps(options, ['baseUrl', 'currentView']);\n const router = useMemo(\n () => createRouter(routes, createHistory(), tracked),\n [routes, createHistory, ...Object.keys(tracked), ...Object.values(tracked)]\n );\n\n const [loading, setLoading] = useState<LoadStatus>();\n setOptions(router, {\n ...rest,\n onLoadingChange(status) {\n setLoading(status && {key: uniqId(), status});\n }\n });\n\n const r = useMemo(\n () => <Router router={router}>{children}</Router>,\n [router, children]\n );\n\n return <LoadingContext.Provider value={loading}>{r}</LoadingContext.Provider>;\n}\n\n/**\n * History mode Router Component.\n * @group Components\n */\nexport function HistoryRouter(props: Props) {\n return useNewRouter(props, createBrowserHistory);\n}\n\n/**\n * Hash mode Router Component.\n * @group Components\n */\nexport function HashRouter(props: Props) {\n return useNewRouter(props, createHashHistory);\n}\n\n/**\n * Memory mode Router Component.\n * @group Components\n */\nexport function MemoryRouter({\n initialEntries,\n initialIndex,\n ...props\n}: Props & MemoryHistoryOptions) {\n const createHistory = useMemo(\n () => () => createMemoryHistory({initialEntries, initialIndex}),\n [initialEntries, initialIndex]\n );\n return useNewRouter(props, createHistory);\n}\n\n/**\n * Get Router instance.\n * @group Hooks\n * @returns Router Instance\n */\nexport function useRouter() {\n return useContext(RouterContext)!;\n}\n","import {createMemoryHistory} from 'history';\nimport {ReactElement, ReactNode} from 'react';\nimport {create, resolve, toLocation} from '@native-router/core';\nimport type {Location, Options, RouterInstance} from '@native-router/core';\nimport {isString} from '@native-router/core/util';\nimport {Router} from './components/Router';\nimport {\n createHydrateResolveView,\n getViewData,\n resolveViewServer\n} from './resolve-view';\nimport type {Route} from './types';\n\nconst defaultHydrateKey = '_nativeRouterReactSSRData';\n\nexport function resolveServerViewBase(\n router: RouterInstance<Route, ReactNode>,\n location: Location,\n options?: {\n scriptAttributes?: Record<string, string>;\n hydrateKey?: string;\n }\n) {\n return resolve<Route, ReactNode>(router, location).then((view) => {\n const data = getViewData(view as ReactElement);\n return (\n <>\n <Router router={router}>{view}</Router>\n <script\n {...options?.scriptAttributes}\n suppressHydrationWarning\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: `window.${\n options?.hydrateKey || defaultHydrateKey\n } = ${JSON.stringify({data, location})};`\n }}\n />\n </>\n );\n });\n}\n\nexport function resolveServerView(\n routes: Route | Route[],\n location: Location | string,\n {\n scriptAttributes,\n hydrateKey,\n ...options\n }: Options<ReactElement> & {\n scriptAttributes?: Record<string, string>;\n hydrateKey?: string;\n } = {}\n) {\n const router = create(\n routes,\n createMemoryHistory({initialEntries: [location]}),\n resolveViewServer,\n options\n );\n\n return resolveServerViewBase(\n router,\n isString(location) ? toLocation(router, location) : location,\n {\n scriptAttributes,\n hydrateKey\n }\n );\n}\n\nexport function resolveClientView(\n routes: Route | Route[],\n options?: Options<ReactElement> & {\n hydrateKey?: string;\n }\n) {\n const {data, location} = (window as any)[\n options?.hydrateKey || defaultHydrateKey\n ] as {data: any[]; location: Location};\n const router = create(\n routes,\n createMemoryHistory({initialEntries: [location]}),\n createHydrateResolveView(data),\n options\n );\n return resolve(router, location);\n}\n"],"names":["ViewContext","ViewProvider","props","_jsx","Provider","useView","useContext","View","DataContext","undefined","useDataContext","useNamedData","DataProvider","_ref","children","name","data","namedData","value","useMemo","MatchedContext","useMatched","useData","LoadingContext","useLoading","resolveView","matched","ctx","resolveViewBase","dataCtx","viewDataMap","WeakMap","resolveViewServer","dataResults","Array","length","Promise","resolve","then","result","index","view","set","createHydrateResolveView","_","getViewData","get","resolveData","router","location","all","map","_ref2","params","route","resolveComponent","component","r","m","default","_ref3","C","views","reverse","reduce","acc","RouterContext","Router","setView","useState","getCurrentView","useEffect","listen","createRouter","routes","history","defaultResolve","options","arguments","create","useNewRouter","createHistory","tracked","rest","splitProps","Object","keys","values","loading","setLoading","setOptions","onLoadingChange","status","key","uniqId","HistoryRouter","createBrowserHistory","HashRouter","createHashHistory","MemoryRouter","initialEntries","initialIndex","createMemoryHistory","useRouter","defaultHydrateKey","resolveServerViewBase","_Fragment","scriptAttributes","suppressHydrationWarning","dangerouslySetInnerHTML","__html","hydrateKey","JSON","stringify","resolveServerView","isString","toLocation","resolveClientView","window"],"mappings":"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"}