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

json-repository

v1.0.2

Published

A repository pattern implementation using JSON files.

Downloads

2

Readme

JSON Repository

A TypeScript-based repository pattern implementation for managing JSON data files. This module provides a flexible way to create and manage repositories with different scopes: singleton, scoped, and transient.

Installation

To install the module, use pnpm:

pnpm add json-repository

Usage

Creating a Repository

You can create a repository using the createRepository function. This function allows you to specify the scope of the repository: singleton, scoped, or transient.

Example:

import { createRepository } from 'json-repository';

const repository = createRepository<MyEntity>('my-entity.json', process.cwd(), 'singleton');

Using the Repository

Once you have a repository instance, you can perform various operations such as fetching all data, adding new items, updating existing items, and deleting items.

Example:

async function performOperations() {
  const repository = createRepository<MyEntity>('my-entity.json', process.cwd(), 'scoped');

  // Fetch all items
  const items = await repository.getAll();

  // Add a new item
  await repository.add({ id: '1', name: 'New Item' });

  // Update an existing item
  await repository.update('1', { id: '1', name: 'Updated Item' });

  // Delete an item
  await repository.delete('1');
}

Using with Hooks

For React applications, you can use the useRepository utility function to integrate repositories with React hooks.

Example:

import { useRepository } from 'json-repository';

function MyComponent() {
  const repository = useRepository<MyEntity>('my-entity.json', 'singleton');

  // Use the repository for operations
}

Custom Hook Example

You can create a custom hook to manage repository data and integrate it with React components.

Custom Hook:

import { useRepository } from 'json-repository';
import { useEffect, useState } from 'react';

export function useCustomRepository<T>(fileName: string, scope: 'singleton' | 'scoped' | 'transient' = 'singleton') {
  const repository = useRepository<T>(fileName, scope);
  const [data, setData] = useState<T[]>([]);

  useEffect(() => {
    async function fetchData() {
      const allData = await repository.getAll();
      setData(allData);
    }
    fetchData();
  }, [repository]);

  return { data, repository };
}

Component Example:

import { useCustomRepository } from '../hooks/useCustomRepository';

interface Item {
  id: string;
  name: string;
}

export default function HomePage() {
  const { data, repository } = useCustomRepository<Item>('items.json');

  const addItem = async () => {
    const newItem: Item = { id: '3', name: 'New Item' };
    await repository.add(newItem);
    // Refresh data after adding
    const updatedData = await repository.getAll();
    setData(updatedData);
  };

  return (
    <div>
      <h1>Items</h1>
      <ul>
        {data.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
      <button onClick={addItem}>Add Item</button>
    </div>
  );
}

Scopes

  • Singleton: A single instance is shared across the entire application.
  • Scoped: A new instance is created for each request or operation, but it can be reused within that scope.
  • Transient: A new instance is created every time it is requested.

Error Handling

The module includes basic error handling to log and throw errors when creating or using repositories. Ensure to handle these errors in your application logic as needed.