/minireq

A minimal request library for the browser

Primary LanguageTypeScript

minireq

build docs codecov code style: prettier

A minimal request library built on XMLHTTPRequest for the browser, and for nodejs with the same API.

Documentation on Github Pages

Why not fetch, axios or superagent

fetch is too bare bones and also does not support features like progress indication. axios and superagent are neither minimal nor are they written with ES modules with makes them awkward to bundle.

Also I want a request library with better types than currently available.

Example

import { makeRequest } from '@minireq/browser';
// If you are using nodejs, you can use
// import { makeRequest } from '@minireq/node';

const request = makeRequest();

const { promise, abort } = request({
    method: 'GET',
    url: '/api/users',
});

// Abort on user click
document.querySelector('button.abortRequest').addEventListener('click', () => {
    abort();
});

promise.then(({ status, data }) => {
    if (status === 200) {
        console.log(data.name);
    }
});

Making a post request, with a timeout on 500ms

import { makeRequest } from '@minireq/browser';

const request = makeRequest();

const { promise } = request({
    method: 'POST',
    url: '/api/users',
    send: {
        name: 'Peter',
        age: 50,
        children: [],
    },
    timeout: 500,
});

promise.then(({ status, data }) => {
    if (status === 201) {
        console.log(data.id);
    }
});

Using a custom content type

import { makeRequest, defaultSerializers } from '@minireq/browser';

const serializer = {
    parse: (data: string) => data.split('\n').map(x => JSON.parse(x)),
    convert: (data: any) => {
        if (!Array.isArray(data)) {
            return [JSON.stringify(data)];
        } else {
            return data.map(x => JSON.stringify(x)).join('\n');
        }
    },
};

const { request } = makeRequest({
    ...defaultSerializers,
    'application/ndjson': serializer,
});

const { promise, abort } = request({
    method: 'GET',
    url: '/api/users',
    accept: 'application/ndjson',
});

const { status, data } = await promise;

if (status === 200) {
    console.log(data.length);
}