# Créer un projet Angular 16 avec Angular Material & Jest



# Création du projet Angular avec Angular Material

---

<p class="callout warning">Angular v16 - `^16.2.0`  
Angular Material v16 - `^16.2.5`</p>

---

### Projet Angular

La création du projet se fait en une seule ligne de commande :<span style="color: #000000;"><span style="color: #ffffff;">  
</span></span>

```shell
ng new project-name --routing --skip-git --strict --style=scss
```

Cette ligne va créer tous les fichiers de base d'un projet Angular dans le dossier `project-name`. A partir de maintenant, tout sera fait en étant dans le dossier du projet : `project-name`.

<p class="callout info">S'il faut créer le projet dans le dossier courant et pas dans un sous-dossier, il faut ajouter cet argument à la commande : `--directory=./`</p>

Pour tester que tout c'est bien passé, il suffit de lancer la commande suivante puis d'ouvrir un navigateur et de taper : `localhost:4200`.

```shell
npm start
```

Si le résultat est celui-ci, alors l'installation basique d'Angular à fonctionné :

[![angular-16-default-app.PNG](https://knowledge.darkmat.fr/uploads/images/gallery/2023-09/scaled-1680-/NRGOZHrfh5J6xQwf-angular-16-default-app.PNG)](https://knowledge.darkmat.fr/uploads/images/gallery/2023-09/NRGOZHrfh5J6xQwf-angular-16-default-app.PNG)

### Ajouter Angular Material

Maintenant que le projet Angular existe, on va pouvoir ajouter Angular Material dans le projet.

Angular Material ajoute de nombreux composants pré-fabriqués pour Angular.

Toujours dans un terminal ouvert depuis le dossier du projet, la ligne suivante :

- Installe Angular Material
- Permet de choisir un thème ([testables directement sur le site d'Angular Material](https://material.angular.io/))
- Permet d'appliquer le style `typographie` à tous le projet.
- Permet d'inclure ou non et d'activer ou non le module d'animations d'Angular

```shell
ng add @angular/material
```

Une fois cela fait, c'est terminé. Angular Material est maintenant utilisable dans le projet.

# Ajouter Jest au projet Angular

---

<p class="callout warning">Angular v16 - `^16.2.0`  
Jest Preset Angular v13 - `^13.1.2`  
Jest v29 - `^29.7.0`  
</p>

---

### Pourquoi ajouter Jest ?

En effet, le projet Angular, à l'installation, contient déjà le module Karma qui permet de tester le code et de voir le résultat dans un navigateur. Ce qui, pendant la phase de développement, est plus pratique.

Cependant, dans le cas d'utilitaires comme Jenkins ou les Runners de Gitlab, le navigateur de Karma ne peut pas être lancé de manière simple. Dans ces cas là, Jest qui se lance en console est plus approprié.

### Installation de Jest

Tout d'abord, il faut installer les dépendances nécessaires

```shell
npm install jest jest-preset-angular @types/jest --save-dev
```

Ensuite, créer un fichier `setup-jest.ts` dans un dossier `config` à la racine du projet et le remplir comme suit :

```typescript
import 'zone.js';
import 'zone.js/testing';

import 'jest-preset-angular/setup-jest';

```

Une fois ce fichier créé, il faut encore modifier le fichier `package.json` :

- Remplacer : ```JSON
    "test": "ng test"
    ```
    
    Par : ```JavaScript
    "test": "jest --coverage --coverage-directory=coverage/jest",
    "test:karma": "ng cache clean && ng test",
    ```
- Ajouter, avant le bloc `"dependencies"` : ```JavaScript
    "jest": {
      "preset": "jest-preset-angular",
      "setupFilesAfterEnv": [
        "./config/setup-jest.ts"
      ],
      "moduleNameMapper": {
        "^src/(.*)$": "./src/$1"
      }
    },
    ```

Maintenant, en lançant `npm test`, les tests de Jest se lancent. Mais la commande `npm run test:karma` permet de passer les tests avec Karma et son navigateur.

# Ajouter des configurations - VSCode

<p class="callout info">Cette page va lister quelques configurations pouvant être utiles en cas d'utilisation de [VSCode](https://code.visualstudio.com/) en tant qu'IDE (*Integrated Development Environment*)</p>

### VSCode

Il y a 3 fichiers de VSCode qui peuvent être modifiés/créés dans le dossier `.vscode` : `extensions.json`, `launch.json` et `settings.json`

#### `extensions.json`

```json
{
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
  "recommendations": [
    "angular.ng-template",
    "esbenp.prettier-vscode",
    "cyrilletuzi.angular-schematics",
    "formulahendry.auto-rename-tag",
    "zainchen.json",
    "davidanson.vscode-markdownlint",
    "pmneo.tsimporter",
    "orta.vscode-jest",
    "ryanluker.vscode-coverage-gutters",
    "pkief.material-icon-theme"
  ]
}

```

#### `launch.json`

```json
{
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "ng serve",
      "type": "chrome",
      "request": "launch",
      "preLaunchTask": "npm: start",
      "url": "http://localhost:4200/"
    },
    {
      "name": "ng test",
      "type": "vscode-jest-tests",
      "request": "launch",
      "preLaunchTask": "npm: test"
    }
  ]
}

```

#### `settings.json`

```json
{
  "javascript.preferences.importModuleSpecifier": "relative",
  "typescript.preferences.importModuleSpecifierEnding": "minimal",
  "typescript.preferences.importModuleSpecifier": "relative",
  "javascript.preferences.importModuleSpecifierEnding": "minimal",
  "js/ts.implicitProjectConfig.module": "ES2022",
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.organizeImports": "always"
  },
  "files.associations": {
    "*.prettierrc": "json"
  },
  "jest.useDashedArgs": true,
  "jest.coverageFormatter": "GutterFormatter",
  "jest.runMode": "on-demand",
  "coverage-gutters.showLineCoverage": true,
  "coverage-gutters.showGutterCoverage": false,
  "coverage-gutters.showRulerCoverage": true
}

```

### Node

package.json

Il faut installer :

- `npm i @types/node`
- `npm i -D ng-mocks webpack-bundle-analyzer`

Puis il faut ajouter, dans les scripts ;

```json
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"build:prod": "ng build --configuration production",
"watch": "npm run build -- --watch --configuration development",
"test": "ng cache clean && ng test",
"build:stats": "npm run build -- --stats-json",
"build:stats:prod": "npm run build:prod -- --stats-json",
"analyze:bundle": "webpack-bundle-analyzer dist/project-name/stats.json",
"analyze": "npm run build:stats && npm run analyze:bundle",
"analyze:prod": "npm run build:stats:prod && npm run analyze:bundle"
```

Si jest est déjà installé, il faut remplacer la ligne

```json
"test": "ng cache clean && ng test",
```

par les lignes

```json
"test": "jest --coverage --coverage-directory=coverage/jest",
"test:karma": "ng cache clean && ng test",
```

### TypeScript Config

Dans le fichier `tsconfig.json`, il est possible et recommandé d'ajouter cette ligne dans la catégorie `compilerOptions`

```json
"esModuleInterop": true
```

### Prettier

Il faut, pour le configurer, placer un fichier `.prettierrc` à la racine du projet. Voilà un exemple de ce qu'il pourrait contenir ;

```json
{
  "singleQuote": true,
  "arrowParens": "avoid",
  "proseWrap": "always",
  "htmlWhitespaceSensitivity": "ignore",
  "bracketSameLine": true,
  "printWidth": 120,
  "useTabs": false,
  "jsxSingleQuote": true,
  "trailingComma": "none",

  "singleAttributePerLine": false,
  "semi": true,
  "tabWidth": 2,
  "bracketSpacing": true,
  "embeddedLanguageFormatting": "auto",
  "endOfLine": "lf",
  "insertPragma": false,
  "quoteProps": "as-needed",
  "requirePragma": false,
  "vueIndentScriptAndStyle": false
}

```