@modern-js/server-core 2.69.5 → 3.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/adapters/node/helper/index.js +52 -39
- package/dist/cjs/adapters/node/helper/loadCache.js +52 -47
- package/dist/cjs/adapters/node/helper/loadConfig.js +69 -85
- package/dist/cjs/adapters/node/helper/loadEnv.js +60 -50
- package/dist/cjs/adapters/node/helper/loadPlugin.js +40 -32
- package/dist/cjs/adapters/node/helper/utils.js +33 -28
- package/dist/cjs/adapters/node/hono.js +87 -99
- package/dist/cjs/adapters/node/index.js +84 -60
- package/dist/cjs/adapters/node/node.js +164 -190
- package/dist/cjs/adapters/node/plugins/index.js +69 -23
- package/dist/cjs/adapters/node/plugins/nodeServer.js +39 -34
- package/dist/cjs/adapters/node/plugins/resource.js +186 -181
- package/dist/cjs/adapters/node/plugins/static.js +152 -164
- package/dist/cjs/constants.js +70 -57
- package/dist/cjs/context.js +37 -28
- package/dist/cjs/helper.js +40 -33
- package/dist/cjs/hono.js +46 -0
- package/dist/cjs/index.js +236 -57
- package/dist/cjs/plugins/compat/hooks.js +71 -83
- package/dist/cjs/plugins/compat/index.js +59 -60
- package/dist/cjs/plugins/default.js +52 -47
- package/dist/cjs/plugins/favicon.js +43 -39
- package/dist/cjs/plugins/index.js +73 -54
- package/dist/cjs/plugins/log.js +82 -87
- package/dist/cjs/plugins/middlewares.js +43 -37
- package/dist/cjs/plugins/monitors.js +178 -187
- package/dist/cjs/plugins/processedBy.js +45 -39
- package/dist/cjs/plugins/render/csrRscRender.js +70 -71
- package/dist/cjs/plugins/render/dataHandler.js +49 -45
- package/dist/cjs/plugins/render/index.js +152 -126
- package/dist/cjs/plugins/render/inject.js +84 -86
- package/dist/cjs/plugins/render/render.js +244 -271
- package/dist/cjs/plugins/render/renderRscHandler.js +68 -69
- package/dist/cjs/plugins/render/serverActionHandler.js +45 -44
- package/dist/cjs/plugins/render/ssrCache.js +173 -191
- package/dist/cjs/plugins/render/ssrRender.js +89 -94
- package/dist/cjs/plugins/render/utils.js +44 -36
- package/dist/cjs/plugins/route.js +60 -57
- package/dist/cjs/serverBase.js +164 -162
- package/dist/cjs/types/config/bff.js +17 -15
- package/dist/cjs/types/config/dev.js +17 -15
- package/dist/cjs/types/config/html.js +17 -15
- package/dist/cjs/types/config/index.js +90 -29
- package/dist/cjs/types/config/output.js +17 -15
- package/dist/cjs/types/config/security.js +17 -15
- package/dist/cjs/types/config/server.js +17 -15
- package/dist/cjs/types/config/share.js +17 -15
- package/dist/cjs/types/config/source.js +17 -15
- package/dist/cjs/types/config/tools.js +17 -15
- package/dist/cjs/types/index.js +76 -25
- package/dist/cjs/types/plugins/base.js +17 -15
- package/dist/cjs/types/plugins/index.js +55 -21
- package/dist/cjs/types/plugins/plugin.js +18 -0
- package/dist/cjs/types/render.js +17 -15
- package/dist/cjs/types/requestHandler.js +17 -15
- package/dist/cjs/types/server.js +17 -15
- package/dist/cjs/utils/entry.js +37 -32
- package/dist/cjs/utils/env.js +46 -40
- package/dist/cjs/utils/error.js +56 -50
- package/dist/cjs/utils/index.js +111 -33
- package/dist/cjs/utils/middlewareCollector.js +58 -49
- package/dist/cjs/utils/publicDir.js +92 -0
- package/dist/cjs/utils/request.js +73 -65
- package/dist/cjs/utils/serverConfig.js +39 -31
- package/dist/cjs/utils/storage.js +58 -68
- package/dist/cjs/utils/transformStream.js +57 -53
- package/dist/cjs/utils/warmup.js +34 -27
- package/dist/esm/adapters/node/helper/index.mjs +6 -0
- package/dist/esm/adapters/node/helper/loadCache.mjs +14 -0
- package/dist/esm/adapters/node/helper/loadConfig.mjs +31 -0
- package/dist/esm/adapters/node/helper/loadEnv.mjs +22 -0
- package/dist/esm/adapters/node/helper/loadPlugin.mjs +13 -0
- package/dist/esm/adapters/node/helper/utils.mjs +2 -0
- package/dist/esm/adapters/node/hono.mjs +53 -0
- package/dist/esm/adapters/node/index.mjs +5 -0
- package/dist/esm/adapters/node/node.mjs +129 -0
- package/dist/esm/adapters/node/plugins/nodeServer.mjs +9 -0
- package/dist/esm/adapters/node/plugins/resource.mjs +138 -0
- package/dist/esm/adapters/node/plugins/static.mjs +118 -0
- package/dist/esm/constants.mjs +28 -0
- package/dist/{esm-node/context.js → esm/context.mjs} +1 -4
- package/dist/esm/helper.mjs +11 -0
- package/dist/esm/hono.mjs +3 -0
- package/dist/esm/index.mjs +13 -0
- package/dist/esm/plugins/compat/hooks.mjs +40 -0
- package/dist/esm/plugins/compat/index.mjs +27 -0
- package/dist/esm/plugins/default.mjs +25 -0
- package/dist/esm/plugins/favicon.mjs +14 -0
- package/dist/{esm-node/plugins/index.js → esm/plugins/index.mjs} +2 -15
- package/dist/esm/plugins/log.mjs +58 -0
- package/dist/esm/plugins/middlewares.mjs +15 -0
- package/dist/esm/plugins/monitors.mjs +149 -0
- package/dist/esm/plugins/processedBy.mjs +16 -0
- package/dist/esm/plugins/render/csrRscRender.mjs +43 -0
- package/dist/esm/plugins/render/dataHandler.mjs +19 -0
- package/dist/esm/plugins/render/index.mjs +84 -0
- package/dist/esm/plugins/render/inject.mjs +55 -0
- package/dist/esm/plugins/render/render.mjs +226 -0
- package/dist/esm/plugins/render/renderRscHandler.mjs +41 -0
- package/dist/esm/plugins/render/serverActionHandler.mjs +18 -0
- package/dist/esm/plugins/render/ssrCache.mjs +158 -0
- package/dist/esm/plugins/render/ssrRender.mjs +62 -0
- package/dist/esm/plugins/render/utils.mjs +15 -0
- package/dist/esm/plugins/route.mjs +34 -0
- package/dist/esm/serverBase.mjs +136 -0
- package/dist/esm/types/plugins/index.mjs +1 -0
- package/dist/esm/utils/entry.mjs +3 -0
- package/dist/esm/utils/env.mjs +14 -0
- package/dist/esm/utils/error.mjs +53 -0
- package/dist/{esm-node/utils/index.js → esm/utils/index.mjs} +1 -0
- package/dist/esm/utils/middlewareCollector.mjs +26 -0
- package/dist/esm/utils/publicDir.mjs +33 -0
- package/dist/esm/utils/request.mjs +40 -0
- package/dist/esm/utils/serverConfig.mjs +9 -0
- package/dist/esm/utils/storage.mjs +30 -0
- package/dist/esm/utils/transformStream.mjs +28 -0
- package/dist/esm/utils/warmup.mjs +6 -0
- package/dist/esm-node/adapters/node/helper/index.mjs +6 -0
- package/dist/esm-node/adapters/node/helper/loadCache.mjs +14 -0
- package/dist/esm-node/adapters/node/helper/loadConfig.mjs +31 -0
- package/dist/esm-node/adapters/node/helper/loadEnv.mjs +22 -0
- package/dist/esm-node/adapters/node/helper/loadPlugin.mjs +13 -0
- package/dist/esm-node/adapters/node/helper/utils.mjs +2 -0
- package/dist/esm-node/adapters/node/hono.mjs +53 -0
- package/dist/esm-node/adapters/node/index.mjs +5 -0
- package/dist/esm-node/adapters/node/node.mjs +129 -0
- package/dist/esm-node/adapters/node/plugins/index.mjs +3 -0
- package/dist/esm-node/adapters/node/plugins/nodeServer.mjs +9 -0
- package/dist/esm-node/adapters/node/plugins/resource.mjs +138 -0
- package/dist/esm-node/adapters/node/plugins/static.mjs +118 -0
- package/dist/esm-node/constants.mjs +28 -0
- package/dist/esm-node/context.mjs +3 -0
- package/dist/esm-node/helper.mjs +11 -0
- package/dist/esm-node/hono.mjs +3 -0
- package/dist/esm-node/index.mjs +13 -0
- package/dist/esm-node/plugins/compat/hooks.mjs +40 -0
- package/dist/esm-node/plugins/compat/index.mjs +27 -0
- package/dist/esm-node/plugins/default.mjs +25 -0
- package/dist/esm-node/plugins/favicon.mjs +14 -0
- package/dist/esm-node/plugins/index.mjs +9 -0
- package/dist/esm-node/plugins/log.mjs +58 -0
- package/dist/esm-node/plugins/middlewares.mjs +15 -0
- package/dist/esm-node/plugins/monitors.mjs +149 -0
- package/dist/esm-node/plugins/processedBy.mjs +16 -0
- package/dist/esm-node/plugins/render/csrRscRender.mjs +43 -0
- package/dist/esm-node/plugins/render/dataHandler.mjs +19 -0
- package/dist/esm-node/plugins/render/index.mjs +84 -0
- package/dist/esm-node/plugins/render/inject.mjs +55 -0
- package/dist/esm-node/plugins/render/render.mjs +226 -0
- package/dist/esm-node/plugins/render/renderRscHandler.mjs +41 -0
- package/dist/esm-node/plugins/render/serverActionHandler.mjs +18 -0
- package/dist/esm-node/plugins/render/ssrCache.mjs +158 -0
- package/dist/esm-node/plugins/render/ssrRender.mjs +62 -0
- package/dist/esm-node/plugins/render/utils.mjs +15 -0
- package/dist/esm-node/plugins/route.mjs +34 -0
- package/dist/esm-node/serverBase.mjs +136 -0
- package/dist/esm-node/types/config/index.mjs +6 -0
- package/dist/esm-node/types/index.mjs +4 -0
- package/dist/esm-node/types/plugins/index.mjs +1 -0
- package/dist/esm-node/utils/entry.mjs +3 -0
- package/dist/esm-node/utils/env.mjs +14 -0
- package/dist/esm-node/utils/error.mjs +53 -0
- package/dist/esm-node/utils/index.mjs +9 -0
- package/dist/esm-node/utils/middlewareCollector.mjs +26 -0
- package/dist/esm-node/utils/publicDir.mjs +33 -0
- package/dist/esm-node/utils/request.mjs +40 -0
- package/dist/esm-node/utils/serverConfig.mjs +9 -0
- package/dist/esm-node/utils/storage.mjs +30 -0
- package/dist/esm-node/utils/transformStream.mjs +28 -0
- package/dist/esm-node/utils/warmup.mjs +6 -0
- package/dist/types/adapters/node/helper/loadConfig.d.ts +1 -1
- package/dist/types/adapters/node/plugins/nodeServer.d.ts +2 -2
- package/dist/types/adapters/node/plugins/resource.d.ts +3 -3
- package/dist/types/adapters/node/plugins/static.d.ts +3 -2
- package/dist/types/hono.d.ts +3 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/plugins/compat/hooks.d.ts +1 -1
- package/dist/types/plugins/default.d.ts +2 -2
- package/dist/types/plugins/favicon.d.ts +2 -2
- package/dist/types/plugins/log.d.ts +2 -2
- package/dist/types/plugins/middlewares.d.ts +2 -2
- package/dist/types/plugins/monitors.d.ts +4 -4
- package/dist/types/plugins/processedBy.d.ts +2 -2
- package/dist/types/plugins/render/dataHandler.d.ts +1 -1
- package/dist/types/plugins/render/index.d.ts +2 -2
- package/dist/types/plugins/render/inject.d.ts +2 -2
- package/dist/types/plugins/render/ssrRender.d.ts +3 -5
- package/dist/types/plugins/route.d.ts +2 -2
- package/dist/types/serverBase.d.ts +14 -20
- package/dist/types/types/config/bff.d.ts +0 -2
- package/dist/types/types/config/html.d.ts +0 -1
- package/dist/types/types/config/index.d.ts +0 -6
- package/dist/types/types/config/output.d.ts +2 -8
- package/dist/types/types/config/server.d.ts +1 -1
- package/dist/types/types/plugins/base.d.ts +5 -26
- package/dist/types/types/plugins/index.d.ts +1 -2
- package/dist/types/types/plugins/{new.d.ts → plugin.d.ts} +6 -4
- package/dist/types/types/render.d.ts +2 -5
- package/dist/types/types/requestHandler.d.ts +3 -7
- package/dist/types/types/server.d.ts +2 -1
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/publicDir.d.ts +40 -0
- package/dist/types/utils/transformStream.d.ts +1 -1
- package/package.json +25 -29
- package/rslib.config.mts +4 -0
- package/rstest.config.ts +7 -0
- package/dist/cjs/plugins/customServer/base.js +0 -186
- package/dist/cjs/plugins/customServer/context.js +0 -70
- package/dist/cjs/plugins/customServer/index.js +0 -210
- package/dist/cjs/plugins/customServer/routerApi.js +0 -44
- package/dist/cjs/plugins/customServer/template.js +0 -58
- package/dist/cjs/types/plugins/new.js +0 -16
- package/dist/cjs/types/plugins/old.js +0 -16
- package/dist/esm/adapters/node/helper/index.js +0 -13
- package/dist/esm/adapters/node/helper/loadCache.js +0 -44
- package/dist/esm/adapters/node/helper/loadConfig.js +0 -157
- package/dist/esm/adapters/node/helper/loadEnv.js +0 -73
- package/dist/esm/adapters/node/helper/loadPlugin.js +0 -59
- package/dist/esm/adapters/node/helper/utils.js +0 -7
- package/dist/esm/adapters/node/hono.js +0 -148
- package/dist/esm/adapters/node/index.js +0 -23
- package/dist/esm/adapters/node/node.js +0 -357
- package/dist/esm/adapters/node/plugins/index.js +0 -3
- package/dist/esm/adapters/node/plugins/nodeServer.js +0 -18
- package/dist/esm/adapters/node/plugins/resource.js +0 -543
- package/dist/esm/adapters/node/plugins/static.js +0 -245
- package/dist/esm/constants.js +0 -35
- package/dist/esm/context.js +0 -6
- package/dist/esm/helper.js +0 -14
- package/dist/esm/index.js +0 -22
- package/dist/esm/plugins/compat/hooks.js +0 -70
- package/dist/esm/plugins/compat/index.js +0 -45
- package/dist/esm/plugins/customServer/base.js +0 -218
- package/dist/esm/plugins/customServer/context.js +0 -66
- package/dist/esm/plugins/customServer/index.js +0 -369
- package/dist/esm/plugins/customServer/routerApi.js +0 -26
- package/dist/esm/plugins/customServer/template.js +0 -47
- package/dist/esm/plugins/default.js +0 -31
- package/dist/esm/plugins/favicon.js +0 -34
- package/dist/esm/plugins/index.js +0 -22
- package/dist/esm/plugins/log.js +0 -106
- package/dist/esm/plugins/middlewares.js +0 -22
- package/dist/esm/plugins/monitors.js +0 -287
- package/dist/esm/plugins/processedBy.js +0 -42
- package/dist/esm/plugins/render/csrRscRender.js +0 -88
- package/dist/esm/plugins/render/dataHandler.js +0 -48
- package/dist/esm/plugins/render/index.js +0 -215
- package/dist/esm/plugins/render/inject.js +0 -126
- package/dist/esm/plugins/render/render.js +0 -572
- package/dist/esm/plugins/render/renderRscHandler.js +0 -81
- package/dist/esm/plugins/render/serverActionHandler.js +0 -49
- package/dist/esm/plugins/render/ssrCache.js +0 -305
- package/dist/esm/plugins/render/ssrRender.js +0 -124
- package/dist/esm/plugins/render/utils.js +0 -17
- package/dist/esm/plugins/route.js +0 -92
- package/dist/esm/serverBase.js +0 -248
- package/dist/esm/types/config/index.js +0 -6
- package/dist/esm/types/index.js +0 -4
- package/dist/esm/types/plugins/index.js +0 -2
- package/dist/esm/types/requestHandler.js +0 -0
- package/dist/esm/types/server.js +0 -0
- package/dist/esm/utils/entry.js +0 -10
- package/dist/esm/utils/env.js +0 -20
- package/dist/esm/utils/error.js +0 -33
- package/dist/esm/utils/index.js +0 -8
- package/dist/esm/utils/middlewareCollector.js +0 -31
- package/dist/esm/utils/request.js +0 -51
- package/dist/esm/utils/serverConfig.js +0 -13
- package/dist/esm/utils/storage.js +0 -38
- package/dist/esm/utils/transformStream.js +0 -104
- package/dist/esm/utils/warmup.js +0 -9
- package/dist/esm-node/adapters/node/helper/index.js +0 -13
- package/dist/esm-node/adapters/node/helper/loadCache.js +0 -19
- package/dist/esm-node/adapters/node/helper/loadConfig.js +0 -59
- package/dist/esm-node/adapters/node/helper/loadEnv.js +0 -22
- package/dist/esm-node/adapters/node/helper/loadPlugin.js +0 -15
- package/dist/esm-node/adapters/node/helper/utils.js +0 -7
- package/dist/esm-node/adapters/node/hono.js +0 -79
- package/dist/esm-node/adapters/node/index.js +0 -23
- package/dist/esm-node/adapters/node/node.js +0 -169
- package/dist/esm-node/adapters/node/plugins/nodeServer.js +0 -14
- package/dist/esm-node/adapters/node/plugins/resource.js +0 -159
- package/dist/esm-node/adapters/node/plugins/static.js +0 -144
- package/dist/esm-node/constants.js +0 -35
- package/dist/esm-node/helper.js +0 -14
- package/dist/esm-node/index.js +0 -22
- package/dist/esm-node/plugins/compat/hooks.js +0 -66
- package/dist/esm-node/plugins/compat/index.js +0 -40
- package/dist/esm-node/plugins/customServer/base.js +0 -162
- package/dist/esm-node/plugins/customServer/context.js +0 -43
- package/dist/esm-node/plugins/customServer/index.js +0 -185
- package/dist/esm-node/plugins/customServer/routerApi.js +0 -20
- package/dist/esm-node/plugins/customServer/template.js +0 -34
- package/dist/esm-node/plugins/default.js +0 -30
- package/dist/esm-node/plugins/favicon.js +0 -20
- package/dist/esm-node/plugins/log.js +0 -73
- package/dist/esm-node/plugins/middlewares.js +0 -19
- package/dist/esm-node/plugins/monitors.js +0 -174
- package/dist/esm-node/plugins/processedBy.js +0 -20
- package/dist/esm-node/plugins/render/csrRscRender.js +0 -54
- package/dist/esm-node/plugins/render/dataHandler.js +0 -25
- package/dist/esm-node/plugins/render/index.js +0 -106
- package/dist/esm-node/plugins/render/inject.js +0 -69
- package/dist/esm-node/plugins/render/render.js +0 -253
- package/dist/esm-node/plugins/render/renderRscHandler.js +0 -52
- package/dist/esm-node/plugins/render/serverActionHandler.js +0 -27
- package/dist/esm-node/plugins/render/ssrCache.js +0 -190
- package/dist/esm-node/plugins/render/ssrRender.js +0 -77
- package/dist/esm-node/plugins/render/utils.js +0 -17
- package/dist/esm-node/plugins/route.js +0 -41
- package/dist/esm-node/serverBase.js +0 -146
- package/dist/esm-node/types/plugins/index.js +0 -2
- package/dist/esm-node/utils/entry.js +0 -10
- package/dist/esm-node/utils/env.js +0 -20
- package/dist/esm-node/utils/error.js +0 -61
- package/dist/esm-node/utils/middlewareCollector.js +0 -29
- package/dist/esm-node/utils/request.js +0 -50
- package/dist/esm-node/utils/serverConfig.js +0 -11
- package/dist/esm-node/utils/storage.js +0 -40
- package/dist/esm-node/utils/transformStream.js +0 -36
- package/dist/esm-node/utils/warmup.js +0 -9
- package/dist/types/plugins/customServer/base.d.ts +0 -7
- package/dist/types/plugins/customServer/context.d.ts +0 -8
- package/dist/types/plugins/customServer/index.d.ts +0 -11
- package/dist/types/plugins/customServer/routerApi.d.ts +0 -9
- package/dist/types/plugins/customServer/template.d.ts +0 -11
- package/dist/types/types/plugins/old.d.ts +0 -56
- /package/dist/{esm-node/adapters/node/plugins/index.js → esm/adapters/node/plugins/index.mjs} +0 -0
- /package/dist/{esm-node/types/server.js → esm/types/config/bff.mjs} +0 -0
- /package/dist/esm/types/config/{bff.js → dev.mjs} +0 -0
- /package/dist/esm/types/config/{dev.js → html.mjs} +0 -0
- /package/dist/{esm-node/types/config/index.js → esm/types/config/index.mjs} +0 -0
- /package/dist/esm/types/config/{html.js → output.mjs} +0 -0
- /package/dist/esm/types/config/{output.js → security.mjs} +0 -0
- /package/dist/esm/types/config/{security.js → server.mjs} +0 -0
- /package/dist/esm/types/config/{server.js → share.mjs} +0 -0
- /package/dist/esm/types/config/{share.js → source.mjs} +0 -0
- /package/dist/esm/types/config/{source.js → tools.mjs} +0 -0
- /package/dist/{esm-node/types/index.js → esm/types/index.mjs} +0 -0
- /package/dist/esm/types/{config/tools.js → plugins/base.mjs} +0 -0
- /package/dist/esm/types/plugins/{base.js → plugin.mjs} +0 -0
- /package/dist/esm/types/{plugins/new.js → render.mjs} +0 -0
- /package/dist/esm/types/{plugins/old.js → requestHandler.mjs} +0 -0
- /package/dist/esm/types/{render.js → server.mjs} +0 -0
- /package/dist/esm-node/types/config/{bff.js → bff.mjs} +0 -0
- /package/dist/esm-node/types/config/{dev.js → dev.mjs} +0 -0
- /package/dist/esm-node/types/config/{html.js → html.mjs} +0 -0
- /package/dist/esm-node/types/config/{output.js → output.mjs} +0 -0
- /package/dist/esm-node/types/config/{security.js → security.mjs} +0 -0
- /package/dist/esm-node/types/config/{server.js → server.mjs} +0 -0
- /package/dist/esm-node/types/config/{share.js → share.mjs} +0 -0
- /package/dist/esm-node/types/config/{source.js → source.mjs} +0 -0
- /package/dist/esm-node/types/config/{tools.js → tools.mjs} +0 -0
- /package/dist/esm-node/types/plugins/{base.js → base.mjs} +0 -0
- /package/dist/esm-node/types/plugins/{new.js → plugin.mjs} +0 -0
- /package/dist/esm-node/types/{plugins/old.js → render.mjs} +0 -0
- /package/dist/esm-node/types/{render.js → requestHandler.mjs} +0 -0
- /package/dist/esm-node/types/{requestHandler.js → server.mjs} +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getPathname } from "../utils";
|
|
2
|
+
const humanize = (times)=>{
|
|
3
|
+
const [delimiter, separator] = [
|
|
4
|
+
',',
|
|
5
|
+
'.'
|
|
6
|
+
];
|
|
7
|
+
const orderTimes = times.map((v)=>v.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, `$1${delimiter}`));
|
|
8
|
+
return orderTimes.join(separator);
|
|
9
|
+
};
|
|
10
|
+
const time = (start)=>{
|
|
11
|
+
const delta = Date.now() - start;
|
|
12
|
+
return humanize([
|
|
13
|
+
delta < 1000 ? `${delta}ms` : `${Math.round(delta / 1000)}s`
|
|
14
|
+
]);
|
|
15
|
+
};
|
|
16
|
+
const colorStatus = (status)=>{
|
|
17
|
+
const out = {
|
|
18
|
+
7: `\x1b[35m${status}\x1b[0m`,
|
|
19
|
+
5: `\x1b[31m${status}\x1b[0m`,
|
|
20
|
+
4: `\x1b[33m${status}\x1b[0m`,
|
|
21
|
+
3: `\x1b[36m${status}\x1b[0m`,
|
|
22
|
+
2: `\x1b[32m${status}\x1b[0m`,
|
|
23
|
+
1: `\x1b[32m${status}\x1b[0m`,
|
|
24
|
+
0: `\x1b[33m${status}\x1b[0m`
|
|
25
|
+
};
|
|
26
|
+
const calculateStatus = Math.floor(status / 100);
|
|
27
|
+
return out[calculateStatus];
|
|
28
|
+
};
|
|
29
|
+
function log(fn, prefix, method, path, status = 0, elapsed) {
|
|
30
|
+
const out = "<--" === prefix ? ` ${prefix} ${method} ${path}` : ` ${prefix} ${method} ${path} ${colorStatus(status)} ${elapsed}`;
|
|
31
|
+
fn(out);
|
|
32
|
+
}
|
|
33
|
+
function logHandler() {
|
|
34
|
+
return async function(c, next) {
|
|
35
|
+
const { method } = c.req;
|
|
36
|
+
const monitors = c.get('monitors');
|
|
37
|
+
if (!monitors) return void await next();
|
|
38
|
+
const path = getPathname(c.req.raw);
|
|
39
|
+
const logFn = monitors.debug;
|
|
40
|
+
log(logFn, "<--", method, path);
|
|
41
|
+
const start = Date.now();
|
|
42
|
+
await next();
|
|
43
|
+
log(logFn, "-->", method, path, c?.env?.node?.res?.statusCode ?? c.res.status, time(start));
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const logPlugin = ()=>({
|
|
47
|
+
name: '@modern-js/plugin-log',
|
|
48
|
+
setup (api) {
|
|
49
|
+
api.onPrepare(()=>{
|
|
50
|
+
const { middlewares } = api.getServerContext();
|
|
51
|
+
middlewares.push({
|
|
52
|
+
name: 'print_log',
|
|
53
|
+
handler: logHandler()
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
export { logPlugin };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const injectConfigMiddlewarePlugin = (configMiddlewares = [], configRenderMiddlewares = [])=>({
|
|
2
|
+
name: '@modern-js/plugin-inject-config-middleware',
|
|
3
|
+
setup (api) {
|
|
4
|
+
api.onPrepare(()=>{
|
|
5
|
+
const { middlewares, renderMiddlewares } = api.getServerContext();
|
|
6
|
+
configMiddlewares.forEach((m)=>{
|
|
7
|
+
middlewares.push(m);
|
|
8
|
+
});
|
|
9
|
+
configRenderMiddlewares.forEach((m)=>{
|
|
10
|
+
renderMiddlewares.push(m);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
export { injectConfigMiddlewarePlugin };
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { time } from "@modern-js/runtime-utils/time";
|
|
2
|
+
import { SERVER_TIMING, ServerTimings } from "../constants";
|
|
3
|
+
function createMonitors() {
|
|
4
|
+
const coreMonitors = [];
|
|
5
|
+
const log = (level, message, args)=>{
|
|
6
|
+
const event = {
|
|
7
|
+
type: 'log',
|
|
8
|
+
payload: {
|
|
9
|
+
level,
|
|
10
|
+
message,
|
|
11
|
+
args
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
coreMonitors.forEach((monitor)=>monitor(event));
|
|
15
|
+
};
|
|
16
|
+
const mointors = {
|
|
17
|
+
push (monitor) {
|
|
18
|
+
coreMonitors.push(monitor);
|
|
19
|
+
},
|
|
20
|
+
error (message, ...args) {
|
|
21
|
+
log('error', message, args);
|
|
22
|
+
},
|
|
23
|
+
warn (message, ...args) {
|
|
24
|
+
log('warn', message, args);
|
|
25
|
+
},
|
|
26
|
+
debug (message, ...args) {
|
|
27
|
+
log('debug', message, args);
|
|
28
|
+
},
|
|
29
|
+
info (message, ...args) {
|
|
30
|
+
log('info', message, args);
|
|
31
|
+
},
|
|
32
|
+
trace (message, ...args) {
|
|
33
|
+
log('trace', message, args);
|
|
34
|
+
},
|
|
35
|
+
timing (name, dur, desc, tags, ...args) {
|
|
36
|
+
const event = {
|
|
37
|
+
type: 'timing',
|
|
38
|
+
payload: {
|
|
39
|
+
name,
|
|
40
|
+
dur,
|
|
41
|
+
desc,
|
|
42
|
+
tags,
|
|
43
|
+
args
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
coreMonitors.forEach((monitor)=>monitor(event));
|
|
47
|
+
},
|
|
48
|
+
counter (name, tags, ...args) {
|
|
49
|
+
const event = {
|
|
50
|
+
type: 'counter',
|
|
51
|
+
payload: {
|
|
52
|
+
name,
|
|
53
|
+
args,
|
|
54
|
+
tags
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
coreMonitors.forEach((monitor)=>monitor(event));
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
return mointors;
|
|
61
|
+
}
|
|
62
|
+
const initMonitorsPlugin = ()=>({
|
|
63
|
+
name: '@modern-js/init-mointor',
|
|
64
|
+
setup (api) {
|
|
65
|
+
api.onPrepare(()=>{
|
|
66
|
+
const { middlewares } = api.getServerContext();
|
|
67
|
+
middlewares.push({
|
|
68
|
+
name: 'init-monitor',
|
|
69
|
+
handler: async (c, next)=>{
|
|
70
|
+
if (!c.get('monitors')) {
|
|
71
|
+
const monitors = createMonitors();
|
|
72
|
+
c.set('monitors', monitors);
|
|
73
|
+
}
|
|
74
|
+
return next();
|
|
75
|
+
},
|
|
76
|
+
order: 'pre'
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
const injectloggerPlugin = (inputLogger)=>({
|
|
82
|
+
name: '@modern-js/inject-logger',
|
|
83
|
+
setup (api) {
|
|
84
|
+
const logger = inputLogger;
|
|
85
|
+
api.onPrepare(()=>{
|
|
86
|
+
const { middlewares } = api.getServerContext();
|
|
87
|
+
middlewares.push({
|
|
88
|
+
name: 'inject-logger',
|
|
89
|
+
handler: async (c, next)=>{
|
|
90
|
+
const pathname = c.req.path;
|
|
91
|
+
const loggerMonitor = (event)=>{
|
|
92
|
+
if ('log' === event.type) {
|
|
93
|
+
const { level, message, args } = event.payload;
|
|
94
|
+
if ('trace' === level) logger.info(message, ...args || []);
|
|
95
|
+
else logger[level](message, ...args || []);
|
|
96
|
+
}
|
|
97
|
+
if ('timing' === event.type) {
|
|
98
|
+
const { name, dur, desc } = event.payload;
|
|
99
|
+
if (desc) logger.debug(`%s Debug - ${name}, cost: %s, req.url = %s `, desc, dur, pathname);
|
|
100
|
+
else logger.debug(`Debug - ${name}, cost: %s, req.url = %s`, dur, pathname);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const monitors = c.get('monitors');
|
|
104
|
+
monitors?.push(loggerMonitor);
|
|
105
|
+
return next();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
const injectServerTiming = ()=>({
|
|
112
|
+
name: '@modern-js/inject-server-timing',
|
|
113
|
+
setup (api) {
|
|
114
|
+
api.onPrepare(()=>{
|
|
115
|
+
const { middlewares, metaName } = api.getServerContext();
|
|
116
|
+
middlewares.push({
|
|
117
|
+
name: 'inject-server-timing',
|
|
118
|
+
handler: async (c, next)=>{
|
|
119
|
+
const serverTimings = [];
|
|
120
|
+
const timingMonitor = (event)=>{
|
|
121
|
+
if ('timing' === event.type) serverTimings.push(event.payload);
|
|
122
|
+
};
|
|
123
|
+
const monitors = c.get('monitors');
|
|
124
|
+
monitors?.push(timingMonitor);
|
|
125
|
+
await next();
|
|
126
|
+
serverTimings.forEach((serverTiming)=>{
|
|
127
|
+
const { name, desc, dur } = serverTiming;
|
|
128
|
+
const _name = `bd-${metaName}-${name}`;
|
|
129
|
+
const value = `${_name};${desc ? `decs="${desc}";` : ''} dur=${dur}`;
|
|
130
|
+
c.header(SERVER_TIMING, value, {
|
|
131
|
+
append: true
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
function requestLatencyMiddleware() {
|
|
140
|
+
return async (c, next)=>{
|
|
141
|
+
const monitors = c.get('monitors');
|
|
142
|
+
if (!monitors) return void await next();
|
|
143
|
+
const getCost = time();
|
|
144
|
+
await next();
|
|
145
|
+
const cost = getCost();
|
|
146
|
+
monitors.timing(ServerTimings.SERVER_HANDLE_REQUEST, cost);
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export { initMonitorsPlugin, injectServerTiming, injectloggerPlugin, requestLatencyMiddleware };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const processedByPlugin = ()=>({
|
|
2
|
+
name: '@modern-js/plugin-processed',
|
|
3
|
+
setup (api) {
|
|
4
|
+
api.onPrepare(()=>{
|
|
5
|
+
const { middlewares } = api.getServerContext();
|
|
6
|
+
middlewares.push({
|
|
7
|
+
name: 'processed-by',
|
|
8
|
+
handler: async (c, next)=>{
|
|
9
|
+
await next();
|
|
10
|
+
c.header('X-Processed-By', 'Modern.js');
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
export { processedByPlugin };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
2
|
+
import { createRequestHandlerConfig } from "./utils";
|
|
3
|
+
const csrRscRender = async (req, options)=>{
|
|
4
|
+
const { routeInfo, serverManifest, rscSSRManifest, rscClientManifest, rscServerManifest, locals, params, loaderContext, reporter, monitors, onError, onTiming, staticGenerate, html } = options;
|
|
5
|
+
const serverBundle = serverManifest?.renderBundles?.[routeInfo.entryName || MAIN_ENTRY_NAME];
|
|
6
|
+
const loadableStats = serverManifest.loadableStats || {};
|
|
7
|
+
const routeManifest = serverManifest.routeManifest || {};
|
|
8
|
+
const config = createRequestHandlerConfig(options.config);
|
|
9
|
+
const requestHandlerOptions = {
|
|
10
|
+
resource: {
|
|
11
|
+
route: routeInfo,
|
|
12
|
+
loadableStats,
|
|
13
|
+
routeManifest,
|
|
14
|
+
entryName: routeInfo.entryName || MAIN_ENTRY_NAME
|
|
15
|
+
},
|
|
16
|
+
config,
|
|
17
|
+
params,
|
|
18
|
+
loaderContext,
|
|
19
|
+
html,
|
|
20
|
+
rscSSRManifest,
|
|
21
|
+
rscClientManifest,
|
|
22
|
+
rscServerManifest,
|
|
23
|
+
locals,
|
|
24
|
+
staticGenerate,
|
|
25
|
+
monitors,
|
|
26
|
+
onError,
|
|
27
|
+
onTiming,
|
|
28
|
+
reporter: reporter
|
|
29
|
+
};
|
|
30
|
+
if (!serverBundle) return new Response('Cannot find server bundle for RSC', {
|
|
31
|
+
status: 500
|
|
32
|
+
});
|
|
33
|
+
const renderRscStreamHandler = await serverBundle.renderRscStreamHandler;
|
|
34
|
+
if (!renderRscStreamHandler) return new Response('Cannot find render handler for RSC', {
|
|
35
|
+
status: 500
|
|
36
|
+
});
|
|
37
|
+
if (!rscClientManifest) return new Response('Cannot find rsc client manifest', {
|
|
38
|
+
status: 500
|
|
39
|
+
});
|
|
40
|
+
const response = await renderRscStreamHandler(req, requestHandlerOptions);
|
|
41
|
+
return response;
|
|
42
|
+
};
|
|
43
|
+
export { csrRscRender };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { MAIN_ENTRY_NAME } from "@modern-js/utils/universal/constants";
|
|
2
|
+
const dataHandler = async (request, { routeInfo, serverRoutes, monitors, onError, onTiming, serverManifest, loaderContext })=>{
|
|
3
|
+
const serverLoaderModule = serverManifest?.loaderBundles?.[routeInfo.entryName || MAIN_ENTRY_NAME];
|
|
4
|
+
if (!serverLoaderModule) return;
|
|
5
|
+
const { routes, handleRequest } = serverLoaderModule;
|
|
6
|
+
const response = await handleRequest({
|
|
7
|
+
request,
|
|
8
|
+
serverRoutes,
|
|
9
|
+
context: {
|
|
10
|
+
monitors,
|
|
11
|
+
loaderContext
|
|
12
|
+
},
|
|
13
|
+
onTiming,
|
|
14
|
+
onError,
|
|
15
|
+
routes
|
|
16
|
+
});
|
|
17
|
+
return response;
|
|
18
|
+
};
|
|
19
|
+
export { dataHandler };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { getLoaderCtx } from "../../helper";
|
|
2
|
+
import { sortRoutes } from "../../utils";
|
|
3
|
+
import { requestLatencyMiddleware } from "../monitors";
|
|
4
|
+
export * from "./inject";
|
|
5
|
+
const DYNAMIC_ROUTE_REG = /\/:./;
|
|
6
|
+
function escapeRegexSpecialChars(path) {
|
|
7
|
+
return path.replace(/[()[\]{}*+?.^$|\\]/g, '\\$&');
|
|
8
|
+
}
|
|
9
|
+
const renderPlugin = ()=>({
|
|
10
|
+
name: '@modern-js/plugin-render',
|
|
11
|
+
setup (api) {
|
|
12
|
+
api.onPrepare(async ()=>{
|
|
13
|
+
const { middlewares, routes, render, renderMiddlewares } = api.getServerContext();
|
|
14
|
+
if (!routes) return;
|
|
15
|
+
const pageRoutes = getPageRoutes(routes);
|
|
16
|
+
middlewares.push({
|
|
17
|
+
name: 'page-latency',
|
|
18
|
+
handler: requestLatencyMiddleware()
|
|
19
|
+
});
|
|
20
|
+
for (const route of pageRoutes){
|
|
21
|
+
const { urlPath: originUrlPath } = route;
|
|
22
|
+
const isDynamic = DYNAMIC_ROUTE_REG.test(originUrlPath);
|
|
23
|
+
const escapedPath = isDynamic ? originUrlPath : escapeRegexSpecialChars(originUrlPath);
|
|
24
|
+
const urlPath = escapedPath.endsWith('/') ? `${escapedPath}*` : `${escapedPath}/*`;
|
|
25
|
+
renderMiddlewares?.forEach((m)=>{
|
|
26
|
+
middlewares.push({
|
|
27
|
+
name: m.name,
|
|
28
|
+
path: urlPath,
|
|
29
|
+
handler: m.handler
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
render && middlewares.push({
|
|
33
|
+
name: "render",
|
|
34
|
+
path: urlPath,
|
|
35
|
+
handler: createRenderHandler(render)
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
function getPageRoutes(routes) {
|
|
42
|
+
return routes.filter((route)=>!route.isApi).sort(sortRoutes);
|
|
43
|
+
}
|
|
44
|
+
function createRenderHandler(render) {
|
|
45
|
+
return async (c, _)=>{
|
|
46
|
+
const reporter = c.get('reporter');
|
|
47
|
+
const monitors = c.get('monitors');
|
|
48
|
+
const templates = c.get('templates') || {};
|
|
49
|
+
const serverManifest = c.get('serverManifest') || {};
|
|
50
|
+
const rscServerManifest = c.get('rscServerManifest');
|
|
51
|
+
const rscClientManifest = c.get('rscClientManifest');
|
|
52
|
+
const rscSSRManifest = c.get('rscSSRManifest');
|
|
53
|
+
const locals = c.get('locals');
|
|
54
|
+
c.get('metrics');
|
|
55
|
+
const matchPathname = c.get('matchPathname');
|
|
56
|
+
const matchEntryName = c.get('matchEntryName');
|
|
57
|
+
const loaderContext = getLoaderCtx(c);
|
|
58
|
+
const contextForceCSR = c.get('forceCSR');
|
|
59
|
+
const request = c.req.raw;
|
|
60
|
+
const nodeReq = c.env.node?.req;
|
|
61
|
+
const res = await render(request, {
|
|
62
|
+
nodeReq,
|
|
63
|
+
monitors,
|
|
64
|
+
templates,
|
|
65
|
+
serverManifest,
|
|
66
|
+
rscServerManifest,
|
|
67
|
+
rscClientManifest,
|
|
68
|
+
rscSSRManifest,
|
|
69
|
+
loaderContext,
|
|
70
|
+
locals,
|
|
71
|
+
matchPathname,
|
|
72
|
+
matchEntryName,
|
|
73
|
+
contextForceCSR,
|
|
74
|
+
reporter
|
|
75
|
+
});
|
|
76
|
+
const { body, status, headers } = res;
|
|
77
|
+
const headersData = {};
|
|
78
|
+
headers.forEach((v, k)=>{
|
|
79
|
+
headersData[k] = v;
|
|
80
|
+
});
|
|
81
|
+
return c.body(body, status, headersData);
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export { renderPlugin };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createRender } from "./render";
|
|
2
|
+
const injectRenderHandlerPlugin = ({ staticGenerate, cacheConfig })=>({
|
|
3
|
+
name: '@modern-js/plugin-inject-render',
|
|
4
|
+
setup (api) {
|
|
5
|
+
api.onPrepare(async ()=>{
|
|
6
|
+
const { distDirectory: pwd, routes, metaName } = api.getServerContext();
|
|
7
|
+
const config = api.getServerConfig();
|
|
8
|
+
const hooks = api.getHooks();
|
|
9
|
+
if (!routes) return;
|
|
10
|
+
const onFallback = async (reason, error)=>{
|
|
11
|
+
await hooks.fallback.call({
|
|
12
|
+
reason,
|
|
13
|
+
error
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
const getRenderHandlerOptions = {
|
|
17
|
+
pwd: pwd,
|
|
18
|
+
routes,
|
|
19
|
+
config,
|
|
20
|
+
metaName,
|
|
21
|
+
cacheConfig: cacheConfig,
|
|
22
|
+
staticGenerate,
|
|
23
|
+
onFallback
|
|
24
|
+
};
|
|
25
|
+
const render = await getRenderHandler(getRenderHandlerOptions);
|
|
26
|
+
api.updateServerContext({
|
|
27
|
+
render,
|
|
28
|
+
getRenderOptions: getRenderHandlerOptions
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
async function getRenderHandler({ pwd, routes, config, cacheConfig, metaName, staticGenerate, onFallback }) {
|
|
34
|
+
const ssrConfig = config.server?.ssr;
|
|
35
|
+
const ssrByEntries = config.server?.ssrByEntries;
|
|
36
|
+
const forceCSR = 'object' == typeof ssrConfig ? ssrConfig.forceCSR : false;
|
|
37
|
+
const forceCSRMap = new Map();
|
|
38
|
+
if (ssrByEntries) Object.entries(ssrByEntries).forEach(([entryName, ssrConfig])=>{
|
|
39
|
+
forceCSRMap.set(entryName, 'object' == typeof ssrConfig ? ssrConfig.forceCSR ?? false : false);
|
|
40
|
+
});
|
|
41
|
+
const render = createRender({
|
|
42
|
+
routes,
|
|
43
|
+
pwd,
|
|
44
|
+
config,
|
|
45
|
+
staticGenerate,
|
|
46
|
+
cacheConfig,
|
|
47
|
+
forceCSR,
|
|
48
|
+
forceCSRMap,
|
|
49
|
+
nonce: config.security?.nonce,
|
|
50
|
+
metaName: metaName || 'modern-js',
|
|
51
|
+
onFallback
|
|
52
|
+
});
|
|
53
|
+
return render;
|
|
54
|
+
}
|
|
55
|
+
export { getRenderHandler, injectRenderHandlerPlugin };
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import * as __rspack_external__modern_js_runtime_utils_router_2aa8d96f from "@modern-js/runtime-utils/router";
|
|
2
|
+
import { cutNameByHyphen } from "@modern-js/utils/universal";
|
|
3
|
+
import { TrieRouter } from "hono/router/trie-router";
|
|
4
|
+
import { X_MODERNJS_RENDER } from "../../constants";
|
|
5
|
+
import { ErrorDigest, createErrorHtml, getPathname, getRuntimeEnv, parseHeaders, parseQuery, sortRoutes, uniqueKeyByRoute } from "../../utils";
|
|
6
|
+
import { csrRscRender } from "./csrRscRender";
|
|
7
|
+
import { dataHandler } from "./dataHandler";
|
|
8
|
+
import { renderRscHandler } from "./renderRscHandler";
|
|
9
|
+
import { serverActionHandler } from "./serverActionHandler";
|
|
10
|
+
import { ssrRender } from "./ssrRender";
|
|
11
|
+
var __webpack_modules__ = {
|
|
12
|
+
"@modern-js/runtime-utils/router" (module) {
|
|
13
|
+
module.exports = __rspack_external__modern_js_runtime_utils_router_2aa8d96f;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var __webpack_module_cache__ = {};
|
|
17
|
+
function __webpack_require__(moduleId) {
|
|
18
|
+
var cachedModule = __webpack_module_cache__[moduleId];
|
|
19
|
+
if (void 0 !== cachedModule) return cachedModule.exports;
|
|
20
|
+
var module = __webpack_module_cache__[moduleId] = {
|
|
21
|
+
exports: {}
|
|
22
|
+
};
|
|
23
|
+
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
24
|
+
return module.exports;
|
|
25
|
+
}
|
|
26
|
+
const DYNAMIC_ROUTE_REG = /\/:./;
|
|
27
|
+
function getRouter(routes) {
|
|
28
|
+
const dynamicRoutes = [];
|
|
29
|
+
const normalRoutes = [];
|
|
30
|
+
routes.forEach((route)=>{
|
|
31
|
+
if (DYNAMIC_ROUTE_REG.test(route.urlPath)) dynamicRoutes.push(route);
|
|
32
|
+
else normalRoutes.push(route);
|
|
33
|
+
});
|
|
34
|
+
const finalRoutes = [
|
|
35
|
+
...normalRoutes.sort(sortRoutes),
|
|
36
|
+
...dynamicRoutes.sort(sortRoutes)
|
|
37
|
+
];
|
|
38
|
+
const router = new TrieRouter();
|
|
39
|
+
for (const route of finalRoutes){
|
|
40
|
+
const { urlPath: originUrlPath } = route;
|
|
41
|
+
const urlPath = originUrlPath.endsWith('/') ? `${originUrlPath}*` : `${originUrlPath}/*`;
|
|
42
|
+
router.add('*', urlPath, route);
|
|
43
|
+
}
|
|
44
|
+
return router;
|
|
45
|
+
}
|
|
46
|
+
function matchRoute(router, pathname, entryName) {
|
|
47
|
+
const matched = router.match('*', pathname);
|
|
48
|
+
if (entryName && matched[0].length > 1) {
|
|
49
|
+
const matches = matched[0];
|
|
50
|
+
const result = matches.find(([route])=>route.entryName === entryName);
|
|
51
|
+
return result || [];
|
|
52
|
+
}
|
|
53
|
+
{
|
|
54
|
+
const result = matched[0][0];
|
|
55
|
+
return result || [];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function getHeadersWithoutCookie(headers) {
|
|
59
|
+
const _headers = {
|
|
60
|
+
...headers,
|
|
61
|
+
cookie: void 0
|
|
62
|
+
};
|
|
63
|
+
delete _headers.cookie;
|
|
64
|
+
return _headers;
|
|
65
|
+
}
|
|
66
|
+
async function createRender({ routes, pwd, metaName, staticGenerate, cacheConfig, forceCSR, forceCSRMap, config, onFallback }) {
|
|
67
|
+
const router = getRouter(routes);
|
|
68
|
+
return async (req, { monitors, nodeReq, templates, serverManifest, rscClientManifest, rscSSRManifest, rscServerManifest, locals, matchEntryName, matchPathname, loaderContext, contextForceCSR, reporter })=>{
|
|
69
|
+
const forMatchpathname = matchPathname ?? getPathname(req);
|
|
70
|
+
const [routeInfo, params] = matchRoute(router, forMatchpathname, matchEntryName);
|
|
71
|
+
const framework = cutNameByHyphen(metaName || 'modern-js');
|
|
72
|
+
const fallbackHeader = `x-${framework}-ssr-fallback`;
|
|
73
|
+
let fallbackReason = null;
|
|
74
|
+
const fallbackWrapper = async (reason, error)=>{
|
|
75
|
+
fallbackReason = reason;
|
|
76
|
+
return onFallback?.(reason, error);
|
|
77
|
+
};
|
|
78
|
+
if (!routeInfo) return new Response(createErrorHtml(404), {
|
|
79
|
+
status: 404,
|
|
80
|
+
headers: {
|
|
81
|
+
'content-type': 'text/html; charset=UTF-8'
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
const html = templates[uniqueKeyByRoute(routeInfo)];
|
|
85
|
+
if (!html) return new Response(createErrorHtml(404), {
|
|
86
|
+
status: 404,
|
|
87
|
+
headers: {
|
|
88
|
+
'content-type': 'text/html; charset=UTF-8'
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
const finalForceCSR = routeInfo.entryName ? forceCSRMap?.get(routeInfo.entryName) ?? forceCSR : forceCSR;
|
|
92
|
+
const renderMode = await getRenderMode(req, fallbackHeader, routeInfo.isSSR, finalForceCSR, nodeReq, fallbackWrapper, contextForceCSR);
|
|
93
|
+
const headerData = parseHeaders(req);
|
|
94
|
+
const onError = (e, key)=>{
|
|
95
|
+
monitors?.error(`SSR Error - ${key || (e instanceof Error ? e.name : e)}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, forMatchpathname, getHeadersWithoutCookie(headerData));
|
|
96
|
+
};
|
|
97
|
+
const onTiming = (name, dur)=>{
|
|
98
|
+
monitors?.timing(name, dur, 'SSR');
|
|
99
|
+
};
|
|
100
|
+
const renderOptions = {
|
|
101
|
+
pwd,
|
|
102
|
+
html,
|
|
103
|
+
routeInfo,
|
|
104
|
+
staticGenerate: staticGenerate || false,
|
|
105
|
+
config,
|
|
106
|
+
nodeReq,
|
|
107
|
+
cacheConfig,
|
|
108
|
+
serverRoutes: routes,
|
|
109
|
+
params,
|
|
110
|
+
monitors,
|
|
111
|
+
locals,
|
|
112
|
+
rscClientManifest,
|
|
113
|
+
rscSSRManifest,
|
|
114
|
+
rscServerManifest,
|
|
115
|
+
serverManifest,
|
|
116
|
+
loaderContext: loaderContext || new Map(),
|
|
117
|
+
onError,
|
|
118
|
+
onTiming,
|
|
119
|
+
reporter
|
|
120
|
+
};
|
|
121
|
+
if (fallbackReason) renderOptions.html = injectFallbackReasonToHtml({
|
|
122
|
+
html: renderOptions.html,
|
|
123
|
+
reason: fallbackReason,
|
|
124
|
+
framework
|
|
125
|
+
});
|
|
126
|
+
let response;
|
|
127
|
+
switch(renderMode){
|
|
128
|
+
case 'data':
|
|
129
|
+
response = await dataHandler(req, renderOptions) || await renderHandler(req, renderOptions, 'ssr', fallbackWrapper, framework);
|
|
130
|
+
break;
|
|
131
|
+
case 'rsc-tree':
|
|
132
|
+
response = await renderRscHandler(req, renderOptions);
|
|
133
|
+
break;
|
|
134
|
+
case 'rsc-action':
|
|
135
|
+
response = await serverActionHandler(req, renderOptions);
|
|
136
|
+
break;
|
|
137
|
+
case 'ssr':
|
|
138
|
+
case 'csr':
|
|
139
|
+
response = await renderHandler(req, renderOptions, renderMode, fallbackWrapper, framework);
|
|
140
|
+
break;
|
|
141
|
+
default:
|
|
142
|
+
throw new Error(`Unknown render mode: ${renderMode}`);
|
|
143
|
+
}
|
|
144
|
+
if (fallbackReason) response.headers.set(fallbackHeader, `1;reason=${fallbackReason}`);
|
|
145
|
+
return response;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
async function renderHandler(request, options, mode, fallbackWrapper, framework) {
|
|
149
|
+
let response = null;
|
|
150
|
+
const { serverManifest } = options;
|
|
151
|
+
const ssrByRouteIds = options.config.server?.ssrByRouteIds;
|
|
152
|
+
const runtimeEnv = getRuntimeEnv();
|
|
153
|
+
if (serverManifest.nestedRoutesJson && ssrByRouteIds && ssrByRouteIds?.length > 0 && 'node' === runtimeEnv) {
|
|
154
|
+
const { nestedRoutesJson } = serverManifest;
|
|
155
|
+
const routes = nestedRoutesJson?.[options.routeInfo.entryName];
|
|
156
|
+
if (routes) {
|
|
157
|
+
const { matchRoutes } = __webpack_require__("@modern-js/runtime-utils/router");
|
|
158
|
+
const url = new URL(request.url);
|
|
159
|
+
const matchedRoutes = matchRoutes(routes, url.pathname, options.routeInfo.urlPath);
|
|
160
|
+
if (matchedRoutes) {
|
|
161
|
+
const lastMatch = matchedRoutes[matchedRoutes.length - 1];
|
|
162
|
+
if (!lastMatch?.route?.id || !ssrByRouteIds.includes(lastMatch.route.id)) response = await csrRender(request, options);
|
|
163
|
+
} else response = await csrRender(request, options);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if ('ssr' !== mode || response) response = await csrRender(request, options);
|
|
167
|
+
else try {
|
|
168
|
+
response = await ssrRender(request, options);
|
|
169
|
+
} catch (e) {
|
|
170
|
+
options.onError(e, ErrorDigest.ERENDER);
|
|
171
|
+
await fallbackWrapper('error', e);
|
|
172
|
+
response = await csrRender(request, {
|
|
173
|
+
...options,
|
|
174
|
+
html: injectFallbackReasonToHtml({
|
|
175
|
+
html: options.html,
|
|
176
|
+
reason: 'error',
|
|
177
|
+
framework
|
|
178
|
+
})
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
const { routeInfo } = options;
|
|
182
|
+
applyExtendHeaders(response, routeInfo);
|
|
183
|
+
return response;
|
|
184
|
+
function applyExtendHeaders(r, route) {
|
|
185
|
+
Object.entries(route.responseHeaders || {}).forEach(([k, v])=>{
|
|
186
|
+
r.headers.set(k, v);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async function getRenderMode(req, fallbackHeader, isSSR, forceCSR, nodeReq, onFallback, contextForceCSR) {
|
|
191
|
+
const query = parseQuery(req);
|
|
192
|
+
if (req.headers.get('x-rsc-action')) return 'rsc-action';
|
|
193
|
+
if (req.headers.get('x-rsc-tree')) return 'rsc-tree';
|
|
194
|
+
if (!isSSR) return 'csr';
|
|
195
|
+
{
|
|
196
|
+
if (query.__loader) return 'data';
|
|
197
|
+
const fallbackHeaderValue = req.headers.get(fallbackHeader) || nodeReq?.headers[fallbackHeader];
|
|
198
|
+
if (forceCSR && (query.csr || fallbackHeaderValue || contextForceCSR)) {
|
|
199
|
+
if (query.csr) await onFallback?.('query');
|
|
200
|
+
else {
|
|
201
|
+
const reason = fallbackHeaderValue?.split(';')[1]?.split('=')[1];
|
|
202
|
+
await onFallback?.(reason ? `header,${reason}` : 'header');
|
|
203
|
+
}
|
|
204
|
+
return 'csr';
|
|
205
|
+
}
|
|
206
|
+
return 'ssr';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function injectFallbackReasonToHtml({ html, reason, framework }) {
|
|
210
|
+
const tag = `<script id="__${framework}_ssr_fallback_reason__" type="application/json">${JSON.stringify({
|
|
211
|
+
reason
|
|
212
|
+
})}</script>`;
|
|
213
|
+
return html.replace(/<\/head>/, `${tag}</head>`);
|
|
214
|
+
}
|
|
215
|
+
async function csrRender(request, options) {
|
|
216
|
+
const { html, rscClientManifest } = options;
|
|
217
|
+
if (!rscClientManifest || process.env.MODERN_DISABLE_INJECT_RSC_DATA) return new Response(html, {
|
|
218
|
+
status: 200,
|
|
219
|
+
headers: new Headers({
|
|
220
|
+
'content-type': 'text/html; charset=UTF-8',
|
|
221
|
+
[X_MODERNJS_RENDER]: 'client'
|
|
222
|
+
})
|
|
223
|
+
});
|
|
224
|
+
return csrRscRender(request, options);
|
|
225
|
+
}
|
|
226
|
+
export { createRender };
|