Seeds

Une seed est un fichier du dossier seeds/ d'une Frond, exécuté au démarrage après la migration. Elle reçoit resolve et appelle les mêmes façades que l'application.

// fronds/blog/seeds/Post.seed.ts
type Facade = Record<string, (inv?: Record<string, unknown>) => Promise<any>>;

export default async (resolve: <T>(name: string) => T) => {
  const posts = resolve<Facade>('post');

  // Ici, la seed ne s'exécute que si la base est vide.
  const existing = await posts.list();
  if (existing.length > 0) return [];

  const created = await posts.create({
    params: {}, query: {},
    body: { slug: 'hello', title: 'Hello', body: '' },
    state: { user: { id: 'seed-author' } },   // identité utilisée par la seed
  });

  // La transition utilise l'opération publish.
  await posts.publish({ params: { id: created.id }, query: {}, body: undefined,
                        state: { user: { id: 'seed-author' } } });

  return [];   // rien à laisser à la boucle de boot
};

Le contrat

  • Export : default async (resolve) => rows[]. Retourner [] signifie « tout est fait ici ».
  • resolve('<entité>') rend la façade de l'entité — chaque opération prend une invocation complète { params, query, body, state }.
  • state est défini par la seed : comme elle s'exécute côté serveur, elle peut fournir l'identité attendue par les opérations. Le publish ci-dessus effectue donc toujours sa vérification d'auteur.
  • L'idempotence est la responsabilité de la seed ; le garde-fou est un list() + retour anticipé.

Passer par la façade applique aux seeds la validation, les règles de cycle de vie et les erreurs utilisées par les appels de l'application.

Suite : Queries & commands — le couple client.

Construit avec Fougere — ce site tourne sur le framework qu'il documente.