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

@balajisk/nextjs-data-fetcher

v3.0.0

Published

A flexible data fetching system for Next.js applications

Readme

Next.js Data Fetcher

A flexible data fetching system for Next.js applications that supports multiple data sources and file types.

Features

  • Support for multiple data sources (JSON, CSV, API, custom)
  • Server-side and client-side fetching with the same API
  • Type-safe with TypeScript
  • Caching for improved performance
  • HOCs for easy integration with React components
  • Toggle between server-side and client-side fetching dynamically

Installation

npm install @balajisk/nextjs-data-fetcher
# or
yarn add @balajisk/nextjs-data-fetcher

Setup

1. Organize Your Data

Ensure that your data source files (.json, .csv) are placed inside the data directory at the root of your Next.js project.

/project-root
  ├── data/
  │   ├── users.json
  │   ├── orders.csv
  ├── pages/
  ├── src/

2. Create an API Route for Data Fetching

Create an API route in api/data/route.ts to serve data from your data directory.

import { type NextRequest, NextResponse } from "next/server"
import fs from "fs/promises"
import path from "path"

export async function GET(request: NextRequest) {
  const type = request.nextUrl.searchParams.get("type")
  const fileType = request.nextUrl.searchParams.get("fileType") || "json" // Default to json if not specified

  if (!type) {
    return NextResponse.json({ error: "Type parameter is required" }, { status: 400 })
  }

  try {
    const cleanType = type.replace(/^\/api\/data\?type=/, "")
    const filePath = path.join(process.cwd(), "data", `${cleanType}.${fileType}`)

    const fileContents = await fs.readFile(filePath, "utf8")

    if (fileType === "json") {
      const data = JSON.parse(fileContents)
      return NextResponse.json(data)
    } else {
      return new Response(fileContents, {
        headers: {
          "Content-Type": getContentType(fileType),
        },
      })
    }
  } catch (error) {
    console.error(`Error fetching ${type} data:`, error)
    return NextResponse.json({ error: `Failed to fetch ${type} data` }, { status: 500 })
  }
}

function getContentType(fileType: string): string {
  switch (fileType.toLowerCase()) {
    case "json":
      return "application/json"
    case "csv":
      return "text/csv"
    case "xml":
      return "application/xml"
    case "yaml":
    case "yml":
      return "application/yaml"
    default:
      return "text/plain"
  }
}

3. Create a Fetcher Class

Define a fetcher class for each data type you need.

import { BaseFetcher } from "@balajisk/nextjs-data-fetcher";

interface User {
  id: number;
  name: string;
  email: string;
}

export class UserFetcher extends BaseFetcher<User> {
  protected type = "users";
  
  constructor() {
    super({
      type: "json",
      source: "users"
    });
  }
}

4. Register Fetchers

Register the fetchers in your application so they can be accessed easily.

import { FetcherRegistry } from "@balajisk/nextjs-data-fetcher";
import { UserFetcher } from "./UserFetcher";

const userFetcher = new UserFetcher();
FetcherRegistry.getInstance().register(userFetcher);

Client-Side Fetching

For client-side fetching, ensure that:

  • You use useEffect or React Query to fetch data inside a component.
  • You access data directly from the API endpoint.
  • Fetching happens in the browser, which means it won't be preloaded on the server.
  • Use HOCs like withClientFetching to wrap your components for easier integration.

Example:

import { withClientFetching } from "@balajisk/nextjs-data-fetcher";
import { UserList } from "./UserList";

const ClientUserList = withClientFetching(UserList, "users");

export default function ClientSideFetching() {
  return (
    <div>
      <h1>Users</h1>
      <ClientUserList />
    </div>
  );
}

Server-Side Fetching

For server-side fetching, ensure that:

  • You use getServerSideProps or getStaticProps.
  • The data is fetched before rendering the page.
  • This improves SEO and reduces the number of client requests.
  • Use HOCs like withServerFetching to wrap your components for easier integration.

Example:

import { withServerFetching } from "@balajisk
/nextjs-data-fetcher";
import { UserList } from "./UserList";

const ServerUserList = withServerFetching(UserList, "users");

// Use in your app
export default function Page() {
  return (
    <div>
      <h1>Users</h1>
      <ServerUserList />
    </div>
  );
}

This guide ensures clarity on how to set up data fetching, organize files, and integrate client-side and server-side data fetching seamlessly. 🚀