npm package: @furkibu/aiko.db
Description: A simple, modern, and asynchronous JSON database for Node.js.
Author: FurkiBu
Latest version: 0.0.7

# @furkibu/aiko.db

![NPM Version](https://img.shields.io/npm/v/@furkibu/aiko.db?style=for-the-badge&logo=npm)
![Downloads](https://img.shields.io/npm/dm/@furkibu/aiko.db?style=for-the-badge)
![License](https://img.shields.io/npm/l/@furkibu/aiko.db?style=for-the-badge)
![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&logo=typescript&logoColor=white)

Node.js için geliştirilmiş, modern, hızlı ve reaktif bir JSON veritabanı. `aikodb`'nin manevi devamı olarak, daha güçlü ve esnek özelliklerle donatılmıştır.

## ✨ Öne Çıkan Özellikler

* **🚀 Asenkron Yapı:** Performans kaybı yaşamadan `async/await` ile tüm veritabanı işlemlerini gerçekleştirin.
* **⚡ Dahili Önbellek (Caching):** Sık erişilen veriler için dosya okuma/yazma işlemlerini en aza indirerek hızı en üst düzeye çıkarır.
* **📡 Olay Yayıcı (Event Emitter):** Veritabanında bir değişiklik olduğunda (`set`, `delete` vb.) anında haberdar olun!
* **📦 Nokta Notasyonu Desteği:** `user.profile.name` gibi iç içe geçmiş verilere kolayca erişin.
* **🛡️ Varsayılan Değer Atama (`ensure`):** Veri yoksa otomatik olarak varsayılan bir değer atayarak kodunuzu basitleştirin.
* **🔍 Esnek Sorgulama & Filtreleme:** `find` ile tek bir veri bulun veya `filter` ile bir koşula uyan tüm verileri getirin.
* **🗂️ Gelişmiş Dizi Yönetimi:** `push()` ile eleman ekleyin, `pull()` ile koşula göre eleman çıkarın.
* **🔢 Matematiksel İşlemler:** `add()` ve `subtract()` ile sayısal verileri atomik olarak artırın veya azaltın.
* **💾 Tek Satırda Yedekleme:** `backup()` metodu ile veritabanınızı kolayca yedekleyin.
* **🤝 Sıfır Bağımlılık:** Projenize gereksiz yük bindirmez.
* **TypeScript Desteği:** Tamamen TypeScript ile yazılmıştır, bu sayede modern ve tip güvenli bir geliştirme deneyimi sunar.

## 💾 Kurulum

```bash
npm install @furkibu/aiko.db
```

## ⚡ Hızlı Başlangıç

```javascript
//const {AikoDB} = require("@furkibu/aiko.db")
import { AikoDB } from '@furkibu/aiko.db';

const db = new AikoDB('server-data.json');

// --- Olayları Dinleme ---
// Veritabanında bir veri değiştiğinde anında tepki ver
db.on('set', (key, newValue) => {
  console.log(`[DEĞİŞİKLİK] Anahtar: '${key}' | Yeni Değer: ${JSON.stringify(newValue)}`);
});

// Bir veri silindiğinde
db.on('delete', (key) => {
  console.log(`[SİLME] Anahtar: '${key}' silindi.`);
});

// --- Asenkron Fonksiyon ---
async function main() {
  // `set` olayı tetiklenecek
  await db.set('config.prefix', '!'); 
  
  // `set` olayı tetiklenecek
  await db.set('users', [{ id: '1', name: 'Furkan', level: 99 }]);

  // `delete` olayı tetiklenecek
  await db.delete('config');
}

main();

/*
  KONSOL ÇIKTISI:
  [DEĞİŞİKLİK] Anahtar: 'config.prefix' | Yeni Değer: "!"
  [DEĞİŞİKLİK] Anahtar: 'users' | Yeni Değer: [{"id":"1","name":"Furkan","level":99}]
  [SİLME] Anahtar: 'config' silindi.
*/
```

## 📚 API Referansı

### Temel İşlemler

* `.set(key, value)`: Bir anahtara değer atar. Nokta notasyonunu destekler. (`set` olayını tetikler)
* `.get(key)`: Bir anahtarın değerini döndürür.
* `.has(key)`: Bir anahtarın var olup olmadığını kontrol eder (`true`/`false`).
* `.delete(key)`: Bir anahtar-değer çiftini siler. (`delete` olayını tetikler)
* `.clear()`: Veritabanındaki tüm verileri temizler. (`clear` olayını tetikler)

### Sayı & Dizi İşlemleri

* `.add(key, amount)`: Sayısal bir değere ekleme yapar. (`set` olayını tetikler)
* `.subtract(key, amount)`: Sayısal bir değerden çıkarma yapar. (`set` olayını tetikler)
* `.push(key, ...values)`: Bir diziye bir veya daha fazla eleman ekler. (`set` olayını tetikler)
* `.pull(key, callback)`: Bir diziden, `callback` koşulunu sağlayan elemanları çıkarır. (`set` olayını tetikler)

### Sorgulama & Veri Yönetimi

* `.all()`: Veritabanındaki tüm veriyi bir JavaScript objesi olarak döndürür.
* `.size()`: Veritabanındaki ana (top-level) anahtar sayısını döndürür.
* `.ensure(key, defaultValue)`: Bir anahtarın var olduğundan emin olur. Yoksa `defaultValue` atar. (`set` olayını tetikleyebilir)
* `.find(callback)`: Bir koşula uyan **ilk** veriyi bulur. Dizilerin içini de arar.
* `.filter(callback)`: Bir koşula uyan **tüm** verileri bir dizi olarak döndürür.

### Yardımcı Programlar

* `.backup(filePath)`: Veritabanının belirtilen yola bir yedeğini oluşturur.

---

### Olaylar (Events)

`AikoDB`, `EventEmitter` sınıfından miras alır. Bu sayede veritabanındaki değişiklikleri dinleyebilirsiniz.

* **`.on('set', (key, newValue) => { ... })`**
  Bir veri eklendiğinde veya güncellendiğinde tetiklenir. `add`, `subtract`, `push`, `pull`, `ensure` metotları da bu olayı tetikler.

* **`.on('delete', (key) => { ... })`**
  Bir veri silindiğinde tetiklenir.

* **`.on('clear', () => { ... })`**
  Veritabanı temizlendiğinde tetiklenir.

```javascript
// Bir olayı sadece bir kez dinlemek için .once() kullanabilirsiniz
db.once('set', (key, value) => {
  console.log('İlk veri başarıyla ayarlandı!');
});
```

### Discord Botunda 

```javascript

const { Client, GatewayIntentBits } = require('discord.js');
const { AikoDB } = require('@furkibu/aiko.db'); 

const client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent
    ]
});


const db = new AikoDB('aikodb.json');


// Veritabanında bir veri değiştiğinde veya eklendiğinde bu olay tetiklenir
db.on('set', (key, newValue) => {
    console.log(`[VERİTABANI] Değişiklik algılandı: ${key} -> ${JSON.stringify(newValue)}`);
    
    // Eğer değişen anahtar 'prefix' ise, botun durumunu güncelle
    // Botun o an online olduğundan emin olmak için (client.user null olmasın diye) kontrol ekleyelim
    if (key === 'prefix' && client.user) {
        const newStatus = `Yeni prefix: ${newValue}`;
        client.user.setActivity(newStatus);
        console.log(`[BOT] Bot durumu güncellendi: ${newStatus}`);
    }
});

// Veritabanı temizlendiğinde
db.on('clear', () => {
    console.log('[VERİTABANI] Tüm veritabanı temizlendi!');
    if (client.user) {
        client.user.setActivity('Ayarlar sıfırlandı!');
    }
});


client.on('ready', async () => {
    console.log(`${client.user.tag} adıyla giriş yapıldı!`);
    
    // Bot başladığında, veritabanından prefix'i kontrol et
    // Eğer 'prefix' ayarlanmamışsa, varsayılan olarak '!' ata
    const prefix = await db.ensure('prefix', '!');
    
    // Botun durumunu ayarla
    client.user.setActivity(`Prefix: ${prefix}`);
    console.log(`[BOT] Aktif prefix: ${prefix}`);
});

// 4. Komutları Yönetme (MessageCreate) Olayı
client.on('messageCreate', async message => {
    if (message.author.bot) return;

    // Mevcut prefix'i veritabanından al
    const prefix = await db.get('prefix'); // ensure sayesinde artık '!' olduğundan eminiz

    // Mesaj prefix ile başlamıyorsa ignore'la
    if (!message.content.startsWith(prefix)) return;

    const args = message.content.slice(prefix.length).trim().split(/ +/);
    const command = args.shift().toLowerCase();

    // --- Prefix Ayarlama Komutu ---
    if (command === 'setprefix') {
        const newPrefix = args[0];
        if (!newPrefix) {
            return message.channel.send('Lütfen yeni bir prefix girin. (Örn: `!setprefix ?`)');
        }
        
        // Veritabanını güncelle
        // BU SATIR, YUKARIDAKİ db.on('set', ...) OLAYINI TETİKLEYECEK!
        await db.set('prefix', newPrefix); 
        
        message.channel.send(`Prefix başarıyla \`${newPrefix}\` olarak ayarlandı!`);
    }

    // --- Diğer Komutlar ---
    if (command === 'ping') {
        message.channel.send('Pong!');
    }
    
    if (command === 'profil') {
        // Kullanıcının parasını (yoksa 0 ata) getir
        const balance = await db.ensure(`users.${message.author.id}.balance`, 0);
        message.channel.send(`${message.author.username}, şu an ${balance} altının var.`);
    }

    if (command === 'calis') {
        // Kullanıcının parasına rastgele 10-50 arası altın ekle
        const kazanc = Math.floor(Math.random() * 41) + 10;
        const newBalance = await db.add(`users.${message.author.id}.balance`, kazanc);
        message.channel.send(`Çalıştın ve ${kazanc} altın kazandın! Yeni bakiyen: ${newBalance} altın.`);
    }
});


// Botu Discord'a bağla
client.login('Token');

```

## 🤝 Katkıda Bulunma

Katkılarınız ve fikirleriniz projeyi daha iyi hale getirecektir. Lütfen bir "issue" açmaktan veya "pull request" göndermekten çekinmeyin.

## 📜 Lisans

Bu proje MIT Lisansı ile lisanslanmıştır.