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

@kontsedal/olas-eslint-plugin

v1.0.0

Published

ESLint rules for Olas apps: no React hooks in controllers, definitions at module scope, synchronous factories, the optimistic-write recipe, test helpers kept in tests, and abort signals passed on.

Readme

@kontsedal/olas-eslint-plugin

ESLint rules for Olas apps. Each rule catches a mistake the types cannot see, such as a React hook in a controller factory, a definition that loses its identity or an async factory. Another keeps test helpers out of app code, and two rules guard optimistic writes. Two opt-in rules keep network calls out of components and make each request take its abort signal.

Install

pnpm add -D @kontsedal/olas-eslint-plugin eslint

eslint >= 9 is a peer dependency, and the plugin uses flat config. The tests run on ESLint 10. The rules read syntax only, so they need no type information. TypeScript files still need a parser, such as the one typescript-eslint sets up.

Setup

// eslint.config.js
import olas from '@kontsedal/olas-eslint-plugin'
import tseslint from 'typescript-eslint'

export default [...tseslint.configs.recommended, olas.configs.recommended]

olas.configs.strict adds the two opt-in rules and raises cancel-before-optimistic to an error.

The configs are typed with ESLint's own Linter.Config, so a typed eslint.config.ts accepts them as they are, in an array or through defineConfig. Each rule is named with the olas/ prefix, so one rule can be set on its own after a config:

export default [
  ...tseslint.configs.recommended,
  olas.configs.recommended,
  { rules: { 'olas/no-network-in-components': 'error' } },
]

Rules

| Rule | recommended | strict | Catches | |---|---|---|---| | no-react-hooks-in-controllers | error | error | A React hook inside a defineController factory. | | define-at-module-scope | error | error | defineQuery, defineInfiniteQuery, defineMutation or defineScope inside a function. | | no-async-controller-factory | error | error | An async factory, which makes the controller's api a promise. | | optimistic-returns-snapshot | error | error | A setData snapshot that onMutate does not return, or that other code discards. | | cancel-before-optimistic | warn | error | An optimistic setData in onMutate with no cancel on the same query before it. | | no-testing-outside-tests | error | error | @kontsedal/olas-core/testing imported from a file that is not a test. | | no-network-in-components | off | error | fetch or axios inside a React component. | | honor-abort-signal | off | error | A fetcher or mutate that does not read its signal, so a cancelled request runs to the end. |

Two rules take options. no-testing-outside-tests takes testFiles, the globs that count as tests. honor-abort-signal takes ignorePattern, for a context whose name marks work with nothing to abort, such as _ctx.

How it is checked

  • tests/rules.test.ts runs every rule through @typescript-eslint/rule-tester, with valid and invalid cases.
  • tests/examples.test.ts runs recommended and strict over the source and tests of every example app in this repo, and expects no findings. The first run found four real mistakes in the examples: three optimistic writes with no cancel first, and one leaked snapshot. It also found two false positives in define-at-module-scope. All six are fixed.