one 1.2.40 → 1.2.42
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/Root.cjs +1 -1
- package/dist/cjs/Root.js +1 -1
- package/dist/cjs/Root.js.map +1 -1
- package/dist/cjs/Root.native.js +1 -1
- package/dist/cjs/Root.native.js.map +1 -1
- package/dist/cjs/cli/build.cjs +157 -2
- package/dist/cjs/cli/build.js +159 -2
- package/dist/cjs/cli/build.js.map +1 -1
- package/dist/cjs/cli/build.native.js +222 -18
- package/dist/cjs/cli/build.native.js.map +1 -1
- package/dist/cjs/createHandleRequest.cjs +21 -20
- package/dist/cjs/createHandleRequest.js +25 -24
- package/dist/cjs/createHandleRequest.js.map +1 -1
- package/dist/cjs/createHandleRequest.native.js +23 -22
- package/dist/cjs/createHandleRequest.native.js.map +1 -1
- package/dist/cjs/router/useScreens.cjs +14 -5
- package/dist/cjs/router/useScreens.js +20 -3
- package/dist/cjs/router/useScreens.js.map +1 -1
- package/dist/cjs/router/useScreens.native.js +13 -4
- package/dist/cjs/router/useScreens.native.js.map +1 -1
- package/dist/cjs/serve-worker.cjs +28 -12
- package/dist/cjs/serve-worker.js +17 -7
- package/dist/cjs/serve-worker.js.map +1 -1
- package/dist/cjs/serve-worker.native.js +28 -12
- package/dist/cjs/serve-worker.native.js.map +1 -1
- package/dist/cjs/serve.cjs +5 -2
- package/dist/cjs/serve.js +2 -2
- package/dist/cjs/serve.js.map +1 -1
- package/dist/cjs/serve.native.js +5 -2
- package/dist/cjs/serve.native.js.map +1 -1
- package/dist/cjs/server/ServerContextScript.cjs +7 -3
- package/dist/cjs/server/ServerContextScript.js +4 -1
- package/dist/cjs/server/ServerContextScript.js.map +1 -1
- package/dist/cjs/server/ServerContextScript.native.js +7 -3
- package/dist/cjs/server/ServerContextScript.native.js.map +1 -1
- package/dist/cjs/server/oneServe.cjs +79 -70
- package/dist/cjs/server/oneServe.js +33 -12
- package/dist/cjs/server/oneServe.js.map +2 -2
- package/dist/cjs/server/oneServe.native.js +105 -81
- package/dist/cjs/server/oneServe.native.js.map +1 -1
- package/dist/cjs/{__mocks__/@react-navigation/native-stack.cjs → server/staticHtmlFetcher.cjs} +12 -8
- package/dist/cjs/{utils/style.js → server/staticHtmlFetcher.js} +12 -8
- package/dist/cjs/server/staticHtmlFetcher.js.map +6 -0
- package/dist/cjs/{utils/style.native.js → server/staticHtmlFetcher.native.js} +12 -7
- package/dist/cjs/server/staticHtmlFetcher.native.js.map +1 -0
- package/dist/cjs/vercel/build/buildVercelOutputDirectory.cjs +19 -2
- package/dist/cjs/vercel/build/buildVercelOutputDirectory.js +13 -1
- package/dist/cjs/vercel/build/buildVercelOutputDirectory.js.map +1 -1
- package/dist/cjs/vercel/build/buildVercelOutputDirectory.native.js +38 -2
- package/dist/cjs/vercel/build/buildVercelOutputDirectory.native.js.map +1 -1
- package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.cjs +63 -3
- package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.js +63 -3
- package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.js.map +1 -1
- package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.native.js +63 -3
- package/dist/cjs/vercel/build/generate/createSsrServerlessFunction.native.js.map +1 -1
- package/dist/cjs/vite/one-server-only.cjs +8 -4
- package/dist/cjs/vite/one-server-only.js +6 -3
- package/dist/cjs/vite/one-server-only.js.map +1 -1
- package/dist/esm/Root.js +1 -1
- package/dist/esm/Root.js.map +1 -1
- package/dist/esm/Root.mjs +1 -1
- package/dist/esm/Root.mjs.map +1 -1
- package/dist/esm/Root.native.js +1 -1
- package/dist/esm/Root.native.js.map +1 -1
- package/dist/esm/cli/build.js +159 -1
- package/dist/esm/cli/build.js.map +1 -1
- package/dist/esm/cli/build.mjs +156 -1
- package/dist/esm/cli/build.mjs.map +1 -1
- package/dist/esm/cli/build.native.js +221 -17
- package/dist/esm/cli/build.native.js.map +1 -1
- package/dist/esm/createHandleRequest.js +25 -24
- package/dist/esm/createHandleRequest.js.map +1 -1
- package/dist/esm/createHandleRequest.mjs +21 -20
- package/dist/esm/createHandleRequest.mjs.map +1 -1
- package/dist/esm/createHandleRequest.native.js +23 -22
- package/dist/esm/createHandleRequest.native.js.map +1 -1
- package/dist/esm/router/useScreens.js +20 -3
- package/dist/esm/router/useScreens.js.map +1 -1
- package/dist/esm/router/useScreens.mjs +14 -5
- package/dist/esm/router/useScreens.mjs.map +1 -1
- package/dist/esm/router/useScreens.native.js +13 -4
- package/dist/esm/router/useScreens.native.js.map +1 -1
- package/dist/esm/serve-worker.js +7 -6
- package/dist/esm/serve-worker.js.map +1 -1
- package/dist/esm/serve-worker.mjs +10 -7
- package/dist/esm/serve-worker.mjs.map +1 -1
- package/dist/esm/serve-worker.native.js +10 -7
- package/dist/esm/serve-worker.native.js.map +1 -1
- package/dist/esm/serve.js +2 -2
- package/dist/esm/serve.js.map +1 -1
- package/dist/esm/serve.mjs +5 -2
- package/dist/esm/serve.mjs.map +1 -1
- package/dist/esm/serve.native.js +5 -2
- package/dist/esm/serve.native.js.map +1 -1
- package/dist/esm/server/ServerContextScript.js +4 -1
- package/dist/esm/server/ServerContextScript.js.map +1 -1
- package/dist/esm/server/ServerContextScript.mjs +7 -3
- package/dist/esm/server/ServerContextScript.mjs.map +1 -1
- package/dist/esm/server/ServerContextScript.native.js +7 -3
- package/dist/esm/server/ServerContextScript.native.js.map +1 -1
- package/dist/esm/server/oneServe.js +35 -16
- package/dist/esm/server/oneServe.js.map +1 -1
- package/dist/esm/server/oneServe.mjs +79 -70
- package/dist/esm/server/oneServe.mjs.map +1 -1
- package/dist/esm/server/oneServe.native.js +105 -81
- package/dist/esm/server/oneServe.native.js.map +1 -1
- package/dist/esm/server/staticHtmlFetcher.js +12 -0
- package/dist/esm/server/staticHtmlFetcher.js.map +6 -0
- package/dist/esm/server/staticHtmlFetcher.mjs +9 -0
- package/dist/esm/server/staticHtmlFetcher.mjs.map +1 -0
- package/dist/esm/server/staticHtmlFetcher.native.js +9 -0
- package/dist/esm/server/staticHtmlFetcher.native.js.map +1 -0
- package/dist/esm/vercel/build/buildVercelOutputDirectory.js +13 -1
- package/dist/esm/vercel/build/buildVercelOutputDirectory.js.map +1 -1
- package/dist/esm/vercel/build/buildVercelOutputDirectory.mjs +19 -2
- package/dist/esm/vercel/build/buildVercelOutputDirectory.mjs.map +1 -1
- package/dist/esm/vercel/build/buildVercelOutputDirectory.native.js +38 -2
- package/dist/esm/vercel/build/buildVercelOutputDirectory.native.js.map +1 -1
- package/dist/esm/vercel/build/generate/createSsrServerlessFunction.js +63 -3
- package/dist/esm/vercel/build/generate/createSsrServerlessFunction.js.map +1 -1
- package/dist/esm/vercel/build/generate/createSsrServerlessFunction.mjs +63 -3
- package/dist/esm/vercel/build/generate/createSsrServerlessFunction.mjs.map +1 -1
- package/dist/esm/vercel/build/generate/createSsrServerlessFunction.native.js +63 -3
- package/dist/esm/vercel/build/generate/createSsrServerlessFunction.native.js.map +1 -1
- package/dist/esm/vite/one-server-only.js +6 -3
- package/dist/esm/vite/one-server-only.js.map +1 -1
- package/dist/esm/vite/one-server-only.mjs +8 -4
- package/dist/esm/vite/one-server-only.mjs.map +1 -1
- package/package.json +9 -9
- package/src/Root.tsx +4 -1
- package/src/cli/build.ts +187 -18
- package/src/createHandleRequest.ts +31 -29
- package/src/router/useScreens.tsx +27 -4
- package/src/serve-worker.ts +25 -8
- package/src/serve.ts +2 -2
- package/src/server/ServerContextScript.tsx +9 -3
- package/src/server/oneServe.ts +100 -29
- package/src/server/staticHtmlFetcher.ts +10 -0
- package/src/useLoader.ts +1 -1
- package/src/vercel/build/buildVercelOutputDirectory.ts +36 -0
- package/src/vercel/build/generate/createSsrServerlessFunction.ts +63 -3
- package/src/vite/one-server-only.tsx +13 -2
- package/src/vite/types.ts +9 -3
- package/types/Root.d.ts.map +1 -1
- package/types/cli/build.d.ts.map +1 -1
- package/types/createHandleRequest.d.ts.map +1 -1
- package/types/router/useScreens.d.ts.map +1 -1
- package/types/serve-worker.d.ts +24 -1
- package/types/serve-worker.d.ts.map +1 -1
- package/types/server/ServerContextScript.d.ts.map +1 -1
- package/types/server/oneServe.d.ts +21 -1
- package/types/server/oneServe.d.ts.map +1 -1
- package/types/server/staticHtmlFetcher.d.ts +3 -0
- package/types/server/staticHtmlFetcher.d.ts.map +1 -0
- package/types/vercel/build/buildVercelOutputDirectory.d.ts.map +1 -1
- package/types/vercel/build/generate/createSsrServerlessFunction.d.ts.map +1 -1
- package/types/vite/one-server-only.d.ts.map +1 -1
- package/types/vite/types.d.ts +8 -3
- package/types/vite/types.d.ts.map +1 -1
- package/dist/cjs/__mocks__/@react-navigation/native-stack.js +0 -24
- package/dist/cjs/__mocks__/@react-navigation/native-stack.js.map +0 -6
- package/dist/cjs/__mocks__/@react-navigation/native-stack.native.js +0 -38
- package/dist/cjs/__mocks__/@react-navigation/native-stack.native.js.map +0 -1
- package/dist/cjs/__mocks__/@react-navigation/native.js +0 -45
- package/dist/cjs/__mocks__/@react-navigation/native.js.map +0 -1
- package/dist/cjs/__mocks__/expo-linking.cjs +0 -36
- package/dist/cjs/__mocks__/expo-linking.js +0 -25
- package/dist/cjs/__mocks__/expo-linking.js.map +0 -6
- package/dist/cjs/__mocks__/expo-linking.native.js +0 -47
- package/dist/cjs/__mocks__/expo-linking.native.js.map +0 -1
- package/dist/cjs/__mocks__/expo-modules-core.cjs +0 -36
- package/dist/cjs/__mocks__/expo-modules-core.js +0 -31
- package/dist/cjs/__mocks__/expo-modules-core.js.map +0 -6
- package/dist/cjs/__mocks__/expo-modules-core.native.js +0 -67
- package/dist/cjs/__mocks__/expo-modules-core.native.js.map +0 -1
- package/dist/cjs/__mocks__/react-native-screens.cjs +0 -28
- package/dist/cjs/__mocks__/react-native-screens.js +0 -22
- package/dist/cjs/__mocks__/react-native-screens.js.map +0 -6
- package/dist/cjs/__mocks__/react-native-screens.native.js +0 -31
- package/dist/cjs/__mocks__/react-native-screens.native.js.map +0 -1
- package/dist/cjs/__mocks__/react-native.js +0 -49
- package/dist/cjs/__mocks__/react-native.js.map +0 -1
- package/dist/cjs/experimental-useLoaderState.cjs +0 -64
- package/dist/cjs/experimental-useLoaderState.js +0 -44
- package/dist/cjs/experimental-useLoaderState.js.map +0 -6
- package/dist/cjs/experimental-useLoaderState.native.js +0 -69
- package/dist/cjs/experimental-useLoaderState.native.js.map +0 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.cjs +0 -40
- package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.js +0 -35
- package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.js.map +0 -6
- package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js +0 -43
- package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js.map +0 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderComponent.cjs +0 -69
- package/dist/cjs/layouts/stack-utils/StackHeaderComponent.js +0 -54
- package/dist/cjs/layouts/stack-utils/StackHeaderComponent.js.map +0 -6
- package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js +0 -78
- package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js.map +0 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderLeft.cjs +0 -35
- package/dist/cjs/layouts/stack-utils/StackHeaderLeft.js +0 -30
- package/dist/cjs/layouts/stack-utils/StackHeaderLeft.js.map +0 -6
- package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js +0 -40
- package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js.map +0 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderRight.cjs +0 -35
- package/dist/cjs/layouts/stack-utils/StackHeaderRight.js +0 -30
- package/dist/cjs/layouts/stack-utils/StackHeaderRight.js.map +0 -6
- package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js +0 -40
- package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js.map +0 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.cjs +0 -35
- package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.js +0 -30
- package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.js.map +0 -6
- package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js +0 -38
- package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js.map +0 -1
- package/dist/cjs/layouts/stack-utils/StackHeaderTitle.cjs +0 -53
- package/dist/cjs/layouts/stack-utils/StackHeaderTitle.js +0 -46
- package/dist/cjs/layouts/stack-utils/StackHeaderTitle.js.map +0 -6
- package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js +0 -56
- package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js.map +0 -1
- package/dist/cjs/layouts/stack-utils/StackScreen.cjs +0 -57
- package/dist/cjs/layouts/stack-utils/StackScreen.js +0 -43
- package/dist/cjs/layouts/stack-utils/StackScreen.js.map +0 -6
- package/dist/cjs/layouts/stack-utils/StackScreen.native.js +0 -64
- package/dist/cjs/layouts/stack-utils/StackScreen.native.js.map +0 -1
- package/dist/cjs/layouts/stack-utils/index.cjs +0 -47
- package/dist/cjs/layouts/stack-utils/index.js +0 -36
- package/dist/cjs/layouts/stack-utils/index.js.map +0 -6
- package/dist/cjs/layouts/stack-utils/index.native.js +0 -50
- package/dist/cjs/layouts/stack-utils/index.native.js.map +0 -1
- package/dist/cjs/utils/children.cjs +0 -38
- package/dist/cjs/utils/children.js +0 -37
- package/dist/cjs/utils/children.js.map +0 -6
- package/dist/cjs/utils/children.native.js +0 -60
- package/dist/cjs/utils/children.native.js.map +0 -1
- package/dist/cjs/utils/safeWrite.cjs +0 -56
- package/dist/cjs/utils/safeWrite.js +0 -51
- package/dist/cjs/utils/safeWrite.js.map +0 -6
- package/dist/cjs/utils/safeWrite.native.js +0 -63
- package/dist/cjs/utils/safeWrite.native.js.map +0 -1
- package/dist/cjs/utils/style.cjs +0 -28
- package/dist/cjs/utils/style.js.map +0 -6
- package/dist/cjs/utils/style.native.js.map +0 -1
- package/dist/esm/__mocks__/@react-navigation/native-stack.js +0 -8
- package/dist/esm/__mocks__/@react-navigation/native-stack.js.map +0 -6
- package/dist/esm/__mocks__/@react-navigation/native-stack.mjs +0 -6
- package/dist/esm/__mocks__/@react-navigation/native-stack.mjs.map +0 -1
- package/dist/esm/__mocks__/@react-navigation/native-stack.native.js +0 -12
- package/dist/esm/__mocks__/@react-navigation/native-stack.native.js.map +0 -1
- package/dist/esm/__mocks__/@react-navigation/native.js +0 -18
- package/dist/esm/__mocks__/@react-navigation/native.js.map +0 -1
- package/dist/esm/__mocks__/expo-linking.js +0 -9
- package/dist/esm/__mocks__/expo-linking.js.map +0 -6
- package/dist/esm/__mocks__/expo-linking.mjs +0 -10
- package/dist/esm/__mocks__/expo-linking.mjs.map +0 -1
- package/dist/esm/__mocks__/expo-linking.native.js +0 -18
- package/dist/esm/__mocks__/expo-linking.native.js.map +0 -1
- package/dist/esm/__mocks__/expo-modules-core.js +0 -15
- package/dist/esm/__mocks__/expo-modules-core.js.map +0 -6
- package/dist/esm/__mocks__/expo-modules-core.mjs +0 -10
- package/dist/esm/__mocks__/expo-modules-core.mjs.map +0 -1
- package/dist/esm/__mocks__/expo-modules-core.native.js +0 -38
- package/dist/esm/__mocks__/expo-modules-core.native.js.map +0 -1
- package/dist/esm/__mocks__/react-native-screens.js +0 -6
- package/dist/esm/__mocks__/react-native-screens.js.map +0 -6
- package/dist/esm/__mocks__/react-native-screens.mjs +0 -4
- package/dist/esm/__mocks__/react-native-screens.mjs.map +0 -1
- package/dist/esm/__mocks__/react-native-screens.native.js +0 -4
- package/dist/esm/__mocks__/react-native-screens.native.js.map +0 -1
- package/dist/esm/__mocks__/react-native.js +0 -19
- package/dist/esm/__mocks__/react-native.js.map +0 -1
- package/dist/esm/experimental-useLoaderState.js +0 -32
- package/dist/esm/experimental-useLoaderState.js.map +0 -6
- package/dist/esm/experimental-useLoaderState.mjs +0 -41
- package/dist/esm/experimental-useLoaderState.mjs.map +0 -1
- package/dist/esm/experimental-useLoaderState.native.js +0 -43
- package/dist/esm/experimental-useLoaderState.native.js.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderBackButton.js +0 -19
- package/dist/esm/layouts/stack-utils/StackHeaderBackButton.js.map +0 -6
- package/dist/esm/layouts/stack-utils/StackHeaderBackButton.mjs +0 -16
- package/dist/esm/layouts/stack-utils/StackHeaderBackButton.mjs.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderBackButton.native.js +0 -16
- package/dist/esm/layouts/stack-utils/StackHeaderBackButton.native.js.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderComponent.js +0 -51
- package/dist/esm/layouts/stack-utils/StackHeaderComponent.js.map +0 -6
- package/dist/esm/layouts/stack-utils/StackHeaderComponent.mjs +0 -45
- package/dist/esm/layouts/stack-utils/StackHeaderComponent.mjs.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderComponent.native.js +0 -51
- package/dist/esm/layouts/stack-utils/StackHeaderComponent.native.js.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderLeft.js +0 -14
- package/dist/esm/layouts/stack-utils/StackHeaderLeft.js.map +0 -6
- package/dist/esm/layouts/stack-utils/StackHeaderLeft.mjs +0 -11
- package/dist/esm/layouts/stack-utils/StackHeaderLeft.mjs.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderLeft.native.js +0 -13
- package/dist/esm/layouts/stack-utils/StackHeaderLeft.native.js.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderRight.js +0 -14
- package/dist/esm/layouts/stack-utils/StackHeaderRight.js.map +0 -6
- package/dist/esm/layouts/stack-utils/StackHeaderRight.mjs +0 -11
- package/dist/esm/layouts/stack-utils/StackHeaderRight.mjs.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderRight.native.js +0 -13
- package/dist/esm/layouts/stack-utils/StackHeaderRight.native.js.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.js +0 -14
- package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.js.map +0 -6
- package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.mjs +0 -11
- package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.mjs.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.native.js +0 -11
- package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.native.js.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderTitle.js +0 -31
- package/dist/esm/layouts/stack-utils/StackHeaderTitle.js.map +0 -6
- package/dist/esm/layouts/stack-utils/StackHeaderTitle.mjs +0 -29
- package/dist/esm/layouts/stack-utils/StackHeaderTitle.mjs.map +0 -1
- package/dist/esm/layouts/stack-utils/StackHeaderTitle.native.js +0 -29
- package/dist/esm/layouts/stack-utils/StackHeaderTitle.native.js.map +0 -1
- package/dist/esm/layouts/stack-utils/StackScreen.js +0 -33
- package/dist/esm/layouts/stack-utils/StackScreen.js.map +0 -6
- package/dist/esm/layouts/stack-utils/StackScreen.mjs +0 -33
- package/dist/esm/layouts/stack-utils/StackScreen.mjs.map +0 -1
- package/dist/esm/layouts/stack-utils/StackScreen.native.js +0 -38
- package/dist/esm/layouts/stack-utils/StackScreen.native.js.map +0 -1
- package/dist/esm/layouts/stack-utils/index.js +0 -26
- package/dist/esm/layouts/stack-utils/index.js.map +0 -6
- package/dist/esm/layouts/stack-utils/index.mjs +0 -16
- package/dist/esm/layouts/stack-utils/index.mjs.map +0 -1
- package/dist/esm/layouts/stack-utils/index.native.js +0 -16
- package/dist/esm/layouts/stack-utils/index.native.js.map +0 -1
- package/dist/esm/utils/children.js +0 -23
- package/dist/esm/utils/children.js.map +0 -6
- package/dist/esm/utils/children.mjs +0 -13
- package/dist/esm/utils/children.mjs.map +0 -1
- package/dist/esm/utils/children.native.js +0 -32
- package/dist/esm/utils/children.native.js.map +0 -1
- package/dist/esm/utils/safeWrite.js +0 -29
- package/dist/esm/utils/safeWrite.js.map +0 -6
- package/dist/esm/utils/safeWrite.mjs +0 -21
- package/dist/esm/utils/safeWrite.mjs.map +0 -1
- package/dist/esm/utils/safeWrite.native.js +0 -25
- package/dist/esm/utils/safeWrite.native.js.map +0 -1
- package/dist/esm/utils/style.js +0 -8
- package/dist/esm/utils/style.js.map +0 -6
- package/dist/esm/utils/style.mjs +0 -5
- package/dist/esm/utils/style.mjs.map +0 -1
- package/dist/esm/utils/style.native.js +0 -5
- package/dist/esm/utils/style.native.js.map +0 -1
- package/types/__mocks__/@react-navigation/native-stack.d.ts.map +0 -1
- package/types/__mocks__/@react-navigation/native.d.ts.map +0 -1
- package/types/__mocks__/expo-linking.d.ts.map +0 -1
- package/types/__mocks__/expo-modules-core.d.ts.map +0 -1
- package/types/__mocks__/react-native-screens.d.ts.map +0 -1
- package/types/__mocks__/react-native.d.ts.map +0 -1
- package/types/experimental-useLoaderState.d.ts.map +0 -1
- package/types/layouts/stack-utils/StackHeaderBackButton.d.ts.map +0 -1
- package/types/layouts/stack-utils/StackHeaderComponent.d.ts.map +0 -1
- package/types/layouts/stack-utils/StackHeaderLeft.d.ts.map +0 -1
- package/types/layouts/stack-utils/StackHeaderRight.d.ts.map +0 -1
- package/types/layouts/stack-utils/StackHeaderSearchBar.d.ts.map +0 -1
- package/types/layouts/stack-utils/StackHeaderTitle.d.ts.map +0 -1
- package/types/layouts/stack-utils/StackScreen.d.ts.map +0 -1
- package/types/layouts/stack-utils/index.d.ts.map +0 -1
- package/types/utils/children.d.ts.map +0 -1
- package/types/utils/safeWrite.d.ts.map +0 -1
- package/types/utils/style.d.ts.map +0 -1
package/src/cli/build.ts
CHANGED
|
@@ -27,6 +27,7 @@ import { buildPage } from './buildPage'
|
|
|
27
27
|
import { checkNodeVersion } from './checkNodeVersion'
|
|
28
28
|
import { generateSitemap, type RouteSitemapData } from './generateSitemap'
|
|
29
29
|
import { labelProcess } from './label-process'
|
|
30
|
+
import { isRolldown } from '../utils/isRolldown'
|
|
30
31
|
|
|
31
32
|
const { ensureDir, writeJSON } = FSExtra
|
|
32
33
|
|
|
@@ -625,6 +626,7 @@ export async function build(args: {
|
|
|
625
626
|
preloads,
|
|
626
627
|
cssPreloads,
|
|
627
628
|
loaders,
|
|
629
|
+
useRolldown: await isRolldown(),
|
|
628
630
|
}
|
|
629
631
|
|
|
630
632
|
await writeJSON(toAbsolute(`dist/buildInfo.json`), buildInfoForWriting)
|
|
@@ -662,29 +664,196 @@ export async function build(args: {
|
|
|
662
664
|
break
|
|
663
665
|
}
|
|
664
666
|
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
667
|
+
case 'cloudflare': {
|
|
668
|
+
// Generate lazy import functions - modules load on-demand, not all upfront
|
|
669
|
+
// Uses find_additional_modules in wrangler config to keep modules separate
|
|
670
|
+
const pageRouteMap: string[] = []
|
|
671
|
+
const apiRouteMap: string[] = []
|
|
672
|
+
const middlewareRouteMap: string[] = []
|
|
673
|
+
|
|
674
|
+
// Generate lazy imports for SSR/SSG page server bundles
|
|
675
|
+
for (const [routeFile, info] of Object.entries(buildInfoForWriting.routeToBuildInfo)) {
|
|
676
|
+
if (info.serverJsPath) {
|
|
677
|
+
const importPath = './' + info.serverJsPath.replace(/^dist\//, '')
|
|
678
|
+
pageRouteMap.push(` '${routeFile}': () => import('${importPath}')`)
|
|
679
|
+
}
|
|
680
|
+
}
|
|
669
681
|
|
|
670
|
-
|
|
682
|
+
// Generate lazy imports for API routes
|
|
683
|
+
for (const route of buildInfoForWriting.manifest.apiRoutes) {
|
|
684
|
+
if (route.file) {
|
|
685
|
+
// API files are built to dist/api/
|
|
686
|
+
// route.page is like "/api/hello", files are at "dist/api/api/hello.js"
|
|
687
|
+
// rolldown preserves brackets, esbuild replaces them with underscores
|
|
688
|
+
const apiFileName = buildInfoForWriting.useRolldown
|
|
689
|
+
? route.page.slice(1)
|
|
690
|
+
: route.page.slice(1).replace(/\[/g, '_').replace(/\]/g, '_')
|
|
691
|
+
const importPath = `./api/${apiFileName}.js`
|
|
692
|
+
apiRouteMap.push(` '${route.page}': () => import('${importPath}')`)
|
|
693
|
+
}
|
|
694
|
+
}
|
|
671
695
|
|
|
672
|
-
|
|
696
|
+
// Generate lazy imports for middlewares
|
|
697
|
+
// The key must match the contextKey used to look up the middleware (e.g., "dist/middlewares/_middleware.js")
|
|
698
|
+
for (const [middlewareFile, builtPath] of Object.entries(builtMiddlewares)) {
|
|
699
|
+
const importPath = './' + builtPath.replace(/^dist\//, '')
|
|
700
|
+
middlewareRouteMap.push(` '${builtPath}': () => import('${importPath}')`)
|
|
701
|
+
}
|
|
673
702
|
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
703
|
+
const workerSrcPath = join(options.root, 'dist', '_worker-src.js')
|
|
704
|
+
const workerCode = `// Polyfill MessageChannel for React SSR (not available in Cloudflare Workers by default)
|
|
705
|
+
if (typeof MessageChannel === 'undefined') {
|
|
706
|
+
globalThis.MessageChannel = class MessageChannel {
|
|
707
|
+
constructor() {
|
|
708
|
+
this.port1 = { postMessage: () => {}, onmessage: null, close: () => {} }
|
|
709
|
+
this.port2 = { postMessage: () => {}, onmessage: null, close: () => {} }
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
import { serve, setFetchStaticHtml } from 'one/serve-worker'
|
|
715
|
+
|
|
716
|
+
// Lazy import map - modules load on-demand when route is matched
|
|
717
|
+
const lazyRoutes = {
|
|
718
|
+
serverEntry: () => import('./server/_virtual_one-entry.js'),
|
|
719
|
+
pages: {
|
|
720
|
+
${pageRouteMap.join(',\n')}
|
|
721
|
+
},
|
|
722
|
+
api: {
|
|
723
|
+
${apiRouteMap.join(',\n')}
|
|
724
|
+
},
|
|
725
|
+
middlewares: {
|
|
726
|
+
${middlewareRouteMap.join(',\n')}
|
|
727
|
+
}
|
|
728
|
+
}
|
|
678
729
|
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
730
|
+
const buildInfo = ${JSON.stringify(buildInfoForWriting)}
|
|
731
|
+
|
|
732
|
+
let app
|
|
733
|
+
|
|
734
|
+
export default {
|
|
735
|
+
async fetch(request, env, ctx) {
|
|
736
|
+
if (!app) {
|
|
737
|
+
app = await serve(buildInfo, lazyRoutes)
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
// Set up static HTML fetcher for this request (uses ASSETS binding)
|
|
741
|
+
if (env.ASSETS) {
|
|
742
|
+
setFetchStaticHtml(async (path) => {
|
|
743
|
+
try {
|
|
744
|
+
const url = new URL(request.url)
|
|
745
|
+
url.pathname = path
|
|
746
|
+
const assetResponse = await env.ASSETS.fetch(new Request(url))
|
|
747
|
+
if (assetResponse && assetResponse.ok) {
|
|
748
|
+
return await assetResponse.text()
|
|
749
|
+
}
|
|
750
|
+
} catch (e) {
|
|
751
|
+
// Asset not found
|
|
752
|
+
}
|
|
753
|
+
return null
|
|
754
|
+
})
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
try {
|
|
758
|
+
// Try the app first
|
|
759
|
+
const response = await app.fetch(request, env, ctx)
|
|
685
760
|
|
|
686
|
-
|
|
687
|
-
|
|
761
|
+
// If no route matched (404) or no response, try serving static assets
|
|
762
|
+
if (!response || response.status === 404) {
|
|
763
|
+
if (env.ASSETS) {
|
|
764
|
+
try {
|
|
765
|
+
const assetResponse = await env.ASSETS.fetch(request)
|
|
766
|
+
// If asset exists, return it
|
|
767
|
+
if (assetResponse && assetResponse.status !== 404) {
|
|
768
|
+
return assetResponse
|
|
769
|
+
}
|
|
770
|
+
} catch (e) {
|
|
771
|
+
// Asset not found, continue with original response
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
return response
|
|
777
|
+
} finally {
|
|
778
|
+
// Clean up per-request state
|
|
779
|
+
setFetchStaticHtml(null)
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
`
|
|
784
|
+
await FSExtra.writeFile(workerSrcPath, workerCode)
|
|
785
|
+
|
|
786
|
+
// Bundle the worker using Vite/esbuild
|
|
787
|
+
// Cloudflare Workers with nodejs_compat supports Node.js built-ins
|
|
788
|
+
console.info('\n [cloudflare] Bundling worker...')
|
|
789
|
+
await viteBuild({
|
|
790
|
+
root: options.root,
|
|
791
|
+
logLevel: 'warn',
|
|
792
|
+
build: {
|
|
793
|
+
outDir: 'dist',
|
|
794
|
+
emptyOutDir: false,
|
|
795
|
+
// Use SSR mode with node target for proper Node.js module resolution
|
|
796
|
+
ssr: workerSrcPath,
|
|
797
|
+
rollupOptions: {
|
|
798
|
+
external: [
|
|
799
|
+
// React Native dev tools - not needed in production
|
|
800
|
+
'@react-native/dev-middleware',
|
|
801
|
+
'@react-native/debugger-shell',
|
|
802
|
+
'metro',
|
|
803
|
+
'metro-core',
|
|
804
|
+
'metro-runtime',
|
|
805
|
+
// Native modules that can't run in workers
|
|
806
|
+
/\.node$/,
|
|
807
|
+
],
|
|
808
|
+
output: {
|
|
809
|
+
entryFileNames: 'worker.js',
|
|
810
|
+
format: 'es',
|
|
811
|
+
// Keep dynamic imports separate for lazy loading
|
|
812
|
+
inlineDynamicImports: false,
|
|
813
|
+
},
|
|
814
|
+
},
|
|
815
|
+
minify: true,
|
|
816
|
+
target: 'esnext',
|
|
817
|
+
},
|
|
818
|
+
define: {
|
|
819
|
+
'process.env.NODE_ENV': JSON.stringify('production'),
|
|
820
|
+
'process.env.VITE_ENVIRONMENT': JSON.stringify('ssr'),
|
|
821
|
+
},
|
|
822
|
+
resolve: {
|
|
823
|
+
conditions: ['workerd', 'worker', 'node', 'module', 'default'],
|
|
824
|
+
},
|
|
825
|
+
ssr: {
|
|
826
|
+
target: 'node',
|
|
827
|
+
noExternal: true,
|
|
828
|
+
},
|
|
829
|
+
})
|
|
830
|
+
|
|
831
|
+
// Clean up temp file
|
|
832
|
+
await FSExtra.remove(workerSrcPath)
|
|
833
|
+
|
|
834
|
+
// Use jsonc for wrangler config (recommended for new projects)
|
|
835
|
+
// Use assets with run_worker_first so all requests go through worker (enables middleware on SSG pages)
|
|
836
|
+
const wranglerConfig = `{
|
|
837
|
+
"name": "one-app",
|
|
838
|
+
"main": "worker.js",
|
|
839
|
+
"compatibility_date": "2024-12-05",
|
|
840
|
+
"compatibility_flags": ["nodejs_compat"],
|
|
841
|
+
"find_additional_modules": true,
|
|
842
|
+
"rules": [
|
|
843
|
+
{ "type": "ESModule", "globs": ["./server/**/*.js"], "fallthrough": true },
|
|
844
|
+
{ "type": "ESModule", "globs": ["./api/**/*.js"], "fallthrough": true },
|
|
845
|
+
{ "type": "ESModule", "globs": ["./middlewares/**/*.js"], "fallthrough": true }
|
|
846
|
+
],
|
|
847
|
+
"assets": { "directory": "client", "binding": "ASSETS", "run_worker_first": true }
|
|
848
|
+
}
|
|
849
|
+
`
|
|
850
|
+
await FSExtra.writeFile(join(options.root, 'dist', 'wrangler.jsonc'), wranglerConfig)
|
|
851
|
+
|
|
852
|
+
postBuildLogs.push(`Cloudflare worker bundled at dist/worker.js`)
|
|
853
|
+
postBuildLogs.push(`To deploy: cd dist && wrangler deploy`)
|
|
854
|
+
|
|
855
|
+
break
|
|
856
|
+
}
|
|
688
857
|
}
|
|
689
858
|
|
|
690
859
|
if (process.env.VXRN_ANALYZE_BUNDLE) {
|
|
@@ -107,39 +107,41 @@ export async function resolveAPIRoute(
|
|
|
107
107
|
console.info(`[one] 📡 API ${request.method} ${pathname} → ${route.file}`, params)
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
(
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
110
|
+
return await runMiddlewares(handlers, request, route, async () => {
|
|
111
|
+
try {
|
|
112
|
+
return resolveAPIEndpoint(
|
|
113
|
+
() =>
|
|
114
|
+
handlers.handleAPI!({
|
|
115
|
+
request,
|
|
116
|
+
route,
|
|
117
|
+
url,
|
|
118
|
+
loaderProps: {
|
|
119
|
+
path: pathname,
|
|
120
|
+
search: url.search,
|
|
121
|
+
params,
|
|
122
|
+
},
|
|
123
|
+
}),
|
|
124
|
+
request,
|
|
125
|
+
params || {}
|
|
126
|
+
)
|
|
127
|
+
} catch (err) {
|
|
128
|
+
if (isResponse(err)) {
|
|
129
|
+
return err
|
|
130
|
+
}
|
|
130
131
|
|
|
131
|
-
|
|
132
|
-
|
|
132
|
+
if (process.env.NODE_ENV === 'development') {
|
|
133
|
+
console.error(`\n [one] Error importing API route at ${pathname}:
|
|
133
134
|
|
|
134
|
-
|
|
135
|
+
${err}
|
|
135
136
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
If this is an import error, you can likely fix this by adding this dependency to
|
|
138
|
+
the "optimizeDeps.include" array in your vite.config.ts.
|
|
139
|
+
`)
|
|
140
|
+
}
|
|
140
141
|
|
|
141
|
-
|
|
142
|
-
|
|
142
|
+
throw err
|
|
143
|
+
}
|
|
144
|
+
})
|
|
143
145
|
}
|
|
144
146
|
|
|
145
147
|
export async function resolveLoaderRoute(
|
|
@@ -29,6 +29,22 @@ import { sortRoutesWithInitial } from './sortRoutes'
|
|
|
29
29
|
// do this hack.
|
|
30
30
|
export const { Screen, Group } = createNavigatorFactory({} as any)()
|
|
31
31
|
|
|
32
|
+
// Cache inline CSS elements at module load (before React hydrates).
|
|
33
|
+
// Reads CSS content from SSR'd <style> elements and creates matching JSX
|
|
34
|
+
// so hydration sees identical content without 100KB+ JSON payload.
|
|
35
|
+
const cachedInlineCSSElements: React.ReactNode[] =
|
|
36
|
+
typeof document !== 'undefined'
|
|
37
|
+
? Array.from(document.querySelectorAll<HTMLStyleElement>('style[id^="__one_css_"]')).map(
|
|
38
|
+
(el, i) => (
|
|
39
|
+
<style
|
|
40
|
+
key={`inline-css-${i}`}
|
|
41
|
+
id={el.id}
|
|
42
|
+
dangerouslySetInnerHTML={{ __html: el.innerHTML }}
|
|
43
|
+
/>
|
|
44
|
+
)
|
|
45
|
+
)
|
|
46
|
+
: []
|
|
47
|
+
|
|
32
48
|
export type ScreenProps<
|
|
33
49
|
TOptions extends Record<string, any> = Record<string, any>,
|
|
34
50
|
State extends NavigationState = NavigationState,
|
|
@@ -205,10 +221,17 @@ export function getQualifiedRouteComponent(value: RouteNode) {
|
|
|
205
221
|
__html: `globalThis['global'] = globalThis`,
|
|
206
222
|
}}
|
|
207
223
|
/>
|
|
208
|
-
{serverContext?.cssContents
|
|
209
|
-
?
|
|
210
|
-
|
|
211
|
-
)
|
|
224
|
+
{serverContext?.cssContents?.length || serverContext?.cssInlineCount
|
|
225
|
+
? // Inline CSS: SSR renders fresh, client uses cached elements from module load
|
|
226
|
+
serverContext?.cssContents
|
|
227
|
+
? serverContext.cssContents.map((content, i) => (
|
|
228
|
+
<style
|
|
229
|
+
key={`inline-css-${i}`}
|
|
230
|
+
id={`__one_css_${i}`}
|
|
231
|
+
dangerouslySetInnerHTML={{ __html: content }}
|
|
232
|
+
/>
|
|
233
|
+
))
|
|
234
|
+
: cachedInlineCSSElements
|
|
212
235
|
: serverContext?.css?.map((file) => <link key={file} rel="stylesheet" href={file} />)}
|
|
213
236
|
<ServerContextScript />
|
|
214
237
|
{headChildren}
|
package/src/serve-worker.ts
CHANGED
|
@@ -1,23 +1,40 @@
|
|
|
1
1
|
import { Hono } from 'hono'
|
|
2
|
-
import { createProdServer } from 'vxrn/serve'
|
|
3
|
-
import { oneServe } from './server/oneServe'
|
|
4
2
|
import { setServerGlobals } from './server/setServerGlobals'
|
|
5
3
|
import { setupBuildInfo } from './server/setupBuildOptions'
|
|
6
4
|
import { ensureExists } from './utils/ensureExists'
|
|
7
5
|
import type { One } from './vite/types'
|
|
8
6
|
|
|
9
|
-
export
|
|
7
|
+
// Re-export static HTML fetcher utilities for worker use
|
|
8
|
+
export { setFetchStaticHtml, getFetchStaticHtml } from './server/staticHtmlFetcher'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Lazy import functions for route modules.
|
|
12
|
+
* Modules are loaded on-demand when a route is matched, not all upfront.
|
|
13
|
+
*/
|
|
14
|
+
export type LazyRoutes = {
|
|
15
|
+
serverEntry: () => Promise<{ default: { render: (props: any) => any } }>
|
|
16
|
+
pages: Record<string, () => Promise<any>>
|
|
17
|
+
api: Record<string, () => Promise<any>>
|
|
18
|
+
middlewares: Record<string, () => Promise<any>>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Creates a Hono app for edge/worker environments (Cloudflare Workers, etc.)
|
|
23
|
+
* Static assets should be handled by the platform (e.g., wrangler's [assets] config)
|
|
24
|
+
* This only sets up the dynamic routes (SSR, API, loaders)
|
|
25
|
+
*
|
|
26
|
+
* @param buildInfo - Build configuration and route metadata
|
|
27
|
+
* @param lazyRoutes - Lazy import functions for route modules (loaded on-demand)
|
|
28
|
+
*/
|
|
29
|
+
export async function serve(buildInfo: One.BuildInfo, lazyRoutes?: LazyRoutes) {
|
|
10
30
|
setupBuildInfo(buildInfo)
|
|
11
31
|
ensureExists(buildInfo.oneOptions)
|
|
12
32
|
setServerGlobals()
|
|
13
33
|
|
|
14
|
-
const serverOptions = buildInfo.oneOptions.server || {}
|
|
15
|
-
|
|
16
34
|
const app = new Hono()
|
|
17
35
|
|
|
18
|
-
await
|
|
19
|
-
|
|
20
|
-
await oneServe(buildInfo.oneOptions, buildInfo, app)
|
|
36
|
+
const { oneServe } = await import('./server/oneServe')
|
|
37
|
+
await oneServe(buildInfo.oneOptions, buildInfo, app, { lazyRoutes })
|
|
21
38
|
|
|
22
39
|
return app
|
|
23
40
|
}
|
package/src/serve.ts
CHANGED
|
@@ -23,7 +23,7 @@ export async function serve(args: VXRNOptions['server'] & { app?: Hono } = {}) {
|
|
|
23
23
|
// to avoid loading the CACHE_KEY before we set it use async imports:
|
|
24
24
|
const { labelProcess } = await import('./cli/label-process')
|
|
25
25
|
const { removeUndefined } = await import('./utils/removeUndefined')
|
|
26
|
-
const { loadEnv, serve: vxrnServe } = await import('vxrn/serve')
|
|
26
|
+
const { loadEnv, serve: vxrnServe, serveStaticAssets } = await import('vxrn/serve')
|
|
27
27
|
const { oneServe } = await import('./server/oneServe')
|
|
28
28
|
|
|
29
29
|
labelProcess('serve')
|
|
@@ -44,7 +44,7 @@ export async function serve(args: VXRNOptions['server'] & { app?: Hono } = {}) {
|
|
|
44
44
|
}),
|
|
45
45
|
|
|
46
46
|
async beforeRegisterRoutes(options, app) {
|
|
47
|
-
await oneServe(oneOptions, buildInfo, app)
|
|
47
|
+
await oneServe(oneOptions, buildInfo, app, { serveStaticAssets })
|
|
48
48
|
},
|
|
49
49
|
|
|
50
50
|
async afterRegisterRoutes(options, app) {},
|
|
@@ -21,9 +21,15 @@ export function ServerContextScript() {
|
|
|
21
21
|
const context = useServerContext()
|
|
22
22
|
const cssUrls = context?.css || []
|
|
23
23
|
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
|
|
24
|
+
// Strip cssContents from JSON payload - we'll read it from DOM instead.
|
|
25
|
+
// This avoids duplicating 100KB+ of CSS as JSON in the HTML.
|
|
26
|
+
// The CSSPrehydrateScript reads the actual <style> elements' innerHTML
|
|
27
|
+
// and stores them in globalThis.__oneCSSContents for hydration matching.
|
|
28
|
+
const { cssContents, ...restContext } = context || {}
|
|
29
|
+
const clientContext = {
|
|
30
|
+
...restContext,
|
|
31
|
+
cssInlineCount: cssContents?.length || 0,
|
|
32
|
+
}
|
|
27
33
|
|
|
28
34
|
return (
|
|
29
35
|
<script
|
package/src/server/oneServe.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { default as FSExtra } from 'fs-extra'
|
|
2
1
|
import type { Hono, MiddlewareHandler } from 'hono'
|
|
3
2
|
import type { BlankEnv } from 'hono/types'
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { getServerEntry } from 'vxrn/serve'
|
|
3
|
+
import { readFile } from 'node:fs/promises'
|
|
4
|
+
import { extname, join, resolve } from 'node:path'
|
|
7
5
|
import {
|
|
8
6
|
CSS_PRELOAD_JS_POSTFIX,
|
|
9
7
|
LOADER_JS_POSTFIX_UNCACHED,
|
|
@@ -17,14 +15,33 @@ import {
|
|
|
17
15
|
} from '../createHandleRequest'
|
|
18
16
|
import type { RenderAppProps } from '../types'
|
|
19
17
|
import { getPathFromLoaderPath } from '../utils/cleanUrl'
|
|
20
|
-
import { isRolldown } from '../utils/isRolldown'
|
|
21
18
|
import { toAbsolute } from '../utils/toAbsolute'
|
|
22
19
|
import type { One } from '../vite/types'
|
|
23
20
|
import type { RouteInfoCompiled } from './createRoutesManifest'
|
|
21
|
+
import { getFetchStaticHtml } from './staticHtmlFetcher'
|
|
24
22
|
|
|
25
23
|
const debugRouter = process.env.ONE_DEBUG_ROUTER
|
|
26
24
|
|
|
27
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Lazy import functions for route modules.
|
|
27
|
+
* Modules are loaded on-demand when a route is matched, not all upfront.
|
|
28
|
+
*/
|
|
29
|
+
type LazyRoutes = {
|
|
30
|
+
serverEntry: () => Promise<{ default: { render: (props: any) => any } }>
|
|
31
|
+
pages: Record<string, () => Promise<any>>
|
|
32
|
+
api: Record<string, () => Promise<any>>
|
|
33
|
+
middlewares: Record<string, () => Promise<any>>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function oneServe(
|
|
37
|
+
oneOptions: One.PluginOptions,
|
|
38
|
+
buildInfo: One.BuildInfo,
|
|
39
|
+
app: Hono,
|
|
40
|
+
options?: {
|
|
41
|
+
serveStaticAssets?: (ctx: { context: any }) => Promise<Response | undefined>
|
|
42
|
+
lazyRoutes?: LazyRoutes
|
|
43
|
+
}
|
|
44
|
+
) {
|
|
28
45
|
const { resolveAPIRoute, resolveLoaderRoute, resolvePageRoute } = await import(
|
|
29
46
|
'../createHandleRequest'
|
|
30
47
|
)
|
|
@@ -61,29 +78,58 @@ export async function oneServe(oneOptions: One.PluginOptions, buildInfo: One.Bui
|
|
|
61
78
|
root: '.',
|
|
62
79
|
}
|
|
63
80
|
|
|
64
|
-
const entryServer = getServerEntry(serverOptions)
|
|
65
|
-
const entry = await import(entryServer)
|
|
66
|
-
|
|
67
|
-
const render = entry.default.render as (props: RenderAppProps) => any
|
|
68
81
|
const apiCJS = oneOptions.build?.api?.outputFormat === 'cjs'
|
|
69
82
|
|
|
70
|
-
|
|
83
|
+
// useRolldown is determined at build time and stored in buildInfo
|
|
84
|
+
const useRolldown = buildInfo.useRolldown ?? false
|
|
85
|
+
|
|
86
|
+
// Lazy load server entry only when needed for SSR
|
|
87
|
+
let render: ((props: RenderAppProps) => any) | null = null
|
|
88
|
+
async function getRender() {
|
|
89
|
+
if (!render) {
|
|
90
|
+
// Use lazy import if available (workers), otherwise dynamic import (Node.js)
|
|
91
|
+
const entry = options?.lazyRoutes?.serverEntry
|
|
92
|
+
? await options.lazyRoutes.serverEntry()
|
|
93
|
+
: await import(
|
|
94
|
+
resolve(
|
|
95
|
+
process.cwd(),
|
|
96
|
+
`${serverOptions.root}/dist/server/_virtual_one-entry.${typeof oneOptions.build?.server === 'object' && oneOptions.build.server.outputFormat === 'cjs' ? 'c' : ''}js`
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
render = entry.default.render as (props: RenderAppProps) => any
|
|
100
|
+
}
|
|
101
|
+
return render
|
|
102
|
+
}
|
|
71
103
|
|
|
72
104
|
const requestHandlers: RequestHandlers = {
|
|
73
105
|
async handleAPI({ route }) {
|
|
106
|
+
// Use lazy import if available (workers), otherwise dynamic import (Node.js)
|
|
107
|
+
if (options?.lazyRoutes?.api?.[route.page]) {
|
|
108
|
+
return await options.lazyRoutes.api[route.page]()
|
|
109
|
+
}
|
|
74
110
|
const fileName = useRolldown
|
|
75
|
-
? route.page.slice(1)
|
|
76
|
-
: route.page.slice(1).replace(/\[/g, '_').replace(/\]/g, '_')
|
|
111
|
+
? route.page.slice(1)
|
|
112
|
+
: route.page.slice(1).replace(/\[/g, '_').replace(/\]/g, '_')
|
|
77
113
|
const apiFile = join(process.cwd(), 'dist', 'api', fileName + (apiCJS ? '.cjs' : '.js'))
|
|
78
114
|
return await import(apiFile)
|
|
79
115
|
},
|
|
80
116
|
|
|
81
117
|
async loadMiddleware(route) {
|
|
118
|
+
// Use lazy import if available (workers), otherwise dynamic import (Node.js)
|
|
119
|
+
if (options?.lazyRoutes?.middlewares?.[route.contextKey]) {
|
|
120
|
+
return await options.lazyRoutes.middlewares[route.contextKey]()
|
|
121
|
+
}
|
|
82
122
|
return await import(toAbsolute(route.contextKey))
|
|
83
123
|
},
|
|
84
124
|
|
|
85
|
-
async handleLoader({
|
|
86
|
-
|
|
125
|
+
async handleLoader({ route, loaderProps }) {
|
|
126
|
+
// Use lazy import if available (workers), otherwise dynamic import (Node.js)
|
|
127
|
+
// For workers, look up by routeFile (original file path like "./dynamic/[id]+ssr.tsx")
|
|
128
|
+
// For Node.js, use route.file which may be loaderServerPath
|
|
129
|
+
const routeFile = (route as any).routeFile || route.file
|
|
130
|
+
const exports = options?.lazyRoutes?.pages?.[routeFile]
|
|
131
|
+
? await options.lazyRoutes.pages[routeFile]()
|
|
132
|
+
: await import(toAbsolute(join('./', 'dist/server', route.file)))
|
|
87
133
|
|
|
88
134
|
const { loader } = exports
|
|
89
135
|
|
|
@@ -109,13 +155,16 @@ export async function oneServe(oneOptions: One.PluginOptions, buildInfo: One.Bui
|
|
|
109
155
|
}
|
|
110
156
|
|
|
111
157
|
try {
|
|
112
|
-
|
|
158
|
+
// Use lazy import if available (workers), otherwise dynamic import (Node.js)
|
|
159
|
+
const exported = options?.lazyRoutes?.pages?.[route.file]
|
|
160
|
+
? await options.lazyRoutes.pages[route.file]()
|
|
161
|
+
: await import(toAbsolute(buildInfo.serverJsPath))
|
|
113
162
|
const loaderData = await exported.loader?.(loaderProps)
|
|
114
163
|
|
|
115
164
|
const headers = new Headers()
|
|
116
165
|
headers.set('content-type', 'text/html')
|
|
117
166
|
|
|
118
|
-
const rendered = await
|
|
167
|
+
const rendered = await (await getRender())({
|
|
119
168
|
mode: route.type,
|
|
120
169
|
loaderData,
|
|
121
170
|
loaderProps,
|
|
@@ -142,10 +191,28 @@ url: ${url}`)
|
|
|
142
191
|
const htmlPath = routeMap[url.pathname] || routeMap[buildInfo?.cleanPath]
|
|
143
192
|
|
|
144
193
|
if (htmlPath) {
|
|
145
|
-
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
194
|
+
// Try Worker ASSETS binding first (for Cloudflare Workers), fall back to filesystem
|
|
195
|
+
const fetchStaticHtml = getFetchStaticHtml()
|
|
196
|
+
let html: string | null = null
|
|
197
|
+
|
|
198
|
+
if (fetchStaticHtml) {
|
|
199
|
+
html = await fetchStaticHtml(htmlPath)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (!html) {
|
|
203
|
+
// Fall back to filesystem (Node.js)
|
|
204
|
+
try {
|
|
205
|
+
html = await readFile(join('dist/client', htmlPath), 'utf-8')
|
|
206
|
+
} catch {
|
|
207
|
+
// File not found
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (html) {
|
|
212
|
+
const headers = new Headers()
|
|
213
|
+
headers.set('content-type', 'text/html')
|
|
214
|
+
return new Response(html, { headers, status: route.isNotFound ? 404 : 200 })
|
|
215
|
+
}
|
|
149
216
|
}
|
|
150
217
|
}
|
|
151
218
|
},
|
|
@@ -161,14 +228,17 @@ url: ${url}`)
|
|
|
161
228
|
// But if we handle every matching static asset here, it seems to break some of the static routes.
|
|
162
229
|
// So we only handle it if there's a matching not-found or dynamic route, to prevent One from taking over the static asset.
|
|
163
230
|
// If there's no matching not-found or dynamic route, it's very likely that One won't handle it and will fallback to VxRN serving the static asset so it will also work.
|
|
164
|
-
|
|
165
|
-
if (
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
231
|
+
// Note: serveStaticAssets is optional - workers handle static assets via platform config
|
|
232
|
+
if (options?.serveStaticAssets) {
|
|
233
|
+
const staticAssetResponse = await options.serveStaticAssets({ context })
|
|
234
|
+
if (staticAssetResponse) {
|
|
235
|
+
return await runMiddlewares(
|
|
236
|
+
requestHandlers,
|
|
237
|
+
request,
|
|
238
|
+
route,
|
|
239
|
+
async () => staticAssetResponse
|
|
240
|
+
)
|
|
241
|
+
}
|
|
172
242
|
}
|
|
173
243
|
}
|
|
174
244
|
|
|
@@ -321,6 +391,7 @@ url: ${url}`)
|
|
|
321
391
|
// for now just change this
|
|
322
392
|
const loaderRoute = {
|
|
323
393
|
...route,
|
|
394
|
+
routeFile: route.file, // preserve original for lazy route lookup
|
|
324
395
|
file: route.loaderServerPath || c.req.path,
|
|
325
396
|
}
|
|
326
397
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Global function for fetching static HTML in Workers (set per-request)
|
|
2
|
+
let _fetchStaticHtml: ((path: string) => Promise<string | null>) | null = null
|
|
3
|
+
|
|
4
|
+
export function setFetchStaticHtml(fn: ((path: string) => Promise<string | null>) | null) {
|
|
5
|
+
_fetchStaticHtml = fn
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function getFetchStaticHtml() {
|
|
9
|
+
return _fetchStaticHtml
|
|
10
|
+
}
|
package/src/useLoader.ts
CHANGED
|
@@ -92,7 +92,7 @@ export function useLoaderState<
|
|
|
92
92
|
// (the pathname is already resolved like /docs/getting-started, not /docs/[slug])
|
|
93
93
|
const currentPath = pathname.replace(/\/index$/, '').replace(/\/$/, '') || '/'
|
|
94
94
|
|
|
95
|
-
// server-side
|
|
95
|
+
// server-side only - typeof window check ensures this never runs on client
|
|
96
96
|
if (typeof window === 'undefined' && loader) {
|
|
97
97
|
const serverData = useAsyncFn(
|
|
98
98
|
loader,
|