@rzerodev/departements-villes-bj
v0.1.3
Published
Module NestJS + Prisma pour créer et seeder les tables Pays / Départements / Villes du Bénin (données géographiques).
Maintainers
Readme
@rzerodev/departements-villes-bj
Module réutilisable pour projets NestJS + Prisma qui ajoute et seed les
tables géographiques du Bénin : Pays, Departement, Ville
(département = admin_name, ville = city, avec lat/lng, population, statut
de capitale).
Conçu pour être facilement étendu à d'autres pays plus tard (un fichier JSON
par pays dans data/, même structure Pays -> Departement -> Ville).
Vous intégrez ce package dans votre projet ? Suivez le guide d'intégration pas à pas.
Compatibilité Prisma : @prisma/client >=4.0.0 <8.0.0 (Prisma 4 à 7).
Prisma 8 est pour l'instant une release candidate avec un CLI différent
et n'est pas encore supporté — voir la section
Compatibilité Prisma du guide
d'intégration pour le détail (notamment le driver adapter requis par
Prisma 7).
Pourquoi ça marche comme ça
Prisma ne permet qu'un seul schema.prisma par projet, avec un seul
PrismaClient généré. Un package npm ne peut donc pas "installer" ses
propres tables de façon invisible : il doit injecter ses modèles dans
votre schema.prisma, puis vous laisser lancer votre migration normalement.
Ensuite, votre propre PrismaClient (déjà généré) contient les modèles
Pays / Departement / Ville, et ce package fournit juste la fonction de
seed qui les remplit.
Installation
npm install @rzerodev/departements-villes-bj1. Ajouter les tables à votre schema.prisma
npx departements-villes-bj-sync
# ou si votre schema n'est pas au chemin par défaut :
npx departements-villes-bj-sync --schema chemin/vers/schema.prismaCela ajoute (ou met à jour) un bloc balisé dans votre prisma/schema.prisma :
// <<< @rzerodev/departements-villes-bj:start >>>
model Pays { ... }
model Departement { ... }
model Ville { ... }
// <<< @rzerodev/departements-villes-bj:end >>>Puis appliquez la migration :
npx prisma format
npx prisma migrate dev --name add_departements_villes_bj
npx prisma generate2. Seeder les données
Option A — script de seed Prisma classique (recommandé)
Dans prisma/seed.ts — Prisma ≤ 6 :
import { PrismaClient } from '@prisma/client';
import { seedDepartementsBj } from '@rzerodev/departements-villes-bj';
const prisma = new PrismaClient();
async function main() {
const result = await seedDepartementsBj(prisma, {
logger: (msg) => console.log(msg),
});
console.log(result); // { paysCount, departementsCount, villesCount }
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(() => prisma.$disconnect());Prisma 7 exige un driver adapter (npm install @prisma/adapter-pg pg
pour Postgres) — voir l'exemple complet dans le
guide d'intégration.
Et dans package.json :
{
"prisma": {
"seed": "ts-node prisma/seed.ts"
}
}npx prisma db seedLe seed est idempotent : relancez-le autant de fois que nécessaire, il
n'y aura jamais de doublons (upsert sur iso2, nom+pays, nom+departement).
Filtrer les données à seeder
Par défaut, seedDepartementsBj charge tout le fichier (aujourd'hui : le
Bénin, ses 12 départements, ses 95 villes). Vous pouvez restreindre ce qui
est seedé avec ces options :
await seedDepartementsBj(prisma, {
pays: 'BJ', // code(s) iso2 à garder (string ou string[])
departements: ['Littoral', 'Atacora'], // ne seeder que ces départements (insensible à la casse)
limit: 3, // ou : les 3 premiers départements seulement
logger: (msg) => console.log(msg),
});pays: filtre par code iso2 ('BJ'ou['BJ', 'TG']) — utile quanddata/contiendra plusieurs pays.departements: liste blanche de noms de départements (admin_name).limit: nombre maximum de départements à seeder, appliqué après les filtrespays/departements(les N premiers rencontrés dans le fichier).
Ces options se combinent : par exemple { pays: 'BJ', limit: 3 } ne seed
que les 3 premiers départements béninois.
Option B — module NestJS (pour un seed déclenché depuis l'app)
import { Module } from '@nestjs/common';
import { DepartementsVillesBjModule } from '@rzerodev/departements-villes-bj';
import { PrismaService } from './prisma/prisma.service';
import { PrismaModule } from './prisma/prisma.module';
@Module({
imports: [
PrismaModule,
DepartementsVillesBjModule.forRootAsync({
imports: [PrismaModule],
inject: [PrismaService],
useFactory: (prisma: PrismaService) => prisma,
seedOptions: { pays: 'BJ', limit: 3 }, // optionnel — voir "Filtrer les données à seeder"
}),
],
})
export class AppModule {}Puis injectez DepartementsVillesBjService où besoin :
constructor(private readonly departementsVillesBjService: DepartementsVillesBjService) {}
async onModuleInit() {
await this.departementsVillesBjService.seed();
// ou, pour écraser les seedOptions par défaut du module pour cet appel :
// await this.departementsVillesBjService.seed({ departements: ['Littoral'] });
}Modèles créés
model Pays {
id Int
nom String
iso2 String @unique
departements Departement[]
}
model Departement {
id Int
nom String
paysId Int
villes Ville[]
}
model Ville {
id Int
nom String
latitude Float
longitude Float
capitale String? // "", "admin" ou "primary"
population Int?
populationVille Int?
departementId Int
}