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

no-mistakes

v0.40.1

Published

Static codebase analysis tools for TS/JS dependencies, dependents, and symbols

Readme

no-mistakes

Unified static codebase intelligence CLI for TS/JS module graphs, symbols, React traits, queue hops, server routes, and project checks.

npm install --save-dev no-mistakes
npx no-mistakes dependencies src/main.mts --json
npx no-mistakes dependents src/utils.mts --json
npx no-mistakes symbols src/utils.mts --json
npx no-mistakes import-usages --root . --filter 'src/**' --json
npx no-mistakes check --json

Programmatic Node usage loads the same Rust analysis through N-API:

const {
  dependencies,
  dependents,
  check,
  fetches,
  importUsages,
  flow,
  playwrightRelated,
  symbols,
  testsPlan,
  testsTargets,
  queueEdges,
  queueRelated,
  queueCheck,
  serverRouteList,
  serverRouteEdges,
  serverRouteRelated,
  serverContracts,
  reactAnalyze,
  reactCheck,
  validateMermaidMarkdown,
} = require("no-mistakes");

(async () => {
  const deps = await dependencies({
    root: process.cwd(),
    files: ["src/main.mts"],
    relationships: ["import"],
    timeout: 30,
    lockTimeout: 30,
  });
  const tests = await dependents({
    root: process.cwd(),
    files: ["src/utils.mts"],
    tests: ["vitest"],
  });
  const symbolFacts = await symbols({
    root: process.cwd(),
    files: ["src/utils.mts"],
    include: "both",
  });
  const imports = await importUsages({
    root: process.cwd(),
    filters: ["src/**"],
  });
  const signatureImpact = await symbols({
    root: process.cwd(),
    files: ["src/utils.mts"],
    mode: "signature-impact",
    symbol: "parseDate",
  });
  const plan = await testsPlan({
    root: process.cwd(),
    framework: "vitest", // also supports "playwright", "dotnet", and "swift"
    changedFiles: ["src/utils.mts"],
  });
  // Complete changed-file inventory, including paths that selected no tests.
  console.log(plan.changed_files);
  const targetCommands = await testsTargets({
    root: process.cwd(),
    framework: "vitest",
    files: ["src/utils.test.mts"],
  });
  const projectCheck = await check({
    root: process.cwd(),
    // Path to tsconfig.json for alias resolution; searched upward if omitted.
    // In monorepos, pass the workspace-scoped tsconfig (e.g. "web/tsconfig.json").
    tsconfig: "tsconfig.json",
  });
  const mermaid = await validateMermaidMarkdown({
    content: "```mermaid\nflowchart LR\n  A --> B\n```",
    file: "docs/design.md",
  });
  const localFlow = await flow({
    root: process.cwd(),
    target: "src/utils.mts#parseDate",
    direction: "dependents",
    depth: 1,
  });
  const coveredByPlaywright = await playwrightRelated({
    root: process.cwd(),
    files: ["web/app/users/page.tsx"],
  });

  const queueHops = await queueRelated({
    root: process.cwd(),
    files: ["src/jobs/enqueue.ts"],
    direction: "both",
  });
  const routeEdges = await serverRouteEdges({
    root: process.cwd(),
    roots: ["src/server.ts"],
  });
  const contracts = await serverContracts({
    root: process.cwd(),
    roots: ["src/server.ts"],
  });
  const components = await reactAnalyze({
    root: process.cwd(),
    targets: ["app/**/*.tsx"],
  });
})();

CLI and Node analyses share a per-user machine-wide lock. CLI flags --timeout, --lock-timeout, and --fail-on-lock have Node equivalents timeout, lockTimeout, and failOnLock. Both timeouts default to 30 seconds; 0 disables either CLI timeout, while 0 or null disables it in Node. Waiting does not alter successful output, and Node lock/timeout failures reject the returned Promise.

Dependency graph, query, and test-planning resolution is per workspace by default: when tsconfig is omitted, each import uses the config that owns its importing file, including referenced projects. This keeps conflicting package aliases isolated while shared code can still select all importing tests. Pass tsconfig explicitly to force one config for a whole invocation when debugging or preserving a legacy single-config workflow.

Graph queries also support relationships: ["workflow"] for canonical local GitHub Actions traversal: workflow file -> virtual job -> virtual step, needs, local reusable workflows/actions, supported literal run: targets and package scripts, and same-run artifact handoffs. Virtual IDs are workflow.yml#job:<job> and workflow.yml#job:<job>/step:<zero-based-index>. Use the precise workflow-job, workflow-step, workflow-needs, workflow-uses, workflow-run, or workflow-artifact filters to select a semantic while retaining its required structural bridge edges. The legacy ci relationship stays separate: it covers only workflow-file-to-Rust-binary Cargo invocations. Remote actions/workflows, workflow_run, dynamic shell commands, and paths outside the tracked graph are intentionally excluded.

External no-mistakes-* executables on PATH can be invoked as subcommands. For example, after installing no-mistakes-scripts:

npm install --save-dev no-mistakes-scripts
npx no-mistakes rust-no-inline-tests crates/*/src
npx no-mistakes rust-max-lines-per-file crates/*/src crates/*/tests

See the full documentation in docs/, the CLI command index, and the Node/N-API guide.