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 🙏

© 2024 – Pkg Stats / Ryan Hefner

@puppup/api-factory

v1.3.0-no-singleton

Published

axios-based api factory

Downloads

576

Readme

Содержание

О проекте

Данный проект предоставляет к использованию универсальное средство для создания API-сущностей с базовым наборов методов

Сделано на базе axios

Быстрый старт

import { Api, ApiFactory, ApiBaseTypes, HttpConfig } from '@puppup/api-factory'

type MyType = {
    id: number;
    name: string;
    email: string;
};

const HTTP_CONFIG: HttpConfig = {
    baseUrl: 'base_url',
    tokenName: 'token_name',
};

// apis - хранилище всех указанных API
const { apis } = new ApiFactory({
    httpConfig: HTTP_CONFIG,
    apisConfig: {
        myApi: {
            instance: Api<ApiBaseTypes<MyType>>,
            endpoint: 'my-endpoint',
        },
    },
});

Инициализация

httpConfig

Данное поле отвечает за настройку http-сущности, на базе которой будут строиться запросы API

  • baseUrl: общая часть ссылки для всех API в пределах данной ApiFactory (например, домен)
  • tokenName: название токена, которое используется в cookies в вашем веб-приложении. На его основании сущность будет устанавливать Authorization-хедер или удалять его.

apisConfig

В данное поле мы передаем объект с настройками нужных нам API. Ключи объекта будут использованы, как названия соответствующих API, В него входят:

  • instance: сущность, которая наследует класс Api и которая будет лежать в основе настройки методов и типов определенной API-сущности. Если отсутствует необходимость в типизации, можно передать Api без типов, но тогда для базовых методов будет применен any
  • endpoint: эндпоинт, на который будет настроен API относительно baseUrl из httpConfig вашей ApiFactory

Создание api

const { apis } = new ApiFactory({
    httpConfig: HTTP_CONFIG,
    apisConfig: {
        myApi: {
            instance: Api,
            endpoint: 'endpoint',
        },
    },
});

Теперь мы имеем api-сущность myApi, предоставляющую методы:

  • findOne
  • findMany
  • create
  • update
  • delete

Данные методы имеют предустановленный endpoint, который мы указали при создании сущности.

Также все методы поддерживают передачу последним параметром AxiosRequestConfig

Типизация

Базовое использование Api в поле instance вернет нам сущность с методами, работающими с any, но мы можем протипизировать её.

Типизация разделена на:

  • single
  • many
  • create
  • update

Базовый набор функций используют типизацию следующим образом:

  • findOne - возвращает single
  • findMany - возвращает many
  • create - принимает create и возвращает single
  • update - принимает update и возвращает single
  • delete - возвращает single

Шаблонная типизация

import { ApiBaseTypes, ApiFactory, ... } from "@puppup/api-factory";

...

type User = {
    id: number;
    name: string;
    email: string;
}

// Использование утилиты для шаблонной типизации
type ApiTypes = ApiBaseTypes<User>;

const { apis } = new ApiFactory({
    httpConfig: HTTP_CONFIG,
    apisConfig: {
        usersApi: {
            instance: Api<ApiTypes>,
            endpoint: 'users',
        },
    },
});

При использовании шаблона ApiBaseTypes, мы получаем базовую типизацию следующего вида:

export type ApiBaseTypes<BaseType> = ApiCustomTypes<{
    single: BaseType;
    many: BaseType[];
    create: Omit<BaseType, 'id'>;
    update: Partial<Omit<BaseType, 'id'>>;
}>;

Кастомная типизация

Если необходимо переписать типы под определенные задачи, можно воспользоваться утилитой ApiCustomTypes, передав в неё необходимые типы

import { ApiCustomTypes, ApiFactory, ... } from "@puppup/api-factory";

...

type User = {
    id: number;
    name: string;
    email: string;
}

// Использование утилиты для кастомной типизации
type ApiTypes = ApiCustomTypes<{
    single: Pick<User, 'id'>,
    many: ApiTypes['single'][],
    create: Pick<User, 'email'>,
    update: Partial<User>,
}>;

const { apis } = new ApiFactory({
    httpConfig: HTTP_CONFIG,
    apisConfig: {
        usersApi: {
            instance: Api<ApiTypes>,
            endpoint: 'users',
        },
    },
});

Также мы можем воспользоваться ApiCustomTypes на базе существующего типа для API, доработав его

import { ApiBaseTypes, ApiCustomTypes, ApiFactory, ... } from "@puppup/api-factory";

...

type User = {
    id: number;
    name: string;
    email: string;
}

// Базовые типы
type ApiTypes = ApiBaseTypes<User>;

// Модифицированные типы
type ApiModifiedTypes = ApiCustomTypes<ApiTypes, {
    create: Pick<User, 'id'>;
}>

const { apis } = new ApiFactory({
    httpConfig: HTTP_CONFIG,
    apisConfig: {
        usersApi: {
            instance: Api<ApiTypes>,
            endpoint: 'users',
        },
        usersModifiedApi: {
            instance: Api<ApiModifiedTypes>,
            endpoint: 'users',
        },
    },
});

Расширение api

Если нам необходимо добавить свои методы, не входящие в стандартный набор, мы можем расширить существующий api

import { Api, ApiBaseTypes, ApiFactory, ... } from "@puppup/api-factory";

...

type User = {
    id: number;
    name: string;
    email: string;
}

class UsersExtendedApi extends Api<ApiBaseTypes<User>> {
    getMe() {
        return this.httpInstance.get(this.endpoint + '/me');
    }
}

const { apis } = new ApiFactory({
    httpConfig: HTTP_CONFIG,
    apisConfig: {
        usersExtendedApi: {
            instance: UsersExtendedApi,
            endpoint: 'users',
        },
    },
});

apis.usersExtendedApi.getMe();