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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@nivalis/normadresse

v3.1.0

Published

French Postal Addresses Normalizer

Readme

@nivalis/normadresse

French Postal Addresses Normalizer

npm version dependencies Status

@nivalis/normadresse is a zero-dependency TypeScript implementation of the normalization rules published by the French Base Adresse Nationale (BAN). It replicates the historical Etalab/La Poste behavior so that you can predict how an address will be shortened before printing envelopes, creating database keys, or comparing postal data.

Why this package?

  • Battle-tested dataset: rules are ported from the official Etalab normadresse distribution.
  • Deterministic, locale-aware output (diacritics removed, particles handled, saints abbreviated, etc.).
  • Works in both Node.js and modern bundlers without native dependencies.
  • Configurable output length (default 32 characters) to fit legacy systems.

Installation

pnpm add @nivalis/normadresse
# or
npm install @nivalis/normadresse
# or
yarn add @nivalis/normadresse

Quick start

import { normalize } from '@nivalis/normadresse';

const raw = 'Boulevard du Marechal Jean Marie de Lattre de Tassigny';
const normalized = normalize(raw);

console.log(normalized);
// -> BD MAL J M DE LATTRE DE TASSIGNY

Need to squeeze the output even more? Pass a custom maxLength (in characters):

normalize(raw, 24);
// -> BD MAL J M DE LATTRE

The function always returns an uppercase string so that you can safely compare normalized addresses.

API

normalize(input: string, maxLength = 32): string

  • input – any raw address line; accents, punctuation, and casing do not matter.
  • maxLength – desired maximum length, defaulting to 32 characters.

Returns the normalized uppercase address. When the input already fits in the requested length, the string is merely sanitized (trimmed, deduplicated spaces, and diacritics removed).

clearRulesCache(): void

The rule set is compiled once and cached. Call clearRulesCache() in test suites when you need to isolate scenarios that alter the global state (for instance when spying on RegExp creation).

Normalization pipeline

The implementation follows the historical Etalab steps:

  1. Pre-processing: remove diacritics, uppercase the string, drop punctuation, and collapse repeated spaces.
  2. Apply a sequence of replacements (road types, honorific titles, general abbreviations, prenoms, saint/sainte, etc.) while progressively checking the string length.
  3. Handle tricky cases such as particles (de, du, des), SaintSt, or repeated articles that should disappear only when necessary.
  4. Finish by applying residual abbreviations and article removals until the desired length is reached or no change is possible.

Because every step is deterministic, running the function twice with the same input (even across platforms) always yields the same output.

Data source & contributions

The rules live in index.ts and originate from Etalab's normadresse project as well as the js-normadresse port. If you notice a discrepancy with the official BAN output, please open an issue with a failing example and, if possible, a reference to the authoritative rule.

Development

pnpm install       # install dependencies
pnpm test          # run the Bun-powered test suite
pnpm lint          # biome static analysis
pnpm build         # compile TypeScript via tsdown

See also

License

MIT