Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC]: publier une config jest #48

Open
pierrezimmermannbam opened this issue Aug 28, 2023 · 3 comments
Open

[RFC]: publier une config jest #48

pierrezimmermannbam opened this issue Aug 28, 2023 · 3 comments

Comments

@pierrezimmermannbam
Copy link
Contributor

Je voudrais récolter vos opinions sur la pertinence de rajouter sur ce repo des configs jest et rntl et de les publier sur npm.
Concrètement, on aurait une config expo et une config bare RN exportée et on les utiliserait comme ça

const baseConfig = require('@bam.tech/jest-config-expo');

module.exports = {
  ...baseConfig,
  // overrides
};

Avantages

Partage des best practices

On partage beaucoup de choses dans les config de jest sur les différents projets. Actuellement on fait des copier coller depuis la bootstrap doc ou alors depuis d’anciens projets (le pire cas potentiellement parce que les configs sont pas forcément bonnes)

En plus de rendre la maintenance plus compliquée, on peut passer à côté de choses très sympas qu’on a implémentées sur les enablers comme sucrase, le clear des mocks, le matcher custom pour les snapshots pour n'en nommer que quelques uns.

Setup et facilité de maintenance

Les projets auraient juste à installer le package et si tout va bien ça devrait rouler. Ensuite s'il y a des nouveautés ils auraient juste à bump le package

Open sourcé

Un autre avantage c’est que ça pourrait être open sourcé, je sais pas trop si ça serait utilisé en dehors de bam mais ça mange pas de pain

Maintenance des enablers

C'est peut-être un des points les plus importants. Aujourd'hui on a une config jest au niveau de chaque module (joconde, doc, cli, warehouse) et c'est un copié collé, du coup si on fait une modif à un endroit il faut la faire partout. Si on avait un package on aurait une seule source de vérité. Cependant on pourrait aussi résoudre ce problème de manière différente, par exemple en mettant la config à la racine et en référençant cette config dans la doc (ce qui serait sans doute une bonne idée, même si on avait le package publié on aurait pas à bump la version partout)

Inconvénients

Malheureusement tout n'est pas rose quand on utilise une lib pour sa config jest (j'en ai fait l'expérience sur un ancien projet):

  • la config est cachée en grande partie, i.e. on doit aller voir dans les node_modules pour voir ce qui se cache dans la config, pas très commode pour debug
  • niveau formation c’est pas optimal non plus, ça devient une boite noire et on court le risque que la connaissance de ces configs disparaisse
  • est-ce que c’est vraiment plus commode que la bootstrap doc ou que la config de la joconde ? Faire un copier coller ça va vite et on peut choper ce qu’on veut derrière. Ici il faudrait savoir si la config dans les enablers est consultée fréquemment aujourd'hui et si c'est pas le cas est-ce qu'avoir un package publié la rendrait plus populaire.
  • La config a beaucoup bougé au début des enablers mais dans le futur est-ce que ça a vocation a beaucoup évoluer ? Pas sûr du tout, auquel cas un brave cp depuis les enablers ferait le taf

Ces inconvénients sont modérés par le fait qu’on pourrait toujours cp le code du package publié pour garder les avantages qu’on avait avant en terme de flexibilité et de lisibilité (même si on pourrait galérer pendant des mois avant de prendre l'action de faire un cp plutôt qu'utiliser la lib)

Je ne suis pas moi-même convaincu que ça soit une bonne idée mais je ne suis pas non plus convaincu que ça soit une mauvaise idée donc chaud pour vos retours

@robingullo
Copy link

Est-ce qu'on peut imaginer quelque chose plus dans l'esprit de warehouse où on téléchargerait la dernière version de la config, git diff et merge (avec résolution de conflits potentiels) ? Tout ça automatisé dans une commande de CLI. Je pense à la "lib" shadcn/ui qui a une approche copier-coller plutôt que package npm : https://ui.shadcn.com/docs/changelog#diff-experimental. Si toute la config est bien documentée ligne par ligne, tu peux ensuite choisir de garder les lignes qui t'intéressent pas.

Sur les enablers, si tous les packages utilisent la même config, on pourrait lancer cette commande sur tous les packages dès qu'on fait une modif de la config jest (même directement dans la CI ?)

Sinon un compromis ça serait de télécharger la config telle quelle dans un fichier jest.bam.config.js et de l'override dans jest.config.js. En gros, comme ce que tu proposes mais dans un fichier du repo plutôt que dans node_modules

@pierrezimmermannbam
Copy link
Contributor Author

Hmm c'est une approche intéressante en effet. Le problème c'est que pour le moment la CLI est pas très développée, il y a pas mal de taf à faire dessus.
Comment ça fonctionne la diff exactement ? De ce que je vois il y a quand même un package npm donc est-ce que la commande de diff fait pas juste pour toi le taf de regarder les changelogs des nouvelles versions ? Si on a un fichier en local qu'on a un peu custom on aura toujours des diffs avec l'upstream non ? Si tu la gardes dans un fichier à part ça résout le problème mais ça peut être assez incompréhensible qu'il faut maintenir l'original dans son repo
Aussi le désavantage c'est que t'auras pas des majs automatiques que tu pourrais avoir si t'as un bot pour gérer les deps par exemple.

@Gguigre Gguigre changed the title RFC: publier une config jest [RFC]: publier une config jest Aug 31, 2023
@MattAgn
Copy link

MattAgn commented Sep 28, 2023

J'aime bien l'idée de partager la config en lib car on peut avoir pas mal de chose dedans :

  • les snapshots customs
  • la config jest
  • les matchers jest que Pierre a créé toHaveBeenCalledOnceWith, et toHaveBeenCalledNTimesWith

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants