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

numero-ci

v0.3.0

Published

Numéros de téléphone ivoiriens : normalisation, détection de l opérateur, et rapprochement entre l ancien format à 8 chiffres et le nouveau à 10.

Readme

numero-ci

Les numéros de téléphone ivoiriens, sans surprise.

npm install numero-ci
import { parse, operatorName, format, matchKey } from 'numero-ci';

parse('+225 07 57 22 36 37');
// { valid: true, national: '0757223637', international: '+2250757223637',
//   matchKey: '57223637', legacyFormat: false }

operatorName('0557223637');   // 'mtn'
format('+2250757223637');     // '07 57 22 36 37'

Pourquoi ce paquet

Les bibliothèques généralistes valident un numéro. Elles ne règlent pas les trois problèmes qu'on rencontre vraiment en Côte d'Ivoire.

1. Les deux époques cohabitent dans toutes les bases

Le 31 janvier 2021, la numérotation est passée de 8 à 10 chiffres : un préfixe de deux chiffres a été ajouté devant l'ancien numéro. Résultat, une base de contacts constituée sur plusieurs années contient les deux écritures de la même ligne.

Sur un carnet WhatsApp réel de 1 122 contacts, nous avons compté 531 numéros à l'ancien format contre 60 au nouveau. Comparer les chaînes brutes ne rapproche rien, et le même client compte deux fois.

matchKey() renvoie les 8 derniers chiffres — la partie que la renumérotation n'a pas touchée :

matchKey('22557223637')          // '57223637'  (ancien format)
matchKey('+225 07 57 22 36 37')  // '57223637'  (actuel)  → même ligne

C'est la clé à utiliser pour dédoublonner, pour rapprocher un CRM d'un export WhatsApp, ou pour vérifier qu'on n'écrit pas deux fois à la même personne.

2. L'opérateur, quand il est connaissable

import { operator } from 'numero-ci';

operator('0757223637');
// { operator: 'orange', type: 'mobile', source: 'prefix' }

Depuis 2021 le préfixe le dit sans ambiguïté : 01 Moov, 05 MTN, 07 Orange pour le mobile ; 21, 25, 27 pour le fixe.

3. Il refuse de deviner

Un ancien numéro à 8 chiffres ne porte pas son opérateur dans le plan actuel. Les tranches sont connues pour 01–03 (Moov), 04–06 (MTN), 07–09 (Orange), plus les tranches en 4x–9x que MTN publie. En dehors de celles-là :

operator('57223637');
// { operator: null, type: null, source: 'unknown' }

null, et pas une supposition. Un opérateur faux envoie un paiement Mobile Money au mauvais endroit, ou un SMS par la mauvaise passerelle. Une réponse « je ne sais pas » se traite ; une réponse fausse, non.

Chaque résultat indique d'où il vient (prefix, legacy-prefix, unknown), pour que vous décidiez si vous vous y fiez.

API

| Fonction | Ce qu'elle fait | |---|---| | parse(numero, operator?) | analyse complète : validité, formes, clé de rapprochement | | isValid(numero) | true / false | | matchKey(numero) | les 8 chiffres de rapprochement, ou null | | operator(numero) | opérateur, type de ligne, et source de la réponse | | operatorName(numero) | 'orange' \| 'mtn' \| 'moov' \| null | | isMobile(numero) | true \| false \| null | | format(numero, style?, operator?) | 'national', 'international', 'compact', 'wa' | | whatsappLink(numero, message?) | lien wa.me, message pré-rempli optionnel |

Toutes les fonctions acceptent n'importe quelle écriture : espaces, points, tirets, parenthèses, indicatif +225, 00225, ou rien. Les tirets insécables (U+2011) sont gérés — on les trouve dans du texte produit par des modèles de langage et dans certains exports de CRM.

Convertir un ancien numéro

Il lui manque son préfixe, donc son opérateur. Les tranches couvrent la plupart des cas ; sinon, donnez-le :

parse('07223637');            // '0707223637' — 07 était Orange à l'époque
parse('57223637');            // valid: false, la raison est expliquée
parse('57223637', 'orange');  // '0757223637'

Les fixes d'avant 2021 sont reconnus sans qu'on ait à préciser quoi que ce soit : 20–25 pour Abidjan, 30–36 pour l'intérieur. Le fixe étant alors le monopole de Côte d'Ivoire Télécom, devenu Orange, ils prennent tous 27.

parse('34710539').national;   // '2734710539' — un fixe de San-Pédro
parse('22411692').national;   // '2722411692' — un fixe d'Abidjan
isMobile('34710539');         // false

Sources

Les préfixes viennent des opérateurs eux-mêmes, pas d'une mémoire :

MTN publie ses anciens préfixes mobiles. Les tranches en 0x viennent de la connaissance du terrain (Zakaria Koné) et recoupent exactement la liste MTN sur 04–06, ce qui les corrobore. Si vous avez une source officielle pour les tranches d'Orange et de Moov, ouvrez une issue — c'est la contribution la plus utile qu'on puisse faire ici.

Tests

npm test

22 tests, aucune dépendance.

In English

Ivorian phone numbers. Solves three local problems that general-purpose libraries ignore: matching a pre-2021 8-digit number with its current 10-digit form (so you can deduplicate contact lists where both coexist), detecting the operator from the prefix, and returning null instead of a guess when the operator cannot be known. The API is in English; the documentation is in French because that is the language of the developers who hit these problems.

Licence

MIT