From 9d896a6ab188385091510cb7bfd50fc23ae81367 Mon Sep 17 00:00:00 2001 From: dswbx Date: Tue, 26 Nov 2024 11:15:38 +0100 Subject: [PATCH] improved nextjs/remix adapters and docs, confirmed remix ssr working --- app/package.json | 3 +- app/src/Api.ts | 12 +- .../cloudflare/cloudflare-workers.adapter.ts | 2 - app/src/adapter/index.ts | 25 ++++ app/src/adapter/nextjs/AdminPage.tsx | 24 ++++ app/src/adapter/nextjs/index.ts | 1 + app/src/adapter/nextjs/nextjs.adapter.ts | 33 ++++- app/src/adapter/remix/AdminPage.tsx | 19 +++ app/src/adapter/remix/index.ts | 1 + app/src/auth/authenticate/Authenticator.ts | 8 +- app/src/modules/server/AdminController.tsx | 1 + app/src/ui/client/ClientProvider.tsx | 3 +- app/tsup.adapters.ts | 17 ++- bun.lockb | Bin 756816 -> 757816 bytes docs/integration/nextjs.mdx | 44 +++--- docs/integration/remix.mdx | 92 ++++++++++--- examples/nextjs/src/components/BkndAdmin.tsx | 11 -- .../nextjs/src/pages/admin/[[...admin]].tsx | 15 +- examples/nextjs/src/pages/index.tsx | 129 +++--------------- examples/nextjs/test.db | Bin 16384 -> 40960 bytes examples/remix/app/root.tsx | 6 + examples/remix/app/routes/_index.tsx | 19 +-- examples/remix/app/routes/admin.$.tsx | 19 +-- 23 files changed, 275 insertions(+), 209 deletions(-) create mode 100644 app/src/adapter/nextjs/AdminPage.tsx create mode 100644 app/src/adapter/remix/AdminPage.tsx delete mode 100644 examples/nextjs/src/components/BkndAdmin.tsx diff --git a/app/package.json b/app/package.json index 58210db..1c6b57a 100644 --- a/app/package.json +++ b/app/package.json @@ -72,6 +72,7 @@ "@hono/vite-dev-server": "^0.17.0", "@tanstack/react-query-devtools": "^5.59.16", "@types/diff": "^5.2.3", + "@types/node": "^22.10.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@vitejs/plugin-react": "^4.3.3", @@ -96,7 +97,7 @@ "metafile": true, "platform": "browser", "format": ["esm", "cjs"], - "splitting": false, + "splitting": true, "loader": { ".svg": "dataurl" } diff --git a/app/src/Api.ts b/app/src/Api.ts index f54ccdf..d94aff9 100644 --- a/app/src/Api.ts +++ b/app/src/Api.ts @@ -5,17 +5,19 @@ import { omit } from "lodash-es"; import { MediaApi } from "media/api/MediaApi"; import { SystemApi } from "modules/SystemApi"; +export type TApiUser = object; + declare global { interface Window { __BKND__: { - user?: any; + user?: TApiUser; }; } } export type ApiOptions = { host: string; - user?: object; + user?: TApiUser; token?: string; headers?: Headers; key?: string; @@ -24,7 +26,7 @@ export type ApiOptions = { export class Api { private token?: string; - private user?: object; + private user?: TApiUser; private verified = false; private token_transport: "header" | "cookie" | "none" = "header"; @@ -111,6 +113,10 @@ export class Api { }; } + getUser(): TApiUser | null { + return this.user || null; + } + private buildApis() { const baseParams = { host: this.options.host, diff --git a/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts b/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts index a7cb1a4..9dc071c 100644 --- a/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts +++ b/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts @@ -5,8 +5,6 @@ import { serveStatic } from "hono/cloudflare-workers"; import type { BkndConfig, CfBkndModeCache } from "../index"; // @ts-ignore -//import manifest from "__STATIC_CONTENT_MANIFEST"; - import _html from "../../static/index.html"; type Context = { diff --git a/app/src/adapter/index.ts b/app/src/adapter/index.ts index 820c3c2..b4b3682 100644 --- a/app/src/adapter/index.ts +++ b/app/src/adapter/index.ts @@ -1,3 +1,4 @@ +import type { IncomingMessage } from "node:http"; import type { App, CreateAppConfig } from "bknd"; export type CfBkndModeCache = (env: Env) => { @@ -35,3 +36,27 @@ export type BkndConfigJson = { port?: number; }; }; + +export function nodeRequestToRequest(req: IncomingMessage): Request { + let protocol = "http"; + try { + protocol = req.headers["x-forwarded-proto"] as string; + } catch (e) {} + const host = req.headers.host; + const url = `${protocol}://${host}${req.url}`; + const headers = new Headers(); + + for (const [key, value] of Object.entries(req.headers)) { + if (Array.isArray(value)) { + headers.append(key, value.join(", ")); + } else if (value) { + headers.append(key, value); + } + } + + const method = req.method || "GET"; + return new Request(url, { + method, + headers + }); +} diff --git a/app/src/adapter/nextjs/AdminPage.tsx b/app/src/adapter/nextjs/AdminPage.tsx new file mode 100644 index 0000000..222e40f --- /dev/null +++ b/app/src/adapter/nextjs/AdminPage.tsx @@ -0,0 +1,24 @@ +import { withApi } from "bknd/adapter/nextjs"; +import type { InferGetServerSidePropsType } from "next"; +import dynamic from "next/dynamic"; + +export const getServerSideProps = withApi(async (context) => { + return { + props: { + user: context.api.getUser() + } + }; +}); + +export function adminPage() { + const Admin = dynamic(() => import("bknd/ui").then((mod) => mod.Admin), { ssr: false }); + const ClientProvider = dynamic(() => import("bknd/ui").then((mod) => mod.ClientProvider)); + return (props: InferGetServerSidePropsType) => { + if (typeof document === "undefined") return null; + return ( + + + + ); + }; +} diff --git a/app/src/adapter/nextjs/index.ts b/app/src/adapter/nextjs/index.ts index 957fa9e..ef03af0 100644 --- a/app/src/adapter/nextjs/index.ts +++ b/app/src/adapter/nextjs/index.ts @@ -1 +1,2 @@ export * from "./nextjs.adapter"; +export * from "./AdminPage"; diff --git a/app/src/adapter/nextjs/nextjs.adapter.ts b/app/src/adapter/nextjs/nextjs.adapter.ts index d533d94..b8565d9 100644 --- a/app/src/adapter/nextjs/nextjs.adapter.ts +++ b/app/src/adapter/nextjs/nextjs.adapter.ts @@ -1,5 +1,36 @@ -import { App, type CreateAppConfig } from "bknd"; +import type { IncomingMessage, ServerResponse } from "node:http"; +import { Api, App, type CreateAppConfig } from "bknd"; import { isDebug } from "bknd/core"; +import { nodeRequestToRequest } from "../index"; + +type GetServerSidePropsContext = { + req: IncomingMessage; + res: ServerResponse; + params?: Params; + query: any; + preview?: boolean; + previewData?: any; + draftMode?: boolean; + resolvedUrl: string; + locale?: string; + locales?: string[]; + defaultLocale?: string; +}; + +export function createApi({ req }: GetServerSidePropsContext) { + const request = nodeRequestToRequest(req); + //console.log("createApi:request.headers", request.headers); + return new Api({ + host: new URL(request.url).origin, + headers: request.headers + }); +} + +export function withApi(handler: (ctx: GetServerSidePropsContext & { api: Api }) => T) { + return (ctx: GetServerSidePropsContext & { api: Api }) => { + return handler({ ...ctx, api: createApi(ctx) }); + }; +} function getCleanRequest(req: Request) { // clean search params from "route" attribute diff --git a/app/src/adapter/remix/AdminPage.tsx b/app/src/adapter/remix/AdminPage.tsx new file mode 100644 index 0000000..6e40032 --- /dev/null +++ b/app/src/adapter/remix/AdminPage.tsx @@ -0,0 +1,19 @@ +import { Suspense, lazy, useEffect, useState } from "react"; + +export function adminPage() { + const Admin = lazy(() => import("bknd/ui").then((mod) => ({ default: mod.Admin }))); + return () => { + const [loaded, setLoaded] = useState(false); + useEffect(() => { + if (typeof window === "undefined") return; + setLoaded(true); + }, []); + if (!loaded) return null; + + return ( + + + + ); + }; +} diff --git a/app/src/adapter/remix/index.ts b/app/src/adapter/remix/index.ts index 77b0812..e02c2c0 100644 --- a/app/src/adapter/remix/index.ts +++ b/app/src/adapter/remix/index.ts @@ -1 +1,2 @@ export * from "./remix.adapter"; +export * from "./AdminPage"; diff --git a/app/src/auth/authenticate/Authenticator.ts b/app/src/auth/authenticate/Authenticator.ts index ff98c41..32c7b42 100644 --- a/app/src/auth/authenticate/Authenticator.ts +++ b/app/src/auth/authenticate/Authenticator.ts @@ -257,11 +257,15 @@ export class Authenticator = Record< return c.json(data); } - const referer = new URL(redirect ?? c.req.header("Referer") ?? "/"); + const successPath = "/"; + const successUrl = new URL(c.req.url).origin + successPath.replace(/\/+$/, "/"); + const referer = new URL(redirect ?? c.req.header("Referer") ?? successUrl); if ("token" in data) { + // @todo: add config await this.setAuthCookie(c, data.token); - return c.redirect("/"); + // can't navigate to "/" – doesn't work on nextjs + return c.redirect(successUrl); } let message = "An error occured"; diff --git a/app/src/modules/server/AdminController.tsx b/app/src/modules/server/AdminController.tsx index 1cffa11..96af5c1 100644 --- a/app/src/modules/server/AdminController.tsx +++ b/app/src/modules/server/AdminController.tsx @@ -117,6 +117,7 @@ export class AdminController implements ClassController { let script: string | undefined; let css: string[] = []; + // @todo: check why nextjs imports manifest, it's not required if (isProd) { const manifest: Manifest = this.options.viteManifest ? this.options.viteManifest diff --git a/app/src/ui/client/ClientProvider.tsx b/app/src/ui/client/ClientProvider.tsx index 4cca06b..078d23a 100644 --- a/app/src/ui/client/ClientProvider.tsx +++ b/app/src/ui/client/ClientProvider.tsx @@ -1,4 +1,5 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import type { TApiUser } from "Api"; import { createContext, useContext, useEffect, useState } from "react"; import { useBkndWindowContext } from "ui/client/BkndProvider"; import { AppQueryClient } from "./utils/AppQueryClient"; @@ -20,7 +21,7 @@ export const ClientProvider = ({ children, baseUrl, user -}: { children?: any; baseUrl?: string; user?: object }) => { +}: { children?: any; baseUrl?: string; user?: TApiUser | null }) => { const [actualBaseUrl, setActualBaseUrl] = useState(null); const winCtx = useBkndWindowContext(); diff --git a/app/tsup.adapters.ts b/app/tsup.adapters.ts index a97712c..d5a3948 100644 --- a/app/tsup.adapters.ts +++ b/app/tsup.adapters.ts @@ -10,13 +10,20 @@ function baseConfig(adapter: string): Options { entry: [`src/adapter/${adapter}`], format: ["esm"], platform: "neutral", - minify, + minify: false, outDir: `dist/adapter/${adapter}`, watch, define: { __isDev: "0" }, - external: [new RegExp(`^(?!\\.\\/src\\/adapter\\/${adapter}\\/).+$`)], + external: [ + "cloudflare:workers", + /^@?hono.*?/, + /^bknd.*?/, + /.*\.html$/, + /^node.*/, + /^react.*?/ + ], metafile: true, splitting: false, treeshake: true @@ -35,7 +42,8 @@ await build({ await build({ ...baseConfig("nextjs"), format: ["esm", "cjs"], - platform: "node" + platform: "node", + external: [...baseConfig("nextjs").external!, /^next.*/] }); await build({ @@ -44,7 +52,8 @@ await build({ }); await build({ - ...baseConfig("bun") + ...baseConfig("bun"), + external: [/^hono.*?/, /^bknd.*?/, "node:path"] }); await build({ diff --git a/bun.lockb b/bun.lockb index ec74acc6c886997df7f45ea4900566c5de827cab..2264076b2fe1050b050e8c113f66c490b934c0e1 100755 GIT binary patch delta 85889 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

&XvT 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⩔yVK{#fa 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 QwB{o!cxBU%(x&kIKi#)!F8}}l delta 85448 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 diff --git a/docs/integration/nextjs.mdx b/docs/integration/nextjs.mdx index 007f94f..408fb8e 100644 --- a/docs/integration/nextjs.mdx +++ b/docs/integration/nextjs.mdx @@ -4,11 +4,6 @@ description: 'Run bknd inside Next.js' --- import InstallBknd from '/snippets/install-bknd.mdx'; - - Next.js support is currently experimental, this guide only covers adding bknd using `pages` - folder. - - ## Installation Install bknd as a dependency: @@ -39,20 +34,37 @@ For more information about the connection object, refer to the [Setup](/setup) g Create a file `[[...admin]].tsx` inside the `pages/admin` folder: ```tsx // pages/admin/[[...admin]].tsx -import type { PageConfig } from "next"; -import dynamic from "next/dynamic"; +import { adminPage, getServerSideProps } from "bknd/adapter/nextjs"; import "bknd/dist/styles.css"; -export const config: PageConfig = { - runtime: "experimental-edge", -}; +export { getServerSideProps }; +export default adminPage(); +``` -const Admin = dynamic( - () => import("bknd/ui").then((mod) => mod.Admin), - { ssr: false }, -); +## Example usage of the API in pages dir +Using pages dir, you need to wrap the `getServerSideProps` function with `withApi` to get access +to the API. With the API, you can query the database or retrieve the authentication status: +```tsx +import { withApi } from "bknd/adapter/nextjs"; +import type { InferGetServerSidePropsType as InferProps } from "next"; -export default function AdminPage() { - return ; +export const getServerSideProps = withApi(async (context) => { + const { data = [] } = await context.api.data.readMany("todos"); + const user = context.api.getUser(); + + return { props: { data, user } }; +}); + +export default function Home(props: InferProps) { + const { data, user } = props; + return ( +

+ ); } ``` \ No newline at end of file diff --git a/docs/integration/remix.mdx b/docs/integration/remix.mdx index 900f533..5e5761f 100644 --- a/docs/integration/remix.mdx +++ b/docs/integration/remix.mdx @@ -4,10 +4,6 @@ description: 'Run bknd inside Remix' --- import InstallBknd from '/snippets/install-bknd.mdx'; - - Remix SSR support is currently limited. - - ## Installation Install bknd as a dependency: @@ -32,28 +28,90 @@ export const action = handler; ``` For more information about the connection object, refer to the [Setup](/setup) guide. +Now make sure that you wrap your root layout with the `ClientProvider` so that all components +share the same context: +```tsx +// app/root.tsx +export function Layout(props) { + // nothing to change here, just for orientation + return ( + {/* ... */} + ); +} + +// add the api to the `AppLoadContext` +// so you don't have to manually type it again +declare module "@remix-run/server-runtime" { + export interface AppLoadContext { + api: Api; + } +} + +// export a loader that initiates the API +// and pass it through the context +export const loader = async (args: LoaderFunctionArgs) => { + const api = new Api({ + host: new URL(args.request.url).origin, + headers: args.request.headers + }); + + // get the user from the API + const user = api.getUser(); + + // add api to the context + args.context.api = api; + + return { user }; +}; + +export default function App() { + const { user } = useLoaderData(); + return ( + + + + ); +} +``` + ## Enabling the Admin UI Create a new splat route file at `app/routes/admin.$.tsx`: ```tsx // app/routes/admin.$.tsx -import { Suspense, lazy, useEffect, useState } from "react"; +import { adminPage } from "bknd/adapter/remix"; import "bknd/dist/styles.css"; -const Admin = lazy(() => import("bknd/ui") - .then((mod) => ({ default: mod.Admin }))); +export default adminPage(); +``` -export default function AdminPage() { - const [loaded, setLoaded] = useState(false); - useEffect(() => { - setLoaded(true); - }, []); - if (!loaded) return null; +## Example usage of the API +Since the API has already been constructed in the root layout, you can now use it in any page: +```tsx +// app/routes/_index.tsx +import type { LoaderFunctionArgs } from "@remix-run/server-runtime"; +import { useLoaderData } from "@remix-run/react"; + +export const loader = async (args: LoaderFunctionArgs) => { + const { api } = args.context; + + // get the authenticated user + const user = api.getAuthState().user; + + // get the data from the API + const { data } = await api.data.readMany("todos"); + return { data, user }; +}; + +export default function Index() { + const { data, user } = useLoaderData(); return ( - - - +
+

Data

+
{JSON.stringify(data, null, 2)}
+

User

+
{JSON.stringify(user, null, 2)}
+
); } - ``` \ No newline at end of file diff --git a/examples/nextjs/src/components/BkndAdmin.tsx b/examples/nextjs/src/components/BkndAdmin.tsx deleted file mode 100644 index 4d885db..0000000 --- a/examples/nextjs/src/components/BkndAdmin.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import dynamic from "next/dynamic"; - -const Admin = dynamic(() => import("bknd/ui").then((mod) => mod.Admin), { ssr: false }); -if (typeof window !== "undefined") { - // @ts-ignore - import("bknd/dist/styles.css"); -} - -export function BkndAdmin() { - return ; -} diff --git a/examples/nextjs/src/pages/admin/[[...admin]].tsx b/examples/nextjs/src/pages/admin/[[...admin]].tsx index d1e98b5..58b4991 100644 --- a/examples/nextjs/src/pages/admin/[[...admin]].tsx +++ b/examples/nextjs/src/pages/admin/[[...admin]].tsx @@ -1,14 +1,5 @@ -import type { PageConfig } from "next"; -import dynamic from "next/dynamic"; - -export const config: PageConfig = { - runtime: "experimental-edge" -}; - -const Admin = dynamic(() => import("bknd/ui").then((mod) => mod.Admin), { ssr: false }); +import { adminPage, getServerSideProps } from "bknd/adapter/nextjs"; import "bknd/dist/styles.css"; -export default function AdminPage() { - if (typeof document === "undefined") return null; - return ; -} +export { getServerSideProps }; +export default adminPage(); diff --git a/examples/nextjs/src/pages/index.tsx b/examples/nextjs/src/pages/index.tsx index 5948fd2..53e81f0 100644 --- a/examples/nextjs/src/pages/index.tsx +++ b/examples/nextjs/src/pages/index.tsx @@ -1,115 +1,24 @@ -import Image from "next/image"; -import localFont from "next/font/local"; +import { withApi } from "bknd/adapter/nextjs"; +import type { InferGetServerSidePropsType } from "next"; -const geistSans = localFont({ - src: "./fonts/GeistVF.woff", - variable: "--font-geist-sans", - weight: "100 900", -}); -const geistMono = localFont({ - src: "./fonts/GeistMonoVF.woff", - variable: "--font-geist-mono", - weight: "100 900", +export const getServerSideProps = withApi(async (context) => { + const { data = [] } = await context.api.data.readMany("todos"); + const user = context.api.getUser(); + + return { props: { data, user } }; }); -export default function Home() { - return ( -
- ); +

User

+
{JSON.stringify(user, null, 2)}
+ + ); } diff --git a/examples/nextjs/test.db b/examples/nextjs/test.db index 1c856e00ef6c9d5a33dd18db103a607b84feab72..e2b5b068db4a0fcc8ca862fd71c75012256af518 100644 GIT binary patch literal 40960 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 diff --git a/examples/remix/app/root.tsx b/examples/remix/app/root.tsx index e65961c..d2e5a75 100644 --- a/examples/remix/app/root.tsx +++ b/examples/remix/app/root.tsx @@ -3,6 +3,12 @@ import { Links, Meta, Outlet, Scripts, ScrollRestoration, useLoaderData } from " import { Api } from "bknd"; import { ClientProvider } from "bknd/ui"; +declare module "@remix-run/server-runtime" { + export interface AppLoadContext { + api: Api; + } +} + export function Layout({ children }: { children: React.ReactNode }) { return ( diff --git a/examples/remix/app/routes/_index.tsx b/examples/remix/app/routes/_index.tsx index 8bdc1f3..78f547f 100644 --- a/examples/remix/app/routes/_index.tsx +++ b/examples/remix/app/routes/_index.tsx @@ -1,31 +1,26 @@ -import type { LoaderFunctionArgs, MetaFunction } from "@remix-run/node"; -import { useLoaderData } from "@remix-run/react"; -import type { Api } from "bknd"; -import { useClient } from "bknd/ui"; +import { type MetaFunction, useLoaderData } from "@remix-run/react"; +import type { LoaderFunctionArgs } from "@remix-run/server-runtime"; export const meta: MetaFunction = () => { return [{ title: "Remix & bknd" }, { name: "description", content: "Welcome to Remix & bknd!" }]; }; export const loader = async (args: LoaderFunctionArgs) => { - const api = args.context.api as Api; + const api = args.context.api; const user = api.getAuthState().user; const { data } = await api.data.readMany("todos"); return { data, user }; }; export default function Index() { - const data = useLoaderData(); - const client = useClient(); - - const query = client.query().data.entity("todos").readMany(); + const { data, user } = useLoaderData(); return (
- hello -
{client.baseUrl}
+

Data

{JSON.stringify(data, null, 2)}
-
{JSON.stringify(query.data, null, 2)}
+

User

+
{JSON.stringify(user, null, 2)}
); } diff --git a/examples/remix/app/routes/admin.$.tsx b/examples/remix/app/routes/admin.$.tsx index 811d13b..0207428 100644 --- a/examples/remix/app/routes/admin.$.tsx +++ b/examples/remix/app/routes/admin.$.tsx @@ -1,19 +1,4 @@ -import { Suspense, lazy, useEffect, useState } from "react"; - -const Admin = lazy(() => import("bknd/ui").then((mod) => ({ default: mod.Admin }))); +import { adminPage } from "bknd/adapter/remix"; import "bknd/dist/styles.css"; -export default function AdminPage() { - const [loaded, setLoaded] = useState(false); - useEffect(() => { - if (typeof window === "undefined") return; - setLoaded(true); - }, []); - if (!loaded) return null; - - return ( - - - - ); -} +export default adminPage();