wopian/kitsu

View on GitHub
packages/kitsu/types/index.d.ts

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * Creates a new `kitsu` instance
 *
 * @param {Object} [options] Options
 * @param {string} [options.baseURL=https://kitsu.io/api/edge] Set the API endpoint
 * @param {Object} [options.headers] Additional headers to send with the requests
 * @param {'traditional'|'modern'|Function} [options.query=traditional] Query serializer function to use. This will impact the way keys are serialized when passing arrays as query parameters. 'modern' is recommended for new projects.
 * @param {boolean} [options.camelCaseTypes=true] If enabled, `type` will be converted to camelCase from kebab-casae or snake_case
 * @param {'kebab'|'snake'|'none'} [options.resourceCase=kebab] Case to convert camelCase to. `kebab` - `/library-entries`; `snake` - /library_entries`; `none` - `/libraryEntries`
 * @param {boolean} [options.pluralize=true] If enabled, `/user` will become `/users` in the URL request and `type` will be pluralized in POST, PATCH and DELETE requests
 * @param {number} [options.timeout=30000] Set the request timeout in milliseconds
 * @param {Object} [options.axiosOptions] Additional options for the axios instance (see [axios/axios#request-config](https://github.com/axios/axios#request-config) for details)
 * @example <caption>Using with Kitsu.io's API</caption>
 * const api = new Kitsu()
 * @example <caption>Using another API server</caption>
 * const api = new Kitsu({
 *   baseURL: 'https://api.example.org/2'
 * })
 * @example <caption>Setting headers</caption>
 * const api = new Kitsu({
 *   headers: {
 *     'User-Agent': 'MyApp/1.0.0 (github.com/username/repo)',
 *     Authorization: 'Bearer 1234567890'
 *   }
 * })
 */
export default class Kitsu {
    constructor(options?: {});
    query: any;
    camel: (s: any) => any;
    resCase: (s: any) => any;
    plural: any;
    /**
     * Get the current headers or add additional headers
     *
     * @memberof Kitsu
     * @returns {Object} All the current headers
     * @example <caption>Get all headers</caption>
     * api.headers
     * @example <caption>Get a single header's value</caption>
     * api.headers['User-Agent']
     * @example <caption>Add or update a header's value</caption>
     * api.headers['Authorization'] = 'Bearer 1234567890'
     */
    headers: any;
    axios: import("axios").AxiosInstance;
    fetch: (model: string, config?: {
        headers?: any;
        params?: {
            fields?: any;
            filter?: any;
            include?: string;
            sort?: string;
            page?: {
                limit?: number;
                offset?: number;
                number?: number;
                size?: number;
                before?: string;
                after?: string;
            };
        };
        axiosOptions?: any;
    }) => any;
    update: (model: string, body: any | any[], config?: {
        params?: any;
        headers?: any;
        axiosOptions?: any;
    }) => any | any[];
    create: (model: string, body: any | any[], config?: {
        params?: any;
        headers?: any;
        axiosOptions?: any;
    }) => any | any[];
    remove: (model: string, id: string | number | number[], config?: {
        params?: any;
        headers?: any;
        axiosOptions?: any;
    }) => any | any[];
    /**
     * Axios Interceptors (alias of `axios.interceptors`)
     *
     * You can intercept responses before they are handled by `get`, `post`, `patch` and `delete` and before requests are sent to the API server.
     *
     * @memberof Kitsu
     * @see {@link https://github.com/axios/axios#interceptors} for documentation
     * @example <caption>Request Interceptor</caption>
     * // Add a request interceptor
     * api.interceptors.request.use(config => {
     *    // Do something before request is sent
     *    return config
     * }, error => {
     *    // Do something with the request error
     *    return Promise.reject(error)
     * })
     * @example <caption>Response Interceptor</caption>
     * // Add a response interceptor
     * api.interceptors.response.use(response => {
     *    // Any status code that lie within the range of 2xx cause this function to trigger
     *    // Do something with response data
     *    return response
     * }, error => {
     *    // Any status codes that falls outside the range of 2xx cause this function to trigger
     *    // Do something with response error
     *    return Promise.reject(error)
     * })
     * @example <caption>Removing Interceptors</caption>
     * const myInterceptor = api.interceptors.request.use(function () {...})
     * api.interceptors.request.eject(myInterceptor)
     */
    interceptors: {
        request: import("axios").AxiosInterceptorManager<import("axios").AxiosRequestConfig<any>>;
        response: import("axios").AxiosInterceptorManager<import("axios").AxiosResponse<any, any>>;
    };
    /**
     * Fetch resources (alias `fetch`)
     *
     * @memberof Kitsu
     * @param {string} model Resource to fetch data from. Expected formats are [`:resource`](https://jsonapi.org/format/#document-resource-objects), [`:resource/:id`](https://jsonapi.org/format/#document-resource-objects), [`:resource/:id/:relationship`](https://jsonapi.org/format/#document-resource-object-relationships) or [`:resource/:id/relationships/:relationship`](https://jsonapi.org/format/#document-resource-object-linkage)
     * @param {Object} [config] Additional configuration
     * @param {Object} [config.headers] Additional headers to send with the request
     * @param {Object} [config.params] JSON:API request queries. JSON:API query parameters not listed are supported
     * @param {Object} [config.params.fields] Return a sparse fieldset with only the included attributes/relationships - [JSON:API Sparse Fieldsets](http://jsonapi.org/format/#fetching-sparse-fieldsets)
     * @param {Object} [config.params.filter] Filter dataset by attribute values - [JSON:API Filtering](http://jsonapi.org/format/#fetching-filtering)
     * @param {string} [config.params.include] Include relationship data - [JSON:API Includes](http://jsonapi.org/format/#fetching-includes)
     * @param {string} [config.params.sort] Sort dataset by one or more comma separated attributes (prepend `-` for descending order) - [JSON:API Sorting](http://jsonapi.org/format/#fetching-sorting)
     * @param {Object} [config.params.page] [JSON:API Pagination](http://jsonapi.org/format/#fetching-pagination). All pagination strategies are supported, even if they are not listed below.
     * @param {number} [config.params.page.limit] Number of resources to return in request (Offset-based) - **Note:** For Kitsu.io, max is `20` except on `libraryEntries` which has a max of `500`
     * @param {number} [config.params.page.offset] Number of resources to offset the dataset by (Offset-based)
     * @param {number} [config.params.page.number] Page of resources to return in request (Page-based) - **Note:** Not supported on Kitsu.io
     * @param {number} [config.params.page.size] Number of resources to return in request (Page-based and cursor-based) - **Note:** Not supported on Kitsu.io
     * @param {string} [config.params.page.before] Get the previous page of resources (Cursor-based) - **Note:** Not Supported on Kitsu.io
     * @param {string} [config.params.page.after] Get the next page of resources (Cursor-based) - **Note:** Not Supported on Kitsu.io
     * @param {Object} [config.axiosOptions] Additional options for the axios instance (see [axios/axios#request-config](https://github.com/axios/axios#request-config) for details)
     * @returns {Object} JSON-parsed response
     * @example <caption>Getting a resource with JSON:API parameters</caption>
     * api.get('users', {
     *   params: {
     *     fields: {
     *       users: 'name,birthday'
     *     },
     *     filter: {
     *       name: 'wopian'
     *     }
     *   }
     * })
     * @example <caption>Getting a collection of resources with their relationships</caption>
     * api.get('anime', {
     *   params: {
     *     include: 'categories'
     *   }
     * })
     * @example <caption>Getting a single resource by ID (method one)</caption>
     * api.get('anime/2', {
     *   params: {
     *     include: 'categories'
     *   }
     * })
     * @example <caption>Getting a single resource by ID (method two)</caption>
     * api.get('anime', {
     *   params: {
     *     include: 'categories',
     *     filter: { id: '2' }
     *  }
     * })
     * @example <caption>Getting a resource's relationship data only</caption>
     * api.get('anime/2/categories')
     * @example <caption>Getting a resource with nested JSON:API filters (not supported by Kitsu.io's API)</caption>
     * // resource?filter[x][y]=value
     * api.get('resource', {
     *   params: {
     *     filter: {
     *       x: {
     *         y: 'value'
     *       }
     *     }
     *   }
     * }
     * @example <caption>Handling errors (async/await)</caption>
     * try {
     *   const { data } = await api.get('anime')
     * } catch (err) {
     *   // Array of JSON:API errors: http://jsonapi.org/format/#error-objects
     *   if (err.errors) err.errors.forEach(error => { ... })
     *   // Error type (Error, TypeError etc.)
     *   err.name
     *   // Error message
     *   err.message
     *   // Axios request parameters
     *   err.config
     *   // Axios response parameters
     *   err.response
     * }
     * @example <caption>Handling errors (Promises)</caption>
     * api.get('anime')
     *   .then(({ data }) => { ... })
     *   .catch(err => {
     *     // Array of JSON:API errors: http://jsonapi.org/format/#error-objects
     *     if (err.errors) err.errors.forEach(error => { ... })
     *     // Error type (Error, TypeError etc.)
     *     err.name
     *     // Error message
     *     err.message
     *     // Axios request parameters
     *     err.config
     *     // Axios response parameters
     *     err.response
     *   })
     */
    get(model: string, config?: {
        headers?: any;
        params?: {
            fields?: any;
            filter?: any;
            include?: string;
            sort?: string;
            page?: {
                limit?: number;
                offset?: number;
                number?: number;
                size?: number;
                before?: string;
                after?: string;
            };
        };
        axiosOptions?: any;
    }): any;
    /**
     * Update a resource (alias `update`)
     *
     * @memberof Kitsu
     * @param {string} model Resource to update data in. Expected formats are [`:resource`](https://jsonapi.org/format/#document-resource-objects), [`:resource/:id`](https://jsonapi.org/format/#document-resource-objects), [`:resource/:id/:relationship`](https://jsonapi.org/format/#document-resource-object-relationships) or [`:resource/:id/relationships/:relationship`](https://jsonapi.org/format/#document-resource-object-linkage)
     * @param {Object|Object[]} body Data to send in the request
     * @param {Object} [config] Additional configuration
     * @param {Object} [config.params] JSON:API request queries. See [#get](#get) for documentation
     * @param {Object} [config.headers] Additional headers to send with the request
     * @param {Object} [config.axiosOptions] Additional options for the axios instance (see [axios/axios#request-config](https://github.com/axios/axios#request-config) for details)
     * @returns {Object|Object[]} JSON-parsed response
     * @example <caption>Update a resource</caption>
     * api.update('posts', {
     *   id: '1',
     *   content: 'Goodbye World'
     * })
     * @example <caption>Update a resource with relationships</caption>
     * api.update('posts', {
     *   content: 'Hello World',
     *   uploads: {
     *     id: '167585',
     *     type: 'uploads'
     *   }
     * })
     * @example <caption>Clear to-one relationships from a resource</caption>
     * api.update('posts/1/relationships/uploads', null)
     * @example <caption>Clear to-many relationships from a resource</caption>
     * api.update('posts/1/relationships/uploads', [])
     * @example <caption>Update multiple resources (API must support the Bulk Extension)</caption>
     * api.update('posts', [
     *   { id: '1', content: 'Hello World' },
     *   { id: '2', content: 'Another post' }
     * ])
     */
    patch(model: string, body: any | any[], config?: {
        params?: any;
        headers?: any;
        axiosOptions?: any;
    }): any | any[];
    /**
     * Create a new resource (alias `create`)
     *
     * @memberof Kitsu
     * @param {string} model Resource to create. Expected formats are [`:resource`](https://jsonapi.org/format/#document-resource-objects), [`:resource/:id`](https://jsonapi.org/format/#document-resource-objects), [`:resource/:id/:relationship`](https://jsonapi.org/format/#document-resource-object-relationships) or [`:resource/:id/relationships/:relationship`](https://jsonapi.org/format/#document-resource-object-linkage)
     * @param {Object|Object[]} body Data to send in the request
     * @param {Object} [config] Additional configuration
     * @param {Object} [config.params] JSON:API request queries. See [#get](#get) for documentation
     * @param {Object} [config.headers] Additional headers to send with the request
     * @param {Object} [config.axiosOptions] Additional options for the axios instance (see [axios/axios#request-config](https://github.com/axios/axios#request-config) for details)
     * @returns {Object|Object[]} JSON-parsed response
     * @example <caption>Create a post on a user's profile feed</caption>
     * api.create('posts', {
     *   content: 'Hello World',
     *   targetUser: {
     *     data: {
     *       id: '42603',
     *       type: 'users'
     *     }
     *   },
     *   user: {
     *     data: {
     *       id: '42603',
     *       type: 'users'
     *     }
     *   }
     * })
     * @example <caption>Create multiple resources (API must support the Bulk Extension)</caption>
     * api.create('posts', [
     *   { content: 'Hello World' },
     *   { content: 'Another post' }
     * ])
     */
    post(model: string, body: any | any[], config?: {
        params?: any;
        headers?: any;
        axiosOptions?: any;
    }): any | any[];
    /**
     * Remove a resource (alias `remove`)
     *
     * @memberof Kitsu
     * @param {string} model Resource to remove. Expected formats are [`:resource`](https://jsonapi.org/format/#document-resource-objects), [`:resource/:id/:relationship`](https://jsonapi.org/format/#document-resource-object-relationships) or [`:resource/:id/relationships/:relationship`](https://jsonapi.org/format/#document-resource-object-linkage)
     * @param {string|number|number[]} id Resource ID to remove. Pass an array of IDs to delete multiple resources (Bulk Extension)
     * @param {Object} [config] Additional configuration
     * @param {Object} [config.params] JSON:API request queries. See [#get](#get) for documentation
     * @param {Object} [config.headers] Additional headers to send with the request
     * @param {Object} [config.axiosOptions] Additional options for the axios instance (see [axios/axios#request-config](https://github.com/axios/axios#request-config) for details)
     * @returns {Object|Object[]} JSON-parsed response
     * @example <caption>Remove one or more relationships from a resource</caption>
     * api.delete('posts/1/relationships/uploads', [456, 789])
     * @example <caption>Remove a single resource</caption>
     * api.delete('posts', 123)
     * @example <caption>Remove multiple resources (API must support the Bulk Extension)</caption>
     * api.delete('posts', [ 1, 2 ])
     */
    delete(model: string, id: string | number | number[], config?: {
        params?: any;
        headers?: any;
        axiosOptions?: any;
    }): any | any[];
    /**
     * Get the authenticated user's data
     *
     * **Note** Requires the JSON:API server to support `filter[self]=true`
     *
     * @memberof Kitsu
     * @param {Object} [config] Additional configuration
     * @param {Object} [config.params] JSON:API request queries. See [#get](#get) for documentation
     * @param {Object} [config.headers] Additional headers to send with the request
     * @param {Object} [config.axiosOptions] Additional options for the axios instance (see [axios/axios#request-config](https://github.com/axios/axios#request-config) for details)
     * @returns {Object} JSON-parsed response
     * @example <caption>Get the authenticated user's resource</caption>
     * api.self()
     * @example <caption>Using JSON:API parameters</caption>
     * api.self({
     *   params: {
     *     fields: {
     *       users: 'name,birthday'
     *     }
     *   }
     * })
     */
    self(config?: {
        params?: any;
        headers?: any;
        axiosOptions?: any;
    }): any;
    /**
     * Send arbitrary requests
     *
     * **Note** Planned changes to the `get`, `patch`, `post` and `delete` methods in a future major release may make this method redundent. See https://github.com/wopian/kitsu/issues/415 for details.
     *
     * @memberof Kitsu
     * @param {Object} [config] Request configuration
     * @param {string} config.url The URL path of the resource
     * @param {string} config.type The resource type
     * @param {Object|Object[]} [config.body] Data to send in the request
     * @param {string} [config.method] Request method - `GET`, `PATCH`, `POST` or `DELETE` (defaults to `GET`, case-insensitive)
     * @param {Object} [config.params] JSON:API request queries. See [#get](#get) for documentation
     * @param {Object} [config.headers] Additional headers to send with the request
     * @param {Object} [config.axiosOptions] Additional options for the axios instance (see [axios/axios#request-config](https://github.com/axios/axios#request-config) for details)
     * @returns {Object} JSON-parsed response
     * @example <caption>Raw GET request</caption>
     * api.request({
     *   url: 'anime/1/mappings',
     *   type: 'mappings',
     *   params: { filter: { externalSite: 'aozora' } }
     * })
     * @example <caption>Raw PATCH request</caption>
     * api.request({
     *   method: 'PATCH',
     *   url: 'anime',
     *   type: 'anime',
     *   body: { id: '1', subtype: 'tv' }
     * })
     * @example <caption>Raw POST request</caption>
     * api.request({
     *   method: 'PATCH',
     *   url: 'anime',
     *   type: 'anime',
     *   body: { subtype: 'tv' }
     * })
     * @example <caption>Raw DELETE request</caption>
     * api.request({
     *   method: 'DELETE',
     *   url: 'anime/1',
     *   type: 'anime',
     *   body: { id: '1' }
     * })
     * @example <caption>Bulk Extension support (`PATCH`, `POST` & `DELETE`)</caption>
     * api.request({
     *   method: 'PATCH',
     *   url: 'anime',
     *   type: 'anime',
     *   body: [
     *     { id: '1', subtype: 'tv' }
     *     { id: '2', subtype: 'ona' }
     *   ]
     * })
     */
    request({ body, method, params, type, url, headers, axiosOptions }?: {
        url: string;
        type: string;
        body?: any | any[];
        method?: string;
        params?: any;
        headers?: any;
        axiosOptions?: any;
    }): any;
}