@bleedingdev/modern-js-runtime 3.2.0-ultramodern.12 → 3.2.0-ultramodern.121
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 +307 -0
- 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 +14 -20
- 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 +10 -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 +21 -9
- package/dist/cjs/core/server/constants.js +15 -11
- package/dist/cjs/core/server/federatedCss.js +51 -0
- package/dist/cjs/core/server/helmet.js +18 -7
- 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 +134 -0
- 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 +16 -16
- package/dist/cjs/core/server/stream/beforeTemplate.js +22 -25
- package/dist/cjs/core/server/stream/beforeTemplate.worker.js +102 -0
- package/dist/cjs/core/server/stream/createReadableStream.js +16 -7
- package/dist/cjs/core/server/stream/createReadableStream.worker.js +13 -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 +12 -6
- package/dist/cjs/core/server/stream/template.js +9 -5
- package/dist/cjs/core/server/string/index.js +19 -14
- package/dist/cjs/core/server/string/loadable.js +56 -15
- 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 +40 -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 +12 -6
- 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 +271 -10
- package/dist/cjs/exports/loadable.js +51 -12
- 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 +10 -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 -13
- 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 -28
- 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 +9 -5
- 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 -14
- 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 +62 -0
- package/dist/esm/boundary-debugger/index.mjs +267 -0
- package/dist/esm/cli/index.mjs +4 -2
- package/dist/esm/cli/ssr/index.mjs +5 -15
- package/dist/esm/cli/template.server.mjs +1 -0
- 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 +12 -4
- package/dist/esm/core/server/federatedCss.mjs +13 -0
- package/dist/esm/core/server/helmet.mjs +6 -2
- 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 +84 -0
- package/dist/esm/core/server/stream/afterTemplate.mjs +7 -11
- package/dist/esm/core/server/stream/beforeTemplate.mjs +14 -11
- package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +64 -0
- package/dist/esm/core/server/stream/createReadableStream.mjs +7 -2
- package/dist/esm/core/server/stream/createReadableStream.worker.mjs +4 -2
- package/dist/esm/core/server/stream/deferredScript.mjs +4 -1
- package/dist/esm/core/server/stream/shared.mjs +3 -1
- package/dist/esm/core/server/string/index.mjs +12 -10
- package/dist/esm/core/server/string/loadable.mjs +43 -9
- package/dist/esm/core/server/string/ssrData.mjs +2 -2
- package/dist/esm/core/server/utils.mjs +31 -8
- package/dist/esm/document/cli/index.mjs +3 -1
- package/dist/esm/exports/head.mjs +255 -4
- package/dist/esm/exports/loadable.mjs +26 -3
- 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 +1 -47
- package/dist/esm/router/cli/code/templates.mjs +1 -8
- package/dist/esm/router/cli/handler.mjs +1 -1
- package/dist/esm/router/cli/index.mjs +3 -24
- 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/utils.mjs +35 -9
- package/dist/esm/rsc/server.worker.mjs +1 -0
- package/dist/esm-node/boundary-debugger/index.mjs +268 -0
- package/dist/esm-node/cli/index.mjs +4 -2
- package/dist/esm-node/cli/ssr/index.mjs +5 -15
- package/dist/esm-node/cli/template.server.mjs +1 -0
- 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 +12 -4
- package/dist/esm-node/core/server/federatedCss.mjs +14 -0
- package/dist/esm-node/core/server/helmet.mjs +6 -2
- 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 +85 -0
- package/dist/esm-node/core/server/stream/afterTemplate.mjs +7 -11
- package/dist/esm-node/core/server/stream/beforeTemplate.mjs +14 -11
- package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +65 -0
- package/dist/esm-node/core/server/stream/createReadableStream.mjs +7 -2
- package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +4 -2
- package/dist/esm-node/core/server/stream/deferredScript.mjs +4 -1
- package/dist/esm-node/core/server/stream/shared.mjs +3 -1
- package/dist/esm-node/core/server/string/index.mjs +12 -10
- package/dist/esm-node/core/server/string/loadable.mjs +43 -9
- package/dist/esm-node/core/server/string/ssrData.mjs +2 -2
- package/dist/esm-node/core/server/utils.mjs +31 -8
- package/dist/esm-node/document/cli/index.mjs +3 -1
- package/dist/esm-node/exports/head.mjs +255 -4
- package/dist/esm-node/exports/loadable.mjs +26 -3
- 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 +1 -47
- package/dist/esm-node/router/cli/code/templates.mjs +1 -8
- package/dist/esm-node/router/cli/handler.mjs +1 -1
- package/dist/esm-node/router/cli/index.mjs +3 -24
- 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/utils.mjs +35 -9
- package/dist/esm-node/rsc/server.worker.mjs +2 -0
- package/dist/types/boundary-debugger/index.d.ts +28 -0
- 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 -7
- package/dist/types/core/plugin/index.d.ts +1 -1
- package/dist/types/core/server/federatedCss.d.ts +5 -0
- package/dist/types/core/server/helmet.d.ts +5 -3
- package/dist/types/core/server/routerCleanup.d.ts +28 -0
- package/dist/types/core/server/scriptOrder.d.ts +25 -0
- package/dist/types/core/server/stream/beforeTemplate.d.ts +1 -0
- package/dist/types/core/server/stream/beforeTemplate.worker.d.ts +10 -0
- package/dist/types/core/server/stream/shared.d.ts +8 -0
- package/dist/types/core/server/string/loadable.d.ts +5 -0
- package/dist/types/core/server/utils.d.ts +12 -1
- package/dist/types/document/constants.d.ts +3 -1
- package/dist/types/exports/head.d.ts +10 -3
- package/dist/types/exports/loadable.d.ts +8 -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/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/dist/types/rsc/server.worker.d.ts +1 -0
- package/package.json +37 -27
- package/rstest.config.mts +2 -4
- package/dist/cjs/router/cli/code/tanstackTypes.js +0 -378
- 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/plugin.js +0 -239
- package/dist/cjs/router/runtime/tanstack/plugin.node.js +0 -278
- package/dist/cjs/router/runtime/tanstack/prefetchLink.js +0 -55
- package/dist/cjs/router/runtime/tanstack/routeTree.js +0 -469
- 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 -195
- package/dist/cjs/ssr/serverRender/types.js +0 -36
- package/dist/esm/router/cli/code/tanstackTypes.mjs +0 -331
- 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/plugin.mjs +0 -205
- package/dist/esm/router/runtime/tanstack/plugin.node.mjs +0 -244
- package/dist/esm/router/runtime/tanstack/prefetchLink.mjs +0 -18
- package/dist/esm/router/runtime/tanstack/routeTree.mjs +0 -429
- 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 -148
- package/dist/esm/ssr/serverRender/types.mjs +0 -1
- package/dist/esm-node/router/cli/code/tanstackTypes.mjs +0 -332
- 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/plugin.mjs +0 -206
- package/dist/esm-node/router/runtime/tanstack/plugin.node.mjs +0 -245
- package/dist/esm-node/router/runtime/tanstack/prefetchLink.mjs +0 -19
- package/dist/esm-node/router/runtime/tanstack/routeTree.mjs +0 -430
- 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 -149
- 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/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
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { getRouterRuntimeState } from "../../router/runtime/lifecycle.mjs";
|
|
2
|
+
const ROUTER_CLEANUP_ERROR = 'An error occurs during router runtime cleanup';
|
|
3
|
+
async function withRouterCleanup(runtimeContext, onError, callback) {
|
|
4
|
+
const routerCleanup = createRouterCleanup(runtimeContext, onError);
|
|
5
|
+
try {
|
|
6
|
+
return await callback(routerCleanup);
|
|
7
|
+
} finally{
|
|
8
|
+
if (!routerCleanup.deferred) await routerCleanup.run();
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function createRouterCleanup(runtimeContext, onError) {
|
|
12
|
+
let deferred = false;
|
|
13
|
+
let finished = false;
|
|
14
|
+
const run = async ()=>{
|
|
15
|
+
if (finished) return;
|
|
16
|
+
finished = true;
|
|
17
|
+
try {
|
|
18
|
+
await getRouterRuntimeState(runtimeContext)?.cleanup?.();
|
|
19
|
+
} catch (error) {
|
|
20
|
+
onError(error, ROUTER_CLEANUP_ERROR);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const deferUntilBodyDone = (response)=>{
|
|
24
|
+
const { body } = response;
|
|
25
|
+
if (!body || body.locked) return response;
|
|
26
|
+
deferred = true;
|
|
27
|
+
const reader = body.getReader();
|
|
28
|
+
const wrappedBody = new ReadableStream({
|
|
29
|
+
async pull (controller) {
|
|
30
|
+
let result;
|
|
31
|
+
try {
|
|
32
|
+
result = await reader.read();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
controller.error(error);
|
|
35
|
+
await run();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (result.done) {
|
|
39
|
+
controller.close();
|
|
40
|
+
await run();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
controller.enqueue(result.value);
|
|
44
|
+
},
|
|
45
|
+
async cancel (reason) {
|
|
46
|
+
try {
|
|
47
|
+
await reader.cancel(reason);
|
|
48
|
+
} catch {}
|
|
49
|
+
await run();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
return new Response(wrappedBody, {
|
|
53
|
+
status: response.status,
|
|
54
|
+
statusText: response.statusText,
|
|
55
|
+
headers: response.headers
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
return {
|
|
59
|
+
get deferred () {
|
|
60
|
+
return deferred;
|
|
61
|
+
},
|
|
62
|
+
run,
|
|
63
|
+
deferUntilBodyDone
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export { ROUTER_CLEANUP_ERROR, createRouterCleanup, withRouterCleanup };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { getRouterMatchedRouteIds } from "../../router/runtime/lifecycle.mjs";
|
|
2
|
+
import { CHUNK_JS_PLACEHOLDER } from "./constants.mjs";
|
|
3
|
+
import { safeReplace } from "./utils.mjs";
|
|
4
|
+
function getScriptTags(template) {
|
|
5
|
+
const scriptRegExp = /<script\b[^>]*\bsrc=(["'])(.*?)\1[^>]*><\/script>/g;
|
|
6
|
+
return Array.from(template.matchAll(scriptRegExp)).map((match)=>({
|
|
7
|
+
index: match.index ?? 0,
|
|
8
|
+
tag: match[0],
|
|
9
|
+
src: match[2]
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
function getAssetBasename(src) {
|
|
13
|
+
const withoutQuery = src.split(/[?#]/)[0];
|
|
14
|
+
return withoutQuery.split('/').pop() || withoutQuery;
|
|
15
|
+
}
|
|
16
|
+
function isEntryScript(src, entryName, asyncEntry) {
|
|
17
|
+
const basename = getAssetBasename(src);
|
|
18
|
+
const prefix = asyncEntry ? `async-${entryName}` : entryName;
|
|
19
|
+
return basename === `${prefix}.js` || basename.startsWith(`${prefix}.`) || basename.startsWith(`${prefix}-`);
|
|
20
|
+
}
|
|
21
|
+
const dedupeByUrl = (chunks)=>{
|
|
22
|
+
const seen = new Set();
|
|
23
|
+
return chunks.filter((chunk)=>{
|
|
24
|
+
if (void 0 === chunk.url || '' === chunk.url || seen.has(chunk.url)) return false;
|
|
25
|
+
seen.add(chunk.url);
|
|
26
|
+
return true;
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
const isAsyncEntryScriptChunk = (chunk, entryName)=>{
|
|
30
|
+
if (void 0 === chunk.url || !chunk.url.endsWith('.js')) return false;
|
|
31
|
+
const asyncEntryName = `async-${entryName}`;
|
|
32
|
+
const filename = chunk.filename ?? chunk.url;
|
|
33
|
+
const basename = filename.split('/').pop() ?? filename;
|
|
34
|
+
return basename === `${asyncEntryName}.js` || basename.startsWith(`${asyncEntryName}.`) || basename.startsWith(`${asyncEntryName}-`);
|
|
35
|
+
};
|
|
36
|
+
function getRouteAssets(runtimeContext, routeManifest = runtimeContext.routeManifest) {
|
|
37
|
+
return routeManifest?.routeAssets;
|
|
38
|
+
}
|
|
39
|
+
function getMatchedRouteAssets(runtimeContext, routeManifest) {
|
|
40
|
+
const routeAssets = getRouteAssets(runtimeContext, routeManifest);
|
|
41
|
+
if (void 0 === routeAssets) return [];
|
|
42
|
+
const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext) ?? [];
|
|
43
|
+
return matchedRouteIds.flatMap((routeId)=>routeAssets[routeId]?.assets ?? []);
|
|
44
|
+
}
|
|
45
|
+
const orderHydrationScriptChunks = ({ asyncEntryChunks, collectedChunks, matchedRouteChunks, entryName })=>{
|
|
46
|
+
const asyncEntryScriptChunks = [];
|
|
47
|
+
const asyncEntryDependencyChunks = [];
|
|
48
|
+
for (const chunk of asyncEntryChunks)if (isAsyncEntryScriptChunk(chunk, entryName)) asyncEntryScriptChunks.push(chunk);
|
|
49
|
+
else asyncEntryDependencyChunks.push(chunk);
|
|
50
|
+
return dedupeByUrl([
|
|
51
|
+
...asyncEntryDependencyChunks,
|
|
52
|
+
...collectedChunks,
|
|
53
|
+
...matchedRouteChunks,
|
|
54
|
+
...asyncEntryScriptChunks
|
|
55
|
+
]);
|
|
56
|
+
};
|
|
57
|
+
function injectBeforeHydrationEntryScript(template, scripts, entryName = 'index') {
|
|
58
|
+
if ('' === scripts) return template;
|
|
59
|
+
const scriptTags = getScriptTags(template);
|
|
60
|
+
const target = scriptTags.find((match)=>isEntryScript(match.src, entryName, false)) ?? scriptTags.find((match)=>isEntryScript(match.src, entryName, true));
|
|
61
|
+
if (void 0 === target) return template;
|
|
62
|
+
return `${template.slice(0, target.index)}${scripts}${template.slice(target.index)}`;
|
|
63
|
+
}
|
|
64
|
+
function replaceChunkJsPlaceholder(template, scripts, entryName, placeholder = CHUNK_JS_PLACEHOLDER) {
|
|
65
|
+
if ('' === scripts) return safeReplace(template, placeholder, '');
|
|
66
|
+
const withoutPlaceholder = safeReplace(template, placeholder, '');
|
|
67
|
+
const withEarlyScripts = injectBeforeHydrationEntryScript(withoutPlaceholder, scripts, entryName);
|
|
68
|
+
if (withEarlyScripts !== withoutPlaceholder) return withEarlyScripts;
|
|
69
|
+
return safeReplace(template, placeholder, scripts);
|
|
70
|
+
}
|
|
71
|
+
function createRouteHydrationScriptTags(runtimeContext, entryName, options = {}) {
|
|
72
|
+
const { nonce, template } = options;
|
|
73
|
+
const routeAssets = getRouteAssets(runtimeContext);
|
|
74
|
+
if (void 0 === routeAssets) return '';
|
|
75
|
+
const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext) ?? [];
|
|
76
|
+
const assetEntries = [
|
|
77
|
+
...matchedRouteIds.map((routeId)=>routeAssets[routeId]),
|
|
78
|
+
routeAssets[`async-${entryName}`]
|
|
79
|
+
].filter((entry)=>void 0 !== entry);
|
|
80
|
+
const jsAssets = Array.from(new Set(assetEntries.flatMap((entry)=>(entry.assets ?? []).filter((asset)=>asset.endsWith('.js')))));
|
|
81
|
+
const nonceAttr = void 0 === nonce || '' === nonce ? '' : ` nonce="${nonce}"`;
|
|
82
|
+
return jsAssets.filter((asset)=>template?.includes(asset) !== true).map((asset)=>`<script src=${asset}${nonceAttr}></script>`).join(' ');
|
|
83
|
+
}
|
|
84
|
+
export { createRouteHydrationScriptTags, getMatchedRouteAssets, injectBeforeHydrationEntryScript, orderHydrationScriptChunks, replaceChunkJsPlaceholder };
|
|
@@ -2,6 +2,7 @@ import { serializeJson } from "@modern-js/runtime-utils/node";
|
|
|
2
2
|
import { getRouterHydrationScripts } from "../../../router/runtime/lifecycle.mjs";
|
|
3
3
|
import { SSR_DATA_JSON_ID } from "../../constants.mjs";
|
|
4
4
|
import { SSR_DATA_PLACEHOLDER } from "../constants.mjs";
|
|
5
|
+
import { createRouteHydrationScriptTags, replaceChunkJsPlaceholder } from "../scriptOrder.mjs";
|
|
5
6
|
import { buildHtml } from "../shared.mjs";
|
|
6
7
|
import { attributesToString, safeReplace } from "../utils.mjs";
|
|
7
8
|
function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
@@ -18,17 +19,12 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
18
19
|
(template)=>injectJs(template, entryName, config.nonce)
|
|
19
20
|
];
|
|
20
21
|
async function injectJs(template, entryName, nonce) {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const { assets } = asyncEntry;
|
|
28
|
-
const jsChunkStr = assets?.filter((asset)=>asset.endsWith('.js'))?.map((asset)=>`<script src=${asset} nonce="${nonce}"></script>`).join(' ');
|
|
29
|
-
if (jsChunkStr) return safeReplace(template, '<!--<?- chunksMap.js ?>-->', jsChunkStr);
|
|
30
|
-
}
|
|
31
|
-
return template;
|
|
22
|
+
const jsChunkStr = createRouteHydrationScriptTags(runtimeContext, entryName, {
|
|
23
|
+
nonce,
|
|
24
|
+
template
|
|
25
|
+
});
|
|
26
|
+
if (!jsChunkStr) return template;
|
|
27
|
+
return replaceChunkJsPlaceholder(template, jsChunkStr, entryName);
|
|
32
28
|
}
|
|
33
29
|
return buildHtml(afterAppTemplate, callbacks);
|
|
34
30
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { matchRoutes } from "@modern-js/runtime-utils/router";
|
|
2
|
-
import react_helmet from "react-helmet";
|
|
3
2
|
import { getRouterMatchedRouteIds } from "../../../router/runtime/lifecycle.mjs";
|
|
4
3
|
import { CHUNK_CSS_PLACEHOLDER } from "../constants.mjs";
|
|
5
|
-
import {
|
|
4
|
+
import { createFederatedCssLinks } from "../federatedCss.mjs";
|
|
5
|
+
import { createReplaceHelemt, getHelmetData } from "../helmet.mjs";
|
|
6
6
|
import { buildHtml } from "../shared.mjs";
|
|
7
7
|
import { checkIsNode, safeReplace } from "../utils.mjs";
|
|
8
8
|
const readAsset = async (chunk)=>{
|
|
@@ -17,8 +17,8 @@ const checkIsInline = (chunk, enableInline)=>{
|
|
|
17
17
|
return Boolean(enableInline);
|
|
18
18
|
};
|
|
19
19
|
async function buildShellBeforeTemplate(beforeAppTemplate, options) {
|
|
20
|
-
const { config, runtimeContext, styledComponentsStyleTags, entryName } = options;
|
|
21
|
-
const helmetData =
|
|
20
|
+
const { config, runtimeContext, styledComponentsStyleTags, entryName, moduleFederationCssAssets } = options;
|
|
21
|
+
const helmetData = getHelmetData(runtimeContext);
|
|
22
22
|
const callbacks = [
|
|
23
23
|
createReplaceHelemt(helmetData),
|
|
24
24
|
(template)=>injectCss(template, entryName, styledComponentsStyleTags)
|
|
@@ -27,33 +27,36 @@ async function buildShellBeforeTemplate(beforeAppTemplate, options) {
|
|
|
27
27
|
async function injectCss(template, entryName, styledComponentsStyleTags) {
|
|
28
28
|
let css = await getCssChunks();
|
|
29
29
|
if (styledComponentsStyleTags) css += styledComponentsStyleTags;
|
|
30
|
+
css += createFederatedCssLinks(moduleFederationCssAssets, {
|
|
31
|
+
template,
|
|
32
|
+
existingAssets: css.match(/href="([^"]+)"/g)?.map((item)=>item.replace(/^href="/, '').replace(/"$/, ''))
|
|
33
|
+
});
|
|
30
34
|
return safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
|
|
31
35
|
async function getCssChunks() {
|
|
32
36
|
const { routeManifest, routerContext, routes } = runtimeContext;
|
|
33
37
|
if (!routeManifest) return '';
|
|
34
38
|
const { routeAssets } = routeManifest;
|
|
35
|
-
let matchedRouteManifests;
|
|
39
|
+
let matchedRouteManifests = [];
|
|
36
40
|
const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext);
|
|
37
41
|
if (matchedRouteIds?.length) matchedRouteManifests = matchedRouteIds.map((routeId)=>routeAssets[routeId]).filter(Boolean);
|
|
38
|
-
else {
|
|
39
|
-
if (!routerContext || !routes) return '';
|
|
42
|
+
else if (routerContext && routes) {
|
|
40
43
|
const matches = matchRoutes(routes, routerContext.location, routerContext.basename);
|
|
41
44
|
matchedRouteManifests = matches?.map((match, index)=>{
|
|
42
45
|
if (!index) return;
|
|
43
46
|
const routeId = match.route.id;
|
|
44
47
|
if (routeId) return routeAssets[routeId];
|
|
45
|
-
}).filter(
|
|
48
|
+
}).filter((routeManifest)=>void 0 !== routeManifest) ?? [];
|
|
46
49
|
}
|
|
47
50
|
const asyncEntry = routeAssets[`async-${entryName}`];
|
|
48
|
-
if (asyncEntry) matchedRouteManifests
|
|
49
|
-
const cssChunks = matchedRouteManifests
|
|
51
|
+
if (asyncEntry) matchedRouteManifests.push(asyncEntry);
|
|
52
|
+
const cssChunks = matchedRouteManifests.reduce((chunks, routeManifest)=>{
|
|
50
53
|
const { referenceCssAssets = [] } = routeManifest;
|
|
51
54
|
const _cssChunks = referenceCssAssets.filter((asset)=>asset?.endsWith('.css') && !template.includes(asset));
|
|
52
55
|
return [
|
|
53
56
|
...chunks,
|
|
54
57
|
..._cssChunks
|
|
55
58
|
];
|
|
56
|
-
}, [])
|
|
59
|
+
}, []);
|
|
57
60
|
const { inlineStyles } = config;
|
|
58
61
|
const styles = await Promise.all(cssChunks.map(async (chunk)=>{
|
|
59
62
|
const link = `<link href="${chunk}" rel="stylesheet" />`;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { matchRoutes } from "@modern-js/runtime-utils/router";
|
|
2
|
+
import { getRouterMatchedRouteIds } from "../../../router/runtime/lifecycle.mjs";
|
|
3
|
+
import { CHUNK_CSS_PLACEHOLDER } from "../constants.mjs";
|
|
4
|
+
import { createFederatedCssLinks } from "../federatedCss.mjs";
|
|
5
|
+
import { createReplaceHelemt, getHelmetData } from "../helmet.mjs";
|
|
6
|
+
import { buildHtml } from "../shared.mjs";
|
|
7
|
+
import { safeReplace } from "../utils.mjs";
|
|
8
|
+
const checkIsInline = (chunk, enableInline)=>{
|
|
9
|
+
if ('production' !== process.env.NODE_ENV) return false;
|
|
10
|
+
if (enableInline instanceof RegExp) return enableInline.test(chunk);
|
|
11
|
+
return Boolean(enableInline);
|
|
12
|
+
};
|
|
13
|
+
async function buildShellBeforeTemplate(beforeAppTemplate, options) {
|
|
14
|
+
const { config, runtimeContext, styledComponentsStyleTags, entryName, moduleFederationCssAssets } = options;
|
|
15
|
+
const helmetData = getHelmetData(runtimeContext);
|
|
16
|
+
const callbacks = [
|
|
17
|
+
createReplaceHelemt(helmetData),
|
|
18
|
+
(template)=>injectCss(template, entryName, styledComponentsStyleTags)
|
|
19
|
+
];
|
|
20
|
+
return buildHtml(beforeAppTemplate, callbacks);
|
|
21
|
+
async function injectCss(template, entryName, styledComponentsStyleTags) {
|
|
22
|
+
let css = await getCssChunks();
|
|
23
|
+
if (styledComponentsStyleTags) css += styledComponentsStyleTags;
|
|
24
|
+
css += createFederatedCssLinks(moduleFederationCssAssets, {
|
|
25
|
+
template,
|
|
26
|
+
existingAssets: css.match(/href="([^"]+)"/g)?.map((item)=>item.replace(/^href="/, '').replace(/"$/, ''))
|
|
27
|
+
});
|
|
28
|
+
return safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
|
|
29
|
+
async function getCssChunks() {
|
|
30
|
+
const { routeManifest, routerContext, routes } = runtimeContext;
|
|
31
|
+
if (!routeManifest) return '';
|
|
32
|
+
const { routeAssets } = routeManifest;
|
|
33
|
+
let matchedRouteManifests = [];
|
|
34
|
+
const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext);
|
|
35
|
+
if (matchedRouteIds?.length) matchedRouteManifests = matchedRouteIds.map((routeId)=>routeAssets[routeId]).filter(Boolean);
|
|
36
|
+
else if (routerContext && routes) {
|
|
37
|
+
const matches = matchRoutes(routes, routerContext.location, routerContext.basename);
|
|
38
|
+
matchedRouteManifests = matches?.map((match, index)=>{
|
|
39
|
+
if (!index) return;
|
|
40
|
+
const routeId = match.route.id;
|
|
41
|
+
if (routeId) return routeAssets[routeId];
|
|
42
|
+
}).filter((routeManifest)=>void 0 !== routeManifest) ?? [];
|
|
43
|
+
}
|
|
44
|
+
const asyncEntry = routeAssets[`async-${entryName}`];
|
|
45
|
+
if (asyncEntry) matchedRouteManifests.push(asyncEntry);
|
|
46
|
+
const cssChunks = matchedRouteManifests.reduce((chunks, routeManifest)=>{
|
|
47
|
+
const { referenceCssAssets = [] } = routeManifest;
|
|
48
|
+
const _cssChunks = referenceCssAssets.filter((asset)=>asset?.endsWith('.css') && !template.includes(asset));
|
|
49
|
+
return [
|
|
50
|
+
...chunks,
|
|
51
|
+
..._cssChunks
|
|
52
|
+
];
|
|
53
|
+
}, []);
|
|
54
|
+
const { inlineStyles } = config;
|
|
55
|
+
const styles = cssChunks.map((chunk)=>{
|
|
56
|
+
const link = `<link href="${chunk}" rel="stylesheet" />`;
|
|
57
|
+
checkIsInline(chunk, inlineStyles);
|
|
58
|
+
return link;
|
|
59
|
+
});
|
|
60
|
+
return `${styles.join('')}`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export { buildShellBeforeTemplate };
|
|
@@ -15,7 +15,7 @@ const defaultExtender = {
|
|
|
15
15
|
};
|
|
16
16
|
const createReadableStreamFromElement = async (request, rootElement, options)=>{
|
|
17
17
|
const { renderToPipeableStream } = await import("react-dom/server");
|
|
18
|
-
const { runtimeContext, htmlTemplate, config, ssrConfig, entryName } = options;
|
|
18
|
+
const { runtimeContext, htmlTemplate, config, ssrConfig, entryName, moduleFederationCssAssets } = options;
|
|
19
19
|
let shellChunkStatus = ShellChunkStatus.START;
|
|
20
20
|
let renderLevel = RenderLevel.SERVER_RENDER;
|
|
21
21
|
const forceStream2String = Boolean(process.env.MODERN_JS_STREAM_TO_STRING);
|
|
@@ -35,11 +35,14 @@ const createReadableStreamFromElement = async (request, rootElement, options)=>{
|
|
|
35
35
|
if (extender.modifyRootElement) processedRootElement = extender.modifyRootElement(processedRootElement);
|
|
36
36
|
});
|
|
37
37
|
const chunkVec = [];
|
|
38
|
+
let hasStartedPipe = false;
|
|
38
39
|
return new Promise((resolve)=>{
|
|
39
40
|
const { pipe: reactStreamingPipe } = renderToPipeableStream(processedRootElement, {
|
|
40
41
|
nonce: config.nonce,
|
|
41
42
|
identifierPrefix: SSR_HYDRATION_ID_PREFIX,
|
|
42
43
|
[onReady] () {
|
|
44
|
+
if (hasStartedPipe) return;
|
|
45
|
+
hasStartedPipe = true;
|
|
43
46
|
let styledComponentsStyleTags = '';
|
|
44
47
|
extenders.forEach((extender)=>{
|
|
45
48
|
if (extender.getStyleTags) styledComponentsStyleTags += extender.getStyleTags();
|
|
@@ -52,6 +55,7 @@ const createReadableStreamFromElement = async (request, rootElement, options)=>{
|
|
|
52
55
|
runtimeContext,
|
|
53
56
|
config,
|
|
54
57
|
entryName,
|
|
58
|
+
moduleFederationCssAssets,
|
|
55
59
|
styledComponentsStyleTags
|
|
56
60
|
}).then(({ shellAfter, shellBefore })=>{
|
|
57
61
|
const pendingScripts = [];
|
|
@@ -109,7 +113,8 @@ const createReadableStreamFromElement = async (request, rootElement, options)=>{
|
|
|
109
113
|
renderLevel,
|
|
110
114
|
runtimeContext,
|
|
111
115
|
entryName,
|
|
112
|
-
config
|
|
116
|
+
config,
|
|
117
|
+
moduleFederationCssAssets
|
|
113
118
|
}).then(({ shellAfter, shellBefore })=>{
|
|
114
119
|
const fallbackHtml = `${shellBefore}${shellAfter}`;
|
|
115
120
|
const readableStream = getReadableStreamFromString(fallbackHtml);
|
|
@@ -8,19 +8,21 @@ import { getTemplates } from "./template.mjs";
|
|
|
8
8
|
const createReadableStreamFromElement = async (request, rootElement, options)=>{
|
|
9
9
|
let shellChunkStatus = ShellChunkStatus.START;
|
|
10
10
|
const chunkVec = [];
|
|
11
|
-
const { htmlTemplate, runtimeContext, config, ssrConfig, entryName, rscRoot } = options;
|
|
11
|
+
const { htmlTemplate, runtimeContext, config, ssrConfig, entryName, moduleFederationCssAssets, rscManifest, rscRoot } = options;
|
|
12
12
|
const { shellBefore, shellAfter } = await getTemplates(htmlTemplate, {
|
|
13
13
|
renderLevel: RenderLevel.SERVER_RENDER,
|
|
14
14
|
runtimeContext,
|
|
15
15
|
ssrConfig,
|
|
16
16
|
request,
|
|
17
17
|
config,
|
|
18
|
-
entryName
|
|
18
|
+
entryName,
|
|
19
|
+
moduleFederationCssAssets
|
|
19
20
|
});
|
|
20
21
|
try {
|
|
21
22
|
const readableOriginal = await renderSSRStream(rootElement, {
|
|
22
23
|
request,
|
|
23
24
|
nonce: config.nonce,
|
|
25
|
+
rscManifest,
|
|
24
26
|
rscRoot: rscRoot,
|
|
25
27
|
routes: runtimeContext.routes,
|
|
26
28
|
onError (error) {
|
|
@@ -22,12 +22,15 @@ function isPromiseLike(value) {
|
|
|
22
22
|
return !!value && 'function' == typeof value.then;
|
|
23
23
|
}
|
|
24
24
|
function toErrorInfo(error) {
|
|
25
|
+
if ('production' === process.env.NODE_ENV) return {
|
|
26
|
+
message: 'Unexpected Server Error'
|
|
27
|
+
};
|
|
25
28
|
if (error && 'object' == typeof error) {
|
|
26
29
|
const maybeMsg = error.message;
|
|
27
30
|
const maybeStack = error.stack;
|
|
28
31
|
return {
|
|
29
32
|
message: 'string' == typeof maybeMsg ? maybeMsg : String(maybeMsg ?? error),
|
|
30
|
-
stack:
|
|
33
|
+
stack: maybeStack
|
|
31
34
|
};
|
|
32
35
|
}
|
|
33
36
|
return {
|
|
@@ -63,7 +63,7 @@ function createRenderStreaming(createReadableStreamPromise) {
|
|
|
63
63
|
const end = time();
|
|
64
64
|
const { runtimeContext, config, resource } = options;
|
|
65
65
|
const { onError, onTiming } = options;
|
|
66
|
-
const { htmlTemplate, entryName } = resource;
|
|
66
|
+
const { htmlTemplate, entryName, moduleFederationCssAssets } = resource;
|
|
67
67
|
const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
|
|
68
68
|
const StreamServerRootWrapper = ({ children })=>/*#__PURE__*/ jsxs(Fragment, {
|
|
69
69
|
children: [
|
|
@@ -83,9 +83,11 @@ function createRenderStreaming(createReadableStreamPromise) {
|
|
|
83
83
|
runtimeContext,
|
|
84
84
|
ssrConfig,
|
|
85
85
|
entryName,
|
|
86
|
+
moduleFederationCssAssets,
|
|
86
87
|
rscClientManifest: options.rscClientManifest,
|
|
87
88
|
rscSSRManifest: options.rscSSRManifest,
|
|
88
89
|
rscServerManifest: options.rscServerManifest,
|
|
90
|
+
rscManifest: options.rscManifest,
|
|
89
91
|
rscRoot: options.rscRoot,
|
|
90
92
|
onShellReady () {
|
|
91
93
|
const cost = end();
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { time } from "@modern-js/runtime-utils/time";
|
|
2
2
|
import { SSR_HYDRATION_ID_PREFIX } from "@modern-js/utils/universal/constants";
|
|
3
3
|
import server from "react-dom/server";
|
|
4
|
-
import react_helmet from "react-helmet";
|
|
5
4
|
import { RenderLevel } from "../../constants.mjs";
|
|
6
5
|
import { getGlobalInternalRuntimeContext } from "../../context/index.mjs";
|
|
7
6
|
import { wrapRuntimeContextProvider } from "../../react/wrapper.mjs";
|
|
8
|
-
import { CHUNK_CSS_PLACEHOLDER,
|
|
9
|
-
import { createReplaceHelemt } from "../helmet.mjs";
|
|
7
|
+
import { CHUNK_CSS_PLACEHOLDER, HTML_PLACEHOLDER, SSR_DATA_PLACEHOLDER } from "../constants.mjs";
|
|
8
|
+
import { createReplaceHelemt, getHelmetData } from "../helmet.mjs";
|
|
9
|
+
import { replaceChunkJsPlaceholder } from "../scriptOrder.mjs";
|
|
10
10
|
import { buildHtml } from "../shared.mjs";
|
|
11
11
|
import { SSRErrors, SSRTimings } from "../tracer.mjs";
|
|
12
12
|
import { getSSRConfigByEntry, safeReplace } from "../utils.mjs";
|
|
@@ -19,7 +19,7 @@ const renderString = async (request, serverRoot, options)=>{
|
|
|
19
19
|
onTiming
|
|
20
20
|
};
|
|
21
21
|
const routerContext = runtimeContext.routerContext;
|
|
22
|
-
const { htmlTemplate, entryName, loadableStats, routeManifest } = resource;
|
|
22
|
+
const { htmlTemplate, entryName, loadableStats, routeManifest, moduleFederationCssAssets } = resource;
|
|
23
23
|
const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
|
|
24
24
|
const chunkSet = {
|
|
25
25
|
renderLevel: RenderLevel.CLIENT_RENDER,
|
|
@@ -32,8 +32,10 @@ const renderString = async (request, serverRoot, options)=>{
|
|
|
32
32
|
stats: loadableStats,
|
|
33
33
|
nonce: config.nonce,
|
|
34
34
|
routeManifest,
|
|
35
|
+
runtimeContext,
|
|
35
36
|
template: htmlTemplate,
|
|
36
37
|
entryName,
|
|
38
|
+
moduleFederationCssAssets,
|
|
37
39
|
chunkSet,
|
|
38
40
|
config
|
|
39
41
|
}),
|
|
@@ -57,10 +59,10 @@ const renderString = async (request, serverRoot, options)=>{
|
|
|
57
59
|
const rootElement = wrapRuntimeContextProvider(serverRoot, Object.assign(runtimeContext, {
|
|
58
60
|
ssr: true
|
|
59
61
|
}));
|
|
60
|
-
const html = await generateHtml(rootElement, htmlTemplate, chunkSet, collectors, runtimeContext.ssrContext?.htmlModifiers || [], tracer);
|
|
62
|
+
const html = await generateHtml(rootElement, htmlTemplate, chunkSet, collectors, runtimeContext.ssrContext?.htmlModifiers || [], runtimeContext, entryName, tracer);
|
|
61
63
|
return html;
|
|
62
64
|
};
|
|
63
|
-
async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifiers, { onError, onTiming }) {
|
|
65
|
+
async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifiers, runtimeContext, entryName, { onError, onTiming }) {
|
|
64
66
|
let html = '';
|
|
65
67
|
let helmetData;
|
|
66
68
|
const finalApp = collectors.reduce((pre, creator)=>creator.collect?.(pre) || pre, App);
|
|
@@ -70,7 +72,7 @@ async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifie
|
|
|
70
72
|
identifierPrefix: SSR_HYDRATION_ID_PREFIX
|
|
71
73
|
});
|
|
72
74
|
chunkSet.renderLevel = RenderLevel.SERVER_RENDER;
|
|
73
|
-
helmetData =
|
|
75
|
+
helmetData = getHelmetData(runtimeContext);
|
|
74
76
|
const cost = end();
|
|
75
77
|
onTiming(SSRTimings.RENDER_HTML, cost);
|
|
76
78
|
} catch (e) {
|
|
@@ -81,7 +83,7 @@ async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifie
|
|
|
81
83
|
const { ssrScripts, cssChunk, jsChunk } = chunkSet;
|
|
82
84
|
const finalHtml = await buildHtml(htmlTemplate, [
|
|
83
85
|
createReplaceHtml(html),
|
|
84
|
-
createReplaceChunkJs(jsChunk),
|
|
86
|
+
createReplaceChunkJs(jsChunk, entryName),
|
|
85
87
|
createReplaceChunkCss(cssChunk),
|
|
86
88
|
createReplaceSSRDataScript(ssrScripts),
|
|
87
89
|
createReplaceHelemt(helmetData),
|
|
@@ -95,8 +97,8 @@ function createReplaceHtml(html) {
|
|
|
95
97
|
function createReplaceSSRDataScript(data) {
|
|
96
98
|
return (template)=>safeReplace(template, SSR_DATA_PLACEHOLDER, data);
|
|
97
99
|
}
|
|
98
|
-
function createReplaceChunkJs(js) {
|
|
99
|
-
return (template)=>
|
|
100
|
+
function createReplaceChunkJs(js, entryName) {
|
|
101
|
+
return (template)=>replaceChunkJsPlaceholder(template, js, entryName);
|
|
100
102
|
}
|
|
101
103
|
function createReplaceChunkCss(css) {
|
|
102
104
|
return (template)=>safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
|
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import { ChunkExtractor } from "@loadable/server";
|
|
2
|
+
import { createFederatedCssLinks } from "../federatedCss.mjs";
|
|
3
|
+
import { getMatchedRouteAssets, orderHydrationScriptChunks } from "../scriptOrder.mjs";
|
|
2
4
|
import { attributesToString, checkIsNode } from "../utils.mjs";
|
|
3
5
|
const extname = (uri)=>{
|
|
4
6
|
if ('string' != typeof uri || !uri.includes('.')) return '';
|
|
5
7
|
return `.${uri?.split('.').pop()}` || '';
|
|
6
8
|
};
|
|
7
9
|
const generateChunks = (chunks, ext)=>chunks.filter((chunk)=>Boolean(chunk.url)).filter((chunk)=>extname(chunk.url).slice(1) === ext);
|
|
10
|
+
const routeAssetToChunk = (asset)=>({
|
|
11
|
+
chunk: asset,
|
|
12
|
+
filename: asset.replace(/^\//, ''),
|
|
13
|
+
linkType: 'preload',
|
|
14
|
+
path: asset,
|
|
15
|
+
scriptType: asset.endsWith('.css') ? 'style' : "script",
|
|
16
|
+
type: 'routeAsset',
|
|
17
|
+
url: asset
|
|
18
|
+
});
|
|
8
19
|
const checkIsInline = (chunk, enableInline)=>{
|
|
9
20
|
if ('production' !== process.env.NODE_ENV) return false;
|
|
10
21
|
if (enableInline instanceof RegExp) return enableInline.test(chunk.url);
|
|
@@ -21,6 +32,11 @@ class LoadableCollector {
|
|
|
21
32
|
const { routeManifest, entryName } = this.options;
|
|
22
33
|
return routeManifest?.routeAssets?.[entryName]?.assets;
|
|
23
34
|
}
|
|
35
|
+
getMatchedRouteChunks() {
|
|
36
|
+
const { routeManifest, runtimeContext } = this.options;
|
|
37
|
+
if (!routeManifest) return [];
|
|
38
|
+
return getMatchedRouteAssets(runtimeContext, routeManifest).map(routeAssetToChunk);
|
|
39
|
+
}
|
|
24
40
|
collect(comopnent) {
|
|
25
41
|
const { stats, entryName } = this.options;
|
|
26
42
|
if (!stats) return comopnent;
|
|
@@ -33,20 +49,29 @@ class LoadableCollector {
|
|
|
33
49
|
return this.extractor.collectChunks(comopnent);
|
|
34
50
|
}
|
|
35
51
|
async effect() {
|
|
36
|
-
if (!this.extractor) return;
|
|
37
52
|
const { extractor, options } = this;
|
|
38
53
|
const { entryName, config } = options;
|
|
39
54
|
const asyncChunks = [];
|
|
40
|
-
if (config.enableAsyncEntry) try {
|
|
55
|
+
if (extractor && config.enableAsyncEntry) try {
|
|
41
56
|
asyncChunks.push(...extractor.getChunkAssets([
|
|
42
57
|
`async-${entryName}`
|
|
43
58
|
]));
|
|
44
59
|
} catch (e) {}
|
|
45
|
-
const
|
|
46
|
-
const
|
|
60
|
+
const collectedChunks = extractor ? extractor.getChunkAssets(extractor.chunks) : [];
|
|
61
|
+
const matchedRouteChunks = this.getMatchedRouteChunks();
|
|
62
|
+
const orderedScriptChunks = orderHydrationScriptChunks({
|
|
63
|
+
asyncEntryChunks: asyncChunks,
|
|
64
|
+
collectedChunks,
|
|
65
|
+
matchedRouteChunks,
|
|
66
|
+
entryName
|
|
67
|
+
});
|
|
68
|
+
const chunks = [].concat(asyncChunks).concat(collectedChunks).concat(matchedRouteChunks);
|
|
69
|
+
const scriptChunks = generateChunks(orderedScriptChunks, 'js');
|
|
47
70
|
const styleChunks = generateChunks(chunks, 'css');
|
|
48
|
-
|
|
49
|
-
|
|
71
|
+
if (extractor) {
|
|
72
|
+
this.emitLoadableScripts(extractor);
|
|
73
|
+
await this.emitScriptAssets(scriptChunks);
|
|
74
|
+
}
|
|
50
75
|
await this.emitStyleAssets(styleChunks);
|
|
51
76
|
}
|
|
52
77
|
emitLoadableScripts(extractor) {
|
|
@@ -81,19 +106,28 @@ class LoadableCollector {
|
|
|
81
106
|
chunkSet.jsChunk += scripts.filter((script)=>Boolean(script)).join('');
|
|
82
107
|
}
|
|
83
108
|
async emitStyleAssets(chunks) {
|
|
84
|
-
const { template, chunkSet, config,
|
|
109
|
+
const { template, chunkSet, config, moduleFederationCssAssets } = this.options;
|
|
85
110
|
const { inlineStyles } = config;
|
|
86
111
|
const atrributes = attributesToString(this.generateAttributes());
|
|
87
112
|
const linkRegExp = /<link .*?href="([^"]+)".*?>/g;
|
|
88
113
|
const matchs = template.matchAll(linkRegExp);
|
|
89
114
|
const existedLinks = [];
|
|
90
115
|
for (const match of matchs)existedLinks.push(match[1]);
|
|
91
|
-
const
|
|
116
|
+
const emittedChunks = chunks.filter((chunk)=>!existedLinks.includes(chunk.url) && !this.existsAssets?.includes(chunk.path));
|
|
117
|
+
const css = await Promise.all(emittedChunks.map(async (chunk)=>{
|
|
92
118
|
const link = `<link${atrributes} href="${chunk.url}" rel="stylesheet" />`;
|
|
93
119
|
if (checkIsNode() && checkIsInline(chunk, inlineStyles)) return readAsset(chunk).then((content)=>`<style>${content}</style>`).catch((_)=>link);
|
|
94
120
|
return link;
|
|
95
121
|
}));
|
|
96
122
|
chunkSet.cssChunk += css.filter((css)=>Boolean(css)).join('');
|
|
123
|
+
chunkSet.cssChunk += createFederatedCssLinks(moduleFederationCssAssets, {
|
|
124
|
+
template,
|
|
125
|
+
attributes: this.generateAttributes(),
|
|
126
|
+
existingAssets: [
|
|
127
|
+
...existedLinks,
|
|
128
|
+
...emittedChunks.map((chunk)=>chunk.url)
|
|
129
|
+
]
|
|
130
|
+
});
|
|
97
131
|
}
|
|
98
132
|
generateAttributes(extraAtr = {}) {
|
|
99
133
|
const { config } = this.options;
|
|
@@ -109,4 +143,4 @@ class LoadableCollector {
|
|
|
109
143
|
this.options = options;
|
|
110
144
|
}
|
|
111
145
|
}
|
|
112
|
-
export { LoadableCollector };
|
|
146
|
+
export { LoadableCollector, orderHydrationScriptChunks };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { serializeJson } from "@modern-js/runtime-utils/node";
|
|
2
|
-
import { getRouterHydrationScripts } from "../../../router/runtime/lifecycle.mjs";
|
|
2
|
+
import { getRouterHydrationScripts, getRouterServerSnapshot } from "../../../router/runtime/lifecycle.mjs";
|
|
3
3
|
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../../constants.mjs";
|
|
4
4
|
import { attributesToString, serializeErrors } from "../utils.mjs";
|
|
5
5
|
function _check_private_redeclaration(obj, privateCollection) {
|
|
@@ -89,7 +89,7 @@ function getSSRData() {
|
|
|
89
89
|
}
|
|
90
90
|
function getRouterData() {
|
|
91
91
|
const { routerContext, runtimeContext } = _class_private_field_get(this, _options);
|
|
92
|
-
const snapshotRouterData = runtimeContext
|
|
92
|
+
const snapshotRouterData = getRouterServerSnapshot(runtimeContext)?.routerData;
|
|
93
93
|
if (snapshotRouterData) return {
|
|
94
94
|
loaderData: snapshotRouterData.loaderData,
|
|
95
95
|
errors: serializeErrors(snapshotRouterData.errors || null)
|