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

@duro-app/eslint-config

v3.2.1

Published

Shareable ESLint flat config for the Duro stack: base TS conventions, the design-system rules and UI-library policy for React apps, Effect server conventions, and accessibility-first test selectors.

Readme

@duro-app/eslint-config

Shareable ESLint flat config for the Duro stack — the policies CLAUDE.md and agent memory can only suggest, wired into the linter so every consumer repo gates them at commit time (via amont's built-in pre-commit-lint-js, which activates on the presence of a root ESLint config) and in CI.

Requires ESLint 9 or 10 (flat config). All plugins arrive as dependencies of this package — consumers install one package.

Usage

// eslint.config.js (repo root — amont only detects a ROOT config)
import {react, effect, tests} from '@duro-app/eslint-config'

export default [
  {ignores: ['**/dist/**', '**/build/**']},
  ...react,
  ...tests,
  // Server-only packages in a monorepo can scope the effect preset:
  ...effect.map((c) => ({...c, files: ['apps/api/**/*.ts']})),
]

Presets

| Preset | Composes | For | | -------- | ------------------------------------------------------------------ | ------------------------- | | base | @eslint/js + typescript-eslint recommended, prettier interop | every TypeScript package | | react | base + classic react-hooks + @duro-app/eslint-plugin + UI policy | RSD / @duro-app/ui apps | | effect | base + @effect plugin + server-stack policy | Effect services | | tests | accessibility-first selectors (self-scoped to test/e2e files) | any repo with tests |

react and effect both include base; applying both just repeats identical entries, which flat config merges harmlessly. tests carries its own files scope, so it can be appended unconditionally.

What the policies enforce

  • react — UI primitives come from @duro-app/ui only (react-aria, Spectrum, MUI, Radix, Chakra, headlessui, antd and @frontjutsu/ui are banned with a message that says where to add missing components); rich text goes through @fredericrous/lexical-multi, never raw lexical; plus everything in @duro-app/eslint-plugin (html.* elements, deep token imports, token values, form kit, the RSD flexGrow trap).
  • effect@effect/sql not Kysely; @effect/opentelemetry only via subpath (the barrel statically imports the web SDK and crashes Node at module load); barrel-import hygiene via @effect/eslint-plugin.
  • tests — no getByTestId family, no CSS class/id locator() strings: select by role/label/text, gate readiness on aria-busy.

Severity is the one gating line: error gates at commit and CI, warn informs everywhere. Don't add --max-warnings=0 — promote a rule to error here instead if it earns gating.

Adopting 3.0 with existing debt

3.0 promotes duro/no-raw-design-values to error and adds duro/no-raw-breakpoint-query. A repo that already carries raw values keeps the gate for every new file and ratchets the old ones down with an explicit file list — never a glob, never --max-warnings:

// eslint.duro-baseline.js — delete a line when its file is migrated. Never add one.
export const RAW_VALUES_BASELINE = [
  'app/routes/legacy-dashboard.tsx',
  'app/components/OldChart/OldChart.tsx',
]
// eslint.config.js — after the presets, so last-wins downgrades only these
import {RAW_VALUES_BASELINE} from './eslint.duro-baseline.js'
export default [
  ...react,
  {files: RAW_VALUES_BASELINE, rules: {'duro/no-raw-design-values': 'warn'}},
]

Most findings carry a suggestion; the ESLint API can apply them in bulk (message.suggestions[0].fix). What is left is the handful that need a human choice — an off-palette color, an off-scale spacing.

Escape hatches

Flat config is last-wins — scope an override after the preset:

...react,
{
  // The one file allowed to import the raw engine reset:
  files: ['packages/editor/src/usePageNode.ts'],
  rules: {'no-restricted-imports': 'off'},
}