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

@orderofchaos/ling-cli

v0.2.1

Published

CLI for extracting translations from source code

Readme

@orderofchaos/ling-cli

CLI tools for extracting and validating translations.

Ecosystem

  • Marketing site: https://order-of-chaos.github.io/ling/
  • Documentation index: https://order-of-chaos.github.io/ling/docs/
  • CLI usage: https://order-of-chaos.github.io/ling/docs/cli/
  • Examples: https://github.com/order-of-chaos/ling/tree/master/examples/cli-setup
  • GitHub: https://github.com/order-of-chaos/ling

| Package | Purpose | | --- | --- | | @orderofchaos/ling | Complete package that installs the full Ling toolkit and re-exports the React/core API. | | @orderofchaos/ling-core | Core types, storage adapters, translators, and pluralization utilities. | | @orderofchaos/ling-react | React provider, hooks, and module helpers for Ling apps. | | @orderofchaos/ling-cli | CLI tools for extracting and validating translation files. | | @orderofchaos/eslint-plugin-ling | ESLint rules that keep translation keys statically analyzable. |

Installation

pnpm add -D @orderofchaos/ling-cli

Commands

ling-scan / ling

Scans source code for t() calls and generates translation files.

# Scan src directory (default)
pnpm ling-scan

# Scan specific directory
pnpm ling-scan ./app

ling-lint

Checks for missing translations.

# Check against Russian as default language
pnpm ling-lint ru

# Specify translations directory
pnpm ling-lint ru ./src/i18n/translations

Configuration

Create ling.config.json in project root:

{
  "outDir": "src/i18n/translations",
  "locales": ["ru", "en"],
  "originalLocale": "ru"
}

How It Works

The scanner finds all calls to t() function in your code:

// src/components/Header.tsx
const { useI18n } = initI18nModule("Header");

function Header() {
  const { t } = useI18n();
  return <h1>{t("Welcome to our app")}</h1>;
}

Running ling-scan generates:

// src/i18n/translations/ru.ts
export const ru = {
  Header: {
    "Welcome to our app": "Welcome to our app",
  },
};

// src/i18n/translations/en.ts
export const en = {
  Header: {
    "Welcome to our app": "Welcome to our app",
  },
};

Then translate the values manually or with a tool.

CI & Pre-commit Integration

Pre-commit Hook (Husky + lint-staged)

Catch missing translations before commit:

# Install
pnpm add -D husky lint-staged
pnpm husky init

Add to package.json:

{
  "lint-staged": {
    "*.{ts,tsx}": [
      "pnpm ling-scan src",
      "pnpm ling-lint en src/i18n/translations"
    ]
  }
}

Add hook .husky/pre-commit:

pnpm lint-staged

GitHub Actions

Add translation check to CI:

# .github/workflows/ci.yml
jobs:
  lint-translations:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v2
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "pnpm"
      - run: pnpm install
      - run: pnpm ling-lint en src/i18n/translations

npm Scripts

Add convenience scripts to package.json:

{
  "scripts": {
    "i18n:scan": "ling-scan src",
    "i18n:lint": "ling-lint en src/i18n/translations",
    "i18n:check": "pnpm i18n:scan && pnpm i18n:lint"
  }
}

Programmatic API

import { scanDirectory, findMissingTranslations } from "@orderofchaos/ling-cli";

// Scan directory
const result = scanDirectory("./src", {
  extensions: ["ts", "tsx"],
  translatorFunction: "t",
  moduleInitFunction: "initI18nModule",
});

// Check for missing translations
const lint = findMissingTranslations(translations, "ru");
console.log(lint.missing);

License

MIT