Merge branch 'master' into loginProto
This commit is contained in:
		| @ -20,16 +20,3 @@ jobs: | ||||
|     - run: npm run build --if-present | ||||
|       name: build | ||||
|       working-directory: ./frontend | ||||
|   Test-frontend: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@v4 | ||||
|     - name: Use Node.js ${{ matrix.node-version }} | ||||
|       uses: actions/setup-node@v3 | ||||
|       working-directory: ./frontend | ||||
|     - run: npm ci | ||||
|       name: clean install | ||||
|       working-directory: ./frontend | ||||
|     - run: npm run test:unit | ||||
|       name: test | ||||
|       working-directory: ./frontend | ||||
|  | ||||
							
								
								
									
										48
									
								
								Documents/JournalDeBord/29-02.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								Documents/JournalDeBord/29-02.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | ||||
| # Journal de bord du 29 février | ||||
|  | ||||
| Ce premier journal de bord permet d'initier une tendance a garder une trace des choix fait lors du dévelopement du | ||||
| projet de génie logiciel. Ces journaux pourront alors être consultés par la suite, pour la rédaction du rapport. | ||||
|  | ||||
| ## Choix des technologies utilisées | ||||
|  | ||||
| ### Backend: spring.io | ||||
|  | ||||
| Le backend est imposé, nous devons utiliser spring boots. La courbe d'aprentisage nous semble difficile mais après de | ||||
| longues documentations nous commençons à comprendre son fonctionnement. | ||||
|  | ||||
| ### Frontend: Vue.js | ||||
|  | ||||
| Le frontend n'est pas imposé, nous devons utiliser javascript mais le choix du framework (si utilisé) est libre. Nous | ||||
| avons pris la recomendation du cours: vue.js qui est un framework simple d'aprentisage et très performant. | ||||
|  | ||||
| #### Librairies | ||||
|  | ||||
| - **Vue3-toastify:** Nous avons opté pour l'utilisation d'une librarie de "notification". cette librairie permet  | ||||
| d'afficher des notifications sur la page. Elle nous est utile autant pour l'application finale que pour le | ||||
| dévelopement. | ||||
|  | ||||
| ### Database: postgresql | ||||
|  | ||||
| C'est une base de données très efficace qui est déjà installé | ||||
|  | ||||
| ### VCS: Gitea | ||||
|  | ||||
| C'est une alternative a github mais self-hosted. Nous avons accés à un serveur sur lequel gitea est installé | ||||
| (https://git.herisson.ovh/). | ||||
|  | ||||
| ### CI/CD: Gitea Actions | ||||
|  | ||||
| Gitea a récement implémenter l'équivalent de github actions dans gitea et qui est complètement compatible avec github | ||||
| actions. Nous avons donc implémentés les test et build en continu lors des pr et merge. Lorsqu'un merge est fait avec la | ||||
| branche master, le site est instentanément mis à jours (après une dernière verification du build et test) sur l'adresse | ||||
| http://clyde.herisson.ovh pour le frontent et http://clyde.herisson.ovh/api pour le backend. | ||||
|  | ||||
|  | ||||
| ## Répartition des taches | ||||
|  | ||||
| Nous nous répartisons les taches par familiarité et préférences avec les différentes partie du projet. | ||||
|  | ||||
| - Wiliam: Frontend visuel | ||||
| - Anthony: Frontend technique | ||||
| - Max: Backend Endpoints | ||||
| - Léo: Backend Data | ||||
							
								
								
									
										45
									
								
								Documents/JournalDeBord/i18n.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								Documents/JournalDeBord/i18n.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | ||||
| # Internationalization (i18n) | ||||
|  | ||||
| L'un des critère du projet est de donner la possibilité aux utilisateur de choisir entre différentes | ||||
| langues. Minimum 2 sont a implémenter, le français et l'anglais. | ||||
|  | ||||
| ## Intention  | ||||
|  | ||||
| La gestion des langue au niveau backend peut sembler être une bonne idée aux premier abord car celà | ||||
| permeterais de laisser la possibilité a différents frontend utilisant la meme api de traduction. | ||||
| cependant, peu d'éléments venant de la base de données sont traduisible. Nous alons alors opter pour | ||||
| une internationalization au niveau du frontend. Dans le cas ou un éléments venant du frontend | ||||
| devrait être traduit, Il suffirait alors de le faire traduire par le frontend directement | ||||
|  | ||||
| ## Implémentation | ||||
|  | ||||
| Le frontend va se voir équiper d'une collection de fonctions permettant la traduction. notament | ||||
| `i18n(key: str) -> str` qui prendrait en entrée une "clé" identifiant la traduction à aller | ||||
| chercher. Cette clé serait sous la forme : `<context>.<element>`. La fonctions retournera alors la | ||||
| traduction du texte dans la langue choisie par l'utilisateur. cette langue sera stockée dans les | ||||
| cookies pour qu'un utilisateur non enregistré puisse naviguer sur le site sans problèmes. Si | ||||
| l'utilisateur est enregistré elle pourra également être ajouter à son profil pour que la langue soit | ||||
| mise à jours lors de son prochain passage. | ||||
|  | ||||
| ### Base de données de traduction | ||||
|  | ||||
| Les traductions seront rassembler dans fichier txt. Une langue sera présente par fichier et une | ||||
| traduction par ligne. (Ce format semble être utilisé par certaines librairies de spring. Malgré le | ||||
| fait que nous ne l'utiliserons finalement pas, ce format semble efficace est facile à utilsier). | ||||
|  | ||||
| Chaque ligne commence par la clé. suivi immédiatement d'un "=". le contenu après ce égale est la | ||||
| traduction jusqu'au égale. | ||||
|  | ||||
| ## Considérations | ||||
|  | ||||
| - Il existe certainemnt des librairies prète à l'emploi de traduction mais celà semble être | ||||
|   relativement simple à implémenter manuellement. | ||||
|  | ||||
| - Dans l'éventualité où nous voudrions implémenter des éléments au milieu d'une traduction (example: | ||||
|   Veuillez vérifier votre addresse mail: `tonitch@herisson.ovh` puis revenir sur le site!). Dans ce | ||||
|   cas nous pouvons utiliser le regex et simplement renseigner ces éléments par \1, \2, \3, ... puis | ||||
|   créer une fonction qui s'occuperais de remplacer ces éléments dans le texte avant de le mettre en | ||||
|   avant. | ||||
|  | ||||
| - Il ne devrait pas etre trop compliqué d'écrire un script qui vérifie que toutes les traductions | ||||
|   sont présente dans tout les fichiers en vérifiant que toutes les clés d'un fichiers sont présente. | ||||
| @ -1 +1 @@ | ||||
|  | ||||
| spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect | ||||
|  | ||||
							
								
								
									
										192
									
								
								backend/src/main/resources/static/assets/index-BP8s9Pse.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								backend/src/main/resources/static/assets/index-BP8s9Pse.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										12
									
								
								backend/src/main/resources/static/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								backend/src/main/resources/static/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| <!doctype html> | ||||
| <html> | ||||
|   <head> | ||||
|     <meta charset="UTF-8" /> | ||||
|     <title>Clyde's api</title> | ||||
|     <script type="module" crossorigin src="/assets/index-BP8s9Pse.js"></script> | ||||
|     <link rel="stylesheet" crossorigin href="/assets/index-rZb_qAw7.css"> | ||||
|   </head> | ||||
|   <body> | ||||
|     <div id="app"></div> | ||||
|   </body> | ||||
| </html> | ||||
							
								
								
									
										1897
									
								
								backend/src/main/resources/static/openapi.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1897
									
								
								backend/src/main/resources/static/openapi.yaml
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,10 +1,9 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <html> | ||||
|   <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <link rel="icon" href="/favicon.ico"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <title>Vite App</title> | ||||
|     <title> Clyde 🪦</title> | ||||
|   </head> | ||||
|   <body> | ||||
|     <div id="app"></div> | ||||
|  | ||||
							
								
								
									
										632
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										632
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -15,8 +15,7 @@ | ||||
|         "@vitejs/plugin-vue": "^5.0.3", | ||||
|         "@vue/test-utils": "^2.4.4", | ||||
|         "jsdom": "^24.0.0", | ||||
|         "vite": "^5.0.11", | ||||
|         "vitest": "^1.2.2" | ||||
|         "vite": "^5.0.11" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@babel/parser": { | ||||
| @ -415,18 +414,6 @@ | ||||
|         "node": ">=12" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@jest/schemas": { | ||||
|       "version": "29.6.3", | ||||
|       "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", | ||||
|       "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@sinclair/typebox": "^0.27.8" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": "^14.15.0 || ^16.10.0 || >=18.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@jridgewell/sourcemap-codec": { | ||||
|       "version": "1.4.15", | ||||
|       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", | ||||
| @ -617,12 +604,6 @@ | ||||
|         "win32" | ||||
|       ] | ||||
|     }, | ||||
|     "node_modules/@sinclair/typebox": { | ||||
|       "version": "0.27.8", | ||||
|       "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", | ||||
|       "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/@types/estree": { | ||||
|       "version": "1.0.5", | ||||
|       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", | ||||
| @ -642,75 +623,6 @@ | ||||
|         "vue": "^3.2.25" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@vitest/expect": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.0.tgz", | ||||
|       "integrity": "sha512-7bWt0vBTZj08B+Ikv70AnLRicohYwFgzNjFqo9SxxqHHxSlUJGSXmCRORhOnRMisiUryKMdvsi1n27Bc6jL9DQ==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@vitest/spy": "1.3.0", | ||||
|         "@vitest/utils": "1.3.0", | ||||
|         "chai": "^4.3.10" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://opencollective.com/vitest" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@vitest/runner": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.0.tgz", | ||||
|       "integrity": "sha512-1Jb15Vo/Oy7mwZ5bXi7zbgszsdIBNjc4IqP8Jpr/8RdBC4nF1CTzIAn2dxYvpF1nGSseeL39lfLQ2uvs5u1Y9A==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@vitest/utils": "1.3.0", | ||||
|         "p-limit": "^5.0.0", | ||||
|         "pathe": "^1.1.1" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://opencollective.com/vitest" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@vitest/snapshot": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.0.tgz", | ||||
|       "integrity": "sha512-swmktcviVVPYx9U4SEQXLV6AEY51Y6bZ14jA2yo6TgMxQ3h+ZYiO0YhAHGJNp0ohCFbPAis1R9kK0cvN6lDPQA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "magic-string": "^0.30.5", | ||||
|         "pathe": "^1.1.1", | ||||
|         "pretty-format": "^29.7.0" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://opencollective.com/vitest" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@vitest/spy": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.0.tgz", | ||||
|       "integrity": "sha512-AkCU0ThZunMvblDpPKgjIi025UxR8V7MZ/g/EwmAGpjIujLVV2X6rGYGmxE2D4FJbAy0/ijdROHMWa2M/6JVMw==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "tinyspy": "^2.2.0" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://opencollective.com/vitest" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@vitest/utils": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.0.tgz", | ||||
|       "integrity": "sha512-/LibEY/fkaXQufi4GDlQZhikQsPO2entBKtfuyIpr1jV4DpaeasqkeHjhdOhU24vSHshcSuEyVlWdzvv2XmYCw==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "diff-sequences": "^29.6.3", | ||||
|         "estree-walker": "^3.0.3", | ||||
|         "loupe": "^2.3.7", | ||||
|         "pretty-format": "^29.7.0" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://opencollective.com/vitest" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@vue/compiler-core": { | ||||
|       "version": "3.4.19", | ||||
|       "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.19.tgz", | ||||
| @ -839,27 +751,6 @@ | ||||
|         "node": "^14.17.0 || ^16.13.0 || >=18.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/acorn": { | ||||
|       "version": "8.11.3", | ||||
|       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", | ||||
|       "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", | ||||
|       "dev": true, | ||||
|       "bin": { | ||||
|         "acorn": "bin/acorn" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=0.4.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/acorn-walk": { | ||||
|       "version": "8.3.2", | ||||
|       "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", | ||||
|       "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=0.4.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/agent-base": { | ||||
|       "version": "7.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", | ||||
| @ -884,27 +775,6 @@ | ||||
|         "url": "https://github.com/chalk/ansi-regex?sponsor=1" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/ansi-styles": { | ||||
|       "version": "5.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", | ||||
|       "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=10" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/chalk/ansi-styles?sponsor=1" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/assertion-error": { | ||||
|       "version": "1.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", | ||||
|       "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": "*" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/asynckit": { | ||||
|       "version": "0.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", | ||||
| @ -926,45 +796,6 @@ | ||||
|         "balanced-match": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/cac": { | ||||
|       "version": "6.7.14", | ||||
|       "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", | ||||
|       "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/chai": { | ||||
|       "version": "4.4.1", | ||||
|       "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", | ||||
|       "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "assertion-error": "^1.1.0", | ||||
|         "check-error": "^1.0.3", | ||||
|         "deep-eql": "^4.1.3", | ||||
|         "get-func-name": "^2.0.2", | ||||
|         "loupe": "^2.3.6", | ||||
|         "pathval": "^1.1.1", | ||||
|         "type-detect": "^4.0.8" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=4" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/check-error": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", | ||||
|       "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "get-func-name": "^2.0.2" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": "*" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/color-convert": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", | ||||
| @ -1081,18 +912,6 @@ | ||||
|       "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/deep-eql": { | ||||
|       "version": "4.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", | ||||
|       "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "type-detect": "^4.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/delayed-stream": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | ||||
| @ -1102,15 +921,6 @@ | ||||
|         "node": ">=0.4.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/diff-sequences": { | ||||
|       "version": "29.6.3", | ||||
|       "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", | ||||
|       "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": "^14.15.0 || ^16.10.0 || >=18.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/eastasianwidth": { | ||||
|       "version": "0.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", | ||||
| @ -1190,38 +1000,6 @@ | ||||
|         "@esbuild/win32-x64": "0.19.12" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/estree-walker": { | ||||
|       "version": "3.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", | ||||
|       "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@types/estree": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/execa": { | ||||
|       "version": "8.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", | ||||
|       "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "cross-spawn": "^7.0.3", | ||||
|         "get-stream": "^8.0.1", | ||||
|         "human-signals": "^5.0.0", | ||||
|         "is-stream": "^3.0.0", | ||||
|         "merge-stream": "^2.0.0", | ||||
|         "npm-run-path": "^5.1.0", | ||||
|         "onetime": "^6.0.0", | ||||
|         "signal-exit": "^4.1.0", | ||||
|         "strip-final-newline": "^3.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=16.17" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sindresorhus/execa?sponsor=1" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/foreground-child": { | ||||
|       "version": "3.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", | ||||
| @ -1266,27 +1044,6 @@ | ||||
|         "node": "^8.16.0 || ^10.6.0 || >=11.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/get-func-name": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", | ||||
|       "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": "*" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/get-stream": { | ||||
|       "version": "8.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", | ||||
|       "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=16" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/sindresorhus" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/glob": { | ||||
|       "version": "10.3.10", | ||||
|       "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", | ||||
| @ -1347,15 +1104,6 @@ | ||||
|         "node": ">= 14" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/human-signals": { | ||||
|       "version": "5.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", | ||||
|       "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=16.17.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/iconv-lite": { | ||||
|       "version": "0.6.3", | ||||
|       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", | ||||
| @ -1389,18 +1137,6 @@ | ||||
|       "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/is-stream": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", | ||||
|       "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": "^12.20.0 || ^14.13.1 || >=16.0.0" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/sindresorhus" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/isexe": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", | ||||
| @ -1455,12 +1191,6 @@ | ||||
|         "node": ">=14" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/js-tokens": { | ||||
|       "version": "8.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", | ||||
|       "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/jsdom": { | ||||
|       "version": "24.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", | ||||
| @ -1501,37 +1231,6 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/jsonc-parser": { | ||||
|       "version": "3.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", | ||||
|       "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/local-pkg": { | ||||
|       "version": "0.5.0", | ||||
|       "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", | ||||
|       "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "mlly": "^1.4.2", | ||||
|         "pkg-types": "^1.0.3" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=14" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/antfu" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/loupe": { | ||||
|       "version": "2.3.7", | ||||
|       "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", | ||||
|       "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "get-func-name": "^2.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/lru-cache": { | ||||
|       "version": "10.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", | ||||
| @ -1552,12 +1251,6 @@ | ||||
|         "node": ">=12" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/merge-stream": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", | ||||
|       "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/mime-db": { | ||||
|       "version": "1.52.0", | ||||
|       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", | ||||
| @ -1579,18 +1272,6 @@ | ||||
|         "node": ">= 0.6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/mimic-fn": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", | ||||
|       "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=12" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/sindresorhus" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/minimatch": { | ||||
|       "version": "9.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", | ||||
| @ -1615,18 +1296,6 @@ | ||||
|         "node": ">=16 || 14 >=14.17" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/mlly": { | ||||
|       "version": "1.5.0", | ||||
|       "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", | ||||
|       "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "acorn": "^8.11.3", | ||||
|         "pathe": "^1.1.2", | ||||
|         "pkg-types": "^1.0.3", | ||||
|         "ufo": "^1.3.2" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/ms": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", | ||||
| @ -1665,69 +1334,12 @@ | ||||
|         "node": "^14.17.0 || ^16.13.0 || >=18.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/npm-run-path": { | ||||
|       "version": "5.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", | ||||
|       "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "path-key": "^4.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": "^12.20.0 || ^14.13.1 || >=16.0.0" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/sindresorhus" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/npm-run-path/node_modules/path-key": { | ||||
|       "version": "4.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", | ||||
|       "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=12" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/sindresorhus" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/nwsapi": { | ||||
|       "version": "2.2.7", | ||||
|       "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", | ||||
|       "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/onetime": { | ||||
|       "version": "6.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", | ||||
|       "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "mimic-fn": "^4.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=12" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/sindresorhus" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/p-limit": { | ||||
|       "version": "5.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", | ||||
|       "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "yocto-queue": "^1.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=18" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/sindresorhus" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/parse5": { | ||||
|       "version": "7.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", | ||||
| @ -1765,37 +1377,11 @@ | ||||
|         "url": "https://github.com/sponsors/isaacs" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/pathe": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", | ||||
|       "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/pathval": { | ||||
|       "version": "1.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", | ||||
|       "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": "*" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/picocolors": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", | ||||
|       "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" | ||||
|     }, | ||||
|     "node_modules/pkg-types": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", | ||||
|       "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "jsonc-parser": "^3.2.0", | ||||
|         "mlly": "^1.2.0", | ||||
|         "pathe": "^1.1.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/postcss": { | ||||
|       "version": "8.4.35", | ||||
|       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", | ||||
| @ -1823,20 +1409,6 @@ | ||||
|         "node": "^10 || ^12 || >=14" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/pretty-format": { | ||||
|       "version": "29.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", | ||||
|       "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@jest/schemas": "^29.6.3", | ||||
|         "ansi-styles": "^5.0.0", | ||||
|         "react-is": "^18.0.0" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": "^14.15.0 || ^16.10.0 || >=18.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/proto-list": { | ||||
|       "version": "1.2.4", | ||||
|       "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", | ||||
| @ -1864,12 +1436,6 @@ | ||||
|       "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/react-is": { | ||||
|       "version": "18.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", | ||||
|       "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/requires-port": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", | ||||
| @ -1980,12 +1546,6 @@ | ||||
|         "node": ">=8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/siginfo": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", | ||||
|       "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/signal-exit": { | ||||
|       "version": "4.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", | ||||
| @ -2006,18 +1566,6 @@ | ||||
|         "node": ">=0.10.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/stackback": { | ||||
|       "version": "0.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", | ||||
|       "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/std-env": { | ||||
|       "version": "3.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", | ||||
|       "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/string-width": { | ||||
|       "version": "5.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", | ||||
| @ -2114,60 +1662,12 @@ | ||||
|         "node": ">=8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/strip-final-newline": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", | ||||
|       "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=12" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/sindresorhus" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/strip-literal": { | ||||
|       "version": "2.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", | ||||
|       "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "js-tokens": "^8.0.2" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/antfu" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/symbol-tree": { | ||||
|       "version": "3.2.4", | ||||
|       "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", | ||||
|       "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/tinybench": { | ||||
|       "version": "2.6.0", | ||||
|       "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", | ||||
|       "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/tinypool": { | ||||
|       "version": "0.8.2", | ||||
|       "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", | ||||
|       "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=14.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/tinyspy": { | ||||
|       "version": "2.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", | ||||
|       "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=14.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/tough-cookie": { | ||||
|       "version": "4.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", | ||||
| @ -2195,21 +1695,6 @@ | ||||
|         "node": ">=18" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/type-detect": { | ||||
|       "version": "4.0.8", | ||||
|       "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", | ||||
|       "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=4" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/ufo": { | ||||
|       "version": "1.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", | ||||
|       "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/universalify": { | ||||
|       "version": "0.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", | ||||
| @ -2284,93 +1769,6 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/vite-node": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.0.tgz", | ||||
|       "integrity": "sha512-D/oiDVBw75XMnjAXne/4feCkCEwcbr2SU1bjAhCcfI5Bq3VoOHji8/wCPAfUkDIeohJ5nSZ39fNxM3dNZ6OBOA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "cac": "^6.7.14", | ||||
|         "debug": "^4.3.4", | ||||
|         "pathe": "^1.1.1", | ||||
|         "picocolors": "^1.0.0", | ||||
|         "vite": "^5.0.0" | ||||
|       }, | ||||
|       "bin": { | ||||
|         "vite-node": "vite-node.mjs" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": "^18.0.0 || >=20.0.0" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://opencollective.com/vitest" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/vitest": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.3.0.tgz", | ||||
|       "integrity": "sha512-V9qb276J1jjSx9xb75T2VoYXdO1UKi+qfflY7V7w93jzX7oA/+RtYE6TcifxksxsZvygSSMwu2Uw6di7yqDMwg==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "@vitest/expect": "1.3.0", | ||||
|         "@vitest/runner": "1.3.0", | ||||
|         "@vitest/snapshot": "1.3.0", | ||||
|         "@vitest/spy": "1.3.0", | ||||
|         "@vitest/utils": "1.3.0", | ||||
|         "acorn-walk": "^8.3.2", | ||||
|         "chai": "^4.3.10", | ||||
|         "debug": "^4.3.4", | ||||
|         "execa": "^8.0.1", | ||||
|         "local-pkg": "^0.5.0", | ||||
|         "magic-string": "^0.30.5", | ||||
|         "pathe": "^1.1.1", | ||||
|         "picocolors": "^1.0.0", | ||||
|         "std-env": "^3.5.0", | ||||
|         "strip-literal": "^2.0.0", | ||||
|         "tinybench": "^2.5.1", | ||||
|         "tinypool": "^0.8.2", | ||||
|         "vite": "^5.0.0", | ||||
|         "vite-node": "1.3.0", | ||||
|         "why-is-node-running": "^2.2.2" | ||||
|       }, | ||||
|       "bin": { | ||||
|         "vitest": "vitest.mjs" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": "^18.0.0 || >=20.0.0" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://opencollective.com/vitest" | ||||
|       }, | ||||
|       "peerDependencies": { | ||||
|         "@edge-runtime/vm": "*", | ||||
|         "@types/node": "^18.0.0 || >=20.0.0", | ||||
|         "@vitest/browser": "1.3.0", | ||||
|         "@vitest/ui": "1.3.0", | ||||
|         "happy-dom": "*", | ||||
|         "jsdom": "*" | ||||
|       }, | ||||
|       "peerDependenciesMeta": { | ||||
|         "@edge-runtime/vm": { | ||||
|           "optional": true | ||||
|         }, | ||||
|         "@types/node": { | ||||
|           "optional": true | ||||
|         }, | ||||
|         "@vitest/browser": { | ||||
|           "optional": true | ||||
|         }, | ||||
|         "@vitest/ui": { | ||||
|           "optional": true | ||||
|         }, | ||||
|         "happy-dom": { | ||||
|           "optional": true | ||||
|         }, | ||||
|         "jsdom": { | ||||
|           "optional": true | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/vue": { | ||||
|       "version": "3.4.19", | ||||
|       "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.19.tgz", | ||||
| @ -2488,22 +1886,6 @@ | ||||
|         "node": ">= 8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/why-is-node-running": { | ||||
|       "version": "2.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", | ||||
|       "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", | ||||
|       "dev": true, | ||||
|       "dependencies": { | ||||
|         "siginfo": "^2.0.0", | ||||
|         "stackback": "0.0.2" | ||||
|       }, | ||||
|       "bin": { | ||||
|         "why-is-node-running": "cli.js" | ||||
|       }, | ||||
|       "engines": { | ||||
|         "node": ">=8" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/wrap-ansi": { | ||||
|       "version": "8.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", | ||||
| @ -2648,18 +2030,6 @@ | ||||
|       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", | ||||
|       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "node_modules/yocto-queue": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", | ||||
|       "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", | ||||
|       "dev": true, | ||||
|       "engines": { | ||||
|         "node": ">=12.20" | ||||
|       }, | ||||
|       "funding": { | ||||
|         "url": "https://github.com/sponsors/sindresorhus" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -6,8 +6,7 @@ | ||||
|   "scripts": { | ||||
|     "dev": "vite", | ||||
|     "build": "vite build", | ||||
|     "preview": "vite preview", | ||||
|     "test:unit": "vitest" | ||||
|     "preview": "vite preview" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "vue": "^3.4.15", | ||||
| @ -15,9 +14,7 @@ | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@vitejs/plugin-vue": "^5.0.3", | ||||
|     "@vue/test-utils": "^2.4.4", | ||||
|     "jsdom": "^24.0.0", | ||||
|     "vite": "^5.0.11", | ||||
|     "vitest": "^1.2.2" | ||||
|     "vite": "^5.0.11" | ||||
|   } | ||||
| } | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 318 B | 
							
								
								
									
										8
									
								
								frontend/public/i18n/EN.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								frontend/public/i18n/EN.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| # English translations (some examples to remove) | ||||
|  | ||||
| login.guest.login=log in | ||||
| login.guest.register=register | ||||
| login.guest.welcome=Please Register here | ||||
| login.success=You are now registered as $name  | ||||
|  | ||||
| #===================================================== | ||||
							
								
								
									
										8
									
								
								frontend/public/i18n/FR.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								frontend/public/i18n/FR.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| # Traductions françaises (Quelques examples a enlever) | ||||
|  | ||||
| login.guest.login=s'identifier | ||||
| login.guest.register=s'enregistrer | ||||
| login.guest.welcome=Veuillez vous enregistrer ici | ||||
| login.success=Vous êtes maintenant identifié comme $name  | ||||
|  | ||||
| #===================================================== | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										84
									
								
								frontend/src/i18n.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								frontend/src/i18n.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,84 @@ | ||||
| /** | ||||
|  * Usage: | ||||
|  * import i18n from './i18n.js' | ||||
|  * | ||||
|  * console.log( i18n('parentcontext.childcontext.key', {user: username}) ); | ||||
|  * | ||||
|  * language is loaded from cookie: lang=XX | ||||
|  * translations are loaded from /public/i18n/XX.txt | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| const default_lang = "EN"; | ||||
| let langs; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Fetch the translation from a key using the current language. | ||||
|  * could also replace certain value of the form `$variable` by providing an object | ||||
|  * with { variable: "value" } | ||||
|  * @param key :string translation key (can be null) | ||||
|  * @param options: Object element to replace in the translation | ||||
|  * | ||||
|  * @return :string The translated text | ||||
|  */ | ||||
| function i18n(key, options) { | ||||
| 	let ret = langs[key]; | ||||
| 	if(options != null){ | ||||
| 		for (let key in options) { | ||||
| 			ret = ret.replaceAll("$" + key, options[key]); | ||||
| 		} | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| async function reloadLang(){ | ||||
| 	langs = await loadLangs(); | ||||
| } | ||||
| reloadLang(); | ||||
|  | ||||
| export default i18n; | ||||
|  | ||||
|  | ||||
| // | ||||
| // Those functions are utility functions use by previous exported functions. | ||||
| // | ||||
|  | ||||
| /** | ||||
|  * Return the content of a cookie with specified key | ||||
|  * @param key cookie name | ||||
|  */ | ||||
| function getCookie(key){ | ||||
| 	key = key + "=" | ||||
| 	let cookies = decodeURIComponent(document.cookie).split(";"); | ||||
| 	for (let el of cookies) { | ||||
| 		el = el.trimStart(); | ||||
| 		if(el.indexOf(key) == 0){ | ||||
| 			return el.substr(key.length, el.length); | ||||
| 		} | ||||
| 	} | ||||
| 	return ""; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Function that load the file with translation from the specified lang and return a dictionnary | ||||
|  * @param select the language to load. could be null to fetch the cookies for an answer | ||||
|  * if nothing is found. default to EN.txt | ||||
|  */ | ||||
| async function loadLangs(lang){ | ||||
| 	lang = lang != null ? lang : getCookie("lang"); | ||||
| 	lang = lang != "" ? lang : default_lang; | ||||
|  | ||||
| 	const filename = "./i18n/" + lang.toUpperCase() + ".txt"; | ||||
| 	const content = await (await fetch(filename)).text(); | ||||
| 	const lines = content.split("\n"); | ||||
|  | ||||
| 	let filteredLines = {}; | ||||
| 	for (let line of lines) { | ||||
| 		if(!line.trim().startsWith("#") && line.trim() != ""){ | ||||
| 			let split = line.indexOf("=") | ||||
| 			filteredLines[line.substr(0, split)] = line.substr(split+1, line.length); | ||||
| 		}; | ||||
| 	} | ||||
| 	return filteredLines; | ||||
| } | ||||
| @ -1,14 +0,0 @@ | ||||
| import { fileURLToPath } from 'node:url' | ||||
| import { mergeConfig, defineConfig, configDefaults } from 'vitest/config' | ||||
| import viteConfig from './vite.config' | ||||
|  | ||||
| export default mergeConfig( | ||||
|   viteConfig, | ||||
|   defineConfig({ | ||||
|     test: { | ||||
|       environment: 'jsdom', | ||||
|       exclude: [...configDefaults.exclude, 'e2e/*'], | ||||
|       root: fileURLToPath(new URL('./', import.meta.url)) | ||||
|     } | ||||
|   }) | ||||
| ) | ||||
		Reference in New Issue
	
	Block a user