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 🙏

© 2025 – Pkg Stats / Ryan Hefner

refine-apito

v0.3.2

Published

A data provider for Refine that connects to Apito - a headless CMS and backend builder.

Readme

Refine Apito Data Provider

npm version npm

A data provider for Refine v5 that connects to Apito - An API builder with Serverless Functions

Features

  • 🚀 Full support for all Refine data provider methods
  • 🔄 Automatic GraphQL query generation for Apito
  • 🔒 Authentication support
  • 🛠️ Comprehensive error handling for GraphQL and network errors
  • 📝 Support for custom GraphQL queries and mutations
  • 🐞 Debug mode for easier troubleshooting
  • 🧩 Well-organized code with separate type definitions for better debugging

Installation

npm install refine-apito
# or
yarn add refine-apito
# or
pnpm add refine-apito

Usage

Basic Setup

import { Refine } from '@refinedev/core';
import { apitoDataProvider } from 'refine-apito';

const App = () => {
  return (
    <Refine
      dataProvider={apitoDataProvider(
        'https://api.apito.io/secured/graphql', // Your Apito GraphQL endpoint
        'YOUR_API_TOKEN' // Your Apito API token
      )}
      // ... other Refine configurations
    >
      {/* ... */}
    </Refine>
  );
};

Debug Mode

For easier debugging, you can use the debug version of the data provider which logs all method calls and their parameters:

import { Refine } from '@refinedev/core';
import { debugApitoDataProvider } from 'refine-apito';

const App = () => {
  return (
    <Refine
      dataProvider={debugApitoDataProvider(
        'https://api.apito.io/secured/graphql',
        'YOUR_API_TOKEN'
      )}
      // ... other Refine configurations
    >
      {/* ... */}
    </Refine>
  );
};

This will log detailed information about each data provider method call to the console, making it easier to debug issues.

Tenant-Based Authentication

If you're using tenant-based authentication, set the third parameter to true:

dataProvider={apitoDataProvider(
  "https://api.apito.io/secured/graphql",
  "INITIAL_TOKEN" // Your Apito API token
)}

API Reference

apitoDataProvider(apiUrl, token)

Creates a data provider for Refine that connects to Apito.

Parameters

  • apiUrl (string): The URL of your Apito GraphQL API endpoint.
  • token (string): Your Apito API token for authentication.

Returns

A Refine data provider object with the following methods:

  • getList: Fetches a list of resources with pagination, sorting, and filtering.
  • getOne: Fetches a single resource by ID.
  • create: Creates a new resource.
  • createMany: Creates multiple resources at once.
  • update: Updates an existing resource.
  • deleteOne: Deletes a resource by ID.
  • custom: Executes a custom GraphQL query.

Additional Methods

The data provider also includes these utility methods:

  • getApiClient(): Returns the GraphQL client instance.
  • getToken(): Returns the current API token.
  • getApiUrl(): Returns the API URL.

Advanced Usage

Custom Fields

You can specify which fields to include in the response by providing a fields array in the meta parameter:

const { data } = useList({
  resource: 'products',
  meta: {
    fields: ['name', 'price', 'description', 'category'],
  },
});

Connection Fields

For related data, you can specify connection fields:

const { data } = useList({
  resource: 'products',
  meta: {
    fields: ['name', 'price'],
    connectionFields: {
      category: 'id name',
      tags: 'id name slug',
    },
  },
});

Custom GraphQL Queries

For more complex queries, you can provide your own GraphQL query:

import { gql } from '@urql/core';

const { data } = useList({
  resource: 'products',
  meta: {
    gqlQuery: gql`
      query GetProducts($where: PRODUCTS_INPUT_WHERE_PAYLOAD) {
        productsList(where: $where) {
          id
          data {
            name
            price
            category
          }
          meta {
            created_at
          }
        }
        productsListCount {
          total
        }
      }
    `,
    variables: {
      where: { category: { eq: 'electronics' } },
    },
    queryKey: 'productsList',
  },
});

Filtering

Apito supports various filter operators:

const { data } = useList({
  resource: 'products',
  filters: [
    {
      field: 'name',
      operator: 'contains',
      value: 'phone',
    },
    {
      field: 'price',
      operator: 'gt',
      value: 100,
    },
  ],
});

Sorting

const { data } = useList({
  resource: 'products',
  sorters: [
    {
      field: 'price',
      order: 'desc',
    },
  ],
});

Pagination

const { data } = useList({
  resource: 'products',
  pagination: {
    currentPage: 1,
    pageSize: 10,
  },
});

Alias Fields

You can also use GraphQL aliases for connection fields by providing aliasFields alongside connectionFields. This is useful when you want to query the same field with different names or create aliases that point to other fields:

const { data } = useList({
  resource: 'orders',
  meta: {
    fields: ['id', 'total', 'status'],
    aliasFields: {
      waiter: 'employee',
    },
    connectionFields: {
      foodList: 'id data { name price }',
      customer: 'id data { name }',
      employee: 'id data { full_name }',
      waiter: 'id data { full_name }',
    },
  },
});

This will generate a GraphQL query like:

{
  orderList {
    id
    data {
      id
      total
      status
    }
    foodList {
      id
      data {
        name
        price
      }
    }
    customer {
      id
      data {
        name
      }
    }
    employee {
      id
      data {
        full_name
      }
    }
    waiter: employee {
      id
      data {
        full_name
      }
    }
  }
}

In this example:

  • waiter is defined as an alias that points to the employee field
  • The waiter connection field specification from connectionFields is used for the alias
  • This allows you to get the same employee data under two different names in your response

Error Handling

The data provider includes comprehensive error handling for both GraphQL and network errors. All errors are converted to Refine's HttpError format for consistent error handling throughout your application.

Code Organization for Debugging

The library is organized to make debugging easier:

  • types.ts: Contains all TypeScript type definitions
  • provider.ts: Contains the main data provider implementation
  • debug-provider.ts: Contains a debug version with console logs
  • index.tsx: Exports everything for external use

This separation makes it easier to navigate the code and set breakpoints when debugging.

Contributing & Development

Local Development

To develop this package locally:

# Install dependencies
pnpm install

# Start development mode
pnpm start

# Test
pnpm test

# Build the package
pnpm build

# Check bundle size
pnpm size

Releasing New Versions

This package uses GitHub Actions for automated releases. To release a new version:

  1. Update the version in package.json
  2. Commit your changes
  3. Create and push a new tag:
git tag v0.1.2  # Use appropriate version
git push origin v0.1.2

The GitHub workflow will automatically:

  • Build the package
  • Publish to npm
  • Create a GitHub release

Alternatively, you can use the release script:

./release.sh 0.1.2  # Replace with your desired version
# Or with a custom commit message:
./release.sh 0.1.2 "feat: add improved error handling"

License

MIT