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

@sphinx-software/resource

v1.0.2

Published

Made with create-react-library

Downloads

8

Readme

@sphinx-software/resource

Asynchronous resource with Suspense supports

NPM JavaScript Style Guide

Install

yarn add @sphinx-software/resource

The asynchronous equation

Data = await Operation(Parameter)

In the traditional approach, the above equation is showing how we deal with async resources / data

Let's change the equation into a new form:

Resource = Operation()

Data = Resource.fetch(Parameter)

That's what library all about. It helps you defer the Operation and its Parameters 👌

Usage

Let's declare an Operation called GET_PROFILE

// The operations.tsx file

import { Operation } from '@sphinx-software/resource'

export type User = {
  name: string
  age: number
}

export type UserSearchCondition = {
  keyword: string
}

const wait = (ms: number) => {
  return new Promise((resolve) => {
    setTimeout(resolve, ms)
  })
}

export const GET_PROFILE: Operation<UserSearchCondition, User> = {
  initial: {
    name: 'Lucy',
    age: 25
  },
  async execute(condition) {
    
    // TODO will call the real searching API with the given condition
    console.log(condition)

    await wait(1000)

    return {
      name: 'Rikky',
      age: 30
    }
  }
}

An Operation needs at least one execute method with given parameters.

You can also define the default value of the resource by providing the initial property

The useResource() hook

Now, let's get the Resource with the newly created Operation

import React, { Suspense } from 'react'
import { GET_PROFILE, User } from './operations'
import { useResource, Resource } from '@sphinx-software/resource'

// ...

const UserDetail = ({ resource }: { resource: Resource<User> }) => {
  
  const user = resource.fetch()
  
  return (<span>Hello {user.name}</span>)
}

const App = () => {
  const [userResource, execute] = useResource(GET_PROFILE)
  
  return (
    <div>
      <button onClick={() => execute({ keyword: 'rikky' })}>Load</button>
      <Suspense fallback='Loading...'>
        <UserDetail resource={userResource} />
      </Suspense>
    </div>
  )
}
  • Each time you press the Load button, the resource will be re-created.
  • Calling the fetch() method will get the user data or - make the UserDetail component suspended

The useResourceState() hook

Sometimes, you just need to read the execution state of the resource to update the component based on it. You can call the useResourceState() hook for it.

// ...

const { error, loading, result } = useResourceState(userResource)

Canceling the operation

We eventually want to cancel the operation while it is executing. In operation definition, we can archive it by registering the cancel callback.

export const WAIT: Operation<number, void> = {
  execute(ms, onCancel) {
    return new Promise((resolve) => {
      const timeout = setTimeout(() => resolve(), ms)

      onCancel(() => {
        clearTimeout(timeout)
      })
    })
  }
}

That's it! Happy coding! ❤️

License

MIT © monkey-programmer