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

@oxyhub/oxlint-plugin

v0.3.1

Published

Oxlint plugin: layout, TypeScript conventions, and correctness rules

Readme

npm version npm downloads node license

Oxyhub extends Oxlint with the ESLint rules it still lacks. You keep Oxlint's strength, power, and speed; as Oxlint grows, those borrowed rules leave this plugin.

Rule ids start with oxyhub/

Requirements

Install

pnpm add -D oxlint @oxyhub/oxlint-plugin

Configuration

Create oxlint.config.ts. Do not list oxyhub/* rules. Do not use .oxlintrc.json.

import { defineConfig } from 'oxlint';

import oxyhub from '@oxyhub/oxlint-plugin/config';

export default defineConfig({
  extends: [oxyhub],
});
{
  "scripts": {
    "lint": "oxlint",
    "lint:fix": "oxlint --fix"
  }
}

Turn a rule off only when you have to:

export default defineConfig({
  extends: [oxyhub],
  rules: {
    'oxyhub/prefer-object-arrow-method': 'off',
  },
});

JSON still works: "extends": ["./node_modules/@oxyhub/oxlint-plugin/recommended.json"]. One config file per directory — JSON or TS, not both.

Rules (23)

Problem (2)

Bugs. Default: error.

| Rule | Description | | --- | --- | | no-bang-condition | ! only on real booleans. Token getters fix to === null; anything else to a full nullish check. | | no-floating-promise | Floating promise chains need .catch, void, await, or return. |

Convention (7)

How to write TypeScript. Default: error.

| Rule | Description | | --- | --- | | prefer-descriptive-binding | No e/err/el/i in params, catch, loops. No bindings named after builtins (filter, object, prototype, constructor, require). f in .map((f) => is fine. | | prefer-object-arrow-method | Object methods as key: (args) => {}, not key() {}. | | prefer-process-import | Use import process from "node:process" instead of the global. | | prefer-fs-promises | Prefer fsPromises over blocking fs sync methods. | | prefer-node-default-name | Conventional default import names (process, path, fs, fsPromises). | | no-node-named-import | No named value imports from node: builtins. | | no-overloaded-if | At most 3 checks in an if. Four or more: extract a named predicate. |

Layout (14)

Indent, wrapping, blank lines. consistent-* and blank-in-* default to error. padding-line-* default to warn.

| Rule | Description | | --- | --- | | consistent-block-indent | Indent blocks, split same-line statements, clean leftover whitespace. | | consistent-call-arguments | Call args stay inline, or wrap when the first arg starts on its own line after (. | | consistent-chain-layout | Break only method calls (.foo()). Property paths (a.b.c) stay inline. | | consistent-condition-spacing | Collapse extra whitespace in single-line if / while / switch tests. | | consistent-object-layout | Object/array/destructure stay inline, or wrap when the first member starts on its own line after { / [. | | consistent-parameter-layout | Multiline params only when a parameter starts on its own line after (. | | consistent-property-indent | Align object/array members to the opening { / [ indent plus two spaces. | | consistent-ternary-layout | Ternaries stay inline, or wrap when ? starts on its own line. | | import-layout | Imports at the top: type → named → default → side-effect. | | no-blank-lines-in-arrow-expression | No blank line between => and an expression body. | | no-blank-lines-in-chain | No blank lines inside a member call chain. | | padding-line-before-decorator | Blank line before a decorator, unless stacked on another decorator. | | padding-line-before-return | Blank line before return / throw when the function has more than one of them. | | padding-line-between-statements | Blank line after if / for / try / switch when another statement follows. Not before them after bindings. |

Settings

Recommended also turns on oxlint max-lines at 300. That is core oxlint, not oxyhub/*.

License

MIT