npm package: @jeandev_2030/jsdb
Description: 🗄️ Banco de dados JSON modular, escalável e puro com Node.js - Sem dependências externas
Author: JsByte
Latest version: 2.0.4

# 🗄️ JsDB - Banco de Dados JSON Modular

Um banco de dados JSON **modular**, **escalável** e **puro** com Node.js. Sem dependências externas, pronto para produção!

![Version](https://img.shields.io/badge/version-2.0.0-blue)
![Node](https://img.shields.io/badge/node-%3E%3D10.0.0-green)
![License](https://img.shields.io/badge/license-MIT-yellow)

---

## ✨ Características

✅ **Totalmente Modular** - Arquitetura escalável e bem organizada  
✅ **Zero Dependências** - Usa apenas o Node.js nativo  
✅ **Type Safe** - Validação de dados integrada  
✅ **Performance** - Sistema de índices para buscas rápidas  
✅ **Persistência Automática** - Salva dados em JSON automaticamente  
✅ **API Simples** - Fácil de usar e aprender  
✅ **Pronto para Npm** - Pode ser instalado em qualquer projeto  

---

## 📦 Instalação

### Local (desenvolvimento)
```bash
git clone https://github.com/jeanbyte2030-ops/JsDB.git
cd JsDB
npm install
```





## 🚀 Uso Rápido

### 1. Importar o módulo

```javascript
const { Database } = require('./index');
// ou
const JsDB = require('./index');
const { createDatabase } = JsDB;
```

### 2. Criar database

```javascript
const db = new Database('./meu-database.json');

// ou usar factory function
const db = createDatabase('./meu-database.json');
```

### 3. Criar tabelas

```javascript
db.createTable('usuarios');
db.createTable('posts');
```

### 4. Operações CRUD

#### CREATE (Inserir)
```javascript
const novoUsuario = db.insert('usuarios', {
  nome: 'João Silva',
  email: 'joao@email.com',
  idade: 25
});

console.log(novoUsuario);
// { id: '1234567890abc', nome: 'João Silva', email: 'joao@email.com', idade: 25, createdAt: '2025-01-23T...' }
```

#### READ (Buscar)
```javascript
// Buscar todos
const todos = db.findAll('usuarios');

// Buscar por ID
const usuario = db.findById('usuarios', 'id-do-usuario');

// Buscar com filtro
const resultado = db.find('usuarios', { idade: 25 });
const resultado = db.find('usuarios', { ativo: true });

// Buscar com função (predicate)
const maioresDeIdade = db.find('usuarios', user => user.idade >= 18);
```

#### UPDATE (Atualizar)
```javascript
db.update('usuarios', 'id-do-usuario', {
  idade: 26,
  ativo: false
});
```

#### DELETE (Deletar)
```javascript
// Deletar um registro
db.delete('usuarios', 'id-do-usuario');

// Deletar toda tabela
db.dropTable('usuarios');
```

---

## 🧪 CLI Interativo (estilo mongosh)

Você pode usar o JsDB no terminal para gerenciar tabelas e registros.

### Rodar localmente
```bash
node bin/jsdb
```

### Escolher arquivo
```bash
node bin/jsdb --file ./meu-db.json
```

### Usando como comando global (após npm link)
```bash
npm link
jsdb --file ./meu-db.json
```

### Comandos principais
```text
help
use <arquivo>
show tables
create table <tabela>
drop table <tabela>
insert <tabela> <json>
find <tabela> <json>
findall <tabela>
findbyid <tabela> <id>
update <tabela> <id> <json>
delete <tabela> <id>
deleteall <tabela>
count <tabela>
info
save
load
config <json>
exit
```

### Exemplos
```text
create table usuarios
insert usuarios {"nome":"Ana","idade":22}
find usuarios {"idade":22}
update usuarios 123 {"ativo":true}
delete usuarios 123
```

## 📚 API Completa

### Database Methods

| Método | Descrição | Exemplo |
|--------|-----------|---------|
| `createTable(nome, registros?)` | Cria nova tabela | `db.createTable('usuarios')` |
| `insert(tabela, obj)` | Insere registro | `db.insert('usuarios', {...})` |
| `findAll(tabela)` | Lista todos | `db.findAll('usuarios')` |
| `findById(tabela, id)` | Busca por ID | `db.findById('usuarios', id)` |
| `find(tabela, filtro)` | Busca com filtro/predicate | `db.find('usuarios', {ativo: true})` |
| `update(tabela, id, obj)` | Atualiza | `db.update('usuarios', id, {...})` |
| `delete(tabela, id)` | Deleta | `db.delete('usuarios', id)` |
| `count(tabela)` | Conta registros | `db.count('usuarios')` |
| `getTables()` | Lista tabelas | `db.getTables()` |
| `dropTable(tabela)` | Remove tabela | `db.dropTable('usuarios')` |
| `deleteAll(tabela)` | Limpa todos os registros | `db.deleteAll('usuarios')` |
| `configure(config)` | Configura DB | `db.configure({autoSave: true})` |
| `save()` | Salva manualmente | `db.save()` |
| `load()` | Carrega do arquivo | `db.load()` |
| `getInfo()` | Info do database | `db.getInfo()` |

---

## ⚙️ Configuração

```javascript
const db = new Database('./data.json');

// ou passar config no construtor
const dbComConfig = new Database('./data.json', {
  autoSave: true,
  prettyPrint: true,
  encoding: 'utf-8'
});

// Configurar opções
db.configure({
  autoSave: true,      // Salva automaticamente após cada operação
  prettyPrint: true,   // Formata JSON com indentação
  encoding: 'utf-8'    // Encoding do arquivo
});
```

---

## 💡 Exemplos Práticos

### Exemplo 1: Gerenciador de Tarefas

```javascript
const { Database } = require('@jeanbyte/jsdb');

const db = new Database('./tarefas.json');

// Criar tabela
db.createTable('tarefas');

// Adicionar tarefas
db.insert('tarefas', {
  titulo: 'Estudar JavaScript',
  concluida: false,
  prioridade: 'alta'
});

db.insert('tarefas', {
  titulo: 'Fazer exercícios',
  concluida: true,
  prioridade: 'média'
});

// Buscar tarefas não concluídas
const pendentes = db.find('tarefas', { concluida: false });
console.log('Tarefas pendentes:', pendentes);

// Marcar como concluída
const tarefa = db.findAll('tarefas')[0];
db.update('tarefas', tarefa.id, { concluida: true });
```

### Exemplo 2: Sistema de Blog

```javascript
const db = new Database('./blog.json');

// Criar tabelas
db.createTable('posts');
db.createTable('comentarios');

// Criar post
const post = db.insert('posts', {
  titulo: 'Meu primeiro post',
  conteudo: 'Lorem ipsum...',
  autor: 'João',
  likes: 0
});

// Adicionar comentários
db.insert('comentarios', {
  postId: post.id,
  autor: 'Maria',
  texto: 'Adorei o post!'
});

// Buscar comentários de um post
const comentarios = db.find('comentarios', { postId: post.id });
console.log(`Post tem ${comentarios.length} comentários`);
```

### Exemplo 3: Ecommerce Simplificado

```javascript
const db = new Database('./ecommerce.json');

db.createTable('produtos');
db.createTable('carrinho');

// Catálogo
const notebook = db.insert('produtos', {
  nome: 'Notebook',
  preco: 3500,
  estoque: 10,
  categoria: 'eletrônicos'
});

// Carrinho do cliente
db.insert('carrinho', {
  clienteId: 'cliente-123',
  produtoId: notebook.id,
  quantidade: 2,
  precoTotal: 7000
});

// Atualizar estoque
db.update('produtos', notebook.id, {
  estoque: 8
});

// Gerar relatório
console.log(`Total de produtos: ${db.count('produtos')}`);
console.log(`Itens no carrinho: ${db.count('carrinho')}`);
```

---

## 📂 Estrutura do Projeto

```
JsDB/
├── bin/
│   └── jsdb             # CLI do terminal
├── index.js              # Entry point do módulo
├── src/
│   ├── cli.js           # CLI interativo
│   ├── Database.js       # Classe principal
│   ├── Table.js          # Classe de tabela
│   └── Utils.js          # Utilitários
├── examples/
│   ├── exemplo1-basico.js
│   ├── exemplo2-avancado.js
│   └── exemplo3-modulo.js
├── data.json             # Arquivo de dados
├── package.json          # Metadados
└── README.md             # Este arquivo
```

---

## 🧪 Testando

```bash
# Executar exemplo básico
npm run example:basico

# Executar exemplo avançado
npm run example:avancado

# Executar exemplo como módulo
npm run example:modulo

# Teste rápido
npm test
```

---

## 🎯 Casos de Uso

- ✅ Prototipagem rápida
- ✅ Pequenas aplicações
- ✅ Projetos de aprendizado
- ✅ APIs serverless (Lambda, Vercel)
- ✅ Aplicações CLI
- ✅ Sistemas de cache
- ✅ Configurações persistentes

---

## ⚡ Performance

- **Inserção**: O(1) - Tempo constante
- **Busca por ID**: O(1) - Via índice hash
- **Busca com filtro**: O(n) - Varredura linear
- **Atualização**: O(1) - Via índice hash
- **Deleção**: O(1) - Via índice hash

---

## 🔒 Segurança

- Validação de dados
- Isolamento de contexto por tabela
- Clone profundo dos dados (previne mutações)
- Tratamento de erros

---

## 📝 Licença

MIT © 2026 JsByte

---

## 🤝 Contribuindo

Contribuições são bem-vindas! Sinta-se à vontade para:

1. Fazer um Fork
2. Criar uma branch para sua feature (`git checkout -b feature/NovaFeature`)
3. Commit suas mudanças (`git commit -m 'Add Nova Feature'`)
4. Push para a branch (`git push origin feature/NovaFeature`)
5. Abrir um Pull Request

---

## 📞 Suporte

- 📧 Email: dev@jsbyte.com.br
- 🐙 GitHub: [@jeanbyte2030-ops](https://github.com/jeanbyte2030-ops)
- 💬 Issues: [Abrir issue](https://github.com/jeanbyte2030-ops/JsDB/issues)

---

## 🗺️ Roadmap

- [ ] Suporte a transações
- [ ] Sistema de backup automático
- [ ] Criptografia de dados
- [ ] Sistema de permissões
- [x] CLI Tool
- [ ] Web Dashboard
- [ ] Replicação de dados
- [ ] Publicar no NPM

---

**Desenvolvido ❤️ para a comunidade Node.js**