diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..ed2e73c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,267 @@ +# Contributing to bknd + +Thank you for your interest in contributing to bknd. This guide will help you get started, understand the codebase, and submit contributions that align with the project's direction. + +## Table of Contents + +- [Before You Start](#before-you-start) +- [Important Resources](#important-resources) +- [Development Setup](#development-setup) +- [Project Structure](#project-structure) +- [Understanding the Codebase](#understanding-the-codebase) +- [Running Tests](#running-tests) +- [Code Style](#code-style) +- [Submitting Changes](#submitting-changes) +- [AI-Generated Code](#ai-generated-code) +- [Contributing to Documentation](#contributing-to-documentation) +- [Reporting Bugs](#reporting-bugs) +- [Getting Help](#getting-help) +- [Contributors](#contributors) +- [Maintainers](#maintainers) + +## Before You Start + +**Open a GitHub Issue before writing code.** This is the preferred way to propose any change. It lets maintainers and the community align on the approach before time is spent on implementation. If you have discussed a contribution in the [Discord server](https://discord.com/invite/952SFk8Tb8) instead, include a link to the relevant Discord thread in your pull request. Pull requests submitted without a corresponding issue or Discord discussion may be closed. + +**Unsolicited architectural changes will be closed.** The internal architecture of bknd is intentional. Refactors, restructuring, or changes to core patterns must be discussed and approved before any code is written. + +Contributions that are generally welcome (after opening an issue): + +- Bug fixes +- New adapters, strategies, or storage backends +- Documentation improvements +- New examples +- Test coverage improvements + +**A note on versioning**: bknd is pre-1.0 and under active development. Full backward compatibility is not guaranteed before v1.0.0. Contributors should be aware that APIs and internal interfaces may change between releases. + +## Important Resources + +- **Documentation**: https://docs.bknd.io +- **Issue Tracker**: https://github.com/bknd-io/bknd/issues +- **Discord**: https://discord.com/invite/952SFk8Tb8 +- **FAQ / Search**: https://www.answeroverflow.com/c/1308395750564302952 + +## Development Setup + +### Prerequisites + +- Node.js 22.13 or higher +- Bun 1.3.3 + +### Getting Started + +1. Fork the repository and clone your fork. + +2. Install dependencies from the repo root: + + ```bash + bun install + ``` + +3. Navigate to the main app package: + + ```bash + cd app + ``` + +4. Copy the example environment file: + + ```bash + cp .env.example .env + ``` + + The default `.env.example` includes a file-based SQLite database (`file:.db/dev.db`). You can change `VITE_DB_URL` to `:memory:` for an in-memory database instead. + +5. Start the dev server: + + ```bash + bun run dev + ``` + + The dev server runs on `http://localhost:28623` using Vite with Hono. + +## Project Structure + +This is a Bun monorepo using workspaces. The vast majority of the code lives in `app/`. + +``` +bknd/ + app/ # Main "bknd" npm package (this is where most work happens) + src/ + adapter/ # Runtime/framework adapters (node, bun, cloudflare, nextjs, astro, etc.) + auth/ # Authentication module (strategies, sessions, user pool) + cli/ # CLI commands + core/ # Shared utilities, event system, drivers, server helpers + data/ # Data module (entities, fields, relations, queries, schema) + flows/ # Workflow engine and tasks + media/ # Media module (storage adapters, uploads) + modes/ # Configuration modes (code, hybrid, db) + modules/ # Module system, MCP server, permissions framework + plugins/ # Built-in plugins (auth, data, cloudflare, dev) + ui/ # All frontend code + client/ # TypeScript SDK and React hooks (exported as bknd/client) + elements/ # React components for auth/media (exported as bknd/elements) + (everything else) # Admin UI (exported as bknd/ui) + App.ts # Central application orchestrator + index.ts # Main package exports + __test__/ # Unit tests (mirrors src/ structure) + e2e/ # End-to-end tests (Playwright) + build.ts # Build script (tsup/esbuild) + build.cli.ts # CLI build script + packages/ # Small satellite packages + cli/ # Standalone CLI package (bknd-cli) + plasmic/ # Plasmic integration + postgres/ # Postgres helper + sqlocal/ # SQLocal helper + docs/ # Documentation site (Next.js + Fumadocs, deployed to docs.bknd.io) + examples/ # Example projects across runtimes and frameworks + docker/ # Docker configuration +``` + +## Understanding the Codebase + +### Path Aliases + +The project uses TypeScript path aliases defined in `app/tsconfig.json`. Imports like `core/utils`, `data/connection`, or `auth/authenticate` resolve to directories under `app/src/`. When reading source code, keep this in mind -- an import like `import { Connection } from "data/connection"` refers to `app/src/data/connection`, not an external package. + +### Module System + +bknd is built around four core modules, each with its own schema, API routes, and permissions: + +- **Data** -- entity definitions, field types, relations, queries (backed by Kysely) +- **Auth** -- authentication strategies, sessions, user management +- **Media** -- file storage with pluggable adapters (S3, Cloudinary, local filesystem, etc.) +- **Flows** -- workflow automation and task execution + +These modules are managed by the `ModuleManager` (in `app/src/modules/`), which handles configuration, building, and lifecycle. + +### Adapter Pattern + +Adapters in `app/src/adapter/` allow bknd to run on different runtimes and frameworks. Each adapter provides the glue between bknd's Hono-based server and a specific environment (Node, Bun, Cloudflare Workers, Next.js, Astro, etc.). + +### Plugin System + +Plugins (in `app/src/plugins/`) hook into the app lifecycle via callbacks like `beforeBuild`, `onBuilt`, `onServerInit`, and `schema`. They can add entities, register routes, and extend behavior. + +### Build System + +The build is handled by a custom `app/build.ts` script using tsup (esbuild under the hood). It builds four targets in parallel: + +- **API** -- the core backend +- **UI** -- the admin interface +- **Elements** -- standalone React components +- **Adapters** -- all runtime/framework adapters + +## Running Tests + +All test commands run from the `app/` directory. + +| Command | Runner | What it runs | +|---|---|---| +| `bun run test` | Bun test | Unit tests (`*.spec.ts` files) | +| `bun run test:node` | Vitest | Node-specific tests (`*.vi-test.ts`, `*.vitest.ts`) | +| `bun run test:e2e` | Playwright | End-to-end tests (`*.e2e-spec.ts` in `e2e/`) | +| `bun run types` | TypeScript | Type checking (no emit) | + +CI runs both Bun and Node tests, with a Postgres 17 service for database integration tests. + +## Code Style + +The project uses **Biome** for formatting and linting. + +- 3-space indentation for JavaScript/TypeScript +- 100-character line width +- Spaces (not tabs) + +To format and lint, run from the repo root: + +```bash +bunx biome format --write ./app +bunx biome lint --changed --write ./app +``` + +Run both before submitting a PR. CI will catch style issues, but it is better to fix them locally first. + +## Submitting Changes + +1. Open a GitHub Issue describing your proposed change, or link to a Discord thread where it was discussed. Wait for feedback before writing code. +2. Fork the repo and create a branch from `main`. +3. Keep changes focused and minimal. One PR per issue. +4. Add or update tests if applicable. +5. Run the test suite and linter before pushing. +6. Open a pull request against `main`. Reference the issue number in the PR description. + +Expect a response from maintainers, but be patient -- this is an actively developed project and review may take some time. + +## AI-Generated Code + +If you use AI tools to write or assist with your code, you must: + +- **Fully review all AI-generated code yourself** before submitting. You are responsible for understanding and standing behind every line in your PR. +- **Include the prompts used** in the PR description. This gives maintainers additional context for reviewing the code. + +Pull requests with unreviewed AI-generated code will be closed. + +## Contributing to Documentation + +The documentation site lives in the `docs/` directory and is a **separate Next.js application** built with [Fumadocs](https://fumadocs.dev). It uses **npm** (not Bun) as its package manager. + +### Docs Setup + +```bash +cd docs +npm install +npm run dev +``` + +The docs dev server runs on `http://localhost:3000`. + +### Where Documentation Lives + +Documentation content is written in MDX and located in `docs/content/docs/`. The directory is organized into: + +- `(documentation)/` -- core documentation pages +- `guide/` -- guides and tutorials +- `api-reference/` -- API reference (partially auto-generated from OpenAPI) + +To add or edit a page, create or modify an `.mdx` file in the appropriate directory. Page metadata is defined via frontmatter at the top of each file. Navigation order is controlled by `meta.json` files in each directory. + +### Building the Docs + +```bash +npm run build +``` + +This generates the OpenAPI and MCP reference pages before building the Next.js site. Make sure the build succeeds locally before submitting a docs PR. + +## Reporting Bugs + +Open a GitHub Issue with: + +- A clear title describing the problem. +- Steps to reproduce the bug. +- Expected behavior vs. actual behavior. +- Your environment (runtime, database, adapter, bknd version). +- Any relevant error messages or logs. + +## Getting Help + +- **Discord**: https://discord.com/invite/952SFk8Tb8 +- **FAQ / Search**: https://www.answeroverflow.com/c/1308395750564302952 +- **GitHub Issues**: https://github.com/bknd-io/bknd/issues + +## Contributors + +Thank you to everyone who has contributed to bknd. + + + + + +Made with [contrib.rocks](https://contrib.rocks). + +## Maintainers + +- **Dennis** ([@dswbx](https://github.com/dswbx)) -- Creator and maintainer of bknd +- **Cameron Pak** ([@cameronapak](https://github.com/cameronapak)) -- Maintainer of bknd docs diff --git a/README.md b/README.md index 2d08d83..a28f54b 100644 --- a/README.md +++ b/README.md @@ -165,3 +165,19 @@ npx bknd run ```bash npm install bknd ``` + +## Contributing + +We welcome contributions! Please read our [CONTRIBUTING.md](CONTRIBUTING.md) before getting started. It covers dev setup, project structure, testing, code style, and how to submit changes. + +Before writing code, please open a GitHub Issue or start a conversation in [Discord](https://discord.com/invite/952SFk8Tb8) so we can align on the approach. + +## Contributors + +Thank you to everyone who has contributed to bknd. + + + + + +Made with [contrib.rocks](https://contrib.rocks). diff --git a/docs/content/docs/(documentation)/integration/(frameworks)/astro.mdx b/docs/content/docs/(documentation)/integration/(frameworks)/astro.mdx index be96c3a..8313f7d 100644 --- a/docs/content/docs/(documentation)/integration/(frameworks)/astro.mdx +++ b/docs/content/docs/(documentation)/integration/(frameworks)/astro.mdx @@ -170,7 +170,7 @@ export const prerender = false; theme: "dark", logo_return_path: "/../" }} - client:only + client:only="react" /> diff --git a/docs/content/docs/(documentation)/modules/auth.mdx b/docs/content/docs/(documentation)/modules/auth.mdx index 069c7bb..72e082a 100644 --- a/docs/content/docs/(documentation)/modules/auth.mdx +++ b/docs/content/docs/(documentation)/modules/auth.mdx @@ -30,6 +30,25 @@ With a focus on flexibility and ease of integration, bknd's authentication syste --- +## Server Module: `module.auth` + +### `auth.changePassword([userId], [password])` + +To change a user's password, use the `changePassword` method: + +```ts +await app.module.auth.changePassword(user.id, password); +``` + +This method updates the password for the specified user. +- `userId`: The ID of the user whose password should be changed. +- `password`: The new password value. + +This method throws an error if: +- The user with the given `userId` is not found. +- The user's authentication strategy is not `"password"` (e.g. the user registered via an OAuth provider). + + ## Securing Your Admin Portal