ProvenPin Install

pluralize English nouns: working versions (tested 2026-10-16)

Pluralize and singularize regular and irregular English nouns with custom rules and count-aware output using the pluralize library offline.

passed7 passed · 0 failed2026-10-16 02:18 UTC
Status
passed
Last passed
2026-10-16 02:18 UTC
Tests
7 / 7
Language
TypeScript
Runtime
node v22.23.3
pinned versions4
pluralize@8.0.0@types/pluralize@0.0.33@types/node@26.6.5tsx@4.23.15
run it
npm install --no-audit --no-fund --ignore-scripts=false
npm test
test environment
node v22.23.3
linux 6.17.0-1022-azure
x64
runner: github-actions 38839686104

The code

Exactly the files that passed. Your agent can pull them with get_recipe("pluralize-english") (install), or see them on GitHub.

package.json
{
  "name": "pluralize-english",
  "private": true,
  "type": "module",
  "scripts": {
    "test": "node --import tsx --test test/*.test.ts"
  },
  "dependencies": {
    "pluralize": "8.0.0"
  },
  "devDependencies": {
    "@types/pluralize": "0.0.33",
    "@types/node": "26.6.5",
    "tsx": "4.23.15"
  }
}
src/nouns.ts
import pluralize from "pluralize";

pluralize.addIrregularRule("flarp", "flarpen");
pluralize.addPluralRule(/blorf$/i, "blorfen");

export function toPlural(word: string): string {
  return pluralize(word);
}

export function toSingular(word: string): string {
  return pluralize.singular(word);
}

export function isPlural(word: string): boolean {
  return pluralize.isPlural(word);
}

export function isSingular(word: string): boolean {
  return pluralize.isSingular(word);
}

export function withCount(word: string, count: number): string {
  return pluralize(word, count, true);
}
test/nouns.test.ts
import { test } from "node:test";
import assert from "node:assert/strict";
import {
  toPlural,
  toSingular,
  isPlural,
  isSingular,
  withCount,
} from "../src/nouns.ts";

test("pluralizes regular nouns", () => {
  assert.equal(toPlural("cat"), "cats");
  assert.equal(toPlural("dog"), "dogs");
  assert.equal(toPlural("box"), "boxes");
});

test("singularizes regular nouns", () => {
  assert.equal(toSingular("cats"), "cat");
  assert.equal(toSingular("boxes"), "box");
});

test("handles irregular nouns", () => {
  assert.equal(toPlural("child"), "children");
  assert.equal(toPlural("mouse"), "mice");
  assert.equal(toPlural("person"), "people");
  assert.equal(toSingular("children"), "child");
  assert.equal(toSingular("mice"), "mouse");
});

test("classifies plural and singular forms", () => {
  assert.equal(isPlural("cats"), true);
  assert.equal(isSingular("cats"), false);
  assert.equal(isSingular("cat"), true);
  assert.equal(isPlural("cat"), false);
});

test("applies a custom irregular rule", () => {
  assert.equal(toPlural("flarp"), "flarpen");
  assert.equal(toSingular("flarpen"), "flarp");
  assert.equal(isPlural("flarpen"), true);
});

test("applies a custom plural rule", () => {
  assert.equal(toPlural("blorf"), "blorfen");
});

test("pluralizes according to count including 0 and 1", () => {
  assert.equal(withCount("cat", 0), "0 cats");
  assert.equal(withCount("cat", 1), "1 cat");
  assert.equal(withCount("cat", 2), "2 cats");
  assert.equal(withCount("mouse", 1), "1 mouse");
});

Connect to ProvenPin

Add the free MCP server so your agent can pull this recipe and others like it. Same setup as the docs.

terminal
claude mcp add --transport http provenpin https://mcp.provenpin.com/mcp

Any other MCP client: Streamable HTTP at https://mcp.provenpin.com/mcp. No API key, no signup.