diff --git a/docs/usage/database.mdx b/docs/usage/database.mdx
index 0586572..3e677ce 100644
--- a/docs/usage/database.mdx
+++ b/docs/usage/database.mdx
@@ -3,13 +3,8 @@ title: 'Database'
description: 'Choosing the right database configuration'
---
-In order to use **bknd**, you need to prepare access information to your database and install
-the dependencies.
+In order to use **bknd**, you need to prepare access information to your database and install the dependencies. Connections to the database are managed using Kysely. Therefore, all [its dialects](https://kysely.dev/docs/dialects) are theoretically supported.
-
- Connections to the database are managed using Kysely. Therefore, all its dialects are
- theoretically supported. However, only the `SQLite` dialect is implemented as of now.
-
## Database
### SQLite in-memory
@@ -56,7 +51,9 @@ connection object to your new database:
```
### Cloudflare D1
-Using the [Cloudflare Adapter](/integration/cloudflare), you can choose to use a D1 database binding. To do so, you only need to add a D1 database to your `wrangler.toml` and it'll pick up automatically. To manually specify which D1 database to take, you can specify it manually:
+Using the [Cloudflare Adapter](/integration/cloudflare), you can choose to use a D1 database binding. To do so, you only need to add a D1 database to your `wrangler.toml` and it'll pick up automatically.
+
+To manually specify which D1 database to take, you can specify it explicitly:
```ts
import { serve, d1 } from "bknd/adapter/cloudflare";
@@ -73,17 +70,19 @@ To use bknd with Postgres, you need to install the `@bknd/postgres` package. You
npm install @bknd/postgres
```
-This package uses `pg` under the hood. If you'd like to see `postgres` or any other flavor, please create an [issue on Github](https://github.com/bknd-io/bknd/issues/new).
+You can connect to your Postgres database using `pg` or `postgres` dialects. Additionally, you may also define your custom connection.
-To establish a connection to your database, you can use any connection options available on the [`pg`](https://node-postgres.com/apis/client) package. Here is a quick example using the [Node.js Adapter](http://localhost:3000/integration/node):
+#### Using `pg`
+
+To establish a connection to your database, you can use any connection options available on the [`pg`](https://node-postgres.com/apis/client) package.
```js
import { serve } from "bknd/adapter/node";
-import { PostgresConnection } from "@bknd/postgres";
+import { pg } from "@bknd/postgres";
/** @type {import("bknd/adapter/node").NodeBkndConfig} */
const config = {
- connection: new PostgresConnection({
+ connection: pg({
connectionString:
"postgresql://user:password@localhost:5432/database",
}),
@@ -92,6 +91,64 @@ const config = {
serve(config);
```
+#### Using `postgres`
+
+To establish a connection to your database, you can use any connection options available on the [`postgres`](https://github.com/porsager/postgres) package.
+
+```js
+import { serve } from "bknd/adapter/node";
+import { postgresJs } from "@bknd/postgres";
+
+serve({
+ connection: postgresJs("postgresql://user:password@localhost:5432/database"),
+});
+```
+
+#### Using custom connection
+
+Several Postgres hosting providers offer their own clients to connect to their database, e.g. suitable for serverless environments.
+
+Example using `@neondatabase/serverless`:
+
+```js
+import { createCustomPostgresConnection } from "@bknd/postgres";
+import { NeonDialect } from "kysely-neon";
+
+const connection = createCustomPostgresConnection(NeonDialect)({
+ connectionString: process.env.NEON,
+});
+
+serve({
+ connection: connection,
+});
+```
+
+Example using `@xata.io/client`:
+
+```js
+import { createCustomPostgresConnection } from "@bknd/postgres";
+import { XataDialect } from "@xata.io/kysely";
+import { buildClient } from "@xata.io/client";
+
+const client = buildClient();
+const xata = new client({
+ databaseURL: process.env.XATA_URL,
+ apiKey: process.env.XATA_API_KEY,
+ branch: process.env.XATA_BRANCH,
+});
+
+const connection = createCustomPostgresConnection(XataDialect, {
+ supports: {
+ batching: false,
+ },
+})({ xata });
+
+serve({
+ connection: connection,
+});
+```
+
+
### SQLocal
To use bknd with `sqlocal` for a offline expierence, you need to install the `@bknd/sqlocal` package. You can do so by running the following command:
@@ -138,7 +195,11 @@ const app = createApp({ connection })
## Initial Structure
To provide an initial database structure, you can pass `initialConfig` to the creation of an app. This will only be used if there isn't an existing configuration found in the database given. Here is a quick example:
-```ts
+
+ The initial structure is only respected if the database is empty! If you made updates, ensure to delete the database first, or perform updates through the Admin UI.
+
+
+```typescript
import { createApp } from "bknd";
import { em, entity, text, number } from "bknd/data";
@@ -193,13 +254,17 @@ Note that we didn't add relational fields directly to the entity, but instead de
### Type completion
+To get type completion, there are two options:
+1. Use the CLI to [generate the types](/usage/cli#generating-types-types)
+2. If you have an initial structure created with the prototype functions, you can extend the `DB` interface with your own schema.
+
All entity related functions use the types defined in `DB` from `bknd/core`. To get type completion, you can extend that interface with your own schema:
-```ts
+```typescript
import { em } from "bknd/data";
import { Api } from "bknd/client";
- const schema = em({ /* ... */ });
+const schema = em({ /* ... */ });
type Database = (typeof schema)["DB"];
declare module "bknd/core" {
@@ -217,10 +282,12 @@ The type completion is available for the API as well as all provided [React hook
To seed your database with initial data, you can pass a `seed` function to the configuration. It
provides the `ModuleBuildContext` as the first argument.
-Note that the seed function will only be executed on app's first boot. If a configuration
-already exists in the database, it will not be executed.
+
+ Note that the seed function will only be executed on app's first boot. If a configuration
+ already exists in the database, it will not be executed.
+
-```ts
+```typescript
import { createApp, type ModuleBuildContext } from "bknd";
const app = createApp({