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

@jeff-tian/gatsby-source-yuque

v3.1.0

Published

Source plugin for pulling data into Gatsby from [语雀](https://www.yuque.com) API.

Readme

gatsby-source-yuque

NPM version LICENSE version

Source plugin for pulling data into Gatsby from 语雀 API.

Install

npm install --save gatsby-source-yuque

How to use

// In your gatsby-config.js
plugins: [
  {
    resolve: 'gatsby-source-yuque',
    options: {
      login: 'raincal',
      repo: 'blog',
      mdNameFormat: 'title'
    }
  }
]

Options

| Name | Default | Description | | -------------- | ------------------------------- | --------------------------------------------------------------------------- | | baseUrl | https://www.yuque.com/api/v2/ | base url | | login | | user/team unique name | | repo | | repo name | | mdNameFormat | title | title or slug | | timeout | 10000 | timeout specifies the number of milliseconds before the request times out | | concurrency | 5 | Parallel downloads of article bodies | | minIntervalMs| 0 | Minimum delay (ms) between successive body downloads | | dailyBudget | Infinity | Max number of article bodies to download per run (graceful stop when hit) | | maxRetries | 3 | Retry count for HTTP 429 / 5xx responses | | backoffBaseMs| 60000 | Base backoff for 429 when Retry-After header is missing | | stopOnRateLimit | true | If true, treat terminal 429 as graceful stop (cache preserved) | | onRateLimit | | (waitMs, attempt) => void — called before each 429 retry sleep | | onArticleFetched | | async (article, index, total) => void — per-article hook (good for incremental cache flushing) | | onBudgetExhausted | | () => void — called once when dailyBudget is reached |

Rate-limit & budget handling

Starting from 3.1.0, the underlying Downloader:

  • Processes articles newest-first (by updated_at descending) so the most valuable content is captured first under constraint.
  • Automatically retries 429 / 5xx responses with exponential backoff, honoring Retry-After when present.
  • Preserves partial progress: when a run is aborted by a final 429 or dailyBudget exhaustion, the cache is still flushed via writeCache (or yuquePath).
  • Exposes onArticleFetched so callers can persist progress after every successful body download.

getArticles() remains backward compatible; new call shapes are additive:

await client.getArticles();                            // legacy: single page
await client.getArticles({offset: 0, limit: 100});     // explicit paging
await client.getArticles({fetchAll: true, limit: 100}); // auto-paginate

Query for all nodes

{
  allYuqueDoc {
    edges {
      node {
        title
        slug
        cover
        description
        created_at
        childMarkdownRemark {
          html
        }
      }
    }
  }
}

LICENSE

MIT