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

@block65/oxlint

v1.93.0

Published

Block65 build of oxlint with additional type-aware rules routed to @block65/oxlint-tsgolint.

Readme

@block65/oxlint

oxlint with five added type-aware rules and eight changed upstream rules. The five added rules are implemented in @block65/oxlint-tsgolint, and package.json declares the oldest build of it they work with as an optional peer dependency on oxlint-tsgolint. Linux x64 and arm64 only, the platforms Block65 runs. The package version names the upstream release it is built on, as described under Versioning.

# pnpm-workspace.yaml
overrides:
  oxlint: npm:@block65/oxlint@[version]
  oxlint-tsgolint: npm:@block65/oxlint-tsgolint@[version]

Added rules

All five are typescript/ rules in the restriction category. They run in tsgolint, so they need --type-aware. Four report a place where a finite type is erased, and one a value invented where a finite type would have named the choice.

  • define-messages-keys: defineMessages whose keys are not a finite union of string or number literals. A call with no type argument passes when it resolves to an overload with a const type parameter, as react-intl 12's does, since that already keeps the literal keys.
  • no-open-string-fallback: an inline string literal after ?? or ??=, or as a destructuring default outside a parameter, where the operand is an open string or a literal union the value is outside. A member of the union chooses a default and a named value is a typed default, so both pass. The empty string is left to the block65 plugin's no-sentinel-fallback.
  • no-widening-alias: a const whose annotation is wider than its initializer, such as string over a literal union or Record<string, T> over an object with known keys.
  • no-widening-object-keys: Object.keys or Object.entries on a value with a finite key type. Options keys and entries name the helpers to use instead; the defaults are typedKeys and typedEntries.
  • no-widening-return-type: a return annotation wider than what the body returns, such as boolean over return true. Option contracts (default true) allows a named object type as the annotation.

Changed rules

typescript/no-inferrable-types reports a primitive annotation it considers redundant and suggests deleting it. On a const holding a literal the annotation is not redundant: const a: number = 5 is typed number, while const a = 5 is typed 5. Deleting it narrows the type, and on an exported declaration that narrows what every other file sees.

In this build the rule stops reporting that case for number, string, boolean and bigint. It still reports const a: 5 = 5, where the annotation matches what inference already gives, and let, var, parameters and properties, which widen on their own.

Five unicorn/ rules report what they did upstream, but --fix applies fewer of their rewrites. Where a rewrite can change behaviour or types, it is offered as a suggestion instead, which --fix-suggestions applies, or not offered at all:

  • prefer-single-call merges push() and unshift() calls only on a variable known to be an array: annotated T[] or Array<T>, or initialised with an array and never reassigned. Any other receiver may have a push() that takes one argument, such as a stream's.
  • no-typeof-undefined does not rewrite inside a generic function or class. typeof value === "undefined" narrows a value of an unconstrained type parameter to undefined, and value === undefined does not.
  • no-useless-undefined does not rewrite these in TypeScript files: return undefined and () => undefined, which change an inferred return type from undefined to void; a parameter's = undefined default, which makes the parameter required; and trailing undefined arguments, which can leave a call short of a required parameter.
  • prefer-dom-node-append rewrites appendChild() only where its result is discarded, since append() returns undefined.
  • prefer-query-selector rewrites only a literal argument that means the same as a selector: an id, class or tag name of ASCII letters, digits, _ and - that does not start with a digit, or a name without quotes. An id held in a variable would need CSS.escape(), and "address.line1" as a selector matches a class.

unicorn/catch-error-name keeps the key of a shorthand property it renames: { cause } becomes { cause: err }, not { err }.

Four unicorn/ rules report less than they do upstream:

  • new-for-builtins reports Object() but not Object(value), a conversion TypeScript types as any, while new Object(value) is typed Object.
  • prefer-math-trunc does not report an integer literal shifted left by zero, such as 1 << 0 at the start of a bit-flag sequence.
  • explicit-length-check does not report .length or .size before || with a string fallback, such as props.size || "base", where the property is a string.
  • no-useless-undefined does not report return undefined in a TypeScript function that also returns a value. Under noImplicitReturns every path must then return explicitly.

unicorn/number-literal-case takes upstream unicorn's hexadecimalValue option, "uppercase" (the default) or "lowercase". oxfmt lower-cases hex digits, so ["error", { "hexadecimalValue": "lowercase" }] agrees with it.

Versioning

The patch is upstream's patch times 100 plus a build number. Upstream 1.83.0 gives 1.83.0, then 1.83.1; an upstream 1.83.1 would give 1.83.100. The major and minor are upstream's, so oxlint ranges keep resolving.