one 1.2.57 → 1.2.58
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/dist/cjs/cli/buildPage.cjs +1 -1
- package/dist/cjs/cli/buildPage.js +1 -1
- package/dist/cjs/cli/buildPage.native.js +1 -1
- package/dist/cjs/cli/buildPage.native.js.map +1 -1
- package/dist/cjs/cli/dev.cjs +4 -4
- package/dist/cjs/cli/dev.js +4 -4
- package/dist/cjs/cli/dev.js.map +1 -1
- package/dist/cjs/cli/dev.native.js +4 -4
- package/dist/cjs/cli/dev.native.js.map +1 -1
- package/dist/cjs/createApp.cjs +2 -1
- package/dist/cjs/createApp.js +2 -2
- package/dist/cjs/createApp.js.map +1 -1
- package/dist/cjs/createHandleRequest.test.js +3 -1
- package/dist/cjs/createHandleRequest.test.js.map +1 -1
- package/dist/cjs/createHandleRequest.test.native.js.map +1 -1
- package/dist/cjs/devtools/registry.cjs +30 -0
- package/dist/cjs/devtools/registry.js +25 -0
- package/dist/cjs/devtools/registry.js.map +6 -0
- package/dist/cjs/devtools/registry.native.js +33 -0
- package/dist/cjs/devtools/registry.native.js.map +1 -0
- package/dist/cjs/fork/createMemoryHistory.cjs +20 -9
- package/dist/cjs/fork/createMemoryHistory.js +22 -4
- package/dist/cjs/fork/createMemoryHistory.js.map +1 -1
- package/dist/cjs/fork/createMemoryHistory.native.js +20 -9
- package/dist/cjs/fork/createMemoryHistory.native.js.map +1 -1
- package/dist/cjs/fork/useLinking.cjs +11 -5
- package/dist/cjs/fork/useLinking.js +6 -6
- package/dist/cjs/fork/useLinking.js.map +1 -1
- package/dist/cjs/index.cjs +17 -1
- package/dist/cjs/index.js +12 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.native.js +17 -1
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/layouts/withLayoutContext.cjs +34 -15
- package/dist/cjs/layouts/withLayoutContext.js +29 -13
- package/dist/cjs/layouts/withLayoutContext.js.map +1 -1
- package/dist/cjs/layouts/withLayoutContext.native.js +42 -19
- package/dist/cjs/layouts/withLayoutContext.native.js.map +1 -1
- package/dist/cjs/link/Link.cjs +5 -2
- package/dist/cjs/link/Link.js +3 -2
- package/dist/cjs/link/Link.js.map +1 -1
- package/dist/cjs/link/Link.native.js +6 -1
- package/dist/cjs/link/Link.native.js.map +1 -1
- package/dist/cjs/link/useLinkTo.cjs +11 -3
- package/dist/cjs/link/useLinkTo.js +6 -3
- package/dist/cjs/link/useLinkTo.js.map +1 -1
- package/dist/cjs/link/useLinkTo.native.js +11 -3
- package/dist/cjs/link/useLinkTo.native.js.map +1 -1
- package/dist/cjs/router/Route.js.map +1 -1
- package/dist/cjs/router/Route.native.js.map +1 -1
- package/dist/cjs/router/findRouteNode.cjs +70 -0
- package/dist/cjs/router/findRouteNode.js +72 -0
- package/dist/cjs/router/findRouteNode.js.map +6 -0
- package/dist/cjs/router/findRouteNode.native.js +104 -0
- package/dist/cjs/router/findRouteNode.native.js.map +1 -0
- package/dist/cjs/router/router.cjs +160 -11
- package/dist/cjs/router/router.js +142 -7
- package/dist/cjs/router/router.js.map +2 -2
- package/dist/cjs/router/router.native.js +241 -57
- package/dist/cjs/router/router.native.js.map +1 -1
- package/dist/cjs/router/useScreens.cjs +1 -1
- package/dist/cjs/router/useScreens.js +1 -1
- package/dist/cjs/router/useScreens.js.map +1 -1
- package/dist/cjs/router/useScreens.native.js +5 -2
- package/dist/cjs/router/useScreens.native.js.map +1 -1
- package/dist/cjs/server/oneServe.js.map +1 -1
- package/dist/cjs/server/oneServe.native.js.map +1 -1
- package/dist/cjs/useBlocker.cjs +158 -0
- package/dist/cjs/useBlocker.js +145 -0
- package/dist/cjs/useBlocker.js.map +6 -0
- package/dist/cjs/useBlocker.native.js +89 -0
- package/dist/cjs/useBlocker.native.js.map +1 -0
- package/dist/cjs/useLoader.cjs +69 -3
- package/dist/cjs/useLoader.js +57 -4
- package/dist/cjs/useLoader.js.map +2 -2
- package/dist/cjs/useLoader.native.js +90 -6
- package/dist/cjs/useLoader.native.js.map +1 -1
- package/dist/cjs/useScrollGroup.cjs +37 -0
- package/dist/cjs/useScrollGroup.js +30 -0
- package/dist/cjs/useScrollGroup.js.map +6 -0
- package/dist/cjs/useScrollGroup.native.js +29 -0
- package/dist/cjs/useScrollGroup.native.js.map +1 -0
- package/dist/cjs/validateParams.cjs +80 -0
- package/dist/cjs/validateParams.js +84 -0
- package/dist/cjs/validateParams.js.map +6 -0
- package/dist/cjs/validateParams.native.js +180 -0
- package/dist/cjs/validateParams.native.js.map +1 -0
- package/dist/cjs/validateSearch.cjs +104 -0
- package/dist/cjs/validateSearch.js +99 -0
- package/dist/cjs/validateSearch.js.map +6 -0
- package/dist/cjs/validateSearch.native.js +202 -0
- package/dist/cjs/validateSearch.native.js.map +1 -0
- package/dist/cjs/views/ErrorBoundary.cjs +293 -10
- package/dist/cjs/views/ErrorBoundary.js +328 -8
- package/dist/cjs/views/ErrorBoundary.js.map +2 -2
- package/dist/cjs/views/ErrorBoundary.native.js +159 -4
- package/dist/cjs/views/ErrorBoundary.native.js.map +1 -1
- package/dist/cjs/views/Navigator.cjs +10 -3
- package/dist/cjs/views/Navigator.js +7 -3
- package/dist/cjs/views/Navigator.js.map +1 -1
- package/dist/cjs/views/Navigator.native.js +12 -3
- package/dist/cjs/views/Navigator.native.js.map +1 -1
- package/dist/cjs/views/Protected.cjs +36 -0
- package/dist/cjs/views/Protected.js +27 -0
- package/dist/cjs/views/Protected.js.map +6 -0
- package/dist/cjs/views/Protected.native.js +44 -0
- package/dist/cjs/views/Protected.native.js.map +1 -0
- package/dist/cjs/views/RootErrorBoundary.cjs +193 -8
- package/dist/cjs/views/RootErrorBoundary.js +213 -8
- package/dist/cjs/views/RootErrorBoundary.js.map +1 -1
- package/dist/cjs/views/RootErrorBoundary.native.js +192 -8
- package/dist/cjs/views/RootErrorBoundary.native.js.map +1 -1
- package/dist/cjs/views/ScrollBehavior.cjs +49 -11
- package/dist/cjs/views/ScrollBehavior.js +47 -11
- package/dist/cjs/views/ScrollBehavior.js.map +1 -1
- package/dist/cjs/views/ScrollBehavior.native.js +68 -10
- package/dist/cjs/views/ScrollBehavior.native.js.map +1 -1
- package/dist/cjs/views/SourceInspector.cjs +28 -0
- package/dist/cjs/views/SourceInspector.js +23 -0
- package/dist/cjs/views/SourceInspector.js.map +6 -0
- package/dist/cjs/views/SourceInspector.native.js +32 -0
- package/dist/cjs/views/SourceInspector.native.js.map +1 -0
- package/dist/cjs/views/Try.cjs +40 -7
- package/dist/cjs/views/Try.js +38 -4
- package/dist/cjs/views/Try.js.map +1 -1
- package/dist/cjs/views/Try.native.js +42 -7
- package/dist/cjs/views/Try.native.js.map +1 -1
- package/dist/cjs/vite/DevHead.cjs +797 -43
- package/dist/cjs/vite/DevHead.js +802 -51
- package/dist/cjs/vite/DevHead.js.map +1 -1
- package/dist/cjs/vite/DevHead.native.js +783 -1
- package/dist/cjs/vite/DevHead.native.js.map +1 -1
- package/dist/cjs/vite/one.cjs +7 -1
- package/dist/cjs/vite/one.js +7 -2
- package/dist/cjs/vite/one.js.map +1 -1
- package/dist/cjs/vite/one.native.js +11 -1
- package/dist/cjs/vite/one.native.js.map +1 -1
- package/dist/cjs/vite/plugins/SSRCSSPlugin.cjs +44 -4
- package/dist/cjs/vite/plugins/SSRCSSPlugin.js +48 -4
- package/dist/cjs/vite/plugins/SSRCSSPlugin.js.map +1 -1
- package/dist/cjs/vite/plugins/SSRCSSPlugin.native.js +62 -5
- package/dist/cjs/vite/plugins/SSRCSSPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.js +6 -3
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.js.map +1 -1
- package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.cjs +5 -1
- package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.js +11 -6
- package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.js.map +1 -1
- package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js +1 -0
- package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
- package/dist/cjs/vite/plugins/sourceInspectorPlugin.cjs +155 -0
- package/dist/cjs/vite/plugins/sourceInspectorPlugin.js +148 -0
- package/dist/cjs/vite/plugins/sourceInspectorPlugin.js.map +6 -0
- package/dist/cjs/vite/plugins/sourceInspectorPlugin.native.js +231 -0
- package/dist/cjs/vite/plugins/sourceInspectorPlugin.native.js.map +1 -0
- package/dist/cjs/vite/plugins/virtualEntryPlugin.cjs +25 -6
- package/dist/cjs/vite/plugins/virtualEntryPlugin.js +16 -6
- package/dist/cjs/vite/plugins/virtualEntryPlugin.js.map +1 -1
- package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js +26 -7
- package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
- package/dist/esm/cli/buildPage.js +1 -1
- package/dist/esm/cli/buildPage.mjs +1 -1
- package/dist/esm/cli/buildPage.mjs.map +1 -1
- package/dist/esm/cli/buildPage.native.js +1 -1
- package/dist/esm/cli/buildPage.native.js.map +1 -1
- package/dist/esm/cli/dev.js +4 -4
- package/dist/esm/cli/dev.js.map +1 -1
- package/dist/esm/cli/dev.mjs +4 -4
- package/dist/esm/cli/dev.mjs.map +1 -1
- package/dist/esm/cli/dev.native.js +4 -4
- package/dist/esm/cli/dev.native.js.map +1 -1
- package/dist/esm/createApp.js +2 -2
- package/dist/esm/createApp.js.map +1 -1
- package/dist/esm/createApp.mjs +2 -1
- package/dist/esm/createApp.mjs.map +1 -1
- package/dist/esm/createHandleRequest.test.js +3 -1
- package/dist/esm/createHandleRequest.test.js.map +1 -1
- package/dist/esm/createHandleRequest.test.mjs.map +1 -1
- package/dist/esm/createHandleRequest.test.native.js.map +1 -1
- package/dist/esm/devtools/registry.js +9 -0
- package/dist/esm/devtools/registry.js.map +6 -0
- package/dist/esm/devtools/registry.mjs +6 -0
- package/dist/esm/devtools/registry.mjs.map +1 -0
- package/dist/esm/devtools/registry.native.js +6 -0
- package/dist/esm/devtools/registry.native.js.map +1 -0
- package/dist/esm/fork/createMemoryHistory.js +22 -4
- package/dist/esm/fork/createMemoryHistory.js.map +1 -1
- package/dist/esm/fork/createMemoryHistory.mjs +20 -9
- package/dist/esm/fork/createMemoryHistory.mjs.map +1 -1
- package/dist/esm/fork/createMemoryHistory.native.js +20 -9
- package/dist/esm/fork/createMemoryHistory.native.js.map +1 -1
- package/dist/esm/fork/useLinking.js +6 -5
- package/dist/esm/fork/useLinking.js.map +1 -1
- package/dist/esm/fork/useLinking.mjs +11 -5
- package/dist/esm/fork/useLinking.mjs.map +1 -1
- package/dist/esm/index.js +30 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +8 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +8 -2
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/layouts/withLayoutContext.js +30 -12
- package/dist/esm/layouts/withLayoutContext.js.map +1 -1
- package/dist/esm/layouts/withLayoutContext.mjs +34 -15
- package/dist/esm/layouts/withLayoutContext.mjs.map +1 -1
- package/dist/esm/layouts/withLayoutContext.native.js +42 -19
- package/dist/esm/layouts/withLayoutContext.native.js.map +1 -1
- package/dist/esm/link/Link.js +3 -2
- package/dist/esm/link/Link.js.map +1 -1
- package/dist/esm/link/Link.mjs +5 -2
- package/dist/esm/link/Link.mjs.map +1 -1
- package/dist/esm/link/Link.native.js +6 -1
- package/dist/esm/link/Link.native.js.map +1 -1
- package/dist/esm/link/useLinkTo.js +6 -3
- package/dist/esm/link/useLinkTo.js.map +1 -1
- package/dist/esm/link/useLinkTo.mjs +11 -3
- package/dist/esm/link/useLinkTo.mjs.map +1 -1
- package/dist/esm/link/useLinkTo.native.js +11 -3
- package/dist/esm/link/useLinkTo.native.js.map +1 -1
- package/dist/esm/router/Route.js.map +1 -1
- package/dist/esm/router/Route.mjs.map +1 -1
- package/dist/esm/router/Route.native.js.map +1 -1
- package/dist/esm/router/findRouteNode.js +56 -0
- package/dist/esm/router/findRouteNode.js.map +6 -0
- package/dist/esm/router/findRouteNode.mjs +44 -0
- package/dist/esm/router/findRouteNode.mjs.map +1 -0
- package/dist/esm/router/findRouteNode.native.js +75 -0
- package/dist/esm/router/findRouteNode.native.js.map +1 -0
- package/dist/esm/router/router.js +154 -6
- package/dist/esm/router/router.js.map +1 -1
- package/dist/esm/router/router.mjs +151 -10
- package/dist/esm/router/router.mjs.map +1 -1
- package/dist/esm/router/router.native.js +232 -56
- package/dist/esm/router/router.native.js.map +1 -1
- package/dist/esm/router/useScreens.js +1 -1
- package/dist/esm/router/useScreens.js.map +1 -1
- package/dist/esm/router/useScreens.mjs +1 -1
- package/dist/esm/router/useScreens.mjs.map +1 -1
- package/dist/esm/router/useScreens.native.js +5 -2
- package/dist/esm/router/useScreens.native.js.map +1 -1
- package/dist/esm/server/oneServe.js.map +1 -1
- package/dist/esm/server/oneServe.mjs.map +1 -1
- package/dist/esm/server/oneServe.native.js.map +1 -1
- package/dist/esm/useBlocker.js +122 -0
- package/dist/esm/useBlocker.js.map +6 -0
- package/dist/esm/useBlocker.mjs +123 -0
- package/dist/esm/useBlocker.mjs.map +1 -0
- package/dist/esm/useBlocker.native.js +51 -0
- package/dist/esm/useBlocker.native.js.map +1 -0
- package/dist/esm/useLoader.js +57 -3
- package/dist/esm/useLoader.js.map +2 -2
- package/dist/esm/useLoader.mjs +69 -4
- package/dist/esm/useLoader.mjs.map +1 -1
- package/dist/esm/useLoader.native.js +90 -7
- package/dist/esm/useLoader.native.js.map +1 -1
- package/dist/esm/useScrollGroup.js +16 -0
- package/dist/esm/useScrollGroup.js.map +6 -0
- package/dist/esm/useScrollGroup.mjs +14 -0
- package/dist/esm/useScrollGroup.mjs.map +1 -0
- package/dist/esm/useScrollGroup.native.js +3 -0
- package/dist/esm/useScrollGroup.native.js.map +1 -0
- package/dist/esm/validateParams.js +68 -0
- package/dist/esm/validateParams.js.map +6 -0
- package/dist/esm/validateParams.mjs +54 -0
- package/dist/esm/validateParams.mjs.map +1 -0
- package/dist/esm/validateParams.native.js +151 -0
- package/dist/esm/validateParams.native.js.map +1 -0
- package/dist/esm/validateSearch.js +83 -0
- package/dist/esm/validateSearch.js.map +6 -0
- package/dist/esm/validateSearch.mjs +77 -0
- package/dist/esm/validateSearch.mjs.map +1 -0
- package/dist/esm/validateSearch.native.js +172 -0
- package/dist/esm/validateSearch.native.js.map +1 -0
- package/dist/esm/views/ErrorBoundary.js +325 -7
- package/dist/esm/views/ErrorBoundary.js.map +2 -2
- package/dist/esm/views/ErrorBoundary.mjs +289 -6
- package/dist/esm/views/ErrorBoundary.mjs.map +1 -1
- package/dist/esm/views/ErrorBoundary.native.js +159 -4
- package/dist/esm/views/ErrorBoundary.native.js.map +1 -1
- package/dist/esm/views/Navigator.js +7 -2
- package/dist/esm/views/Navigator.js.map +1 -1
- package/dist/esm/views/Navigator.mjs +10 -3
- package/dist/esm/views/Navigator.mjs.map +1 -1
- package/dist/esm/views/Navigator.native.js +12 -3
- package/dist/esm/views/Navigator.native.js.map +1 -1
- package/dist/esm/views/Protected.js +14 -0
- package/dist/esm/views/Protected.js.map +6 -0
- package/dist/esm/views/Protected.mjs +11 -0
- package/dist/esm/views/Protected.mjs.map +1 -0
- package/dist/esm/views/Protected.native.js +16 -0
- package/dist/esm/views/Protected.native.js.map +1 -0
- package/dist/esm/views/RootErrorBoundary.js +214 -7
- package/dist/esm/views/RootErrorBoundary.js.map +1 -1
- package/dist/esm/views/RootErrorBoundary.mjs +192 -7
- package/dist/esm/views/RootErrorBoundary.mjs.map +1 -1
- package/dist/esm/views/RootErrorBoundary.native.js +191 -7
- package/dist/esm/views/RootErrorBoundary.native.js.map +1 -1
- package/dist/esm/views/ScrollBehavior.js +47 -11
- package/dist/esm/views/ScrollBehavior.js.map +1 -1
- package/dist/esm/views/ScrollBehavior.mjs +48 -11
- package/dist/esm/views/ScrollBehavior.mjs.map +1 -1
- package/dist/esm/views/ScrollBehavior.native.js +67 -10
- package/dist/esm/views/ScrollBehavior.native.js.map +1 -1
- package/dist/esm/views/SourceInspector.js +7 -0
- package/dist/esm/views/SourceInspector.js.map +6 -0
- package/dist/esm/views/SourceInspector.mjs +5 -0
- package/dist/esm/views/SourceInspector.mjs.map +1 -0
- package/dist/esm/views/SourceInspector.native.js +6 -0
- package/dist/esm/views/SourceInspector.native.js.map +1 -0
- package/dist/esm/views/Try.js +38 -4
- package/dist/esm/views/Try.js.map +1 -1
- package/dist/esm/views/Try.mjs +40 -7
- package/dist/esm/views/Try.mjs.map +1 -1
- package/dist/esm/views/Try.native.js +42 -7
- package/dist/esm/views/Try.native.js.map +1 -1
- package/dist/esm/vite/DevHead.js +802 -51
- package/dist/esm/vite/DevHead.js.map +1 -1
- package/dist/esm/vite/DevHead.mjs +797 -43
- package/dist/esm/vite/DevHead.mjs.map +1 -1
- package/dist/esm/vite/DevHead.native.js +782 -0
- package/dist/esm/vite/DevHead.native.js.map +1 -1
- package/dist/esm/vite/one.js +7 -1
- package/dist/esm/vite/one.js.map +1 -1
- package/dist/esm/vite/one.mjs +7 -1
- package/dist/esm/vite/one.mjs.map +1 -1
- package/dist/esm/vite/one.native.js +11 -1
- package/dist/esm/vite/one.native.js.map +1 -1
- package/dist/esm/vite/plugins/SSRCSSPlugin.js +48 -4
- package/dist/esm/vite/plugins/SSRCSSPlugin.js.map +1 -1
- package/dist/esm/vite/plugins/SSRCSSPlugin.mjs +44 -4
- package/dist/esm/vite/plugins/SSRCSSPlugin.mjs.map +1 -1
- package/dist/esm/vite/plugins/SSRCSSPlugin.native.js +61 -4
- package/dist/esm/vite/plugins/SSRCSSPlugin.native.js.map +1 -1
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.js +6 -3
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.js.map +1 -1
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
- package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
- package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.js +11 -6
- package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.js.map +1 -1
- package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.mjs +5 -1
- package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.mjs.map +1 -1
- package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.native.js +1 -0
- package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
- package/dist/esm/vite/plugins/sourceInspectorPlugin.js +126 -0
- package/dist/esm/vite/plugins/sourceInspectorPlugin.js.map +6 -0
- package/dist/esm/vite/plugins/sourceInspectorPlugin.mjs +121 -0
- package/dist/esm/vite/plugins/sourceInspectorPlugin.mjs.map +1 -0
- package/dist/esm/vite/plugins/sourceInspectorPlugin.native.js +194 -0
- package/dist/esm/vite/plugins/sourceInspectorPlugin.native.js.map +1 -0
- package/dist/esm/vite/plugins/virtualEntryPlugin.js +16 -6
- package/dist/esm/vite/plugins/virtualEntryPlugin.js.map +1 -1
- package/dist/esm/vite/plugins/virtualEntryPlugin.mjs +25 -6
- package/dist/esm/vite/plugins/virtualEntryPlugin.mjs.map +1 -1
- package/dist/esm/vite/plugins/virtualEntryPlugin.native.js +26 -7
- package/dist/esm/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
- package/package.json +11 -9
- package/src/cli/buildPage.ts +1 -1
- package/src/cli/dev.ts +4 -4
- package/src/createApp.tsx +11 -1
- package/src/createHandleRequest.test.ts +3 -1
- package/src/devtools/registry.ts +21 -0
- package/src/fork/createMemoryHistory.tsx +43 -11
- package/src/fork/useLinking.ts +14 -4
- package/src/index.ts +34 -1
- package/src/interfaces/router.ts +48 -0
- package/src/layouts/withLayoutContext.tsx +48 -8
- package/src/link/Link.tsx +7 -2
- package/src/link/useLinkTo.tsx +7 -3
- package/src/router/Route.tsx +32 -3
- package/src/router/findRouteNode.ts +127 -0
- package/src/router/router.ts +286 -2
- package/src/router/useScreens.tsx +9 -3
- package/src/useBlocker.native.ts +153 -0
- package/src/useBlocker.ts +340 -0
- package/src/useLoader.ts +139 -1
- package/src/useScrollGroup.native.ts +7 -0
- package/src/useScrollGroup.ts +44 -0
- package/src/validateParams.ts +196 -0
- package/src/validateSearch.ts +241 -0
- package/src/views/ErrorBoundary.tsx +154 -156
- package/src/views/ErrorBoundary.web.tsx +321 -0
- package/src/views/Navigator.tsx +14 -2
- package/src/views/Protected.tsx +62 -0
- package/src/views/RootErrorBoundary.tsx +214 -17
- package/src/views/ScrollBehavior.tsx +82 -3
- package/src/views/SourceInspector.tsx +39 -0
- package/src/views/Try.tsx +81 -12
- package/src/vite/DevHead.tsx +819 -54
- package/src/vite/one.ts +13 -0
- package/src/vite/plugins/SSRCSSPlugin.ts +104 -0
- package/src/vite/plugins/fileSystemRouterPlugin.tsx +11 -8
- package/src/vite/plugins/generateFileSystemRouteTypesPlugin.tsx +4 -0
- package/src/vite/plugins/sourceInspectorPlugin.ts +246 -0
- package/src/vite/plugins/virtualEntryPlugin.ts +35 -10
- package/src/vite/types.ts +28 -0
- package/types/Route.d.ts.map +1 -0
- package/types/cleanUrl.d.ts.map +1 -0
- package/types/cli/run.d.ts.map +1 -0
- package/types/createApp.d.ts +5 -0
- package/types/createApp.d.ts.map +1 -1
- package/types/createRoute.d.ts.map +1 -0
- package/types/devtools/registry.d.ts +15 -0
- package/types/devtools/registry.d.ts.map +1 -0
- package/types/fork/NavigationContainer.native.d.ts.map +1 -0
- package/types/fork/createMemoryHistory.d.ts +8 -3
- package/types/fork/createMemoryHistory.d.ts.map +1 -1
- package/types/fork/useLinking.d.ts.map +1 -1
- package/types/getLinkingConfig.d.ts.map +1 -0
- package/types/getRoutes.d.ts.map +1 -0
- package/types/imperative-api.d.ts.map +1 -0
- package/types/index.d.ts +8 -1
- package/types/index.d.ts.map +1 -1
- package/types/interfaces/router.d.ts +47 -0
- package/types/interfaces/router.d.ts.map +1 -1
- package/types/layouts/withLayoutContext.d.ts +2 -1
- package/types/layouts/withLayoutContext.d.ts.map +1 -1
- package/types/link/Link.d.ts.map +1 -1
- package/types/link/useLinkTo.d.ts +1 -0
- package/types/link/useLinkTo.d.ts.map +1 -1
- package/types/matchers.d.ts.map +1 -0
- package/types/platform.d.ts.map +1 -0
- package/types/router/Route.d.ts +32 -3
- package/types/router/Route.d.ts.map +1 -1
- package/types/router/findRouteNode.d.ts +31 -0
- package/types/router/findRouteNode.d.ts.map +1 -0
- package/types/router/router.d.ts +35 -0
- package/types/router/router.d.ts.map +1 -1
- package/types/router/useScreens.d.ts +2 -0
- package/types/router/useScreens.d.ts.map +1 -1
- package/types/server/oneServe.d.ts.map +1 -1
- package/types/sortRoutes.d.ts.map +1 -0
- package/types/useBlocker.d.ts +72 -0
- package/types/useBlocker.d.ts.map +1 -0
- package/types/useBlocker.native.d.ts +60 -0
- package/types/useBlocker.native.d.ts.map +1 -0
- package/types/useLoader.d.ts +10 -0
- package/types/useLoader.d.ts.map +1 -1
- package/types/useNavigation.d.ts.map +1 -0
- package/types/useScreens.d.ts.map +1 -0
- package/types/useScrollGroup.d.ts +27 -0
- package/types/useScrollGroup.d.ts.map +1 -0
- package/types/useScrollGroup.native.d.ts +6 -0
- package/types/useScrollGroup.native.d.ts.map +1 -0
- package/types/useSearch.d.ts.map +1 -0
- package/types/useViteRoutes.d.ts.map +1 -0
- package/types/validateParams.d.ts +85 -0
- package/types/validateParams.d.ts.map +1 -0
- package/types/validateSearch.d.ts +107 -0
- package/types/validateSearch.d.ts.map +1 -0
- package/types/views/ErrorBoundary.d.ts +11 -1
- package/types/views/ErrorBoundary.d.ts.map +1 -1
- package/types/views/ErrorBoundary.web.d.ts +13 -0
- package/types/views/ErrorBoundary.web.d.ts.map +1 -0
- package/types/views/Navigator.d.ts.map +1 -1
- package/types/views/Protected.d.ts +39 -0
- package/types/views/Protected.d.ts.map +1 -0
- package/types/views/RootErrorBoundary.d.ts +14 -8
- package/types/views/RootErrorBoundary.d.ts.map +1 -1
- package/types/views/ScrollBehavior.d.ts +8 -0
- package/types/views/ScrollBehavior.d.ts.map +1 -1
- package/types/views/ScrollRestoration.d.ts.map +1 -0
- package/types/views/SourceInspector.d.ts +35 -0
- package/types/views/SourceInspector.d.ts.map +1 -0
- package/types/views/Try.d.ts +29 -6
- package/types/views/Try.d.ts.map +1 -1
- package/types/vite/DevHead.d.ts.map +1 -1
- package/types/vite/build.d.ts.map +1 -0
- package/types/vite/headers.d.ts.map +1 -0
- package/types/vite/headers.native.d.ts.map +1 -0
- package/types/vite/one.d.ts.map +1 -1
- package/types/vite/plugins/SSRCSSPlugin.d.ts.map +1 -1
- package/types/vite/plugins/fileSystemRouterPlugin.d.ts.map +1 -1
- package/types/vite/plugins/generateFileSystemRouteTypesPlugin.d.ts.map +1 -1
- package/types/vite/plugins/seoPreviewPlugin.d.ts.map +1 -0
- package/types/vite/plugins/sourceInspectorPlugin.d.ts +3 -0
- package/types/vite/plugins/sourceInspectorPlugin.d.ts.map +1 -0
- package/types/vite/plugins/virtualEntryPlugin.d.ts.map +1 -1
- package/types/vite/resolveAPIRequest.d.ts.map +1 -0
- package/types/vite/server.d.ts.map +1 -0
- package/types/vite/types.d.ts +24 -0
- package/types/vite/types.d.ts.map +1 -1
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { Platform } from 'react-native'
|
|
3
|
+
|
|
4
|
+
export type BlockerState = 'unblocked' | 'blocked' | 'proceeding'
|
|
5
|
+
|
|
6
|
+
export type BlockerFunction = (args: {
|
|
7
|
+
currentLocation: string
|
|
8
|
+
nextLocation: string
|
|
9
|
+
historyAction: 'push' | 'pop' | 'replace'
|
|
10
|
+
}) => boolean
|
|
11
|
+
|
|
12
|
+
export type Blocker =
|
|
13
|
+
| {
|
|
14
|
+
state: 'unblocked'
|
|
15
|
+
reset?: undefined
|
|
16
|
+
proceed?: undefined
|
|
17
|
+
location?: undefined
|
|
18
|
+
}
|
|
19
|
+
| {
|
|
20
|
+
state: 'blocked'
|
|
21
|
+
reset: () => void
|
|
22
|
+
proceed: () => void
|
|
23
|
+
location: string
|
|
24
|
+
}
|
|
25
|
+
| {
|
|
26
|
+
state: 'proceeding'
|
|
27
|
+
reset?: undefined
|
|
28
|
+
proceed?: undefined
|
|
29
|
+
location: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Stored pending navigation that was blocked.
|
|
34
|
+
* We need to restore it when the user confirms.
|
|
35
|
+
*/
|
|
36
|
+
type PendingNavigation = {
|
|
37
|
+
previousLocation: string
|
|
38
|
+
nextLocation: string
|
|
39
|
+
historyAction: 'push' | 'pop' | 'replace'
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Global state for blocking
|
|
43
|
+
let currentLocation =
|
|
44
|
+
typeof window !== 'undefined' ? window.location.pathname + window.location.search : ''
|
|
45
|
+
let isBlocking = false
|
|
46
|
+
let isProceeding = false
|
|
47
|
+
let pendingNavigation: PendingNavigation | null = null
|
|
48
|
+
|
|
49
|
+
// Active blocker callbacks
|
|
50
|
+
const blockerCallbacks = new Map<
|
|
51
|
+
symbol,
|
|
52
|
+
{
|
|
53
|
+
shouldBlock: () => boolean
|
|
54
|
+
onBlock: (pending: PendingNavigation) => void
|
|
55
|
+
onProceed: () => void
|
|
56
|
+
onReset: () => void
|
|
57
|
+
}
|
|
58
|
+
>()
|
|
59
|
+
|
|
60
|
+
// Track if global listeners are set up
|
|
61
|
+
let listenersSetup = false
|
|
62
|
+
|
|
63
|
+
function setupListeners() {
|
|
64
|
+
if (listenersSetup || typeof window === 'undefined') return
|
|
65
|
+
listenersSetup = true
|
|
66
|
+
|
|
67
|
+
// Track current location on page load
|
|
68
|
+
currentLocation = window.location.pathname + window.location.search
|
|
69
|
+
|
|
70
|
+
// Listen for popstate (browser back/forward)
|
|
71
|
+
window.addEventListener('popstate', () => {
|
|
72
|
+
if (isProceeding) return
|
|
73
|
+
|
|
74
|
+
const nextLocation = window.location.pathname + window.location.search
|
|
75
|
+
|
|
76
|
+
// Check if any blocker wants to block
|
|
77
|
+
for (const [, callbacks] of blockerCallbacks) {
|
|
78
|
+
if (callbacks.shouldBlock()) {
|
|
79
|
+
// Block the navigation
|
|
80
|
+
isBlocking = true
|
|
81
|
+
pendingNavigation = {
|
|
82
|
+
previousLocation: currentLocation,
|
|
83
|
+
nextLocation,
|
|
84
|
+
historyAction: 'pop',
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Restore the previous URL immediately using history.forward() or history.back()
|
|
88
|
+
// We pushed a state when we got here, so we need to go back
|
|
89
|
+
window.history.go(1) // Go forward to restore
|
|
90
|
+
|
|
91
|
+
// Notify the blocker
|
|
92
|
+
callbacks.onBlock(pendingNavigation)
|
|
93
|
+
return
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// No blocking, update current location
|
|
98
|
+
currentLocation = nextLocation
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
// Intercept pushState and replaceState
|
|
102
|
+
const originalPushState = window.history.pushState.bind(window.history)
|
|
103
|
+
const originalReplaceState = window.history.replaceState.bind(window.history)
|
|
104
|
+
|
|
105
|
+
window.history.pushState = function (state, title, url) {
|
|
106
|
+
if (isProceeding || !url) {
|
|
107
|
+
return originalPushState(state, title, url)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const nextLocation = typeof url === 'string' ? url : url.toString()
|
|
111
|
+
|
|
112
|
+
for (const [, callbacks] of blockerCallbacks) {
|
|
113
|
+
if (callbacks.shouldBlock()) {
|
|
114
|
+
isBlocking = true
|
|
115
|
+
pendingNavigation = {
|
|
116
|
+
previousLocation: currentLocation,
|
|
117
|
+
nextLocation,
|
|
118
|
+
historyAction: 'push',
|
|
119
|
+
}
|
|
120
|
+
callbacks.onBlock(pendingNavigation)
|
|
121
|
+
return // Don't call original
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
currentLocation = nextLocation
|
|
126
|
+
return originalPushState(state, title, url)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
window.history.replaceState = function (state, title, url) {
|
|
130
|
+
if (isProceeding || !url) {
|
|
131
|
+
return originalReplaceState(state, title, url)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const nextLocation = typeof url === 'string' ? url : url.toString()
|
|
135
|
+
|
|
136
|
+
for (const [, callbacks] of blockerCallbacks) {
|
|
137
|
+
if (callbacks.shouldBlock()) {
|
|
138
|
+
isBlocking = true
|
|
139
|
+
pendingNavigation = {
|
|
140
|
+
previousLocation: currentLocation,
|
|
141
|
+
nextLocation,
|
|
142
|
+
historyAction: 'replace',
|
|
143
|
+
}
|
|
144
|
+
callbacks.onBlock(pendingNavigation)
|
|
145
|
+
return // Don't call original
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
currentLocation = nextLocation
|
|
150
|
+
return originalReplaceState(state, title, url)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Handle beforeunload (page close/refresh)
|
|
154
|
+
window.addEventListener('beforeunload', (event) => {
|
|
155
|
+
for (const [, callbacks] of blockerCallbacks) {
|
|
156
|
+
if (callbacks.shouldBlock()) {
|
|
157
|
+
event.preventDefault()
|
|
158
|
+
event.returnValue = ''
|
|
159
|
+
return
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Block navigation when a condition is met.
|
|
167
|
+
*
|
|
168
|
+
* This is useful for preventing users from accidentally leaving a page with unsaved changes.
|
|
169
|
+
* Works with both browser navigation (back/forward, URL changes) and programmatic navigation.
|
|
170
|
+
*
|
|
171
|
+
* @param shouldBlock - Either a boolean or a function that returns whether to block.
|
|
172
|
+
* When using a function, you receive the current and next locations and can make dynamic decisions.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```tsx
|
|
176
|
+
* function EditForm() {
|
|
177
|
+
* const [isDirty, setIsDirty] = useState(false)
|
|
178
|
+
* const blocker = useBlocker(isDirty)
|
|
179
|
+
*
|
|
180
|
+
* return (
|
|
181
|
+
* <>
|
|
182
|
+
* <form onChange={() => setIsDirty(true)}>
|
|
183
|
+
* {// form fields}
|
|
184
|
+
* </form>
|
|
185
|
+
*
|
|
186
|
+
* {blocker.state === 'blocked' && (
|
|
187
|
+
* <Dialog>
|
|
188
|
+
* <p>You have unsaved changes. Leave anyway?</p>
|
|
189
|
+
* <button onClick={blocker.reset}>Stay</button>
|
|
190
|
+
* <button onClick={blocker.proceed}>Leave</button>
|
|
191
|
+
* </Dialog>
|
|
192
|
+
* )}
|
|
193
|
+
* </>
|
|
194
|
+
* )
|
|
195
|
+
* }
|
|
196
|
+
* ```
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```tsx
|
|
200
|
+
* // Function-based blocking with location info
|
|
201
|
+
* const blocker = useBlocker(({ currentLocation, nextLocation }) => {
|
|
202
|
+
* // Only block when leaving this specific section
|
|
203
|
+
* return currentLocation.startsWith('/edit') && !nextLocation.startsWith('/edit')
|
|
204
|
+
* })
|
|
205
|
+
* ```
|
|
206
|
+
*/
|
|
207
|
+
export function useBlocker(shouldBlock: BlockerFunction | boolean): Blocker {
|
|
208
|
+
const [state, setState] = React.useState<BlockerState>('unblocked')
|
|
209
|
+
const [blockedLocation, setBlockedLocation] = React.useState<string | null>(null)
|
|
210
|
+
const idRef = React.useRef<symbol | null>(null)
|
|
211
|
+
|
|
212
|
+
const shouldBlockRef = React.useRef(shouldBlock)
|
|
213
|
+
shouldBlockRef.current = shouldBlock
|
|
214
|
+
|
|
215
|
+
React.useEffect(() => {
|
|
216
|
+
// Only run on web
|
|
217
|
+
if (Platform.OS !== 'web' || typeof window === 'undefined') return
|
|
218
|
+
|
|
219
|
+
setupListeners()
|
|
220
|
+
|
|
221
|
+
const id = Symbol('blocker')
|
|
222
|
+
idRef.current = id
|
|
223
|
+
|
|
224
|
+
blockerCallbacks.set(id, {
|
|
225
|
+
shouldBlock: () => {
|
|
226
|
+
const block = shouldBlockRef.current
|
|
227
|
+
if (typeof block === 'function') {
|
|
228
|
+
return block({
|
|
229
|
+
currentLocation,
|
|
230
|
+
nextLocation: pendingNavigation?.nextLocation || '',
|
|
231
|
+
historyAction: pendingNavigation?.historyAction || 'push',
|
|
232
|
+
})
|
|
233
|
+
}
|
|
234
|
+
return block
|
|
235
|
+
},
|
|
236
|
+
onBlock: (pending) => {
|
|
237
|
+
setBlockedLocation(pending.nextLocation)
|
|
238
|
+
setState('blocked')
|
|
239
|
+
},
|
|
240
|
+
onProceed: () => {
|
|
241
|
+
setState('proceeding')
|
|
242
|
+
},
|
|
243
|
+
onReset: () => {
|
|
244
|
+
setState('unblocked')
|
|
245
|
+
setBlockedLocation(null)
|
|
246
|
+
},
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
return () => {
|
|
250
|
+
blockerCallbacks.delete(id)
|
|
251
|
+
}
|
|
252
|
+
}, [])
|
|
253
|
+
|
|
254
|
+
const reset = React.useCallback(() => {
|
|
255
|
+
isBlocking = false
|
|
256
|
+
pendingNavigation = null
|
|
257
|
+
setBlockedLocation(null)
|
|
258
|
+
setState('unblocked')
|
|
259
|
+
}, [])
|
|
260
|
+
|
|
261
|
+
const proceed = React.useCallback(() => {
|
|
262
|
+
if (!pendingNavigation) return
|
|
263
|
+
|
|
264
|
+
setState('proceeding')
|
|
265
|
+
isProceeding = true
|
|
266
|
+
|
|
267
|
+
const pending = pendingNavigation
|
|
268
|
+
pendingNavigation = null
|
|
269
|
+
isBlocking = false
|
|
270
|
+
|
|
271
|
+
// Execute the blocked navigation
|
|
272
|
+
requestAnimationFrame(() => {
|
|
273
|
+
if (pending.historyAction === 'pop') {
|
|
274
|
+
// Go back to where the user wanted to go
|
|
275
|
+
window.history.back()
|
|
276
|
+
} else if (pending.historyAction === 'push') {
|
|
277
|
+
window.history.pushState(null, '', pending.nextLocation)
|
|
278
|
+
} else {
|
|
279
|
+
window.history.replaceState(null, '', pending.nextLocation)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
currentLocation = pending.nextLocation
|
|
283
|
+
|
|
284
|
+
// Reset state after navigation
|
|
285
|
+
requestAnimationFrame(() => {
|
|
286
|
+
isProceeding = false
|
|
287
|
+
setBlockedLocation(null)
|
|
288
|
+
setState('unblocked')
|
|
289
|
+
})
|
|
290
|
+
})
|
|
291
|
+
}, [])
|
|
292
|
+
|
|
293
|
+
if (state === 'unblocked') {
|
|
294
|
+
return { state: 'unblocked' }
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (state === 'proceeding') {
|
|
298
|
+
return { state: 'proceeding', location: blockedLocation! }
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return {
|
|
302
|
+
state: 'blocked',
|
|
303
|
+
reset,
|
|
304
|
+
proceed,
|
|
305
|
+
location: blockedLocation!,
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Check if any active blocker wants to block navigation.
|
|
311
|
+
* Called by the router before navigating via Link.
|
|
312
|
+
* Returns true if navigation was blocked.
|
|
313
|
+
*/
|
|
314
|
+
export function checkBlocker(
|
|
315
|
+
nextLocation: string,
|
|
316
|
+
historyAction: 'push' | 'pop' | 'replace' = 'push'
|
|
317
|
+
): boolean {
|
|
318
|
+
if (Platform.OS !== 'web' || typeof window === 'undefined') {
|
|
319
|
+
return false
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (isProceeding) {
|
|
323
|
+
return false
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
for (const [, callbacks] of blockerCallbacks) {
|
|
327
|
+
if (callbacks.shouldBlock()) {
|
|
328
|
+
isBlocking = true
|
|
329
|
+
pendingNavigation = {
|
|
330
|
+
previousLocation: currentLocation,
|
|
331
|
+
nextLocation,
|
|
332
|
+
historyAction,
|
|
333
|
+
}
|
|
334
|
+
callbacks.onBlock(pendingNavigation)
|
|
335
|
+
return true
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return false
|
|
340
|
+
}
|
package/src/useLoader.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useCallback, useDeferredValue, useSyncExternalStore } from 'react'
|
|
2
|
+
import { registerDevtoolsFunction } from './devtools/registry'
|
|
2
3
|
import { useParams, usePathname } from './hooks'
|
|
3
4
|
import { preloadedLoaderData, preloadingLoader } from './router/router'
|
|
4
5
|
import { getLoaderPath } from './utils/cleanUrl'
|
|
@@ -15,6 +16,60 @@ type LoaderStateEntry = {
|
|
|
15
16
|
hasLoadedOnce?: boolean
|
|
16
17
|
}
|
|
17
18
|
|
|
19
|
+
// Timing data for loader waterfall devtool (dev only)
|
|
20
|
+
export type LoaderTimingEntry = {
|
|
21
|
+
path: string
|
|
22
|
+
startTime: number
|
|
23
|
+
moduleLoadTime?: number
|
|
24
|
+
executionTime?: number
|
|
25
|
+
totalTime?: number
|
|
26
|
+
error?: string
|
|
27
|
+
source: 'preload' | 'initial' | 'refetch'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Store timing history for devtools - only populated in development
|
|
31
|
+
const loaderTimingHistory: LoaderTimingEntry[] = []
|
|
32
|
+
const MAX_TIMING_HISTORY = 50
|
|
33
|
+
|
|
34
|
+
function recordLoaderTiming(entry: LoaderTimingEntry) {
|
|
35
|
+
if (process.env.NODE_ENV !== 'development') return
|
|
36
|
+
|
|
37
|
+
loaderTimingHistory.unshift(entry)
|
|
38
|
+
if (loaderTimingHistory.length > MAX_TIMING_HISTORY) {
|
|
39
|
+
loaderTimingHistory.pop()
|
|
40
|
+
}
|
|
41
|
+
// Dispatch event for devtools
|
|
42
|
+
if (typeof window !== 'undefined') {
|
|
43
|
+
window.dispatchEvent(new CustomEvent('one-loader-timing', { detail: entry }))
|
|
44
|
+
|
|
45
|
+
// Also dispatch error event if there was an error
|
|
46
|
+
if (entry.error) {
|
|
47
|
+
window.dispatchEvent(
|
|
48
|
+
new CustomEvent('one-error', {
|
|
49
|
+
detail: {
|
|
50
|
+
error: {
|
|
51
|
+
message: entry.error,
|
|
52
|
+
name: 'LoaderError',
|
|
53
|
+
},
|
|
54
|
+
route: {
|
|
55
|
+
pathname: entry.path,
|
|
56
|
+
},
|
|
57
|
+
timestamp: Date.now(),
|
|
58
|
+
type: 'loader',
|
|
59
|
+
},
|
|
60
|
+
})
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function getLoaderTimingHistory(): LoaderTimingEntry[] {
|
|
67
|
+
return loaderTimingHistory
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Register with devtools registry so router.ts doesn't need to dynamically import us
|
|
71
|
+
registerDevtoolsFunction('getLoaderTimingHistory', getLoaderTimingHistory)
|
|
72
|
+
|
|
18
73
|
const loaderState: Record<string, LoaderStateEntry> = {}
|
|
19
74
|
const subscribers = new Set<() => void>()
|
|
20
75
|
|
|
@@ -44,6 +99,8 @@ function getLoaderState(path: string, preloadedData?: any): LoaderStateEntry {
|
|
|
44
99
|
}
|
|
45
100
|
|
|
46
101
|
export async function refetchLoader(pathname: string): Promise<void> {
|
|
102
|
+
const startTime = performance.now()
|
|
103
|
+
|
|
47
104
|
updateState(pathname, {
|
|
48
105
|
state: 'loading',
|
|
49
106
|
error: null,
|
|
@@ -53,8 +110,15 @@ export async function refetchLoader(pathname: string): Promise<void> {
|
|
|
53
110
|
const cacheBust = `${Date.now()}`
|
|
54
111
|
const loaderJSUrl = getLoaderPath(pathname, true, cacheBust)
|
|
55
112
|
|
|
113
|
+
const moduleLoadStart = performance.now()
|
|
56
114
|
const module = await dynamicImport(loaderJSUrl)
|
|
115
|
+
const moduleLoadTime = performance.now() - moduleLoadStart
|
|
116
|
+
|
|
117
|
+
const executionStart = performance.now()
|
|
57
118
|
const result = await module.loader()
|
|
119
|
+
const executionTime = performance.now() - executionStart
|
|
120
|
+
|
|
121
|
+
const totalTime = performance.now() - startTime
|
|
58
122
|
|
|
59
123
|
updateState(pathname, {
|
|
60
124
|
data: result,
|
|
@@ -62,16 +126,37 @@ export async function refetchLoader(pathname: string): Promise<void> {
|
|
|
62
126
|
timestamp: Date.now(),
|
|
63
127
|
hasLoadedOnce: true,
|
|
64
128
|
})
|
|
129
|
+
|
|
130
|
+
recordLoaderTiming({
|
|
131
|
+
path: pathname,
|
|
132
|
+
startTime,
|
|
133
|
+
moduleLoadTime,
|
|
134
|
+
executionTime,
|
|
135
|
+
totalTime,
|
|
136
|
+
source: 'refetch',
|
|
137
|
+
})
|
|
65
138
|
} catch (err) {
|
|
139
|
+
const totalTime = performance.now() - startTime
|
|
140
|
+
|
|
66
141
|
updateState(pathname, {
|
|
67
142
|
error: err,
|
|
68
143
|
state: 'idle',
|
|
69
144
|
})
|
|
145
|
+
|
|
146
|
+
recordLoaderTiming({
|
|
147
|
+
path: pathname,
|
|
148
|
+
startTime,
|
|
149
|
+
totalTime,
|
|
150
|
+
error: err instanceof Error ? err.message : String(err),
|
|
151
|
+
source: 'refetch',
|
|
152
|
+
})
|
|
153
|
+
|
|
70
154
|
throw err
|
|
71
155
|
}
|
|
72
156
|
}
|
|
73
157
|
|
|
74
|
-
|
|
158
|
+
// Expose refetchLoader globally for HMR in development
|
|
159
|
+
if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {
|
|
75
160
|
;(window as any).__oneRefetchLoader = refetchLoader
|
|
76
161
|
}
|
|
77
162
|
|
|
@@ -172,12 +257,15 @@ export function useLoaderState<
|
|
|
172
257
|
} else {
|
|
173
258
|
// initial load
|
|
174
259
|
const loadData = async () => {
|
|
260
|
+
const startTime = performance.now()
|
|
261
|
+
|
|
175
262
|
try {
|
|
176
263
|
if (process.env.TAMAGUI_TARGET === 'native') {
|
|
177
264
|
const loaderJSUrl = getLoaderPath(currentPath, true)
|
|
178
265
|
const nativeLoaderJSUrl = `${loaderJSUrl}?platform=ios`
|
|
179
266
|
|
|
180
267
|
try {
|
|
268
|
+
const moduleLoadStart = performance.now()
|
|
181
269
|
const loaderJsCodeResp = await fetch(nativeLoaderJSUrl)
|
|
182
270
|
if (!loaderJsCodeResp.ok) {
|
|
183
271
|
throw new Error(`Response not ok: ${loaderJsCodeResp.status}`)
|
|
@@ -187,41 +275,91 @@ export function useLoaderState<
|
|
|
187
275
|
const result = eval(
|
|
188
276
|
`() => { var exports = {}; ${loaderJsCode}; return exports; }`
|
|
189
277
|
)()
|
|
278
|
+
const moduleLoadTime = performance.now() - moduleLoadStart
|
|
190
279
|
|
|
191
280
|
if (typeof result.loader !== 'function') {
|
|
192
281
|
throw new Error("Loader code isn't exporting a `loader` function")
|
|
193
282
|
}
|
|
194
283
|
|
|
284
|
+
const executionStart = performance.now()
|
|
195
285
|
const data = await result.loader()
|
|
286
|
+
const executionTime = performance.now() - executionStart
|
|
287
|
+
const totalTime = performance.now() - startTime
|
|
288
|
+
|
|
196
289
|
updateState(currentPath, {
|
|
197
290
|
data,
|
|
198
291
|
hasLoadedOnce: true,
|
|
199
292
|
promise: undefined,
|
|
200
293
|
})
|
|
294
|
+
|
|
295
|
+
recordLoaderTiming({
|
|
296
|
+
path: currentPath,
|
|
297
|
+
startTime,
|
|
298
|
+
moduleLoadTime,
|
|
299
|
+
executionTime,
|
|
300
|
+
totalTime,
|
|
301
|
+
source: 'initial',
|
|
302
|
+
})
|
|
201
303
|
return
|
|
202
304
|
} catch (e) {
|
|
305
|
+
const totalTime = performance.now() - startTime
|
|
203
306
|
updateState(currentPath, {
|
|
204
307
|
data: {},
|
|
205
308
|
promise: undefined,
|
|
206
309
|
})
|
|
310
|
+
recordLoaderTiming({
|
|
311
|
+
path: currentPath,
|
|
312
|
+
startTime,
|
|
313
|
+
totalTime,
|
|
314
|
+
error: e instanceof Error ? e.message : String(e),
|
|
315
|
+
source: 'initial',
|
|
316
|
+
})
|
|
207
317
|
return
|
|
208
318
|
}
|
|
209
319
|
}
|
|
210
320
|
|
|
211
321
|
// web platform
|
|
212
322
|
const loaderJSUrl = getLoaderPath(currentPath, true)
|
|
323
|
+
|
|
324
|
+
const moduleLoadStart = performance.now()
|
|
213
325
|
const module = await dynamicImport(loaderJSUrl)
|
|
326
|
+
const moduleLoadTime = performance.now() - moduleLoadStart
|
|
327
|
+
|
|
328
|
+
const executionStart = performance.now()
|
|
214
329
|
const result = await module.loader()
|
|
330
|
+
const executionTime = performance.now() - executionStart
|
|
331
|
+
|
|
332
|
+
const totalTime = performance.now() - startTime
|
|
333
|
+
|
|
215
334
|
updateState(currentPath, {
|
|
216
335
|
data: result,
|
|
217
336
|
hasLoadedOnce: true,
|
|
218
337
|
promise: undefined,
|
|
219
338
|
})
|
|
339
|
+
|
|
340
|
+
recordLoaderTiming({
|
|
341
|
+
path: currentPath,
|
|
342
|
+
startTime,
|
|
343
|
+
moduleLoadTime,
|
|
344
|
+
executionTime,
|
|
345
|
+
totalTime,
|
|
346
|
+
source: 'initial',
|
|
347
|
+
})
|
|
220
348
|
} catch (err) {
|
|
349
|
+
const totalTime = performance.now() - startTime
|
|
350
|
+
|
|
221
351
|
updateState(currentPath, {
|
|
222
352
|
error: err,
|
|
223
353
|
promise: undefined,
|
|
224
354
|
})
|
|
355
|
+
|
|
356
|
+
recordLoaderTiming({
|
|
357
|
+
path: currentPath,
|
|
358
|
+
startTime,
|
|
359
|
+
totalTime,
|
|
360
|
+
error: err instanceof Error ? err.message : String(err),
|
|
361
|
+
source: 'initial',
|
|
362
|
+
})
|
|
225
363
|
}
|
|
226
364
|
}
|
|
227
365
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useEffect } from 'react'
|
|
2
|
+
import { usePathname } from './hooks'
|
|
3
|
+
import { registerScrollGroup } from './views/ScrollBehavior'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Register the current route as a scroll group.
|
|
7
|
+
* Child routes will preserve scroll position when navigating between them.
|
|
8
|
+
*
|
|
9
|
+
* Use this in a layout component to create a scroll group for all its children.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* // app/dashboard/_layout.tsx
|
|
14
|
+
* import { useScrollGroup } from 'one'
|
|
15
|
+
*
|
|
16
|
+
* export default function DashboardLayout() {
|
|
17
|
+
* // All routes under /dashboard will share scroll position
|
|
18
|
+
* useScrollGroup()
|
|
19
|
+
*
|
|
20
|
+
* return <Slot />
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* // Custom group path
|
|
27
|
+
* useScrollGroup('/products')
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function useScrollGroup(groupPath?: string) {
|
|
31
|
+
const pathname = usePathname()
|
|
32
|
+
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
// Use provided groupPath or derive from current pathname
|
|
35
|
+
const group = groupPath || pathname
|
|
36
|
+
|
|
37
|
+
if (!group) return
|
|
38
|
+
|
|
39
|
+
// Normalize the group path
|
|
40
|
+
const normalizedGroup = group.endsWith('/') ? group.slice(0, -1) : group
|
|
41
|
+
|
|
42
|
+
return registerScrollGroup(normalizedGroup)
|
|
43
|
+
}, [groupPath, pathname])
|
|
44
|
+
}
|