UNPKG

@aurios/jason

Version:

A simple, lightweight, and embeddable JSON document database built on Bun.

190 lines (140 loc) • 5.33 kB
# jason db šŸ“¦ ![image with logo and name of package](./static/markdown-image.png) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/mit-license.php) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com) [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/your/repo/graphs/commit-activity) [![Made with Bun](https://img.shields.io/badge/Bun-%23000000.svg?style=flat&logo=bun&logoColor=white)](https://bun.sh) ![Node Current](https://img.shields.io/node/v/%40aurios%2Fjason?style=flat&logo=node.js&labelColor=000) [![TypeScript](https://img.shields.io/badge/TypeScript-%23007ACC.svg?style=flat&logo=typescript&logoColor=white)](https://www.typescriptlang.org/) ![npm bundle size](https://img.shields.io/bundlephobia/min/%40aurios%2Fjason?style=flat) ![NPM Downloads](https://img.shields.io/npm/dw/%40aurios%2Fjason?style=flat&logo=npm) ![GitHub Repo stars](https://img.shields.io/github/stars/realfakenerd/jason) > šŸš€ A simple, lightweight, and embeddable JSON database built with Bun jason is the perfect solution when you need a fast and easy-to-use JSON database in your Bun projects. With features like schema validation, concurrency control, and built-in caching, it provides everything you need in a simple package. ## ✨ Highlights - šŸ“ **Simple API** - CRUD and query JSON documents with just a few lines of code - 🪶 **Lightweight & Embeddable** - Easy integration without adding bloat to your project - āœ… **Schema Validation** - Ensure your data integrity - šŸ”’ **Concurrency Control** - Prevent update conflicts - šŸ“š **Versioning Support** - Track document changes - ⚔ **Built-in Caching** - Improve read performance - šŸ” **Query System** - Find documents with custom criteria ## šŸš€ Installation ```sh bun add @aurios/jason # or npm i @aurios/jason ``` ## šŸ’» Quick Example ```typescript import { createJasonDB } from "@aurios/jason"; // Initialize the database const db = await createJasonDB({ base_path: "./my-db", collections: { // Define schema using the simple string syntax users: "name;email;age:number;isActive:boolean" } }); const { users } = db.collections; // Create a document await users.create({ name: "John Smith", email: "john@example.com", age: 30, isActive: true }); // Find documents const adults = await users.find({ where: { age: { _tag: "gte", value: 18 } } }); ``` ## šŸ› ļø Core API ### šŸ“¦ Initialization Use `createJasonDB` to initialize your database instance. You define your collections and their schemas in the configuration. ```typescript const db = await createJasonDB({ base_path: "./data", // Directory to store data collections: { // String syntax: "field1;field2:type;..." posts: "@id;title;content;published:boolean;*tags", // You can also use Effect Schema objects if preferred // users: Schema.Struct({ ... }) } }); ``` ### šŸ“ Schema String Syntax The string syntax provides a shorthand for defining fields and indexes: * **Format**: `name:type` (type defaults to string if omitted) * **Types**: `string`, `number`, `boolean`, `date`, `array<T>`, `record<K,V>` * **Modifiers**: * `@id`: UUID Primary Key * `++id`: Auto-increment Primary Key * `&name`: Unique Index * `*tags`: Multi-entry Index (for arrays) * `[a+b]`: Compound Index ### šŸ“‘ Collection Operations Access collections via `db.collections.<name>`. ```typescript const collection = db.collections.posts; // Create const post = await collection.create({ title: "Hello World", tags: ["news", "tech"] }); // Read (by ID) const item = await collection.findById(post.id); // Update await collection.update(post.id, { title: "Updated Title" }); // Delete await collection.delete(post.id); // Check existence const exists = await collection.has(post.id); ``` ### šŸ” Querying Use `find` or `findOne` with a rich query language. ```typescript // Simple equality const results = await collection.find({ where: { published: true } }); // Comparison operators // Available tags: eq, ne, gt, gte, lt, lte, in, nin, startsWith, regex const recent = await collection.find({ where: { views: { _tag: "gt", value: 100 }, title: { _tag: "startsWith", value: "How to" } }, order_by: { field: "createdAt", order: "desc" }, limit: 10 }); // Batch Operations await collection.batch.insert([ ... ]); await collection.batch.update({ category: "tech" }, { published: true }); await collection.batch.delete({ archived: true }); ``` ## šŸ¤ Contributing Contributions are welcome! 1. šŸ“ Fork the project 2. šŸ”§ Create your feature branch (`git checkout -b feature/AmazingFeature`) 3. šŸ“ Commit your changes (`git commit -m 'Add: amazing feature'`) 4. šŸ“¤ Push to the branch (`git push origin feature/AmazingFeature`) 5. šŸ” Open a Pull Request ## šŸ›  Development ```sh # Clone the repo git clone https://github.com/realfakenerd/jason # Install dependencies bun install # Run tests bun test # Build project bun run build ``` ## šŸ“„ License Distributed under the [MIT License](../LICENSE) --- ⭐ If this project helped you, consider giving it a star! šŸ“« Questions? Open an issue or get in touch!