Flex est un projet qui n'a pas d'objectif spécifique, il vise à développer des applications et des sites web de manière différente, en utilisant une multitude de langages et une variété de technologies.
Flex a été réfléchi pour une architecture / organisation multi-applications et multi-sites.
Informations importantes concernant ce projet:
- Il a été crée pour le fun et dans le but de m'améliorer dans la conception de projets de manière générale.
- Il n'a pas vocation d'être DÉPLOYÉ pour de la production.
- Il n'est pas STABLE et ne le sera pas non plus dans le futur.
- Il ne se veut pas lié à un écosystème d'un langage précis.
- Il PEUT être abandonné à tout moment.
Autrement dit, c'est un code en chantier et non professionnel. Toutefois le projet se veut suivre une certaine qualité de code, en suivant les règles de qualité de code qui ont été définit par mes propres soins.
-
Chat
-
Flex Discussionclient web avec Vue- Un fichier
apps/web/flex-discussion/.envDOIT être crée.
- Un fichier
-
-
Serveur
-
Un fichier
config/flex/.envDOIT être crée. Se referrer au fichierconfig/flex/.env.example. -
Les fichiers de configuration finissant par
.example.ymlDOIVENT être renommés, sans.example. Exemple:chat.example.yml->chat.yml.
-
| Ice | Dark | Light |
|---|---|---|
![]() |
![]() |
![]() |
- Node.js LTS
- pnpm (utilisation des workspace avec)
- Rust
pnpm install
cargo build- Chat Server:
cargo run --bin flex - Flex Discussion Web Client:
pnpm chat:discussion - Flex Discussion Storybook:
pnpm story:discussion - Adonai Serveur Application:
pnpm adonai
Flex utilise Vitest pour tester unitairement le code JavaScript/TypeScript.
- Exécution des tests unitaires:
# Démarrer tous les tests unitaires de tous les packages
pnpm test:unit
# Démarrer tous les tests unitaires d'un package spécifique
pnpm --filter @phisyx/flex-<package-name> test:unit-
Écrire un test unitaire:
- Placer les fichiers de test dans un répertoire
testsau sein du package - Nommer les fichiers de test avec une extension
.spec.ts
Exemple:
import { it } from "vitest"; import { myFunction } from "#src/myFile"; it("myFunction: test case description", ({ expect }) => { expect(myFunction(input)).toEqual(expectedOutput); });
- Placer les fichiers de test dans un répertoire
Flex utilise Playwright pour les tests end-to-end de l'application web Flex Discussion.
-
Exécution des tests E2E:
# Démarrer tous les tests e2e pnpm test:e2e # Afficher le report pnpm test:e2e:report
-
Écrire un test E2E:
- Placer les fichiers de test dans un répertoire
tests/e2eau sein du package - Nommer les fichiers de test avec une extension
.spec.ts - Utiliser la classe utilitaire
ChatPageContextpour simplifier les opérations communes
Exemple:
import { test } from "@playwright/test"; import { ChatPageContext } from "./helpers/context.js"; test("Test description", async ({ page }) => { let chat_ctx = await ChatPageContext.connect(page); // Test actions and assertions });
- Placer les fichiers de test dans un répertoire
-
Exécution des tests Rust:
# Lancer tous les tests cargo test # Lancer tous les tests d'un package spécifiqu cargo test -p flex-package-name
-
Écrire un test Rust:
- Placer les fichiers de test dans un répertoire
testsau sein du package ou directement dans un module avec#[cfg(test)]
Exemple:
#[test] fn test_function_name() { let result = function_to_test(); assert_eq!(result, expected_value); }
- Placer les fichiers de test dans un répertoire
| Dossier | Proposition | Informations complémentaires |
|---|---|---|
| apps/ | Toutes les applications liées à notre projet | |
| apps/{app}/ | Application | |
| apps/{app}/assets/ | Ressources statiques d'une application | Ressources bien spécifiques à l'application. |
| apps/{app}/bin/ | Différents points d'entrées d'une app | (system) |
| apps/{app}/entrypoints/ | Différents points d'entrées d'une app | (front) |
| apps/{app}/src/ | Fichier source, code métier | |
| apps/{app}/sys/ | Design système de l'application | EX: storybook, histoire, ... -- À décider (avec /design). |
| apps/{app}/types/ | Déclarations de types | Pour TypeScript, par exemple. EX: types/file.d.ts |
| apps/{app}/{dir}/ | ||
| apps/{app}/app.{ext} | Point d'entrée de l'application (lib) | EX: app.ts, app.rs, app.php, ... |
apps/{app}/{pollution-file} |
EX: .gitignore, .eslint, biome.json, clippy.toml, phpstan.neon, ... |
|
| assets/ | Ressources statiques partagées des applications | |
| assets/{dir}/{file} | EX: audio/file.mp3, img/file.png, svg/icon.svg, ... |
|
| audits/ | Audits, pen testing, review, rapports de sécurité | |
| audits/{file,script,dir/} | ||
| audits/{timestamp}/{file} | EX timestamp: YYYYMMDD |
|
| config/ | Configurations des applications | |
| config/shared | Contient les fichiers de configurations applicatifs partagées | EX: certificats ssl, ... |
| config/{app}/{app}.{ext} | Configuration principale d'une application | EX: fichier brut, schémas/validation, ... |
| config/{app}/{name}.{ext} | Configurations secondaires d'une application | |
| database/ | Base de données des applications | |
| database/{sgbd}/ | Optionnel | EX: mysql, pgsql, ... |
| database/{sgbd}/{dir}/ | EX: extensions, enums, migrations, seeders, fixtures, ... |
|
| design/ | Design des applications | À décider (avec /apps/{app}/sys) |
| design/system/ | Design système des applications (storybook, histoire, ...) | EX: storybook, histoire, ... -- À décider (avec /apps/{app}/sys). |
| design/{file} | Fichiers reliés au Design système des applications | EX: figjam, ... |
| docs/ | Documentation du projet | |
| docs/adr/ | Architecture Decision Record | |
| docs/apps/{app}/README.md | Documentation d'une application | |
| docs/code-quality/ | Qualité du code | |
| docs/developers/ | DX | |
| docs/protocols/ | Protocoles utilisé(e)s | |
| docs/screenshots/ | Captures d'écrans | |
| docs/specs/ | Spécifications utilisé(e)s | |
| env/ | Variables d'environnement des applications | |
| env/{app}/{env-file} | EX: editor/.env, editor/.env.local, mail/.env.vault, ... |
|
| i18n/ | Internationalisation, locales | EX: fr.po, fr.yaml, ... -- À décider (avec /locales) |
| locales/ | Internationalisation, locales | EX: fr.po, fr.yaml, ... -- À décider (avec /i18n) |
| infra/ | Containérisation, orchestrateur, CI/CD, Déploiement, configurations toolings, monitoring, ... | |
| infra/{tool}/{conf-file} | EX: Docker, k8s, Ansible, ... |
|
| libs/ | Code partagé par nos applications | |
| libs/patches/{module}/ | Correctifs de certaines dépendances externes | |
| libs/thirdparty/{module}/ | Dépendances externes | Projets non versionnés, non disponible dans les registres des PM |
| libs/{manager}/{module}/ | Les modules internes en fonction de l'écosystème | EX manager: npm, composer, crates, gems, ... |
| libs/{manager}/{module}/examples/ | Les exemples du module | |
| libs/{manager}/{module}/src/ | Fichiers sources | |
| libs/{manager}/{module}/{dir}/ | ||
libs/{manager}/{module}/{pollution-file} |
EX: .gitignore, .eslint, package.json, Cargo.toml, ... |
|
| libs/{manager}/{module}/{index}.{ext} | Un fichier qui sert d'index pour éviter de faire des imports sur src/ |
EX: index.ts, lib.rs, ... |
| licenses/ | Fichiers de licences | |
| licenses/{license-file} | EX: LICENSE-MIT, MPL-2.0.LICENSE, Apache-2.0.txt, ... |
|
| supports/ | Communications, discussions internes | EX: pdf, markdown, ... |
| tests/ | Les tests fonctionnels des applications | |
| tests/{app}/ | ||
| tmp/ | Les fichiers temporaires générés par les applications | |
| tmp/{dir}/ | EX: logs/*, pids/*, sessions/*, ... |
|
| tools/ | Outils internes pour améliorer la DX | |
| tools/{script} | EX: check-license.sh, generate-docs.sh, ... |
|
| tools/{tooling}/ | EX: git/hooks/*, ia/*, vscode/*, ... |
|
| www/ | Sites webs | |
| www/{site}/ | Site web | |
| www/{site}/bin/ | Différents points d'entrées d'un site | |
| www/{site}/public/ | Ressources publiques du site | |
| www/{site}/src/ | Fichier source, code métier | |
| www/{site}/site.{ext} | Point d'entrée du site (lib) | |
www/{site}/{pollution-file} |
EX: .gitignore, .eslint, package.json, Cargo.toml, ... |
-
Composant ActionBar
Un composant
ActionBarinclut un titre, et des actions. Il fournit une zone standard pour les contrôles d'action. Il permet de définir des contrôles qui peuvent être utilisés de spécifiquement à une vue.Notre composant
ActionBardéfinit deux zones distinctes :- Zone de titre
Cette zone contient soit une chaîne de caractères contenant le texte du titre, soit des balises HTML.
- Zone d'action
Cette zone contient des composants qui définissent les actions que l'application peut effectuer dans une vue.
Par exemple, notre application peut définir un bouton de recherche et/ou d'actualisation dans la zone d'action.
L'image suivante montre le composant
ActionBarintégré au composantPrivateRoomde l'application avec un avatar ouvre un menu et un bouton de fermeture de privé : -
Composant Alert
Un composant
Alertindique une information qu'un utilisateur DOIT lire.Un composant
Alertpeut avoir un bouton de fermeture. Il peut également s'auto-détruire si la propriétécloseAfterSecondslui est donnée.Il peut avoir une apparence différence en fonction du thème choisi par l'utilisateur ou celui par défaut de l'application et du niveau d'importance de l'information.
Les types d'alertes :
errorinfosuccesswarning
L'image suivante montre le composant
Alertde typeinfosur l'habillage du thèmeice, intégré au composantChannelJoinDialogde l'application : -
Composant AlertDialog
-
Composant Badge
L'image suivante montre le composant
Badge, intégré aux composantsNavigationAreaetNavigationRoomde l'application : -
Composant Button
Un composant
Buttonpermet de créer un bouton transparent de la manière d'un élément<button> -
Composant ComboBox
Un composant
ComboBoxest simplement un composantDropDownListavec un champ de filtre.L'image suivante montre le composant
ComboBox, intégré au composantUpdateAccountDialogde l'application : -
Composant DataGrid
Un composant
DataGridpermet de lister des données sous forme de tableau de manière automatique.L'image suivante montre le composant
DataGrid, intégré au composantCustomRoomChannelListde l'application : -
Composant Dialog
Un composant
Dialogpermet de créer une boite de dialogue.L'image suivante montre le composant
Dialog, intégré au composantChannelSettingsDialogde l'application : -
Composant DropDownList
Un composant
DropDownListest simplement un composantComboBoxSANS le champ de filtre du composantComboBox. Voir l'image duComboBox. -
Composant DropDownMenu
-
Composant FormLink
Un composant
FormLinkpermet de créer un lien classique sans rediriger l'utilisateur vers l'URL lors du clique.Ce composant effectue une requête
XHRviafetchvers l'URL donnée. -
Composant Image
Un composant
Imagepermet de créer une image classique avec la possibilité de mettre en cache les appels réseaux côté applicatif. -
Composant InputCounter
Un composant
InputCounterpermet de créer un compteur sur un bouton.L'image suivante montre le composant
InputCounter, intégré au composantChannelSettingsDialogde l'application : -
Composant InputLabelSWitch
Un composant
InputLabelSWitchdonne deux choix à l'utilisateur, activé ou désactivé.- Activé labellisé par défaut sous "Oui".
- Désactivé labellisé par défaut sous "Non".
L'image suivante montre le composant
InputLabelSWitch, intégré au composantDirectAccessViewde l'application : -
Composant InputSWitch
Un composant
InputSWitchdonne deux choix à l'utilisateur, activé ou désactivé.L'image suivante montre le composant
InputSWitch, intégré au composantDirectAccessViewde l'application : -
Composant Menu
Un composant
Menupermet de créer un menu classique. -
Composant TextEdit
Un composant
TextEditest semblable à un comportement d'un élément aveccontenteditable. -
Composant TextInput
Un composant
TextInputpermet de créer un champ de saisie de la manière d'un élément<input>













