u/jbeduya

I'm loving this!


import { Validator as v, rule } from '@bunnykit/orm/validation';

export const baseAdmissionSchema = v.schema({
	student_mode: rule().enum(StudentModeEnum),
	student_id: rule().string().requiredIf('student_mode', StudentModeEnum.EXISTING),
	semester_id: rule().string().required(),
	first_name: rule().string().requiredIf('student_mode', StudentModeEnum.NEW),
	last_name: rule().string().requiredIf('student_mode', StudentModeEnum.NEW),
	middle_name: rule().string(),
	lrn: rule().string(),
	birthdate: rule().date().string().requiredIf('student_mode', StudentModeEnum.NEW),
	gender: rule().string().requiredIf('student_mode', StudentModeEnum.NEW),
	branch_id: rule()
		.required()
		.string()
		.default((await Branch.first())?.id ?? ''),
	program_id: rule().string().required(),
	year_level: rule().number().required(),
	section_id: rule().string(),
	academic_level_id: rule().string().required(),
	guardians: rule().sometimes().array().max(2),
	'guardians.*.firstname': rule().required().string(),
	'guardians.*.lastname': rule().required().string(),
	'guardians.*.contact_number': rule().required().string(),
	'guardians.*.relationship': rule().required().string(),
	'guardians.*.email': rule().string().email().sometimes().nullable()
});


...

import { form } from '$app/server';
import { DB } from '@bunnykit/orm';
import { createAdmissionInputSchema } from './admission.schema';
import Admission from '$module/admission/models/admission';

export const createAdmissionForm = form(createAdmissionInputSchema, async (data) => {
	return await DB.transaction(async () => {
		const { guardians, ...admissionData } = data;
		const admission = await Admission.create(admissionData);

		if (guardians && guardians.length > 0) {
			await admission.guardians().createMany(guardians);
		}

		return { success: true };
	});
});

data?.guardians?.map(g => g.email) are all fully typed!

reddit.com
u/jbeduya — 5 days ago
▲ 7 r/bun+1 crossposts

@bunnykit/storage — Laravel-style file storage for Bun with S3, R2, and local disk support

Just published @bunnykit/storage, a Laravel Storage-inspired file abstraction for Bun.

Features:

  • Local disk + S3-compatible backends (R2, AWS S3, MinIO, Backblaze, DigitalOcean Spaces, Wasabi, Tigris, Supabase)
  • Uses Bun's native Bun.S3Client — zero extra dependencies
  • Simple unified API: put(), get(), delete(), url(), temporaryUrl(), putFromUrl()
  • Extensible: add custom drivers and typed disk names with full autocomplete
  • Optional media tracking layer — upload files and record them in DB, inspired by spatie/laravel-medialibrary

Install:

  bun add @bunnykit/storage

Links:

Feedback welcome!

u/jbeduya — 5 days ago

I missed Laravel's Eloquent so much in SvelteKit that I built it for Bun

u/jbeduya — 7 days ago
▲ 20 r/bun+2 crossposts

Bunny ORM: Eloquent-inspired ORM for Bun with REPL, migrations, and dynamic tenancy

I’ve been building an Eloquent-inspired ORM for Bun called Bunny. I added a multi-tenant aware implementation because I am using this for a SaaS project of mine using Sveltekit + Bun.

It’s designed specifically for Bun’s native sql client, and it currently supports:

- SQLite, MySQL, and PostgreSQL

- Zero runtime dependencies

- TypeScript-first API

- Chainable query builder

- Schema migrations and CLI

- Model relations, observers, soft deletes, and streaming helpers

- Interactive REPL with bunny repl

- Dynamic multi-tenant connection switching

- Landlord / tenant migration groups

- PostgreSQL schema switching and RLS support

A big focus for me has been making multi-tenant apps easier to reason about. The ORM supports tenant resolution at runtime, so apps can switch connections based on request context, subdomain, or header without hardcoding all tenants in config.

Example:

await TenantContext.run("acme", async () => {

const users = await User.all();

});

You can also put a resolveTenant function in bunny.config.ts and reuse the same config in the CLI and app bootstrap.

I’m sharing it here in case it’s useful to anyone building on Bun, especially if you’ve wanted an ORM that feels more like

Eloquent but is Bun-native.

Repo: https://github.com/bunnykit/orm

Would love feedback on:

- the API shape

- multi-tenant design

- SQLite/MySQL/Postgres support

- anything that feels awkward or missing

u/jbeduya — 5 days ago