Retour à la documentation

Module SDK — Guide complet

Créez, compilez, signez et publiez votre premier module BizzOptima avec le CLI officiel.

Le Module SDK BizzOptima vous permet de créer des extensions métier complètes intégrées nativement dans l'application desktop. Chaque module est un bundle IIFE autonome signé et distribué via le marketplace.

Prérequis

  • Node.js 20+
  • Un compte développeur BizzOptima
  • Connaissance de React et TypeScript

1 — Créer un compte développeur

bash
bizzoptima login

Si vous n'avez pas encore de compte, inscrivez-vous depuis l'espace développeurs ou via le CLI :

bash
# Installer le CLI globalement
npm install -g bizzoptima-cli

# Se connecter (ou créer un compte sur developers.bizzoptima.com)
bizzoptima login

2 — Initialiser un module

bash
bizzoptima init mon-module
cd mon-module
npm install

Le CLI génère la structure complète avec le manifest v2, un composant React fonctionnel et la configuration TypeScript :

bash
mon-module/
├── src/
│   └── index.tsx        ← composant + déclaration BizzOptimaModules
├── manifest.json        ← métadonnées, permissions, sécurité
├── package.json
├── tsconfig.json
└── .bizzmodignore

3 — Le manifest.json

Le manifest v2 déclare les capabilities requises, les restrictions d'accès inter-modules et les métadonnées marketplace :

json
{
  "id": "mon-module",
  "name": "Mon Module",
  "version": "1.0.0",
  "author": "Votre Nom",
  "license": "MIT",
  "minAppVersion": "1.0.0",
  "entryPoint": "dist/index.js",
  "permissions": [
    "db:read",
    "db:write",
    "events:subscribe",
    "events:emit"
  ],
  "sensitiveData": false,
  "trustedCallers": []
}

4 — Coder le module

Chaque module reçoit une instance de BizzOptimaModuleAPI scopée à son moduleId. Utilisez les hooks React du SDK :

tsx
import { ModuleRoot, useDB, useToast, usePermission } from '@bizzoptima/module-sdk';

function MyScreen() {
  const { data: items, loading } = useDB('SELECT * FROM my_items');
  const toast = useToast();
  const canWrite = usePermission('db:write');

  return (
    <div>
      {loading ? 'Chargement…' : items.map(i => <div key={i.id}>{i.name}</div>)}
      {canWrite && (
        <button onClick={() => toast('Succès', { type: 'success' })}>
          Action
        </button>
      )}
    </div>
  );
}

// Déclaration globale (chargée par le desktop)
window.BizzOptimaModules['mon-module'] = {
  manifest: { id: 'mon-module', name: 'Mon Module', version: '1.0.0' },
  init(api) {
    // setup: DB migrations, event subscriptions, inter-module bridges
  },
  Screen() {
    return <ModuleRoot api={window.__BIZZOPTIMA_API__}><MyScreen /></ModuleRoot>;
  },
};

5 — Sécurité inter-modules

Pour les modules manipulant des données sensibles (paiements, santé), restreignez les appels entrants avec trustedCallers dans le manifest et createSecureHandler dans le code :

tsx
import { createSecureHandler, createPaymentGuard } from '@bizzoptima/module-sdk';

// Dans init() :
const guardPayment = createPaymentGuard(api, {
  allowedCallers: ['quick_cashier', 'sales'],
});

api.interModule.expose(
  'processPayment',
  createSecureHandler(
    async (params, caller) => {
      guardPayment(caller);  // throws si caller non autorisé
      // ... logique de paiement
    },
    { moduleId: 'mon-module', allowedCallers: ['quick_cashier', 'sales'] },
  ),
);

6 — Build

bash
bizzoptima build
# → Compile TypeScript avec tsc
# → Crée mon-module-1.0.0.bizzmod (zip)

7 — Signature cloud

La signature est effectuée par le serveur BizzOptima avec la clé Ed25519 privée. Votre compte développeur doit être actif :

bash
bizzoptima sign
# → Envoie le .bizzmod au serveur
# → Reçoit le bundle signé (signature.json injectée)
# → Écrase le fichier local

8 — Publication

bash
bizzoptima publish
# → Upload vers Firebase Storage
# → Crée le document Firestore dans developer_modules
# → Soumet pour review par l'équipe BizzOptima

Une fois approuvé, votre module apparaît dans le marketplace pour les utilisateurs ayant le plan compatible.

Référence complète du SDK

Consultez la SDK Reference complète pour la liste exhaustive de toutes les APIs disponibles, leurs signatures TypeScript et leurs prérequis de capability.