npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

one-request-4-all

v0.7.3

Published

<p align="center"> <img src="https://i.imgur.com/zUBBeJx.png" align="center" width=600 /> <p align="center"><strong>Native Node.js fetch implementation with axios interface</strong></p> <p align="center">Just swap the import and use a lighter, nati

Readme


🎯 Why one-request-4-all?

Tired of heavy HTTP libraries? one-request-4-all is a lightweight, native Node.js fetch implementation that provides the exact same interface as axios. Just change the import and enjoy a smaller bundle size!

✨ Key Features

📦 Installation

# npm
npm install r3q

# yarn
yarn add r3q

# bun
bun add r3q

🚀 Quick Start

Basic Usage

import reqify from "r3q";

// GET request
const response = await reqify.get("https://api.example.com/users");
console.log(response.data);

// POST request
const newUser = await reqify.post("https://api.example.com/users", {
  name: "John Doe",
  email: "[email protected]",
});

Drop-in Replacement for Axios

// Before (with axios)
import axios from "axios";

// After (with reqify)
import reqify from "r3q";

// Same interface, same usage!
const response = await reqify.get("/api/users", {
  headers: {
    Authorization: "Bearer token",
  },
});

📚 API Reference

Request Methods

// GET, DELETE, HEAD, OPTIONS
await reqify.get<T>(url, config?)
await reqify.delete<T>(url, config?)
await reqify.head<T>(url, config?)
await reqify.options<T>(url, config?)

// POST, PUT, PATCH
await reqify.post<T>(url, data?, config?)
await reqify.put<T>(url, data?, config?)
await reqify.patch<T>(url, data?, config?)

// Generic request
await reqify<T>(config)
await reqify<T>(url, config)

Request Configuration

interface reqify<D = any> {
  url: string;
  method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';
  headers?: Record<string, string>;
  data?: D;
  params?: Record<string, string | number | boolean>;
  responseType?: 'json' | 'text' | 'stream';
}

Response Object

interface one-request-4-allResponse<T = any, D = any> {
  data: T;
  status: number;
  statusText: string;
  headers: Headers;
  config: reqify<D>;
  request: Response;
}

🔧 Auto-Healing

one-request-4-all includes a powerful auto-healing system that automatically detects and recovers from common HTTP errors:

// Auto-healing is enabled by default
const response = await reqify.get("https://api.example.com/data", {
  maxRetries: 3, // Number of retry attempts (default: 3)
  timeout: 5000, // Initial timeout in ms (default: 5000)
  autoHeal: true, // Enable auto-healing (default: true)
});

// Check if the request was healed
if (response.healed) {
  console.log("✅ Request was automatically healed!");
  console.log("Message:", response.healMessage);
  // Example: "Rate limited - retry after 1000ms"
}

Supported Error Recovery

  • 401 Unauthorized: Increases timeout and retries
  • 403 Forbidden: Adjusts timeout for permission checks
  • 413 Payload Too Large: Removes optional fields from payload (description, metadata, avatar, etc.)
  • 422 Validation Error: Creates values based on expected types
  • 429 Rate Limit: Respects Retry-After header or uses exponential backoff
  • Timeout: Progressively increases timeout (max 30s)
  • Network Errors: Retries with increased timeout
  • Parse Errors: Handles malformed JSON responses

Value Creation Heuristic

When validation fails (422 error), one-request-4-all automatically creates values based on the expected type:

import { createValueFromType } from "r3q";

createValueFromType("expected email"); // "[email protected]"
createValueFromType("must be number"); // 0
createValueFromType("expected uuid"); // "00000000-0000-0000-0000-000000000000"

📖 Read the full Auto-Healing documentation

💡 Advanced Usage

Query Parameters

const response = await reqify.get("https://api.example.com/users", {
  params: {
    page: 1,
    limit: 10,
    active: true,
  },
});
// GET https://api.example.com/users?page=1&limit=10&active=true

Custom Headers

const response = await reqify.post("https://api.example.com/users", userData, {
  headers: {
    Authorization: "Bearer token123",
    "Content-Type": "application/json",
    "X-API-Key": "your-api-key",
  },
});

Different Response Types

// JSON (default)
const jsonData = await reqify.get("/api/data");

// Text response
const textData = await reqify.get("/api/text", {
  responseType: "text",
});

// Stream response
const streamData = await reqify.get("/api/file", {
  responseType: "stream",
});

Error Handling

try {
  const response = await reqify.get("/api/users/123");
  console.log(response.data);
} catch (error) {
  if (error.response) {
    // Server responded with error status
    console.log(error.response.status);
    console.log(error.response.data);
  } else if (error.request) {
    // Network error
    console.log("Network error");
  } else {
    // Other error
    console.log("Error:", error.message);
  }
}

🔄 Migration from Axios

Step 1: Change the import

// Before
import axios from "axios";

// After
import reqify from "r3q";

Step 2: Change the usage (if needed)

// Before
const response = await axios.get("/api/users");

// After (same syntax works!)
const response = await reqify.get("/api/users");

Compatibility Notes

  • ✅ Same method signatures
  • ✅ Same response structure
  • ✅ Same error handling
  • ✅ Same configuration options
  • ✅ Full TypeScript support
  • ⚠️ Some advanced axios features may not be implemented yet

🧪 Testing

npm test

🔧 Development

# Install dependencies
npm install

# Build
npm run build

# Run tests
npm test

📄 License

MIT License - see the LICENSE file for details.