@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
|
@@ -1,332 +0,0 @@
|
|
|
1
|
-
import "node:module";
|
|
2
|
-
import { findExists, formatImportPath, fs, slash } from "@modern-js/utils";
|
|
3
|
-
import path from "path";
|
|
4
|
-
import { makeLegalIdentifier } from "./makeLegalIdentifier.mjs";
|
|
5
|
-
import { getPathWithoutExt } from "./utils.mjs";
|
|
6
|
-
const JS_OR_TS_EXTS = [
|
|
7
|
-
'.js',
|
|
8
|
-
'.jsx',
|
|
9
|
-
'.ts',
|
|
10
|
-
'.tsx',
|
|
11
|
-
'.mjs',
|
|
12
|
-
'.mts',
|
|
13
|
-
'.cjs',
|
|
14
|
-
'.cts'
|
|
15
|
-
];
|
|
16
|
-
function toTanstackPath(pathname) {
|
|
17
|
-
return pathname.split('/').map((segment)=>{
|
|
18
|
-
if (!segment) return segment;
|
|
19
|
-
if ('*' === segment) return '$';
|
|
20
|
-
if (segment.startsWith(':')) {
|
|
21
|
-
const name = segment.slice(1);
|
|
22
|
-
if (name.endsWith('?')) return `{-$${name.slice(0, -1)}}`;
|
|
23
|
-
return `$${name}`;
|
|
24
|
-
}
|
|
25
|
-
return segment;
|
|
26
|
-
}).join('/');
|
|
27
|
-
}
|
|
28
|
-
async function resolveFileNoExt(inputNoExtPath) {
|
|
29
|
-
const file = findExists(JS_OR_TS_EXTS.map((ext)=>`${inputNoExtPath}${ext}`));
|
|
30
|
-
return file ? getPathWithoutExt(file) : null;
|
|
31
|
-
}
|
|
32
|
-
function quote(str) {
|
|
33
|
-
return JSON.stringify(str);
|
|
34
|
-
}
|
|
35
|
-
function normalizeRelativeImport(p) {
|
|
36
|
-
const normalized = formatImportPath(slash(p));
|
|
37
|
-
if (normalized.startsWith('.')) return normalized;
|
|
38
|
-
return `./${normalized}`;
|
|
39
|
-
}
|
|
40
|
-
function pickModernLoaderModule(route) {
|
|
41
|
-
const loaderPath = route.data || route.loader;
|
|
42
|
-
if (!loaderPath || 'string' != typeof loaderPath) return null;
|
|
43
|
-
const inline = Boolean(route.data);
|
|
44
|
-
return {
|
|
45
|
-
loaderPath,
|
|
46
|
-
inline
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
function isPathlessLayout(route) {
|
|
50
|
-
return 'nested' === route.type && 'boolean' != typeof route.index && void 0 === route.path;
|
|
51
|
-
}
|
|
52
|
-
function isIndexRoute(route) {
|
|
53
|
-
return 'nested' === route.type && Boolean(route.index);
|
|
54
|
-
}
|
|
55
|
-
function createRouteStaticDataSnippet(opts) {
|
|
56
|
-
const staticDataLines = [];
|
|
57
|
-
if (opts.modernRouteId) staticDataLines.push(`modernRouteId: ${quote(opts.modernRouteId)},`);
|
|
58
|
-
if (opts.loaderName) staticDataLines.push(`modernRouteLoader: ${opts.loaderName},`);
|
|
59
|
-
if (opts.actionName) staticDataLines.push(`modernRouteAction: ${opts.actionName},`);
|
|
60
|
-
if (!staticDataLines.length) return null;
|
|
61
|
-
return `staticData: createRouteStaticData({\n ${staticDataLines.join('\n ')}\n }),`;
|
|
62
|
-
}
|
|
63
|
-
async function isTanstackRouterFrameworkEnabled(appContext) {
|
|
64
|
-
const runtimeConfigBase = path.join(appContext.srcDirectory, appContext.runtimeConfigFile);
|
|
65
|
-
const runtimeConfigFile = findExists(JS_OR_TS_EXTS.map((ext)=>`${runtimeConfigBase}${ext}`));
|
|
66
|
-
if (!runtimeConfigFile) return false;
|
|
67
|
-
try {
|
|
68
|
-
const content = await fs.readFile(runtimeConfigFile, 'utf-8');
|
|
69
|
-
return /framework\s*:\s*['"]tanstack['"]/.test(content);
|
|
70
|
-
} catch {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
async function generateTanstackRouterTypesSourceForEntry(opts) {
|
|
75
|
-
const { appContext, entryName, routes } = opts;
|
|
76
|
-
const outDir = path.join(appContext.srcDirectory, 'modern-tanstack', entryName);
|
|
77
|
-
const rootModern = routes.find((r)=>r && 'nested' === r.type && r.isRoot);
|
|
78
|
-
const topLevel = rootModern ? rootModern.children || [] : routes;
|
|
79
|
-
const imports = [];
|
|
80
|
-
const statements = [];
|
|
81
|
-
const loaderImportMap = new Map();
|
|
82
|
-
let loaderIndex = 0;
|
|
83
|
-
let routeIndex = 0;
|
|
84
|
-
const getImportNamesForLoader = async (aliasedNoExtPath, inline, hasAction)=>{
|
|
85
|
-
const key = `${inline ? 'inline' : 'default'}:${hasAction ? 'action' : 'loader'}:${aliasedNoExtPath}`;
|
|
86
|
-
const existing = loaderImportMap.get(key);
|
|
87
|
-
if (existing) return {
|
|
88
|
-
loaderName: existing,
|
|
89
|
-
actionName: hasAction ? existing.replace(/^loader_/, 'action_') : null
|
|
90
|
-
};
|
|
91
|
-
const prefix = `${appContext.internalSrcAlias}/`;
|
|
92
|
-
let absNoExt = null;
|
|
93
|
-
if (aliasedNoExtPath.startsWith(prefix)) {
|
|
94
|
-
const rel = aliasedNoExtPath.slice(prefix.length);
|
|
95
|
-
absNoExt = path.join(appContext.srcDirectory, rel);
|
|
96
|
-
} else absNoExt = path.isAbsolute(aliasedNoExtPath) ? aliasedNoExtPath : path.join(appContext.srcDirectory, aliasedNoExtPath);
|
|
97
|
-
const resolvedNoExt = await resolveFileNoExt(absNoExt);
|
|
98
|
-
if (!resolvedNoExt) return null;
|
|
99
|
-
const relImport = normalizeRelativeImport(path.relative(outDir, resolvedNoExt));
|
|
100
|
-
const importName = `loader_${loaderIndex++}`;
|
|
101
|
-
const actionName = hasAction ? importName.replace(/^loader_/, 'action_') : null;
|
|
102
|
-
if (inline) {
|
|
103
|
-
const specifiers = [
|
|
104
|
-
`loader as ${importName}`
|
|
105
|
-
];
|
|
106
|
-
if (actionName) specifiers.push(`action as ${actionName}`);
|
|
107
|
-
imports.push(`import { ${specifiers.join(', ')} } from ${quote(relImport)};`);
|
|
108
|
-
} else imports.push(`import ${importName} from ${quote(relImport)};`);
|
|
109
|
-
loaderImportMap.set(key, importName);
|
|
110
|
-
return {
|
|
111
|
-
loaderName: importName,
|
|
112
|
-
actionName
|
|
113
|
-
};
|
|
114
|
-
};
|
|
115
|
-
const createRouteVarName = (route)=>{
|
|
116
|
-
const id = route.id;
|
|
117
|
-
const base = id ? makeLegalIdentifier(id) : `r_${routeIndex++}`;
|
|
118
|
-
return `route_${base}`;
|
|
119
|
-
};
|
|
120
|
-
const buildRoute = async (opts)=>{
|
|
121
|
-
const { parentVar, route } = opts;
|
|
122
|
-
const varName = createRouteVarName(route);
|
|
123
|
-
const loaderInfo = pickModernLoaderModule(route);
|
|
124
|
-
const routeAction = route.action;
|
|
125
|
-
const loaderImports = loaderInfo ? await getImportNamesForLoader(loaderInfo.loaderPath, loaderInfo.inline, Boolean(loaderInfo.inline && routeAction === loaderInfo.loaderPath)) : null;
|
|
126
|
-
const loaderName = loaderImports?.loaderName || null;
|
|
127
|
-
const actionName = loaderImports?.actionName || null;
|
|
128
|
-
const rawPath = route.path;
|
|
129
|
-
const hasSplat = 'string' == typeof rawPath && rawPath.includes('*');
|
|
130
|
-
const routeOpts = [
|
|
131
|
-
`getParentRoute: () => ${parentVar},`
|
|
132
|
-
];
|
|
133
|
-
if (isPathlessLayout(route)) {
|
|
134
|
-
const id = route.id;
|
|
135
|
-
routeOpts.push(`id: ${quote(id || 'pathless')},`);
|
|
136
|
-
} else {
|
|
137
|
-
const p = isIndexRoute(route) ? '/' : toTanstackPath(rawPath || '');
|
|
138
|
-
routeOpts.push(`path: ${quote(p)},`);
|
|
139
|
-
}
|
|
140
|
-
if (loaderName) routeOpts.push(`loader: modernLoaderToTanstack({ hasSplat: ${hasSplat} }, ${loaderName}),`);
|
|
141
|
-
const staticDataSnippet = createRouteStaticDataSnippet({
|
|
142
|
-
modernRouteId: route.id,
|
|
143
|
-
loaderName,
|
|
144
|
-
actionName
|
|
145
|
-
});
|
|
146
|
-
if (staticDataSnippet) routeOpts.push(staticDataSnippet);
|
|
147
|
-
statements.push(`const ${varName} = createRoute({\n ${routeOpts.join('\n ')}\n});`);
|
|
148
|
-
const children = route.children;
|
|
149
|
-
if (children && children.length > 0) {
|
|
150
|
-
const childVars = await Promise.all(children.map((child)=>buildRoute({
|
|
151
|
-
parentVar: varName,
|
|
152
|
-
route: child
|
|
153
|
-
})));
|
|
154
|
-
statements.push(`${varName}.addChildren([${childVars.join(', ')}]);`);
|
|
155
|
-
}
|
|
156
|
-
return varName;
|
|
157
|
-
};
|
|
158
|
-
const rootLoaderInfo = rootModern ? pickModernLoaderModule(rootModern) : null;
|
|
159
|
-
const rootAction = rootModern?.action;
|
|
160
|
-
const rootLoaderImports = rootLoaderInfo?.loaderPath ? await getImportNamesForLoader(rootLoaderInfo.loaderPath, rootLoaderInfo.inline, Boolean(rootLoaderInfo.inline && rootAction === rootLoaderInfo.loaderPath)) : null;
|
|
161
|
-
const rootLoaderName = rootLoaderImports?.loaderName || null;
|
|
162
|
-
const rootActionName = rootLoaderImports?.actionName || null;
|
|
163
|
-
const topLevelVars = await Promise.all(topLevel.map((route)=>buildRoute({
|
|
164
|
-
parentVar: 'rootRoute',
|
|
165
|
-
route
|
|
166
|
-
})));
|
|
167
|
-
const rootOpts = [];
|
|
168
|
-
if (rootLoaderName) rootOpts.push(`loader: modernLoaderToTanstack({ hasSplat: false }, ${rootLoaderName}),`);
|
|
169
|
-
const routerGenTs = `/* eslint-disable */
|
|
170
|
-
// This file is auto-generated by Modern.js. Do not edit manually.
|
|
171
|
-
|
|
172
|
-
import {
|
|
173
|
-
createMemoryHistory,
|
|
174
|
-
createRootRouteWithContext,
|
|
175
|
-
createRoute,
|
|
176
|
-
createRouter,
|
|
177
|
-
notFound,
|
|
178
|
-
redirect,
|
|
179
|
-
} from '@modern-js/runtime/tanstack-router';
|
|
180
|
-
|
|
181
|
-
type ModernRouterContext = {
|
|
182
|
-
request?: Request;
|
|
183
|
-
requestContext?: unknown;
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
function isResponse(value: unknown): value is Response {
|
|
187
|
-
return (
|
|
188
|
-
value != null &&
|
|
189
|
-
typeof value === 'object' &&
|
|
190
|
-
typeof (value as any).status === 'number' &&
|
|
191
|
-
typeof (value as any).headers === 'object'
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const redirectStatusCodes = new Set([301, 302, 303, 307, 308]);
|
|
196
|
-
function isRedirectResponse(res: Response) {
|
|
197
|
-
return redirectStatusCodes.has(res.status);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
function throwTanstackRedirect(location: string) {
|
|
201
|
-
const target = location || '/';
|
|
202
|
-
try {
|
|
203
|
-
void new URL(target);
|
|
204
|
-
throw redirect({ href: target });
|
|
205
|
-
} catch {
|
|
206
|
-
throw redirect({ to: target });
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
function mapParamsForModernLoader(params: Record<string, string>, hasSplat: boolean) {
|
|
211
|
-
if (!hasSplat) {
|
|
212
|
-
return params;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
const { _splat, ...rest } = params as any;
|
|
216
|
-
if (typeof _splat !== 'undefined') {
|
|
217
|
-
return { ...rest, '*': _splat };
|
|
218
|
-
}
|
|
219
|
-
return rest;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
function createRouteStaticData(opts: {
|
|
223
|
-
modernRouteId?: string;
|
|
224
|
-
modernRouteAction?: unknown;
|
|
225
|
-
modernRouteLoader?: unknown;
|
|
226
|
-
}) {
|
|
227
|
-
const staticData: Record<string, unknown> = {};
|
|
228
|
-
|
|
229
|
-
if (opts.modernRouteId) {
|
|
230
|
-
staticData.modernRouteId = opts.modernRouteId;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
if (opts.modernRouteLoader) {
|
|
234
|
-
staticData.modernRouteLoader = opts.modernRouteLoader;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
if (opts.modernRouteAction) {
|
|
238
|
-
staticData.modernRouteAction = opts.modernRouteAction;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
return Object.keys(staticData).length > 0 ? staticData : undefined;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
function modernLoaderToTanstack<TLoader extends (args: any) => any>(
|
|
245
|
-
opts: { hasSplat: boolean },
|
|
246
|
-
modernLoader: TLoader,
|
|
247
|
-
) {
|
|
248
|
-
type LoaderResult = Awaited<ReturnType<TLoader>>;
|
|
249
|
-
|
|
250
|
-
return async (ctx: any): Promise<LoaderResult> => {
|
|
251
|
-
try {
|
|
252
|
-
const signal: AbortSignal =
|
|
253
|
-
ctx?.abortController?.signal ||
|
|
254
|
-
ctx?.signal ||
|
|
255
|
-
new AbortController().signal;
|
|
256
|
-
const baseRequest: Request | undefined =
|
|
257
|
-
ctx?.context?.request instanceof Request ? ctx.context.request : undefined;
|
|
258
|
-
|
|
259
|
-
const href =
|
|
260
|
-
typeof ctx?.location === 'string'
|
|
261
|
-
? ctx.location
|
|
262
|
-
: ctx?.location?.publicHref ||
|
|
263
|
-
ctx?.location?.href ||
|
|
264
|
-
ctx?.location?.url?.href ||
|
|
265
|
-
'';
|
|
266
|
-
|
|
267
|
-
const request = baseRequest
|
|
268
|
-
? new Request(baseRequest, { signal })
|
|
269
|
-
: new Request(href, { signal });
|
|
270
|
-
|
|
271
|
-
const params = mapParamsForModernLoader(ctx?.params || {}, opts.hasSplat);
|
|
272
|
-
|
|
273
|
-
const result = await (modernLoader as any)({
|
|
274
|
-
request,
|
|
275
|
-
params,
|
|
276
|
-
context: ctx?.context?.requestContext,
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
if (isResponse(result)) {
|
|
280
|
-
if (isRedirectResponse(result)) {
|
|
281
|
-
const location = result.headers.get('Location') || '/';
|
|
282
|
-
throwTanstackRedirect(location);
|
|
283
|
-
}
|
|
284
|
-
if (result.status === 404) {
|
|
285
|
-
throw notFound();
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
return result as LoaderResult;
|
|
290
|
-
} catch (err) {
|
|
291
|
-
if (isResponse(err)) {
|
|
292
|
-
if (isRedirectResponse(err)) {
|
|
293
|
-
const location = err.headers.get('Location') || '/';
|
|
294
|
-
throwTanstackRedirect(location);
|
|
295
|
-
}
|
|
296
|
-
if (err.status === 404) {
|
|
297
|
-
throw notFound();
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
throw err;
|
|
301
|
-
}
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
${imports.join('\n')}
|
|
306
|
-
|
|
307
|
-
export const rootRoute = createRootRouteWithContext<ModernRouterContext>()({
|
|
308
|
-
${rootOpts.join('\n ')}
|
|
309
|
-
${createRouteStaticDataSnippet({
|
|
310
|
-
modernRouteId: rootModern?.id,
|
|
311
|
-
loaderName: rootLoaderName,
|
|
312
|
-
actionName: rootActionName
|
|
313
|
-
}) || ''}
|
|
314
|
-
});
|
|
315
|
-
|
|
316
|
-
${statements.join('\n\n')}
|
|
317
|
-
|
|
318
|
-
export const routeTree = rootRoute.addChildren([${topLevelVars.join(', ')}]);
|
|
319
|
-
|
|
320
|
-
export const router = createRouter({
|
|
321
|
-
routeTree,
|
|
322
|
-
history: createMemoryHistory({
|
|
323
|
-
initialEntries: ['/'],
|
|
324
|
-
}),
|
|
325
|
-
context: {} as ModernRouterContext,
|
|
326
|
-
});
|
|
327
|
-
`;
|
|
328
|
-
return {
|
|
329
|
-
routerGenTs
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
export { generateTanstackRouterTypesSourceForEntry, isTanstackRouterFrameworkEnabled };
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import "node:module";
|
|
2
|
-
function normalizeBasepath(basepath) {
|
|
3
|
-
if (!basepath) return '/';
|
|
4
|
-
let normalized = basepath.startsWith('/') ? basepath : `/${basepath}`;
|
|
5
|
-
if (normalized.length > 1 && normalized.endsWith('/')) normalized = normalized.slice(0, -1);
|
|
6
|
-
return normalized || '/';
|
|
7
|
-
}
|
|
8
|
-
function createModernBasepathRewrite(basepath, caseSensitive = false) {
|
|
9
|
-
const normalizedBasepath = normalizeBasepath(basepath);
|
|
10
|
-
if ('/' === normalizedBasepath) return;
|
|
11
|
-
const normalizedBasepathWithSlash = `${normalizedBasepath}/`;
|
|
12
|
-
const checkBasepath = caseSensitive ? normalizedBasepath : normalizedBasepath.toLowerCase();
|
|
13
|
-
const checkBasepathWithSlash = caseSensitive ? normalizedBasepathWithSlash : normalizedBasepathWithSlash.toLowerCase();
|
|
14
|
-
return {
|
|
15
|
-
input: ({ url })=>{
|
|
16
|
-
const pathname = caseSensitive ? url.pathname : url.pathname.toLowerCase();
|
|
17
|
-
if (pathname === checkBasepath) url.pathname = '/';
|
|
18
|
-
else if (pathname.startsWith(checkBasepathWithSlash)) url.pathname = url.pathname.slice(normalizedBasepath.length) || '/';
|
|
19
|
-
return url;
|
|
20
|
-
},
|
|
21
|
-
output: ({ url })=>{
|
|
22
|
-
const pathname = url.pathname || '/';
|
|
23
|
-
if ('/' === pathname) url.pathname = normalizedBasepath;
|
|
24
|
-
else url.pathname = `${normalizedBasepath}${pathname.startsWith('/') ? '' : '/'}${pathname}`;
|
|
25
|
-
return url;
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
export { createModernBasepathRewrite };
|
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
import "node:module";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import { useRouter } from "@tanstack/react-router";
|
|
4
|
-
import { useCallback, useRef, useState } from "react";
|
|
5
|
-
class RouteActionResponseError extends Error {
|
|
6
|
-
constructor(response, data){
|
|
7
|
-
super(`Route action failed with status ${response.status}`);
|
|
8
|
-
this.name = 'RouteActionResponseError';
|
|
9
|
-
this.response = response;
|
|
10
|
-
this.data = data;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
function formDataToUrlSearchParams(formData) {
|
|
14
|
-
const searchParams = new URLSearchParams();
|
|
15
|
-
formData.forEach((value, key)=>{
|
|
16
|
-
if ('string' == typeof value) searchParams.append(key, value);
|
|
17
|
-
});
|
|
18
|
-
return searchParams;
|
|
19
|
-
}
|
|
20
|
-
function formDataToTextPlain(formData) {
|
|
21
|
-
return Array.from(formData.entries()).map(([key, value])=>`${key}=${String(value)}`).join('\n');
|
|
22
|
-
}
|
|
23
|
-
function toFormData(target) {
|
|
24
|
-
if (target instanceof HTMLFormElement) return new FormData(target);
|
|
25
|
-
if (target instanceof FormData) return target;
|
|
26
|
-
if (target instanceof URLSearchParams) {
|
|
27
|
-
const formData = new FormData();
|
|
28
|
-
target.forEach((value, key)=>{
|
|
29
|
-
formData.append(key, value);
|
|
30
|
-
});
|
|
31
|
-
return formData;
|
|
32
|
-
}
|
|
33
|
-
const formData = new FormData();
|
|
34
|
-
Object.entries(target).forEach(([key, value])=>{
|
|
35
|
-
if (null == value) return;
|
|
36
|
-
formData.append(key, String(value));
|
|
37
|
-
});
|
|
38
|
-
return formData;
|
|
39
|
-
}
|
|
40
|
-
function getSubmitter(event) {
|
|
41
|
-
const nativeEvent = event.nativeEvent;
|
|
42
|
-
const submitter = nativeEvent?.submitter;
|
|
43
|
-
if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) return submitter;
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
function createFormDataFromSubmit({ form, submitter }) {
|
|
47
|
-
if (submitter) try {
|
|
48
|
-
return new FormData(form, submitter);
|
|
49
|
-
} catch {}
|
|
50
|
-
return new FormData(form);
|
|
51
|
-
}
|
|
52
|
-
function resolveSubmitOptionsFromForm({ form, submitter, action, method, encType }) {
|
|
53
|
-
const resolvedAction = submitter?.getAttribute('formaction') || action || form.getAttribute('action') || '.';
|
|
54
|
-
const resolvedMethod = (submitter?.getAttribute('formmethod') || method || form.getAttribute('method') || 'get').toLowerCase();
|
|
55
|
-
const resolvedEncType = submitter?.getAttribute('formenctype') || encType || form.getAttribute('enctype') || 'application/x-www-form-urlencoded';
|
|
56
|
-
return {
|
|
57
|
-
action: resolvedAction,
|
|
58
|
-
method: resolvedMethod,
|
|
59
|
-
encType: resolvedEncType
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
function resolveRouteHandlers(router, actionTo) {
|
|
63
|
-
const builtLocation = router.buildLocation({
|
|
64
|
-
to: actionTo
|
|
65
|
-
});
|
|
66
|
-
const href = router.getParsedLocationHref(builtLocation);
|
|
67
|
-
const matchedRoutes = router.getMatchedRoutes(builtLocation.pathname);
|
|
68
|
-
const routeStaticData = matchedRoutes.foundRoute?.options?.staticData;
|
|
69
|
-
const action = routeStaticData?.modernRouteAction;
|
|
70
|
-
const loader = routeStaticData?.modernRouteLoader;
|
|
71
|
-
return {
|
|
72
|
-
action,
|
|
73
|
-
loader,
|
|
74
|
-
href,
|
|
75
|
-
params: matchedRoutes.routeParams || {}
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
function isRedirectResponse(value) {
|
|
79
|
-
if (!(value instanceof Response)) return false;
|
|
80
|
-
return [
|
|
81
|
-
301,
|
|
82
|
-
302,
|
|
83
|
-
303,
|
|
84
|
-
307,
|
|
85
|
-
308
|
|
86
|
-
].includes(value.status);
|
|
87
|
-
}
|
|
88
|
-
async function parseResponseData(response) {
|
|
89
|
-
if (204 === response.status) return null;
|
|
90
|
-
const contentType = response.headers.get('Content-Type') || '';
|
|
91
|
-
if (contentType.includes('application/json')) return response.json();
|
|
92
|
-
return response.text();
|
|
93
|
-
}
|
|
94
|
-
async function parseResponseResultOrThrow(response) {
|
|
95
|
-
const parsed = await parseResponseData(response);
|
|
96
|
-
if (!response.ok) throw new RouteActionResponseError(response, parsed);
|
|
97
|
-
return parsed;
|
|
98
|
-
}
|
|
99
|
-
async function submitRouteAction({ router, target, options = {}, isFetcher = false, onInvalidateStart }) {
|
|
100
|
-
const method = (options.method || 'post').toLowerCase();
|
|
101
|
-
const encType = options.encType || 'application/x-www-form-urlencoded';
|
|
102
|
-
const actionTo = options.action || '.';
|
|
103
|
-
const formData = toFormData(target);
|
|
104
|
-
const resolved = resolveRouteHandlers(router, actionTo);
|
|
105
|
-
if ('get' === method) {
|
|
106
|
-
const search = formDataToUrlSearchParams(formData).toString();
|
|
107
|
-
const requestUrl = new URL(resolved.href, window.location.origin);
|
|
108
|
-
requestUrl.search = search;
|
|
109
|
-
if (isFetcher && resolved.loader) {
|
|
110
|
-
const result = await resolved.loader({
|
|
111
|
-
request: new Request(requestUrl, {
|
|
112
|
-
method: 'GET'
|
|
113
|
-
}),
|
|
114
|
-
params: resolved.params
|
|
115
|
-
});
|
|
116
|
-
if (result instanceof Response) {
|
|
117
|
-
const redirectTo = result.headers.get('X-Modernjs-Redirect') || result.headers.get('Location');
|
|
118
|
-
if (redirectTo || isRedirectResponse(result)) {
|
|
119
|
-
await router.navigate({
|
|
120
|
-
to: redirectTo || '/'
|
|
121
|
-
});
|
|
122
|
-
return parseResponseData(result);
|
|
123
|
-
}
|
|
124
|
-
return parseResponseResultOrThrow(result);
|
|
125
|
-
}
|
|
126
|
-
return result;
|
|
127
|
-
}
|
|
128
|
-
await router.navigate({
|
|
129
|
-
href: search ? `${resolved.href}?${search}` : resolved.href
|
|
130
|
-
});
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
if (!resolved.action) throw new Error(`No route action found for "${actionTo}"`);
|
|
134
|
-
const headers = new Headers();
|
|
135
|
-
let body = null;
|
|
136
|
-
if (encType.includes('application/json')) {
|
|
137
|
-
headers.set('Content-Type', 'application/json');
|
|
138
|
-
body = JSON.stringify(Object.fromEntries(formDataToUrlSearchParams(formData).entries()));
|
|
139
|
-
} else if (encType.includes('text/plain')) {
|
|
140
|
-
headers.set('Content-Type', 'text/plain;charset=UTF-8');
|
|
141
|
-
body = formDataToTextPlain(formData);
|
|
142
|
-
} else if (encType.includes('application/x-www-form-urlencoded')) {
|
|
143
|
-
headers.set('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
|
|
144
|
-
body = formDataToUrlSearchParams(formData);
|
|
145
|
-
} else body = formData;
|
|
146
|
-
const request = new Request(new URL(resolved.href, window.location.origin), {
|
|
147
|
-
method: method.toUpperCase(),
|
|
148
|
-
headers,
|
|
149
|
-
body
|
|
150
|
-
});
|
|
151
|
-
const result = await resolved.action({
|
|
152
|
-
request,
|
|
153
|
-
params: resolved.params
|
|
154
|
-
});
|
|
155
|
-
if (result instanceof Response) {
|
|
156
|
-
const redirectTo = result.headers.get('X-Modernjs-Redirect') || result.headers.get('Location');
|
|
157
|
-
if (redirectTo || isRedirectResponse(result)) {
|
|
158
|
-
await router.navigate({
|
|
159
|
-
to: redirectTo || '/'
|
|
160
|
-
});
|
|
161
|
-
return parseResponseData(result);
|
|
162
|
-
}
|
|
163
|
-
const parsed = isFetcher ? await parseResponseResultOrThrow(result) : await parseResponseData(result);
|
|
164
|
-
onInvalidateStart?.();
|
|
165
|
-
await router.invalidate();
|
|
166
|
-
return parsed;
|
|
167
|
-
}
|
|
168
|
-
onInvalidateStart?.();
|
|
169
|
-
await router.invalidate();
|
|
170
|
-
return result;
|
|
171
|
-
}
|
|
172
|
-
function Form({ action, method = 'get', encType, reloadDocument, onSubmit, ...rest }) {
|
|
173
|
-
const router = useRouter();
|
|
174
|
-
const handleSubmit = useCallback(async (event)=>{
|
|
175
|
-
onSubmit?.(event);
|
|
176
|
-
if (event.defaultPrevented || reloadDocument) return;
|
|
177
|
-
event.preventDefault();
|
|
178
|
-
const submitter = getSubmitter(event);
|
|
179
|
-
const formData = createFormDataFromSubmit({
|
|
180
|
-
form: event.currentTarget,
|
|
181
|
-
submitter
|
|
182
|
-
});
|
|
183
|
-
const normalizedOptions = resolveSubmitOptionsFromForm({
|
|
184
|
-
form: event.currentTarget,
|
|
185
|
-
submitter,
|
|
186
|
-
action,
|
|
187
|
-
method,
|
|
188
|
-
encType
|
|
189
|
-
});
|
|
190
|
-
await submitRouteAction({
|
|
191
|
-
router,
|
|
192
|
-
target: formData,
|
|
193
|
-
options: normalizedOptions
|
|
194
|
-
});
|
|
195
|
-
}, [
|
|
196
|
-
action,
|
|
197
|
-
encType,
|
|
198
|
-
method,
|
|
199
|
-
onSubmit,
|
|
200
|
-
reloadDocument,
|
|
201
|
-
router
|
|
202
|
-
]);
|
|
203
|
-
return /*#__PURE__*/ jsx("form", {
|
|
204
|
-
...rest,
|
|
205
|
-
action: action,
|
|
206
|
-
method: method,
|
|
207
|
-
encType: encType,
|
|
208
|
-
onSubmit: handleSubmit
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
function useFetcher() {
|
|
212
|
-
const router = useRouter();
|
|
213
|
-
const [state, setState] = useState('idle');
|
|
214
|
-
const [data, setData] = useState(void 0);
|
|
215
|
-
const [error, setError] = useState(void 0);
|
|
216
|
-
const requestStatesRef = useRef(new Map());
|
|
217
|
-
const requestIdRef = useRef(0);
|
|
218
|
-
const syncStateFromRequests = useCallback(()=>{
|
|
219
|
-
let hasSubmitting = false;
|
|
220
|
-
let hasLoading = false;
|
|
221
|
-
requestStatesRef.current.forEach((requestState)=>{
|
|
222
|
-
if ('submitting' === requestState) hasSubmitting = true;
|
|
223
|
-
else if ('loading' === requestState) hasLoading = true;
|
|
224
|
-
});
|
|
225
|
-
if (hasSubmitting) return void setState('submitting');
|
|
226
|
-
if (hasLoading) return void setState('loading');
|
|
227
|
-
setState('idle');
|
|
228
|
-
}, []);
|
|
229
|
-
const setRequestState = useCallback((requestId, requestState)=>{
|
|
230
|
-
requestStatesRef.current.set(requestId, requestState);
|
|
231
|
-
syncStateFromRequests();
|
|
232
|
-
}, [
|
|
233
|
-
syncStateFromRequests
|
|
234
|
-
]);
|
|
235
|
-
const clearRequestState = useCallback((requestId)=>{
|
|
236
|
-
requestStatesRef.current.delete(requestId);
|
|
237
|
-
syncStateFromRequests();
|
|
238
|
-
}, [
|
|
239
|
-
syncStateFromRequests
|
|
240
|
-
]);
|
|
241
|
-
const submit = useCallback(async (target, options)=>{
|
|
242
|
-
setError(void 0);
|
|
243
|
-
const requestId = ++requestIdRef.current;
|
|
244
|
-
const normalizedMethod = (options?.method || 'post').toLowerCase();
|
|
245
|
-
const isLoaderSubmit = 'get' === normalizedMethod;
|
|
246
|
-
setRequestState(requestId, isLoaderSubmit ? 'loading' : 'submitting');
|
|
247
|
-
try {
|
|
248
|
-
const result = await submitRouteAction({
|
|
249
|
-
router,
|
|
250
|
-
target,
|
|
251
|
-
options,
|
|
252
|
-
isFetcher: true,
|
|
253
|
-
onInvalidateStart: ()=>{
|
|
254
|
-
if (!isLoaderSubmit) setRequestState(requestId, 'loading');
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
setData(result);
|
|
258
|
-
} catch (err) {
|
|
259
|
-
setError(err);
|
|
260
|
-
throw err;
|
|
261
|
-
} finally{
|
|
262
|
-
clearRequestState(requestId);
|
|
263
|
-
}
|
|
264
|
-
}, [
|
|
265
|
-
clearRequestState,
|
|
266
|
-
router,
|
|
267
|
-
setRequestState
|
|
268
|
-
]);
|
|
269
|
-
const FetcherForm = useCallback(({ action, method = 'get', encType, reloadDocument, onSubmit, ...rest })=>{
|
|
270
|
-
const handleSubmit = async (event)=>{
|
|
271
|
-
onSubmit?.(event);
|
|
272
|
-
if (event.defaultPrevented || reloadDocument) return;
|
|
273
|
-
event.preventDefault();
|
|
274
|
-
const submitter = getSubmitter(event);
|
|
275
|
-
const formData = createFormDataFromSubmit({
|
|
276
|
-
form: event.currentTarget,
|
|
277
|
-
submitter
|
|
278
|
-
});
|
|
279
|
-
const normalizedOptions = resolveSubmitOptionsFromForm({
|
|
280
|
-
form: event.currentTarget,
|
|
281
|
-
submitter,
|
|
282
|
-
action,
|
|
283
|
-
method,
|
|
284
|
-
encType
|
|
285
|
-
});
|
|
286
|
-
await submit(formData, normalizedOptions);
|
|
287
|
-
};
|
|
288
|
-
return /*#__PURE__*/ jsx("form", {
|
|
289
|
-
...rest,
|
|
290
|
-
action: action,
|
|
291
|
-
method: method,
|
|
292
|
-
encType: encType,
|
|
293
|
-
onSubmit: handleSubmit
|
|
294
|
-
});
|
|
295
|
-
}, [
|
|
296
|
-
submit
|
|
297
|
-
]);
|
|
298
|
-
return {
|
|
299
|
-
state,
|
|
300
|
-
data,
|
|
301
|
-
error,
|
|
302
|
-
Form: FetcherForm,
|
|
303
|
-
submit
|
|
304
|
-
};
|
|
305
|
-
}
|
|
306
|
-
export { Form, RouteActionResponseError, useFetcher };
|