@mapfarm/portal-sdk (0.1.1)
Installation
@mapfarm:registry=npm install @mapfarm/portal-sdk@0.1.1"@mapfarm/portal-sdk": "0.1.1"About this package
@mapfarm/portal-sdk
SDK des portails MAPFARM (forge · harvest · console). Extrait l'« os commun » des portails scopés — le client d'accès (auth + isolation ADR-006) et quelques primitives UI — pour ne pas le réécrire à chaque portail (règle de trois, ADR-007).
Publié sur le registre npm privé de la forge (Gitea) :
https://git.mapfarm.cloud/api/packages/mapfarm/npm/.
createClient — le client scopé (le cœur)
Abstrait les deux seuls axes qui diffèrent entre portails ; tout le reste (get/post/
upload/fileUrl, erreur typée ApiError) est commun.
import { createClient } from "@mapfarm/portal-sdk";
// forge — SSO Authelia (cookie) + tenant en en-tête, validé côté BFF
const client = createClient({
base: "/api/factory/portal/v1",
auth: { mode: "cookie" },
scope: { carrier: "header", name: "X-Portal-Tenant", value: () => getTenant() },
});
// harvest — magic-link (bearer) + company_id en query
const client = createClient({
base: "/api/producer",
auth: { mode: "bearer", token: TOKEN },
scope: { carrier: "query", name: "company_id", value: () => activeCompanyId() },
});
const me = await client.get("/me");
await client.post("/validate", { decision });
- auth :
{ mode: "cookie" }(credentials include) |{ mode: "bearer", token }. - scope :
{ carrier: "header" | "query", name, value }.valueaccepte une fonction() => string(scope dynamique, relu à chaque appel). - Le SDK transporte le scope ; il ne le décide pas. Le serveur le valide contre le périmètre autorisé (hors périmètre → 403). L'isolation reste serveur.
fileUrl(path, extra): URL<img>/téléchargement (scope + token en query, où un en-tête est impossible).
Primitives UI
Badge · Kpi (layout="value-first" ou libellé d'abord) · Loading · Empty ·
Chip · SectionHead. Structure + noms de classes uniquement, aucun thème : chaque
portail garde son styles.css (forge sombre, harvest clair+or) → zéro régression.
Lot 0 (v0.1.0) : le Shell partagé et un design-system complet sont volontairement différés au 3ᵉ portail (console) — les deux portails existants divergent trop de thème/mise en page pour une abstraction saine maintenant (R4, pas de généralisation prématurée).
Tests
npm test # node test/client.test.mjs — contrat du client scopé (9 cas)
Dependencies
Peer Dependencies
| ID | Version |
|---|---|
| react | >=18 |