# form-validation

Petite lib JS de validation de champs (téléphone, email, URL), servie par
`js.letareau.fr` comme `html-builder` — pas de build tool côté consommateur,
juste des `<script>` à charger. Module indépendant, aucun lien avec
`html-builder`.

Source : `/var/www/js/form-validation/`.

## Charger la lib

```html
<script src="https://js.letareau.fr/form-validation/dist/form-validation.js"></script>
<script>
  fetch('https://js.letareau.fr/form-validation/data/phone-formats.json')
    .then(r => r.json())
    .then(data => FormValidationPhone.setData(data));
</script>
```

Trois objets globaux exposés : `FormValidationPhone`, `FormValidationEmail`, `FormValidationUrl`.

## Téléphone

```js
FormValidationPhone.validate('06 12 34 56 78', {
    countries: ['FR'],       // optionnel — codes ISO autorisés, ex: forcer la France
    defaultCountry: 'FR',    // optionnel — pays supposé si le numéro est saisi sans "+"
});
// → { valid: true, country: 'FR', reason: null }
```

Sans `countries`, tous les pays connus (245, voir `data/phone-formats.json`)
sont acceptés dès que le numéro commence par `+`. Sans `+` ni
`defaultCountry`, la validation échoue (`reason: 'unknown_country'`) — il
faut au moins l'un des deux pour désambiguïser un numéro saisi en local.

`reason` possibles : `empty`, `unknown_country`, `no_match`.

## Email / URL

```js
FormValidationEmail.validate('a@b.fr');      // { valid: true, reason: null }
FormValidationUrl.validate('https://x.com'); // { valid: true, reason: null }
FormValidationUrl.validate('ftp://x.com', { protocols: ['http:', 'https:', 'ftp:'] });
```

Validation de forme uniquement (pas de vérification DNS/MX pour l'email, pas
de test d'accessibilité réelle pour l'URL).

## Données téléphone : `data/phone-formats.json`

Générées depuis les métadonnées publiques de
[libphonenumber](https://github.com/google/libphonenumber) (Google, Apache
2.0) — indicatif pays, préfixe national, et regex de validation du numéro
national par pays (245 pays).

### Mettre à jour les données

```sh
cd /var/www/js/form-validation
php update-phone-data.php
```

Télécharge `PhoneNumberMetadata.xml` depuis le dépôt GitHub public de
libphonenumber et régénère `data/phone-formats.json`. Aucun appel réseau
n'est fait par la lib JS elle-même — seul ce script, lancé manuellement ou
via cron, dépend du réseau.

**Cron mensuel recommandé** (les formats de numéros changent rarement, un
rafraîchissement mensuel suffit largement) :

```cron
0 4 1 * * php /var/www/js/form-validation/update-phone-data.php >> /var/log/form-validation-update.log 2>&1
```

## Déploiement

```sh
cd /var/www/js/form-validation
./build.sh
```

Régénère `dist/form-validation.js` (concaténation simple de `src/*.js`,
même principe que `html-builder/build.sh`). `js.letareau.fr` sert
directement `/var/www/js/` — rien à copier ailleurs.

## Où c'est utilisé

- `sondage.letareau.fr` — validation du champ téléphone dans les sondages
  (`views/surveys/respond.php`), en complément de l'attribut HTML `pattern`
  natif (garde-fou local instantané, avant/après JS).
