Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@isdk/kvsqlite

isdk3590.6.31TypeScript support: included

npm version License: MIT

ai, ai-tool, tool, store, database, sqlite3

readme

KVSqlite

npm version License: MIT

A powerful, document-oriented SQLite Key-Value store with full-text search, built on better-sqlite3.

KVSqlite is a high-performance, persistent Key-Value store that directly extends better-sqlite3. It provides a flexible, MongoDB-like document API on top of SQLite's robust feature set, designed for Node.js applications that need a simple yet powerful local database with advanced features like full-text search and flexible indexing.

✨ Key Features

  • Flexible Document-Style API: Seamlessly store and query complex JSON objects. Fixed fields and JSON data are automatically merged.
  • Automatic Timestamps: createdAt and updatedAt fields are automatically managed by database triggers.
  • Powerful Full-Text Search (FTS5): Integrated support for boolean queries, result ranking, and advanced tokenizers, including pre-packaged Chinese word segmentation.
  • Advanced Indexing: Create unique, partial, and JSON indexes for optimized query performance.
  • Transactional Integrity: ACID-compliant transactions for reliable data manipulation.
  • Extensible: Load custom SQLite extensions and plugins.

📦 Installation

This library requires better-sqlite3 as a peer dependency.

# Using npm
npm install @isdk/kvsqlite better-sqlite3

# Using yarn
yarn add @isdk/kvsqlite better-sqlite3

🚀 Quick Start

The KVSqlite constructor is identical to better-sqlite3's Database constructor. You can pass KVSqlite-specific options in the second argument.

import { KVSqlite } from '@isdk/kvsqlite';

// 1. Initialize the KVSqlite database.
// The constructor is the same as for better-sqlite3's Database.
// Use ':memory:' for an in-memory DB, or a file path for persistence.
const db = new KVSqlite(':memory:');

// By default, a collection named `kv` is created.
// You can operate on it directly from the db instance.
await db.set('some_key', { info: 'default collection data' });
const defaultData = await db.get('some_key');
console.log('Data in default collection:', defaultData);


// 2. Create and use a named collection for structured data (Recommended).
interface User {
  _id: string;
  name: string;
  age: number;
}

// Use the .create() method on the db instance to get a collection.
const users = db.create('users');

// 3. Now, perform operations on the 'users' collection.
const alice: User = {
  _id: 'u001',
  name: 'Alice',
  age: 30,
};
await users.set(alice);

const foundUser = await users.get('u001');
console.log('Found in users collection:', foundUser);

// 4. (Optional) Create collections on initialization.
const dbWithCollections = new KVSqlite(':memory:', {
  collections: ['products', 'orders']
});
const products = dbWithCollections.getCollection('products');
await products.set({ _id: 'p1', name: 'Laptop' });
console.log('Found in products collection:', await products.get('p1'));

Advanced Usage

Full-Text Search (FTS5)

Enable FTS5 when creating a collection to perform advanced text searches.

import { KVSqlite } from '@isdk/kvsqlite';

const db = new KVSqlite(':memory:');

const posts = db.create('posts', {
  // Enable FTS on creation
  fts: true,
});

await posts.bulkDocs([
  { _id: 'p01', content: 'SQLite is a powerful and fast database engine.' },
  { _id: 'p02', content: 'KVSqlite provides a simple API for SQLite.' },
]);

// Search for one or more terms
const results = await posts.searchFts('powerful OR simple');
console.log(results);

KVSqlite comes with a pre-built plugin for Chinese word segmentation.

import { KVSqlite } from '@isdk/kvsqlite';

const db = new KVSqlite(':memory:');

const articles = db.create('articles', {
  fts: {
    language: 'zh', // Enable the Chinese tokenizer
  },
});

await articles.set({ _id: 'a01', content: '数据库是一个非常有用的工具' });

// The search query will be tokenized automatically
const results = await articles.searchFts('数据库 工具');
console.log(results);

Using Custom Fields and Indexes

You can define a fixed schema with typed fields and create indexes for faster queries.

import { KVSqlite } from '@isdk/kvsqlite';

const db = new KVSqlite(':memory:');

const products = db.create('products', {
  // Define fixed fields alongside the default '_id' and 'val'
  fields: {
    category: { type: 'TEXT' },
    price: { type: 'REAL' },
  },
  indexes: [
    // Create an index on the 'category' field
    { name: 'category_idx', fields: ['category'] },
    // Create a partial index for expensive products
    { name: 'expensive_idx', fields: ['price'], partial: 'price > 1000' },
  ],
});

await products.set({ _id: 'prod01', category: 'electronics', price: 1200, val: { name: 'Laptop' } });

// This query will be fast due to the index
const electronics = await products.searchEx({ category: 'electronics' });
console.log(electronics);

📚 API Documentation

For a detailed API reference, please see the generated TypeDoc documentation.

📜 License

This project is licensed under the MIT License. See the LICENSE-MIT file for details.