npm package: @simjrlouz/catchless
Description: Stop try/catch hell. Handle errors as data.
Latest version: 1.0.0

# 🎣 Catchless

> Stop the `try/catch` hell. Handle async errors like a pro.
> En finissez avec l’enfer des `try/catch`. Gérez vos erreurs asynchrones comme un pro.

![Bundle Size](https://img.shields.io/bundlephobia/min/catchless?label=size)
![Language](https://img.shields.io/github/languages/top/votre-pseudo/catchless)

---

## 💡 Why Catchless? / Pourquoi Catchless ?

**EN:**
In JavaScript/TypeScript, handling async errors often leads to deeply nested code and unreadable `try/catch` blocks.
**Catchless** brings the **“Error as Data”** pattern (inspired by Go and Rust) to your codebase, making your code linear, clean, and type-safe.

**FR :**
En JavaScript/TypeScript, la gestion des erreurs asynchrones mène souvent à un code imbriqué et des blocs `try/catch` illisibles.
**Catchless** introduit le pattern **« l’erreur comme donnée »** (inspiré de Go et Rust) pour un code plus lisible, linéaire et sécurisé (type-safe).

---

## 🔍 Comparison / Comparaison

### ❌ Before / Avant

```ts
async function getUser() {
  try {
    const res = await fetch('/api/user');
    const user = await res.json();
    return user;
  } catch (error) {
    console.error(error);
    return null;
  }
}
```

### ✅ With Catchless / Avec Catchless

```ts
import { safe } from 'catchless';

async function getUser() {
  const [user, err] = await safe(api.getUser());

  if (err) {
    console.error(err);
    return null;
  }

  return user;
}
```

---

## 📦 Installation

```bash
npm install catchless
# or / ou
yarn add catchless
# or / ou
pnpm add catchless
```

---

## 🛠 Features / Fonctionnalités

### 1️⃣ Simple Safe Call

**EN:** Wraps any promise into a simple `[data, error]` tuple.
**FR :** Enveloppe n’importe quelle promesse dans un tuple `[data, error]`.

```ts
const [data, err] = await safe(myPromise);
```

---

### 2️⃣ With Timeout

**EN:** Prevents your application from hanging forever if an API is too slow.
**FR :** Empêche votre application de rester bloquée si une API est trop lente.

```ts
// Fails if not resolved after 2000ms
const [data, err] = await safeWithTimeout(api.getData(), 2000);
```

---

### 3️⃣ Fully Type-Safe

**EN:** Automatically infers data types. No more `any`.
**FR :** Inférence automatique des types. Fini le `any`.

```ts
const [user, err] = await safe<User>(fetchUser());

// user: User | null
// err: Error | null
```

---

## 🧩 Advanced Usage / Usage Avancé

**EN:** Specify a custom error type for domain-specific error handling.
**FR :** Spécifiez un type d’erreur personnalisé pour une meilleure gestion métier.

```ts
type MyApiError = {
  code: number;
  message: string;
};

const [data, err] = await safe<User, MyApiError>(fetchUser());

if (err) {
  console.log(err.code);
}
```

---

## 📊 Benefits / Avantages

* **Zero Dependencies** — Built with pure TypeScript
* **Ultra-lightweight** — Less than 500 bytes (minified + gzipped)
* **Linear Flow** — Reduces cognitive load by removing deep nesting

---

* **Zéro dépendance** — Construit en pur TypeScript
* **Ultra-léger** — Moins de 500 octets (minifié + gzippé)
* **Flux linéaire** — Réduit la charge cognitive en supprimant l’imbrication

---

## 🤝 Contributing

**EN:** Contributions are welcome! Feel free to open an issue or a pull request.
**FR :** Les contributions sont les bienvenues ! Ouvrez une issue ou une pull request.

---

## 📄 License

MIT © LOUZOLO Sim-Jr Steeven / sim-jr