npm package: @gleissonneves/liz-api-client
Description: Cliente HTTP baseado em fetch, com suporte a interceptadores, retry automático, timeout e tratamento de erros.
Author: Gleisson Neves
Latest version: 1.1.0

# 📡 API Client - JavaScript Fetch Wrapper
Uma biblioteca de cliente HTTP moderna e extensível, baseada em fetch, com suporte a interceptadores, retry automático, timeout configurável e tratamento de erros avançado.

# ✨ Recursos
✅ baseUrl configurável
✅ Timeout nativo por requisição
✅ Retry automático em erros de rede (configurável)
✅ Interceptadores (onRequest, onResponse, onError)
✅ Tratamento de erros com classe ApiError
✅ Parsing automático de JSON e Text
✅ Controle de query params em requisições GET
✅ Totalmente extensível para middlewares e caching

# 🚀 Instalação
## 🛠️ Uso básico
1. Importação e Instância
```bash
npm install @gleissonneves/liz-api-client
```


```js
import { Api } from "@gleissonneves/liz-api-client";

const api = new Api({
  baseUrl: 'https://api.meuservico.com',
  timeout: 10000, // Opcional (default: 15 segundos)
  maxRetries: 2,  // Opcional (default: 2 tentativas)
});

```

2. Métodos Disponíveis
- api.get(endpoint, queryParams = {}, config = {})
- api.post(endpoint, body = {}, config = {})
- api.put(endpoint, body = {}, config = {})
- api.delete(endpoint, config = {})
- api.setInterceptors({ request, response, error })

# 📚 Exemplos de uso
1. Requisição GET com Query Params
```js
const { data } = await api.get('/usuarios', { ativo: true });
console.log(data);
```

2. Requisição POST com corpo de dados
```js
await api.post('/login', { email: 'email@exemplo.com', senha: '123456' });
```

3. Tratamento de Erros
```js
try {
  const { data } = await api.get('/dados');
} catch (error) {
  if (error instanceof ApiError) {
    console.error('Erro de API', error.status, error.data);
  } else {
    console.error('Erro desconhecido', error);
  }
}
```

## 🔥 Interceptadores
Adicionando Interceptadores Globais

```js
api.setInterceptors({
  request: async (config) => {
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  response: async (response) => {
    // Você pode manipular a resposta aqui
    return response;
  },
  error: async (error) => {
    // Centralize o tratamento de erros aqui
    console.error('Interceptado erro:', error);
    throw error;
  }
});
```

## ⚙️ Configurações aceitas no construtor

| Propriedade | Tipo   | Descrição                                   | Default                                |
|-------------|--------|---------------------------------------------|----------------------------------------|
| baseUrl     | string | URL base para todas as requisições          | ''                                     |
| timeout     | number | Tempo limite em ms para abortar requisição  | 15000                                  |
| maxRetries  | number | Número máximo de tentativas em erro de rede | 2                                      |
| headers     | object | Cabeçalhos padrão                           | { 'Content-Type': 'application/json' } |

# 🧩 Classe de Erro: ApiError
Todos os erros de API são lançados como instâncias de ApiError.

## Atributos disponíveis:
- status: Código HTTP da resposta
- data: Corpo da resposta (JSON ou texto)
- response: Objeto Response original

# 🛡️ Roadmap Futuro

- [] Suporte a cache de respostas (Cache-First)
- [] Middlewares encadeáveis (use(middleware))
- [] Retentativas inteligentes baseadas em erro (retryIf)
- [] Upload progress (com onUploadProgress)
- [] Caching com invalidation (stale-while-revalidate)