@bleedingdev/modern-js-runtime 3.2.0-ultramodern.99 → 3.4.0-ultramodern.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/boundary-debugger/index.js +19 -11
- package/dist/cjs/cache/index.js +9 -5
- package/dist/cjs/cli/alias.js +9 -5
- package/dist/cjs/cli/code.js +9 -5
- package/dist/cjs/cli/constants.js +20 -16
- package/dist/cjs/cli/entry.js +9 -5
- package/dist/cjs/cli/index.js +20 -5
- package/dist/cjs/cli/ssr/index.js +9 -5
- package/dist/cjs/cli/ssr/loadable-bundler-plugin.js +9 -5
- package/dist/cjs/cli/ssr/mode.js +12 -8
- package/dist/cjs/cli/template.js +9 -5
- package/dist/cjs/cli/template.server.js +9 -5
- package/dist/cjs/common.js +14 -10
- package/dist/cjs/core/browser/hydrate.js +9 -5
- package/dist/cjs/core/browser/index.js +9 -5
- package/dist/cjs/core/browser/withCallback.js +9 -5
- package/dist/cjs/core/compat/hooks.js +14 -10
- package/dist/cjs/core/compat/index.js +9 -5
- package/dist/cjs/core/compat/requestContext.js +13 -9
- package/dist/cjs/core/config.js +12 -8
- package/dist/cjs/core/constants.js +15 -10
- package/dist/cjs/core/context/extensions.js +69 -0
- package/dist/cjs/core/context/helmetContext.js +54 -0
- package/dist/cjs/core/context/index.js +74 -5
- package/dist/cjs/core/context/monitors/default.js +12 -8
- package/dist/cjs/core/context/monitors/index.js +9 -5
- package/dist/cjs/core/context/monitors/index.server.js +9 -5
- package/dist/cjs/core/context/request/index.js +12 -8
- package/dist/cjs/core/context/request/index.server.js +9 -5
- package/dist/cjs/core/context/response/index.js +15 -11
- package/dist/cjs/core/context/response/index.server.js +9 -5
- package/dist/cjs/core/context/runtime.js +9 -5
- package/dist/cjs/core/context/serverPayload/index.js +13 -9
- package/dist/cjs/core/context/serverPayload/index.server.js +9 -5
- package/dist/cjs/core/index.js +9 -5
- package/dist/cjs/core/plugin/index.js +9 -5
- package/dist/cjs/core/react/index.js +9 -5
- package/dist/cjs/core/react/wrapper.js +15 -9
- package/dist/cjs/core/server/constants.js +15 -11
- package/dist/cjs/core/server/federatedCss.js +11 -7
- package/dist/cjs/core/server/helmet.js +11 -6
- package/dist/cjs/core/server/index.js +9 -5
- package/dist/cjs/core/server/react/index.js +9 -5
- package/dist/cjs/core/server/react/no-ssr-cache/index.js +9 -5
- package/dist/cjs/core/server/react/nossr/index.js +9 -5
- package/dist/cjs/core/server/requestHandler.js +51 -34
- package/dist/cjs/core/server/routerCleanup.js +110 -0
- package/dist/cjs/core/server/scriptOrder.js +84 -9
- package/dist/cjs/core/server/server.js +9 -5
- package/dist/cjs/core/server/shared.js +12 -8
- package/dist/cjs/core/server/stream/afterTemplate.js +15 -23
- package/dist/cjs/core/server/stream/beforeTemplate.js +11 -7
- package/dist/cjs/core/server/stream/beforeTemplate.worker.js +10 -6
- package/dist/cjs/core/server/stream/createReadableStream.js +16 -10
- package/dist/cjs/core/server/stream/createReadableStream.worker.js +15 -7
- package/dist/cjs/core/server/stream/deferredScript.js +13 -6
- package/dist/cjs/core/server/stream/index.js +9 -5
- package/dist/cjs/core/server/stream/shared.js +9 -5
- package/dist/cjs/core/server/stream/template.js +9 -5
- package/dist/cjs/core/server/string/index.js +10 -12
- package/dist/cjs/core/server/string/loadable.js +24 -54
- package/dist/cjs/core/server/string/ssrData.js +10 -6
- package/dist/cjs/core/server/tracer.js +13 -9
- package/dist/cjs/core/server/utils.js +63 -13
- package/dist/cjs/document/Body.js +9 -5
- package/dist/cjs/document/Comment.js +9 -5
- package/dist/cjs/document/DocumentContext.js +9 -5
- package/dist/cjs/document/DocumentStructureContext.js +9 -5
- package/dist/cjs/document/Head.js +9 -5
- package/dist/cjs/document/Html.js +9 -5
- package/dist/cjs/document/Links.js +9 -5
- package/dist/cjs/document/Root.js +9 -5
- package/dist/cjs/document/Script.js +9 -5
- package/dist/cjs/document/Scripts.js +9 -5
- package/dist/cjs/document/Style.js +9 -5
- package/dist/cjs/document/Title.js +9 -5
- package/dist/cjs/document/cli/index.js +14 -11
- package/dist/cjs/document/constants.js +9 -5
- package/dist/cjs/document/index.js +9 -5
- package/dist/cjs/exports/config-routes.js +12 -8
- package/dist/cjs/exports/head.js +153 -83
- package/dist/cjs/exports/loadable.js +27 -18
- package/dist/cjs/exports/tanstack-router.js +50 -58
- package/dist/cjs/index.js +9 -5
- package/dist/cjs/internal.js +9 -5
- package/dist/cjs/module-federation/index.js +178 -0
- package/dist/cjs/react-server.js +9 -5
- package/dist/cjs/router/cli/code/getClientRoutes/getRoutes.js +9 -5
- package/dist/cjs/router/cli/code/getClientRoutes/index.js +9 -5
- package/dist/cjs/router/cli/code/getClientRoutes/utils.js +9 -5
- package/dist/cjs/router/cli/code/index.js +16 -52
- package/dist/cjs/router/cli/code/inspect.js +9 -5
- package/dist/cjs/router/cli/code/makeLegalIdentifier.js +12 -8
- package/dist/cjs/router/cli/code/nestedRoutes.js +9 -5
- package/dist/cjs/router/cli/code/templates.js +10 -19
- package/dist/cjs/router/cli/code/utils.js +9 -5
- package/dist/cjs/router/cli/config-routes/converter.js +9 -5
- package/dist/cjs/router/cli/config-routes/parseRouteConfig.js +9 -5
- package/dist/cjs/router/cli/constants.js +23 -19
- package/dist/cjs/router/cli/entry.js +9 -5
- package/dist/cjs/router/cli/handler.js +10 -6
- package/dist/cjs/router/cli/index.js +11 -29
- package/dist/cjs/router/index.js +9 -5
- package/dist/cjs/router/internal.js +12 -8
- package/dist/cjs/router/runtime/CSSLinks.js +9 -5
- package/dist/cjs/router/runtime/DefaultNotFound.js +9 -5
- package/dist/cjs/router/runtime/DeferredDataScripts.js +12 -8
- package/dist/cjs/router/runtime/DeferredDataScripts.node.js +25 -9
- package/dist/cjs/router/runtime/PrefetchLink.js +161 -26
- package/dist/cjs/router/runtime/constants.js +9 -5
- package/dist/cjs/router/runtime/hooks.js +9 -5
- package/dist/cjs/router/runtime/index.js +15 -10
- package/dist/cjs/router/runtime/internal.js +29 -18
- package/dist/cjs/router/runtime/lifecycle.js +38 -19
- package/dist/cjs/router/runtime/plugin.js +11 -14
- package/dist/cjs/router/runtime/plugin.node.js +11 -12
- package/dist/cjs/router/runtime/provider.js +107 -0
- package/dist/cjs/router/runtime/routerHelper.js +9 -5
- package/dist/cjs/router/runtime/rsc-router.js +19 -9
- package/dist/cjs/router/runtime/rsc.js +9 -5
- package/dist/cjs/router/runtime/server.js +9 -5
- package/dist/cjs/router/runtime/utils.js +44 -15
- package/dist/cjs/router/runtime/withRouter.js +9 -5
- package/dist/cjs/rsc/client.js +12 -8
- package/dist/cjs/rsc/server.js +9 -5
- package/dist/cjs/rsc/server.worker.js +9 -5
- package/dist/esm/boundary-debugger/index.mjs +10 -6
- package/dist/esm/cli/index.mjs +4 -2
- package/dist/esm/core/context/extensions.mjs +28 -0
- package/dist/esm/core/context/helmetContext.mjs +13 -0
- package/dist/esm/core/context/index.mjs +5 -0
- package/dist/esm/core/react/wrapper.mjs +6 -4
- package/dist/esm/core/server/federatedCss.mjs +2 -2
- package/dist/esm/core/server/helmet.mjs +2 -1
- package/dist/esm/core/server/requestHandler.mjs +43 -30
- package/dist/esm/core/server/routerCleanup.mjs +66 -0
- package/dist/esm/core/server/scriptOrder.mjs +62 -3
- package/dist/esm/core/server/stream/afterTemplate.mjs +8 -20
- package/dist/esm/core/server/stream/beforeTemplate.mjs +3 -3
- package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +1 -1
- package/dist/esm/core/server/stream/createReadableStream.mjs +7 -5
- package/dist/esm/core/server/stream/createReadableStream.worker.mjs +6 -2
- package/dist/esm/core/server/stream/deferredScript.mjs +4 -1
- package/dist/esm/core/server/string/index.mjs +3 -9
- package/dist/esm/core/server/string/loadable.mjs +14 -48
- package/dist/esm/core/server/string/ssrData.mjs +2 -2
- package/dist/esm/core/server/utils.mjs +52 -9
- package/dist/esm/document/cli/index.mjs +5 -6
- package/dist/esm/exports/head.mjs +144 -78
- package/dist/esm/exports/loadable.mjs +12 -6
- package/dist/esm/exports/tanstack-router.mjs +30 -3
- package/dist/esm/module-federation/index.mjs +109 -0
- package/dist/esm/router/cli/code/index.mjs +8 -48
- package/dist/esm/router/cli/code/templates.mjs +1 -14
- package/dist/esm/router/cli/handler.mjs +1 -1
- package/dist/esm/router/cli/index.mjs +3 -25
- package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +16 -4
- package/dist/esm/router/runtime/PrefetchLink.mjs +152 -21
- package/dist/esm/router/runtime/internal.mjs +16 -15
- package/dist/esm/router/runtime/lifecycle.mjs +22 -13
- package/dist/esm/router/runtime/plugin.mjs +4 -11
- package/dist/esm/router/runtime/plugin.node.mjs +4 -9
- package/dist/esm/router/runtime/provider.mjs +57 -0
- package/dist/esm/router/runtime/rsc-router.mjs +10 -4
- package/dist/esm/router/runtime/utils.mjs +35 -10
- package/dist/esm-node/boundary-debugger/index.mjs +10 -6
- package/dist/esm-node/cli/index.mjs +4 -2
- package/dist/esm-node/core/context/extensions.mjs +29 -0
- package/dist/esm-node/core/context/helmetContext.mjs +14 -0
- package/dist/esm-node/core/context/index.mjs +5 -0
- package/dist/esm-node/core/react/wrapper.mjs +6 -4
- package/dist/esm-node/core/server/federatedCss.mjs +2 -2
- package/dist/esm-node/core/server/helmet.mjs +2 -1
- package/dist/esm-node/core/server/requestHandler.mjs +43 -30
- package/dist/esm-node/core/server/routerCleanup.mjs +67 -0
- package/dist/esm-node/core/server/scriptOrder.mjs +62 -3
- package/dist/esm-node/core/server/stream/afterTemplate.mjs +8 -20
- package/dist/esm-node/core/server/stream/beforeTemplate.mjs +3 -3
- package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +1 -1
- package/dist/esm-node/core/server/stream/createReadableStream.mjs +7 -5
- package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +6 -2
- package/dist/esm-node/core/server/stream/deferredScript.mjs +4 -1
- package/dist/esm-node/core/server/string/index.mjs +3 -9
- package/dist/esm-node/core/server/string/loadable.mjs +14 -48
- package/dist/esm-node/core/server/string/ssrData.mjs +2 -2
- package/dist/esm-node/core/server/utils.mjs +52 -9
- package/dist/esm-node/document/cli/index.mjs +5 -6
- package/dist/esm-node/exports/head.mjs +144 -78
- package/dist/esm-node/exports/loadable.mjs +12 -6
- package/dist/esm-node/exports/tanstack-router.mjs +30 -3
- package/dist/esm-node/module-federation/index.mjs +110 -0
- package/dist/esm-node/router/cli/code/index.mjs +8 -48
- package/dist/esm-node/router/cli/code/templates.mjs +1 -14
- package/dist/esm-node/router/cli/handler.mjs +1 -1
- package/dist/esm-node/router/cli/index.mjs +3 -25
- package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +16 -4
- package/dist/esm-node/router/runtime/PrefetchLink.mjs +152 -21
- package/dist/esm-node/router/runtime/internal.mjs +16 -15
- package/dist/esm-node/router/runtime/lifecycle.mjs +22 -13
- package/dist/esm-node/router/runtime/plugin.mjs +4 -11
- package/dist/esm-node/router/runtime/plugin.node.mjs +4 -9
- package/dist/esm-node/router/runtime/provider.mjs +58 -0
- package/dist/esm-node/router/runtime/rsc-router.mjs +10 -4
- package/dist/esm-node/router/runtime/utils.mjs +35 -10
- package/dist/types/cli/entry.d.ts +2 -2
- package/dist/types/cli/index.d.ts +3 -1
- package/dist/types/core/context/extensions.d.ts +37 -0
- package/dist/types/core/context/helmetContext.d.ts +10 -0
- package/dist/types/core/context/index.d.ts +6 -0
- package/dist/types/core/context/response/index.server.d.ts +4 -1
- package/dist/types/core/context/runtime.d.ts +1 -11
- package/dist/types/core/plugin/index.d.ts +1 -1
- package/dist/types/core/server/routerCleanup.d.ts +28 -0
- package/dist/types/core/server/scriptOrder.d.ts +24 -0
- package/dist/types/core/server/string/loadable.d.ts +1 -7
- package/dist/types/core/server/utils.d.ts +19 -1
- package/dist/types/document/constants.d.ts +3 -1
- package/dist/types/exports/head.d.ts +4 -4
- package/dist/types/exports/loadable.d.ts +1 -1
- package/dist/types/exports/tanstack-router.d.ts +88 -5
- package/dist/types/module-federation/index.d.ts +65 -0
- package/dist/types/router/cli/code/index.d.ts +1 -3
- package/dist/types/router/cli/code/utils.d.ts +1 -1
- package/dist/types/router/cli/entry.d.ts +1 -1
- package/dist/types/router/cli/handler.d.ts +0 -3
- package/dist/types/router/runtime/DeferredDataScripts.d.ts +1 -1
- package/dist/types/router/runtime/PrefetchLink.d.ts +5 -1
- package/dist/types/router/runtime/internal.d.ts +1 -0
- package/dist/types/router/runtime/lifecycle.d.ts +2 -0
- package/dist/types/router/runtime/plugin.d.ts +1 -1
- package/dist/types/router/runtime/plugin.node.d.ts +1 -1
- package/dist/types/router/runtime/provider.d.ts +61 -0
- package/package.json +34 -26
- package/rstest.config.mts +2 -4
- package/dist/cjs/router/cli/code/tanstackTypes.js +0 -443
- package/dist/cjs/router/runtime/tanstack/basepathRewrite.js +0 -62
- package/dist/cjs/router/runtime/tanstack/dataMutation.js +0 -345
- package/dist/cjs/router/runtime/tanstack/hydrationBoundary.js +0 -43
- package/dist/cjs/router/runtime/tanstack/plugin.js +0 -240
- package/dist/cjs/router/runtime/tanstack/plugin.node.js +0 -268
- package/dist/cjs/router/runtime/tanstack/prefetchLink.js +0 -55
- package/dist/cjs/router/runtime/tanstack/routeTree.js +0 -510
- package/dist/cjs/router/runtime/tanstack/rsc/ClientSlot.js +0 -53
- package/dist/cjs/router/runtime/tanstack/rsc/CompositeComponent.js +0 -75
- package/dist/cjs/router/runtime/tanstack/rsc/ReplayableStream.js +0 -141
- package/dist/cjs/router/runtime/tanstack/rsc/RscNodeRenderer.js +0 -65
- package/dist/cjs/router/runtime/tanstack/rsc/SlotContext.js +0 -54
- package/dist/cjs/router/runtime/tanstack/rsc/client.js +0 -93
- package/dist/cjs/router/runtime/tanstack/rsc/createRscProxy.js +0 -141
- package/dist/cjs/router/runtime/tanstack/rsc/index.js +0 -42
- package/dist/cjs/router/runtime/tanstack/rsc/server.js +0 -246
- package/dist/cjs/router/runtime/tanstack/rsc/slotUsageSanitizer.js +0 -65
- package/dist/cjs/router/runtime/tanstack/rsc/symbols.js +0 -72
- package/dist/cjs/ssr/index.node.js +0 -121
- package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -84
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +0 -196
- package/dist/cjs/ssr/serverRender/types.js +0 -36
- package/dist/esm/router/cli/code/tanstackTypes.mjs +0 -396
- package/dist/esm/router/runtime/tanstack/basepathRewrite.mjs +0 -28
- package/dist/esm/router/runtime/tanstack/dataMutation.mjs +0 -305
- package/dist/esm/router/runtime/tanstack/hydrationBoundary.mjs +0 -9
- package/dist/esm/router/runtime/tanstack/plugin.mjs +0 -206
- package/dist/esm/router/runtime/tanstack/plugin.node.mjs +0 -234
- package/dist/esm/router/runtime/tanstack/prefetchLink.mjs +0 -18
- package/dist/esm/router/runtime/tanstack/routeTree.mjs +0 -470
- package/dist/esm/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -19
- package/dist/esm/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -41
- package/dist/esm/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -104
- package/dist/esm/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -31
- package/dist/esm/router/runtime/tanstack/rsc/SlotContext.mjs +0 -17
- package/dist/esm/router/runtime/tanstack/rsc/client.mjs +0 -53
- package/dist/esm/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -107
- package/dist/esm/router/runtime/tanstack/rsc/index.mjs +0 -1
- package/dist/esm/router/runtime/tanstack/rsc/server.mjs +0 -200
- package/dist/esm/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -31
- package/dist/esm/router/runtime/tanstack/rsc/symbols.mjs +0 -17
- package/dist/esm/ssr/index.node.mjs +0 -44
- package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -50
- package/dist/esm/ssr/serverRender/renderToString/entry.mjs +0 -151
- package/dist/esm/ssr/serverRender/types.mjs +0 -1
- package/dist/esm-node/router/cli/code/tanstackTypes.mjs +0 -397
- package/dist/esm-node/router/runtime/tanstack/basepathRewrite.mjs +0 -29
- package/dist/esm-node/router/runtime/tanstack/dataMutation.mjs +0 -306
- package/dist/esm-node/router/runtime/tanstack/hydrationBoundary.mjs +0 -10
- package/dist/esm-node/router/runtime/tanstack/plugin.mjs +0 -207
- package/dist/esm-node/router/runtime/tanstack/plugin.node.mjs +0 -235
- package/dist/esm-node/router/runtime/tanstack/prefetchLink.mjs +0 -19
- package/dist/esm-node/router/runtime/tanstack/routeTree.mjs +0 -471
- package/dist/esm-node/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -20
- package/dist/esm-node/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -42
- package/dist/esm-node/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -105
- package/dist/esm-node/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -32
- package/dist/esm-node/router/runtime/tanstack/rsc/SlotContext.mjs +0 -18
- package/dist/esm-node/router/runtime/tanstack/rsc/client.mjs +0 -54
- package/dist/esm-node/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -108
- package/dist/esm-node/router/runtime/tanstack/rsc/index.mjs +0 -2
- package/dist/esm-node/router/runtime/tanstack/rsc/server.mjs +0 -201
- package/dist/esm-node/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -32
- package/dist/esm-node/router/runtime/tanstack/rsc/symbols.mjs +0 -18
- package/dist/esm-node/ssr/index.node.mjs +0 -45
- package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -51
- package/dist/esm-node/ssr/serverRender/renderToString/entry.mjs +0 -152
- package/dist/esm-node/ssr/serverRender/types.mjs +0 -2
- package/dist/types/router/cli/code/tanstackTypes.d.ts +0 -10
- package/dist/types/router/runtime/tanstack/basepathRewrite.d.ts +0 -8
- package/dist/types/router/runtime/tanstack/dataMutation.d.ts +0 -29
- package/dist/types/router/runtime/tanstack/hydrationBoundary.d.ts +0 -2
- package/dist/types/router/runtime/tanstack/plugin.d.ts +0 -6
- package/dist/types/router/runtime/tanstack/plugin.node.d.ts +0 -6
- package/dist/types/router/runtime/tanstack/prefetchLink.d.ts +0 -11
- package/dist/types/router/runtime/tanstack/routeTree.d.ts +0 -8
- package/dist/types/router/runtime/tanstack/rsc/ClientSlot.d.ts +0 -5
- package/dist/types/router/runtime/tanstack/rsc/CompositeComponent.d.ts +0 -3
- package/dist/types/router/runtime/tanstack/rsc/ReplayableStream.d.ts +0 -24
- package/dist/types/router/runtime/tanstack/rsc/RscNodeRenderer.d.ts +0 -5
- package/dist/types/router/runtime/tanstack/rsc/SlotContext.d.ts +0 -11
- package/dist/types/router/runtime/tanstack/rsc/client.d.ts +0 -11
- package/dist/types/router/runtime/tanstack/rsc/createRscProxy.d.ts +0 -7
- package/dist/types/router/runtime/tanstack/rsc/index.d.ts +0 -2
- package/dist/types/router/runtime/tanstack/rsc/server.d.ts +0 -14
- package/dist/types/router/runtime/tanstack/rsc/slotUsageSanitizer.d.ts +0 -2
- package/dist/types/router/runtime/tanstack/rsc/symbols.d.ts +0 -46
|
@@ -4,15 +4,15 @@ import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFrom
|
|
|
4
4
|
import { normalizePathname } from "@modern-js/runtime-utils/url";
|
|
5
5
|
import * as __rspack_external_react from "react";
|
|
6
6
|
import { InternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
|
|
7
|
-
import { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter } from "./hooks.mjs";
|
|
8
7
|
import { applyRouterRuntimeState } from "./lifecycle.mjs";
|
|
8
|
+
import { routerProviderRegistryHooks } from "./provider.mjs";
|
|
9
9
|
import { createClientRouterFromPayload } from "./rsc-router.mjs";
|
|
10
10
|
import { createRouteObjectsFromConfig, deserializeErrors, renderRoutes, urlJoin } from "./utils.mjs";
|
|
11
11
|
let finalRouteConfig = {
|
|
12
12
|
routes: []
|
|
13
13
|
};
|
|
14
14
|
let beforeCreateRouter = true;
|
|
15
|
-
function
|
|
15
|
+
function modifyRoutes(modifyFunction) {
|
|
16
16
|
if (beforeCreateRouter) {
|
|
17
17
|
const { routes: originRoutes } = finalRouteConfig;
|
|
18
18
|
const newRoutes = modifyFunction(originRoutes);
|
|
@@ -21,14 +21,7 @@ function plugin_modifyRoutes(modifyFunction) {
|
|
|
21
21
|
}
|
|
22
22
|
const routerPlugin = (userConfig = {})=>({
|
|
23
23
|
name: '@modern-js/plugin-router',
|
|
24
|
-
registryHooks:
|
|
25
|
-
onAfterCreateRouter: onAfterCreateRouter,
|
|
26
|
-
onAfterHydrateRouter: onAfterHydrateRouter,
|
|
27
|
-
onBeforeCreateRouter: onBeforeCreateRouter,
|
|
28
|
-
modifyRoutes: modifyRoutes,
|
|
29
|
-
onBeforeCreateRoutes: onBeforeCreateRoutes,
|
|
30
|
-
onBeforeHydrateRouter: onBeforeHydrateRouter
|
|
31
|
-
},
|
|
24
|
+
registryHooks: routerProviderRegistryHooks,
|
|
32
25
|
setup: (api)=>{
|
|
33
26
|
const routesContainer = {
|
|
34
27
|
current: []
|
|
@@ -216,4 +209,4 @@ function useRouterCreation(props, options) {
|
|
|
216
209
|
getBlockNavState
|
|
217
210
|
]);
|
|
218
211
|
}
|
|
219
|
-
export { beforeCreateRouter, finalRouteConfig,
|
|
212
|
+
export { beforeCreateRouter, finalRouteConfig, modifyRoutes, routerPlugin };
|
|
@@ -8,8 +8,8 @@ import { useContext } from "react";
|
|
|
8
8
|
import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
|
|
9
9
|
import { setServerPayload } from "../../core/context/serverPayload/index.server.mjs";
|
|
10
10
|
import DeferredDataScripts_node from "./DeferredDataScripts.node.mjs";
|
|
11
|
-
import { modifyRoutes, onAfterCreateRouter, onBeforeCreateRouter, onBeforeCreateRoutes } from "./hooks.mjs";
|
|
12
11
|
import { applyRouterRuntimeState, createRouterServerSnapshot } from "./lifecycle.mjs";
|
|
12
|
+
import { routerProviderRegistryHooks } from "./provider.mjs";
|
|
13
13
|
import { RSCStaticRouter, createServerPayload, handleRSCRedirect, prepareRSCRoutes } from "./rsc-router.mjs";
|
|
14
14
|
import { createRouteObjectsFromConfig, renderRoutes, urlJoin } from "./utils.mjs";
|
|
15
15
|
function createRemixRequest(request) {
|
|
@@ -42,12 +42,7 @@ function createReactRouterServerSnapshot(routerContext, basename) {
|
|
|
42
42
|
}
|
|
43
43
|
const routerPlugin = (userConfig = {})=>({
|
|
44
44
|
name: '@modern-js/plugin-router',
|
|
45
|
-
registryHooks:
|
|
46
|
-
onAfterCreateRouter: onAfterCreateRouter,
|
|
47
|
-
onBeforeCreateRouter: onBeforeCreateRouter,
|
|
48
|
-
modifyRoutes: modifyRoutes,
|
|
49
|
-
onBeforeCreateRoutes: onBeforeCreateRoutes
|
|
50
|
-
},
|
|
45
|
+
registryHooks: routerProviderRegistryHooks,
|
|
51
46
|
setup: (api)=>{
|
|
52
47
|
let finalRouteConfig = {};
|
|
53
48
|
api.onBeforeRender(async (context, interrupt)=>{
|
|
@@ -175,5 +170,5 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
175
170
|
});
|
|
176
171
|
}
|
|
177
172
|
});
|
|
178
|
-
const
|
|
179
|
-
export {
|
|
173
|
+
const modifyRoutes = ()=>{};
|
|
174
|
+
export { modifyRoutes, routerPlugin };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter } from "./hooks.mjs";
|
|
2
|
+
const routerProviderRegistryHooks = {
|
|
3
|
+
modifyRoutes: modifyRoutes,
|
|
4
|
+
onBeforeCreateRoutes: onBeforeCreateRoutes,
|
|
5
|
+
onBeforeCreateRouter: onBeforeCreateRouter,
|
|
6
|
+
onAfterCreateRouter: onAfterCreateRouter,
|
|
7
|
+
onBeforeHydrateRouter: onBeforeHydrateRouter,
|
|
8
|
+
onAfterHydrateRouter: onAfterHydrateRouter
|
|
9
|
+
};
|
|
10
|
+
function reportUnsupportedProviderRegistryHooks(providerPlugin) {
|
|
11
|
+
const unsupportedHookNames = Object.keys(providerPlugin.registryHooks ?? {}).filter((hookName)=>!(hookName in routerProviderRegistryHooks));
|
|
12
|
+
if (unsupportedHookNames.length > 0) console.warn(`[@modern-js/runtime] The router provider "${providerPlugin.name}" declares registry hooks outside the router hook contract: ${unsupportedHookNames.join(', ')}. These hooks are not registered when the provider is resolved through \`runtime.router.framework\` — declare them on a separate runtime plugin instead.`);
|
|
13
|
+
return unsupportedHookNames;
|
|
14
|
+
}
|
|
15
|
+
const REGISTRY_SLOT = Symbol.for('@modern-js/runtime:router-providers:v2');
|
|
16
|
+
function getRegistry() {
|
|
17
|
+
const host = globalThis;
|
|
18
|
+
host[REGISTRY_SLOT] ??= {
|
|
19
|
+
providers: new Map(),
|
|
20
|
+
warnedDuplicates: new Set()
|
|
21
|
+
};
|
|
22
|
+
host[REGISTRY_SLOT].warnedDuplicates ??= new Set();
|
|
23
|
+
return host[REGISTRY_SLOT];
|
|
24
|
+
}
|
|
25
|
+
function registerRouterProvider(name, factory, options = {}) {
|
|
26
|
+
const registry = getRegistry();
|
|
27
|
+
const existing = registry.providers.get(name);
|
|
28
|
+
if (void 0 !== existing) {
|
|
29
|
+
if (existing !== factory && !registry.warnedDuplicates.has(name)) {
|
|
30
|
+
registry.warnedDuplicates.add(name);
|
|
31
|
+
console.warn(`[@modern-js/runtime] The router provider "${name}" was registered more than once with different module instances; keeping the first registration. This usually means two copies of the providing plugin were bundled — for Module Federation, add the provider runtime (e.g. '@modern-js/plugin-tanstack/runtime') to the shared modules of both the host and the remote to deduplicate it.`);
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (true !== options.isDefault) {
|
|
36
|
+
if (void 0 !== registry.nonDefaultProvider && registry.nonDefaultProvider !== name) throw new Error(`[@modern-js/runtime] Cannot register router provider "${name}": the competing router provider "${registry.nonDefaultProvider}" is already registered. Only one non-default router provider may be installed at a time — remove one of the router plugins.`);
|
|
37
|
+
registry.nonDefaultProvider = name;
|
|
38
|
+
} else registry.defaultProvider = name;
|
|
39
|
+
registry.providers.set(name, factory);
|
|
40
|
+
}
|
|
41
|
+
function resolveRouterProvider(framework, options = {}) {
|
|
42
|
+
const registry = getRegistry();
|
|
43
|
+
const name = framework || registry.defaultProvider || options.localDefault?.name;
|
|
44
|
+
if (void 0 === name) throw new Error('[@modern-js/runtime] No default router provider is registered. This is a bug in the runtime setup.');
|
|
45
|
+
if (void 0 !== options.localDefault && name === options.localDefault.name) return options.localDefault.factory;
|
|
46
|
+
const factory = registry.providers.get(name);
|
|
47
|
+
if (void 0 !== factory) return factory;
|
|
48
|
+
if ('tanstack' === name) throw new Error("[@modern-js/runtime] `runtime.router.framework` is set to \"tanstack\", but no TanStack router provider is registered. Install @modern-js/plugin-tanstack, add `tanstackRouterPlugin()` to the `plugins` array in modern.config.ts, and make sure '@modern-js/plugin-tanstack/runtime' is imported (e.g. in modern.runtime.ts).");
|
|
49
|
+
throw new Error(`[@modern-js/runtime] Unknown router framework "${name}". Registered providers: ${[
|
|
50
|
+
...registry.providers.keys()
|
|
51
|
+
].join(', ') || '(none)'}. Install and register the plugin that provides this router framework.`);
|
|
52
|
+
}
|
|
53
|
+
function unsafe_resetRouterProvidersForTesting() {
|
|
54
|
+
const host = globalThis;
|
|
55
|
+
delete host[REGISTRY_SLOT];
|
|
56
|
+
}
|
|
57
|
+
export { registerRouterProvider, reportUnsupportedProviderRegistryHooks, resolveRouterProvider, routerProviderRegistryHooks, unsafe_resetRouterProvidersForTesting };
|
|
@@ -8,6 +8,7 @@ const safeUse = (value)=>{
|
|
|
8
8
|
if ('function' == typeof reactUse) return reactUse(value);
|
|
9
9
|
return null;
|
|
10
10
|
};
|
|
11
|
+
const hasRouteErrorBoundary = (route)=>Boolean(route.errorElement || route.ErrorBoundary);
|
|
11
12
|
function collectCssFilesFromRoutes(matches, routes) {
|
|
12
13
|
const cssFiles = [];
|
|
13
14
|
for (const match of matches){
|
|
@@ -69,7 +70,7 @@ const createServerPayload = (routerContext, routes)=>{
|
|
|
69
70
|
errorElement: route.errorElement,
|
|
70
71
|
handle: route.handle,
|
|
71
72
|
hasAction: !!route.action,
|
|
72
|
-
hasErrorBoundary:
|
|
73
|
+
hasErrorBoundary: hasRouteErrorBoundary(route),
|
|
73
74
|
hasLoader: !!route.loader,
|
|
74
75
|
hasClientLoader: !!route.hasClientLoader,
|
|
75
76
|
id: route.id,
|
|
@@ -132,6 +133,12 @@ const mergeRoutes = (routes, originalRoutes)=>{
|
|
|
132
133
|
});
|
|
133
134
|
return mergeRoutesRecursive(originalRoutes);
|
|
134
135
|
};
|
|
136
|
+
const toReactRouterRoute = (route)=>{
|
|
137
|
+
const { hasErrorBoundary: _hasErrorBoundary, children, ...routeObject } = route;
|
|
138
|
+
const sanitizedRoute = routeObject;
|
|
139
|
+
if (children && Array.isArray(children)) sanitizedRoute.children = children.map(toReactRouterRoute);
|
|
140
|
+
return sanitizedRoute;
|
|
141
|
+
};
|
|
135
142
|
const findRouteInTree = (routes, routeId)=>{
|
|
136
143
|
for (const route of routes){
|
|
137
144
|
if (route.id === routeId) return route;
|
|
@@ -252,7 +259,7 @@ const createClientRouterFromPayload = (payload, originalRoutes, basename = '')=>
|
|
|
252
259
|
if (matchedRoute) {
|
|
253
260
|
const modernMatch = match.route;
|
|
254
261
|
router.patchRoutes(matchedRoute.parentId ?? null, [
|
|
255
|
-
matchedRoute
|
|
262
|
+
toReactRouterRoute(matchedRoute)
|
|
256
263
|
], true);
|
|
257
264
|
if (modernMatch.isClientComponent && modernMatch.Component) delete modernMatch.Component;
|
|
258
265
|
}
|
|
@@ -285,7 +292,6 @@ const createRSCStaticRouterComponent = (payload, basename)=>{
|
|
|
285
292
|
id: match.id,
|
|
286
293
|
action: match.hasAction || !!match.clientAction,
|
|
287
294
|
handle: match.handle,
|
|
288
|
-
hasErrorBoundary: match.hasErrorBoundary,
|
|
289
295
|
loader: match.hasLoader || !!match.clientLoader,
|
|
290
296
|
index: match.index,
|
|
291
297
|
path: match.path,
|
|
@@ -304,7 +310,7 @@ const createRSCStaticRouterComponent = (payload, basename)=>{
|
|
|
304
310
|
route
|
|
305
311
|
];
|
|
306
312
|
}, []);
|
|
307
|
-
const router = createStaticRouter(processedRoutes, routerContext);
|
|
313
|
+
const router = createStaticRouter(processedRoutes.map(toReactRouterRoute), routerContext);
|
|
308
314
|
return /*#__PURE__*/ jsx(StaticRouterProvider, {
|
|
309
315
|
context: routerContext,
|
|
310
316
|
router: router,
|
|
@@ -60,7 +60,6 @@ function getRouteObjects(routes, { globalApp, ssrMode, props }) {
|
|
|
60
60
|
id: route.id,
|
|
61
61
|
loader: route.loader,
|
|
62
62
|
action: route.action,
|
|
63
|
-
hasErrorBoundary: route.hasErrorBoundary,
|
|
64
63
|
shouldRevalidate: route.shouldRevalidate,
|
|
65
64
|
handle: {
|
|
66
65
|
...route.handle,
|
|
@@ -98,7 +97,10 @@ function getRouteObjects(routes, { globalApp, ssrMode, props }) {
|
|
|
98
97
|
}
|
|
99
98
|
routeObjects.push({
|
|
100
99
|
path: '*',
|
|
101
|
-
element: /*#__PURE__*/ jsx(DefaultNotFound, {})
|
|
100
|
+
element: /*#__PURE__*/ jsx(DefaultNotFound, {}),
|
|
101
|
+
loader: ()=>new Response('404', {
|
|
102
|
+
status: 404
|
|
103
|
+
})
|
|
102
104
|
});
|
|
103
105
|
return routeObjects;
|
|
104
106
|
}
|
|
@@ -147,17 +149,40 @@ function serializeErrors(errors) {
|
|
|
147
149
|
if (!errors) return null;
|
|
148
150
|
const entries = Object.entries(errors);
|
|
149
151
|
const serialized = {};
|
|
150
|
-
for (const [key, val] of entries)if (isRouteErrorResponse(val)) serialized[key] =
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
for (const [key, val] of entries)if (isRouteErrorResponse(val)) serialized[key] = serializeRouteErrorResponse(val);
|
|
153
|
+
else if (val instanceof Error) serialized[key] = serializeError(val);
|
|
154
|
+
else serialized[key] = val;
|
|
155
|
+
return serialized;
|
|
156
|
+
}
|
|
157
|
+
function shouldRedactServerError() {
|
|
158
|
+
return 'development' !== process.env.NODE_ENV && 'test' !== process.env.NODE_ENV;
|
|
159
|
+
}
|
|
160
|
+
function serializeError(error) {
|
|
161
|
+
if (shouldRedactServerError()) return {
|
|
162
|
+
message: 'Unexpected Server Error',
|
|
163
|
+
stack: void 0,
|
|
164
|
+
__type: 'Error'
|
|
153
165
|
};
|
|
154
|
-
|
|
155
|
-
message:
|
|
156
|
-
stack:
|
|
166
|
+
return {
|
|
167
|
+
message: error.message,
|
|
168
|
+
stack: error.stack,
|
|
157
169
|
__type: 'Error'
|
|
158
170
|
};
|
|
159
|
-
|
|
160
|
-
|
|
171
|
+
}
|
|
172
|
+
function serializeRouteErrorResponse(error) {
|
|
173
|
+
if (!isRouteErrorResponse(error)) return error;
|
|
174
|
+
if (error.status >= 500 && shouldRedactServerError()) return {
|
|
175
|
+
status: error.status,
|
|
176
|
+
statusText: 'Internal Server Error',
|
|
177
|
+
data: 'Unexpected Server Error',
|
|
178
|
+
__type: 'RouteErrorResponse'
|
|
179
|
+
};
|
|
180
|
+
return {
|
|
181
|
+
status: error.status,
|
|
182
|
+
statusText: error.statusText,
|
|
183
|
+
data: error.data,
|
|
184
|
+
__type: 'RouteErrorResponse'
|
|
185
|
+
};
|
|
161
186
|
}
|
|
162
187
|
function deserializeErrors(errors) {
|
|
163
188
|
if (!errors) return null;
|
|
@@ -51,7 +51,7 @@ const readQueryEnabledOverride = ()=>{
|
|
|
51
51
|
const detectLanguage = ()=>{
|
|
52
52
|
if ("u" < typeof document) return 'en';
|
|
53
53
|
const htmlLanguage = document.documentElement.lang;
|
|
54
|
-
if (htmlLanguage) return htmlLanguage.split('-')[0] || 'en';
|
|
54
|
+
if ('' !== htmlLanguage) return htmlLanguage.split('-')[0] || 'en';
|
|
55
55
|
if ("u" < typeof window) return 'en';
|
|
56
56
|
return window.location.pathname.split('/').filter(Boolean)[0] || 'en';
|
|
57
57
|
};
|
|
@@ -70,7 +70,7 @@ const getBoundaryId = (element)=>element.dataset.modernBoundaryId ?? element.dat
|
|
|
70
70
|
const collectBoundaryElements = (legacySelector)=>{
|
|
71
71
|
const elements = new Set();
|
|
72
72
|
for (const element of document.querySelectorAll(boundarySelector))elements.add(element);
|
|
73
|
-
if (
|
|
73
|
+
if (void 0 === legacySelector || '' === legacySelector) return Array.from(elements);
|
|
74
74
|
try {
|
|
75
75
|
for (const element of document.querySelectorAll(legacySelector))elements.add(element);
|
|
76
76
|
} catch {}
|
|
@@ -114,7 +114,7 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
|
|
|
114
114
|
const seenBoxes = new Set();
|
|
115
115
|
const nextBoxes = collectBoundaryElements(legacySelector).map((element)=>{
|
|
116
116
|
const boundaryId = getBoundaryId(element);
|
|
117
|
-
if (
|
|
117
|
+
if (void 0 === boundaryId || '' === boundaryId) return;
|
|
118
118
|
const rect = element.getBoundingClientRect();
|
|
119
119
|
if (rect.width <= 0 || rect.height <= 0) return;
|
|
120
120
|
const rectKey = formatRectKey(rect);
|
|
@@ -125,7 +125,7 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
|
|
|
125
125
|
const color = boundary?.color ?? palette[hashBoundaryId(boundaryId) % palette.length];
|
|
126
126
|
const label = boundary?.label ?? boundary?.appId ?? boundaryId;
|
|
127
127
|
const expose = element.dataset.modernMfExpose;
|
|
128
|
-
const detail = expose && expose !== label && expose !== boundaryId ? expose : void 0;
|
|
128
|
+
const detail = void 0 !== expose && '' !== expose && expose !== label && expose !== boundaryId ? expose : void 0;
|
|
129
129
|
const box = {
|
|
130
130
|
color,
|
|
131
131
|
height: rect.height,
|
|
@@ -135,7 +135,7 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
|
|
|
135
135
|
top: rect.top,
|
|
136
136
|
width: rect.width
|
|
137
137
|
};
|
|
138
|
-
if (detail) box.detail = detail;
|
|
138
|
+
if (void 0 !== detail) box.detail = detail;
|
|
139
139
|
return box;
|
|
140
140
|
}).filter((box)=>void 0 !== box);
|
|
141
141
|
setBoxes(nextBoxes);
|
|
@@ -197,9 +197,13 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
|
|
|
197
197
|
enabled ? /*#__PURE__*/ jsx("div", {
|
|
198
198
|
"aria-hidden": "true",
|
|
199
199
|
children: boxes.map((box)=>/*#__PURE__*/ jsx("div", {
|
|
200
|
+
"data-modern-boundary-overlay": "",
|
|
201
|
+
"data-modern-boundary-overlay-id": box.id,
|
|
202
|
+
"data-modern-boundary-overlay-label": box.label,
|
|
200
203
|
style: {
|
|
201
204
|
border: `2px solid ${box.color}`,
|
|
202
205
|
borderRadius: 8,
|
|
206
|
+
boxSizing: 'border-box',
|
|
203
207
|
boxShadow: `0 0 0 1px rgba(255,255,255,.72), 0 6px 20px color-mix(in srgb, ${box.color} 20%, transparent)`,
|
|
204
208
|
height: box.height,
|
|
205
209
|
left: box.left,
|
|
@@ -228,7 +232,7 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
|
|
|
228
232
|
/*#__PURE__*/ jsx("span", {
|
|
229
233
|
children: box.label
|
|
230
234
|
}),
|
|
231
|
-
box.detail ? /*#__PURE__*/ jsx("span", {
|
|
235
|
+
void 0 !== box.detail && '' !== box.detail ? /*#__PURE__*/ jsx("span", {
|
|
232
236
|
style: {
|
|
233
237
|
font: '700 10px/1.1 system-ui, sans-serif',
|
|
234
238
|
opacity: 0.82,
|
|
@@ -3,7 +3,7 @@ const require = /*#__PURE__*/ __rslib_shim_module__.createRequire(/*#__PURE__*/
|
|
|
3
3
|
import { cleanRequireCache, isReact18 as utils_isReact18 } from "@modern-js/utils";
|
|
4
4
|
import path_0 from "path";
|
|
5
5
|
import { documentPlugin } from "../document/cli/index.mjs";
|
|
6
|
-
import { getEntrypointRoutesDir, handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints, isRouteEntry, routerPlugin } from "../router/cli/index.mjs";
|
|
6
|
+
import { getEntrypointRoutesDir, getEntrypointRoutesOwner, handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints, isRouteEntry, routerPlugin } from "../router/cli/index.mjs";
|
|
7
7
|
import { builderPluginAlias } from "./alias.mjs";
|
|
8
8
|
import { generateCode } from "./code.mjs";
|
|
9
9
|
import { ENTRY_BOOTSTRAP_FILE_NAME, ENTRY_POINT_FILE_NAME } from "./constants.mjs";
|
|
@@ -91,5 +91,7 @@ const runtimePlugin = (params)=>({
|
|
|
91
91
|
}
|
|
92
92
|
});
|
|
93
93
|
const cli = runtimePlugin;
|
|
94
|
+
export { makeLegalIdentifier } from "../router/cli/code/makeLegalIdentifier.mjs";
|
|
95
|
+
export { getPathWithoutExt } from "../router/cli/code/utils.mjs";
|
|
94
96
|
export default cli;
|
|
95
|
-
export { documentPlugin, getEntrypointRoutesDir, handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints, isRouteEntry, isRuntimeEntry, routerPlugin, runtimePlugin, ssrPlugin };
|
|
97
|
+
export { documentPlugin, getEntrypointRoutesDir, getEntrypointRoutesOwner, handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints, isRouteEntry, isRuntimeEntry, routerPlugin, runtimePlugin, ssrPlugin };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
const EXTENSIONS_SLOT = Symbol.for('@modern-js/runtime:context-extensions');
|
|
3
|
+
function getStore(context) {
|
|
4
|
+
return context[EXTENSIONS_SLOT];
|
|
5
|
+
}
|
|
6
|
+
function ensureStore(context) {
|
|
7
|
+
const target = context;
|
|
8
|
+
target[EXTENSIONS_SLOT] ??= new Map();
|
|
9
|
+
return target[EXTENSIONS_SLOT];
|
|
10
|
+
}
|
|
11
|
+
function stripRuntimeContextExtensions(context) {
|
|
12
|
+
delete context[EXTENSIONS_SLOT];
|
|
13
|
+
}
|
|
14
|
+
function createRuntimeContextExtension(id) {
|
|
15
|
+
const key = Symbol.for(`@modern-js/runtime:context-extension:${id}`);
|
|
16
|
+
return {
|
|
17
|
+
key,
|
|
18
|
+
get (context) {
|
|
19
|
+
return getStore(context)?.get(key);
|
|
20
|
+
},
|
|
21
|
+
set (context, value) {
|
|
22
|
+
ensureStore(context).set(key, value);
|
|
23
|
+
},
|
|
24
|
+
remove (context) {
|
|
25
|
+
getStore(context)?.delete(key);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export { createRuntimeContextExtension, stripRuntimeContextExtensions };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { createRuntimeContextExtension } from "./extensions.mjs";
|
|
3
|
+
const helmetContextExtension = createRuntimeContextExtension('@modern-js/runtime:helmet-context');
|
|
4
|
+
function getHelmetContext(context) {
|
|
5
|
+
return helmetContextExtension.get(context);
|
|
6
|
+
}
|
|
7
|
+
function ensureHelmetContext(context) {
|
|
8
|
+
const existing = helmetContextExtension.get(context);
|
|
9
|
+
if (void 0 !== existing) return existing;
|
|
10
|
+
const created = {};
|
|
11
|
+
helmetContextExtension.set(context, created);
|
|
12
|
+
return created;
|
|
13
|
+
}
|
|
14
|
+
export { ensureHelmetContext, getHelmetContext };
|
|
@@ -41,6 +41,11 @@ function getGlobalLayoutApp() {
|
|
|
41
41
|
function getGlobalBasename() {
|
|
42
42
|
return globalContext.basename;
|
|
43
43
|
}
|
|
44
|
+
export { DefaultNotFound } from "../../router/runtime/DefaultNotFound.mjs";
|
|
45
|
+
export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter } from "../../router/runtime/hooks.mjs";
|
|
46
|
+
export { applyRouterRuntimeState, applyRouterServerPrepareResult, cleanupRouterRuntimeState, createRouterRuntimeState, createRouterServerSnapshot, getRouterHydrationScripts, getRouterMatchedRouteIds, getRouterRuntimeState, getRouterServerSnapshot } from "../../router/runtime/lifecycle.mjs";
|
|
47
|
+
export { registerRouterProvider, resolveRouterProvider, routerProviderRegistryHooks } from "../../router/runtime/provider.mjs";
|
|
48
|
+
export { createRuntimeContextExtension } from "./extensions.mjs";
|
|
44
49
|
export { InternalRuntimeContext, RuntimeContext, getInitialContext } from "./runtime.mjs";
|
|
45
50
|
export { getServerPayload, setServerPayload } from "./serverPayload/index.mjs";
|
|
46
51
|
export { getCurrentEntryName, getGlobalApp, getGlobalBasename, getGlobalEnableRsc, getGlobalInternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRSCRoot, getGlobalRoutes, setGlobalContext, setGlobalInternalRuntimeContext };
|
|
@@ -2,24 +2,26 @@ import "node:module";
|
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { HelmetProvider } from "react-helmet-async";
|
|
4
4
|
import { InternalRuntimeContext, RuntimeContext } from "../context/index.mjs";
|
|
5
|
+
import { stripRuntimeContextExtensions } from "../context/extensions.mjs";
|
|
6
|
+
import { ensureHelmetContext } from "../context/helmetContext.mjs";
|
|
5
7
|
function wrapRuntimeContextProvider(App, contextValue) {
|
|
6
|
-
const { isBrowser, initialData, routes,
|
|
8
|
+
const { isBrowser, initialData, routes, context, routeManifest, routerContext, unstable_getBlockNavState, ssrContext, _internalContext, _internalRouterBaseName, ...rest } = contextValue;
|
|
7
9
|
const internalContextValue = contextValue;
|
|
8
|
-
|
|
10
|
+
const helmetContext = ensureHelmetContext(internalContextValue);
|
|
9
11
|
const runtimeContextValue = {
|
|
10
12
|
isBrowser,
|
|
11
13
|
initialData,
|
|
12
14
|
routes,
|
|
13
|
-
routerFramework,
|
|
14
15
|
context,
|
|
15
16
|
...rest
|
|
16
17
|
};
|
|
18
|
+
stripRuntimeContextExtensions(runtimeContextValue);
|
|
17
19
|
return /*#__PURE__*/ jsx(InternalRuntimeContext.Provider, {
|
|
18
20
|
value: internalContextValue,
|
|
19
21
|
children: /*#__PURE__*/ jsx(RuntimeContext.Provider, {
|
|
20
22
|
value: runtimeContextValue,
|
|
21
23
|
children: /*#__PURE__*/ jsx(HelmetProvider, {
|
|
22
|
-
context:
|
|
24
|
+
context: helmetContext,
|
|
23
25
|
children: App
|
|
24
26
|
})
|
|
25
27
|
})
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { attributesToString } from "./utils.mjs";
|
|
3
3
|
const createFederatedCssLinks = (assets, options)=>{
|
|
4
|
-
if (
|
|
4
|
+
if (void 0 === assets || 0 === assets.length) return '';
|
|
5
5
|
const seen = new Set(options.existingAssets || []);
|
|
6
6
|
const attributes = attributesToString(options.attributes || {});
|
|
7
7
|
const links = [];
|
|
8
|
-
for (const asset of assets)if (!(
|
|
8
|
+
for (const asset of assets)if (!('' === asset || seen.has(asset) || options.template.includes(asset))) {
|
|
9
9
|
seen.add(asset);
|
|
10
10
|
links.push(`<link${attributes} href="${asset}" rel="stylesheet" />`);
|
|
11
11
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
+
import { getHelmetContext } from "../context/helmetContext.mjs";
|
|
2
3
|
import { safeReplace } from "./utils.mjs";
|
|
3
4
|
const EOL = '\n';
|
|
4
5
|
const RE_HTML_ATTR = /<html[^>]*>/;
|
|
@@ -7,7 +8,7 @@ const RE_LAST_IN_HEAD = /<\/head>/;
|
|
|
7
8
|
const RE_TITLE = /<title[^>]*>([\s\S\n\r]*?)<\/title>/;
|
|
8
9
|
const TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/;
|
|
9
10
|
function getHelmetData(runtimeContext) {
|
|
10
|
-
return runtimeContext
|
|
11
|
+
return getHelmetContext(runtimeContext)?.helmet ?? void 0;
|
|
11
12
|
}
|
|
12
13
|
function createReplaceHelemt(helmetData) {
|
|
13
14
|
return helmetData ? (template)=>helmetReplace(template, helmetData) : (tempalte)=>tempalte;
|
|
@@ -3,13 +3,14 @@ import { jsx } from "react/jsx-runtime";
|
|
|
3
3
|
import { storage } from "@modern-js/runtime-utils/node";
|
|
4
4
|
import { getPathname, parseCookie, parseHeaders, parseQuery } from "@modern-js/runtime-utils/universal/request";
|
|
5
5
|
import react, { Fragment } from "react";
|
|
6
|
-
import {
|
|
6
|
+
import { getRouterServerSnapshot } from "../../router/runtime/lifecycle.mjs";
|
|
7
7
|
import { handleRSCRedirect } from "../../router/runtime/rsc-router.mjs";
|
|
8
8
|
import { getGlobalInternalRuntimeContext, getGlobalRSCRoot } from "../context/index.mjs";
|
|
9
9
|
import { getInitialContext } from "../context/runtime.mjs";
|
|
10
10
|
import { getServerPayload } from "../context/serverPayload/index.mjs";
|
|
11
11
|
import { createRoot } from "../react/index.mjs";
|
|
12
12
|
import { CHUNK_CSS_PLACEHOLDER } from "./constants.mjs";
|
|
13
|
+
import { withRouterCleanup } from "./routerCleanup.mjs";
|
|
13
14
|
import { SSRErrors } from "./tracer.mjs";
|
|
14
15
|
import { getSSRConfigByEntry, getSSRMode } from "./utils.mjs";
|
|
15
16
|
async function handleRSCRequest(request, Root, context, options, handleRequest) {
|
|
@@ -38,6 +39,39 @@ const processRedirect = (headers, status, ctx)=>{
|
|
|
38
39
|
headers
|
|
39
40
|
});
|
|
40
41
|
};
|
|
42
|
+
const applyRouterSnapshotResult = (context, onError)=>{
|
|
43
|
+
const routerServerSnapshot = getRouterServerSnapshot(context);
|
|
44
|
+
const routerStatusCode = routerServerSnapshot?.statusCode ?? context.routerContext?.statusCode;
|
|
45
|
+
if (routerStatusCode && 200 !== routerStatusCode) context.ssrContext?.response.status(routerStatusCode);
|
|
46
|
+
const errors = Object.values(routerServerSnapshot?.errors || context.routerContext?.errors || {});
|
|
47
|
+
if (errors.length > 0) onError(errors[0], SSRErrors.LOADER_ERROR);
|
|
48
|
+
};
|
|
49
|
+
const createLoaderRedirectResponse = (beforeRenderResult, redirectCtx)=>{
|
|
50
|
+
if (!beforeRenderResult || !isRedirectStatus(beforeRenderResult.status)) return;
|
|
51
|
+
if (beforeRenderResult.headers.has('X-Modernjs-Redirect')) return beforeRenderResult;
|
|
52
|
+
const redirectUrl = beforeRenderResult.headers.get('Location') || '/';
|
|
53
|
+
return processRedirect(new Headers({
|
|
54
|
+
Location: redirectUrl
|
|
55
|
+
}), beforeRenderResult.status, redirectCtx);
|
|
56
|
+
};
|
|
57
|
+
const renderRequest = async (request, Root, context, options, handleRequest, enableRsc)=>{
|
|
58
|
+
if (enableRsc) return handleRSCRequest(request, Root, context, options, handleRequest);
|
|
59
|
+
return handleRequest(request, Root, {
|
|
60
|
+
...options,
|
|
61
|
+
runtimeContext: context
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
const finalizeRenderResponse = (response, responseProxy, redirectCtx, routerCleanup)=>{
|
|
65
|
+
if (-1 !== responseProxy.status && isRedirectStatus(responseProxy.status) && responseProxy.headers.Location) return processRedirect(new Headers(responseProxy.headers), responseProxy.status, redirectCtx);
|
|
66
|
+
Object.entries(responseProxy.headers).forEach(([key, value])=>{
|
|
67
|
+
response.headers.set(key, value);
|
|
68
|
+
});
|
|
69
|
+
if (-1 !== responseProxy.status) return routerCleanup.deferUntilBodyDone(new Response(response.body, {
|
|
70
|
+
status: responseProxy.status,
|
|
71
|
+
headers: response.headers
|
|
72
|
+
}));
|
|
73
|
+
return routerCleanup.deferUntilBodyDone(response);
|
|
74
|
+
};
|
|
41
75
|
function createSSRContext(request, options) {
|
|
42
76
|
const { config, loaderContext, onError, onTiming, locals, resource, params, responseProxy, reporter } = options;
|
|
43
77
|
const { nonce, useJsonScript } = config;
|
|
@@ -133,41 +167,20 @@ const createRequestHandler = async (handleRequest, createRequestOptions)=>{
|
|
|
133
167
|
isRSCNavigation: 'true' === request.headers.get('x-rsc-tree'),
|
|
134
168
|
basename: ssrContext.baseUrl || '/'
|
|
135
169
|
};
|
|
136
|
-
|
|
170
|
+
return withRouterCleanup(context, options.onError, async (routerCleanup)=>{
|
|
137
171
|
const beforeRenderResult = await runBeforeRender(context);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
if (errors.length > 0) options.onError(errors[0], SSRErrors.LOADER_ERROR);
|
|
143
|
-
if ("u" > typeof Response && beforeRenderResult instanceof Response && isRedirectStatus(beforeRenderResult.status)) {
|
|
144
|
-
if (beforeRenderResult.headers.has('X-Modernjs-Redirect')) return beforeRenderResult;
|
|
145
|
-
const redirectUrl = beforeRenderResult.headers.get('Location') || '/';
|
|
146
|
-
return processRedirect(new Headers({
|
|
147
|
-
Location: redirectUrl
|
|
148
|
-
}), beforeRenderResult.status, redirectCtx);
|
|
172
|
+
applyRouterSnapshotResult(context, options.onError);
|
|
173
|
+
if ("u" > typeof Response) {
|
|
174
|
+
const redirectResponse = createLoaderRedirectResponse(beforeRenderResult, redirectCtx);
|
|
175
|
+
if (redirectResponse) return redirectResponse;
|
|
149
176
|
}
|
|
150
177
|
if (!createRequestOptions?.enableRsc) {
|
|
151
178
|
const { htmlTemplate } = options.resource;
|
|
152
179
|
options.resource.htmlTemplate = htmlTemplate.replace('</head>', `${CHUNK_CSS_PLACEHOLDER}</head>`);
|
|
153
180
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
runtimeContext: context
|
|
158
|
-
});
|
|
159
|
-
if (-1 !== responseProxy.status && isRedirectStatus(responseProxy.status) && responseProxy.headers.Location) return processRedirect(new Headers(responseProxy.headers), responseProxy.status, redirectCtx);
|
|
160
|
-
Object.entries(responseProxy.headers).forEach(([key, value])=>{
|
|
161
|
-
response.headers.set(key, value);
|
|
162
|
-
});
|
|
163
|
-
if (-1 !== responseProxy.status) return new Response(response.body, {
|
|
164
|
-
status: responseProxy.status,
|
|
165
|
-
headers: response.headers
|
|
166
|
-
});
|
|
167
|
-
return response;
|
|
168
|
-
} finally{
|
|
169
|
-
await cleanupRouterRuntimeState(context);
|
|
170
|
-
}
|
|
181
|
+
const response = await renderRequest(request, Root, context, options, handleRequest, !!createRequestOptions?.enableRsc);
|
|
182
|
+
return finalizeRenderResponse(response, responseProxy, redirectCtx, routerCleanup);
|
|
183
|
+
});
|
|
171
184
|
});
|
|
172
185
|
};
|
|
173
186
|
return requestHandler;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { getRouterRuntimeState } from "../../router/runtime/lifecycle.mjs";
|
|
3
|
+
const ROUTER_CLEANUP_ERROR = 'An error occurs during router runtime cleanup';
|
|
4
|
+
async function withRouterCleanup(runtimeContext, onError, callback) {
|
|
5
|
+
const routerCleanup = createRouterCleanup(runtimeContext, onError);
|
|
6
|
+
try {
|
|
7
|
+
return await callback(routerCleanup);
|
|
8
|
+
} finally{
|
|
9
|
+
if (!routerCleanup.deferred) await routerCleanup.run();
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function createRouterCleanup(runtimeContext, onError) {
|
|
13
|
+
let deferred = false;
|
|
14
|
+
let finished = false;
|
|
15
|
+
const run = async ()=>{
|
|
16
|
+
if (finished) return;
|
|
17
|
+
finished = true;
|
|
18
|
+
try {
|
|
19
|
+
await getRouterRuntimeState(runtimeContext)?.cleanup?.();
|
|
20
|
+
} catch (error) {
|
|
21
|
+
onError(error, ROUTER_CLEANUP_ERROR);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const deferUntilBodyDone = (response)=>{
|
|
25
|
+
const { body } = response;
|
|
26
|
+
if (!body || body.locked) return response;
|
|
27
|
+
deferred = true;
|
|
28
|
+
const reader = body.getReader();
|
|
29
|
+
const wrappedBody = new ReadableStream({
|
|
30
|
+
async pull (controller) {
|
|
31
|
+
let result;
|
|
32
|
+
try {
|
|
33
|
+
result = await reader.read();
|
|
34
|
+
} catch (error) {
|
|
35
|
+
controller.error(error);
|
|
36
|
+
await run();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (result.done) {
|
|
40
|
+
controller.close();
|
|
41
|
+
await run();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
controller.enqueue(result.value);
|
|
45
|
+
},
|
|
46
|
+
async cancel (reason) {
|
|
47
|
+
try {
|
|
48
|
+
await reader.cancel(reason);
|
|
49
|
+
} catch {}
|
|
50
|
+
await run();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return new Response(wrappedBody, {
|
|
54
|
+
status: response.status,
|
|
55
|
+
statusText: response.statusText,
|
|
56
|
+
headers: response.headers
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
get deferred () {
|
|
61
|
+
return deferred;
|
|
62
|
+
},
|
|
63
|
+
run,
|
|
64
|
+
deferUntilBodyDone
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export { ROUTER_CLEANUP_ERROR, createRouterCleanup, withRouterCleanup };
|