aboutsummaryrefslogtreecommitdiff
path: root/examples/hello-next/bun-framework-next/client.development.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'examples/hello-next/bun-framework-next/client.development.tsx')
-rw-r--r--examples/hello-next/bun-framework-next/client.development.tsx114
1 files changed, 100 insertions, 14 deletions
diff --git a/examples/hello-next/bun-framework-next/client.development.tsx b/examples/hello-next/bun-framework-next/client.development.tsx
index 755441fa2..b93b1fcce 100644
--- a/examples/hello-next/bun-framework-next/client.development.tsx
+++ b/examples/hello-next/bun-framework-next/client.development.tsx
@@ -61,15 +61,86 @@ declare global {
}
}
+function nextDataFromBunData() {
+ const {
+ router: { routes, route, params: paramsList },
+ problems,
+ } = globalThis.__BUN_DATA__;
+
+ const paramsMap = new Map();
+ for (let i = 0; i < paramsList.keys.length; i++) {
+ paramsMap.set(
+ decodeURIComponent(paramsList.keys[i]),
+ decodeURIComponent(paramsList.values[i])
+ );
+ }
+
+ const params = {};
+ var url = new URL(location.href);
+ Object.assign(params, Object.fromEntries(url.searchParams.entries()));
+ Object.assign(params, Object.fromEntries(paramsMap.entries()));
+
+ const pages = routes.reduce((acc, route) => {
+ var name = route.substring(route.indexOf("_next") + "_next/".length);
+
+ while (name.startsWith("/")) {
+ name = name.substring(1);
+ }
+
+ if (name.startsWith("pages")) {
+ name = name.substring("pages".length);
+ }
+
+ while (name.startsWith("/")) {
+ name = name.substring(1);
+ }
+
+ if (name.endsWith(".jsx")) {
+ name = name.substring(0, name.length - ".jsx".length);
+ }
+
+ if (name.endsWith(".tsx")) {
+ name = name.substring(0, name.length - ".tsx".length);
+ }
+
+ if (name.endsWith(".ts")) {
+ name = name.substring(0, name.length - ".ts".length);
+ }
+
+ if (name.endsWith(".js")) {
+ name = name.substring(0, name.length - ".js".length);
+ }
+
+ acc["/" + name] = [route];
+ return acc;
+ }, {});
+
+ return {
+ page: routes[route],
+ buildId: "1234",
+ assetPrefix: "",
+ isPreview: false,
+ locale: null,
+ locales: [],
+ isFallback: false,
+ err: null,
+ props: {},
+ query: params,
+ pages,
+ };
+}
+
type RenderRouteInfo = PrivateRouteInfo & {
App: AppComponent;
scroll?: { x: number; y: number } | null;
};
type RenderErrorProps = Omit<RenderRouteInfo, "Component" | "styleSheets">;
-const data: typeof window["__NEXT_DATA__"] = JSON.parse(
- document.getElementById("__NEXT_DATA__")!.textContent!
-);
+const nextDataTag = document.getElementById("__NEXT_DATA__");
+
+const data: typeof window["__NEXT_DATA__"] = nextDataTag
+ ? JSON.parse(document.getElementById("__NEXT_DATA__")!.textContent!)
+ : nextDataFromBunData();
window.__NEXT_DATA__ = data;
const {
@@ -102,7 +173,11 @@ if (hasBasePath(asPath)) {
asPath = delBasePath(asPath);
}
-const pageLoader: PageLoader = new PageLoader(buildId, prefix, data.pages);
+export const pageLoader: PageLoader = new PageLoader(
+ buildId,
+ prefix,
+ data.pages
+);
const headManager: {
mountedInstances: Set<unknown>;
@@ -116,7 +191,7 @@ export let router: Router;
let CachedApp: AppComponent, onPerfEntry: (metric: any) => void;
export default function boot(EntryPointNamespace, loader) {
- _boot(EntryPointNamespace).then(() => {});
+ _boot(EntryPointNamespace).then(() => {}, false);
}
class Container extends React.Component<{
@@ -230,7 +305,7 @@ function AppContainer({
);
}
-async function _boot(EntryPointNamespace) {
+export async function _boot(EntryPointNamespace, isError) {
NextRouteLoader.default.getClientBuildManifest = () => Promise.resolve({});
const PageComponent = EntryPointNamespace.default;
@@ -287,14 +362,25 @@ async function _boot(EntryPointNamespace) {
globalThis.next.router = router;
- ReactDOM.hydrate(
- <TopLevelRender
- App={CachedApp}
- Component={PageComponent}
- props={{ pageProps: hydrateProps }}
- />,
- document.querySelector("#__next")
- );
+ if (isError) {
+ ReactDOM.render(
+ <TopLevelRender
+ App={CachedApp}
+ Component={PageComponent}
+ props={{ pageProps: hydrateProps }}
+ />,
+ document.querySelector("#__next")
+ );
+ } else {
+ ReactDOM.hydrate(
+ <TopLevelRender
+ App={CachedApp}
+ Component={PageComponent}
+ props={{ pageProps: hydrateProps }}
+ />,
+ document.querySelector("#__next")
+ );
+ }
}
function TopLevelRender({ App, Component, props, scroll }) {