# Node

# Nest.js



# Création du projet Nest.js en TypeScript

<p class="callout warning">Nest v10 - `^10.0.0`  
RxJS v7 - `^7.8.1`</p>

---

### Projet Nest.js

La création du projet se fait en une seule ligne de commande :

```bash
nest new -l TypeScript -p npm --strict project-name
```

Cette ligne va créer tous les fichiers de base d'un projet Nest.js 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:3000`.

```bash
npm run start:dev
```

Si le résultat est celui-ci, alors l'installation basique de Nest.js à fonctionné :

[![image.png](https://knowledge.darkmat.fr/uploads/images/gallery/2024-08/scaled-1680-/2sXXWvtpt1uHhk1c-image.png)](https://knowledge.darkmat.fr/uploads/images/gallery/2024-08/2sXXWvtpt1uHhk1c-image.png)

# 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
{
  "recommendations": [
    "pkief.material-icon-theme",
    "esbenp.prettier-vscode",
    "sonarsource.sonarlint-vscode",
    "ryanluker.vscode-coverage-gutters",
    "orta.vscode-jest",
    "pmneo.tsimporter",
    "archsense.architecture-view-nestjs"
  ]
}

```

#### `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
"build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "nest start",
"start:dev": "npm start -- --watch",
"start:debug": "npm start:dev -- --debug",
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest --verbose",
"test:watch": "npm test -- --watch",
"test:cov": "npm test -- --coverage --coverageReporters=lcov --coverageReporters=text --coverageReporters=text-summary --coverageReporters=html",
"test:ci": "jest --ci",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json",
"prepare": "husky",
"postversion": "node set-sonar-version.js && git add sonar-project.properties && git commit -m \"Updating project version\" && git push --tags && git push --all -n"
```

### TypeScript Config

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

```json
"esModuleInterop": true,
"strict": 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": "all",

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

```

### ESLint

Il faut ajouter dans le fichier `eslint.config.mjs`, dans les règles, celles-ci :

```javascript
'@typescript-eslint/no-unsafe-call': 'warn',
'prettier/prettier': [
  'error',
  {
    endOfLine: 'auto',
  },
],
```

# Outils supplémentaires

### BCrypt.js

```bash
npm i bcryptjs
npm i -D @types/bcryptjs
```

### ClassTransformer / ClassValidator

```bash
npm i class-transformer class-validator
```

### Passport

```bash
npm i passport @nestjs/passport
```

### MySQL

```bash
npm i mysql2
```

### Swagger

```bash
npm i swagger-ui-express @nestjs/swagger
```

### TypeORM

```bash
npm i typeorm @nestjs/typeorm
```

### Winston

```bash
npm i winston
```

### LintStaged

```bash
npm i -D lint-staged
```

### JestJunit

```bash
npm i -D jest-junit
```

### Husky

```bash
npm i -D husky
```

# Utilitaires



# Documentation

### compodoc

<p class="callout info">version 1.1.26</p>

Installer `compodoc` avec `npm` :

```bash
npm i -D @compodoc/compodoc
```

Scripts possibles dans le `package.json` :

```json
    "doc:build": "compodoc",
    "doc:serve": "compodoc --serve --open",
```

Fichier `.compodocrc.json`, à la racine du projet :

```json
{
  "tsconfig": "tsconfig.doc.json",
  "output": "docs",
  "theme": "default",
  "hideGenerator": true,
  "disablePrivate": true,
  "disableInternal": true,
  "language": "fr"
}
```

Fichier `tsconfig.doc.json`, à la racine du projet :

```json
{
  "include": ["src/app/**/*.ts"],
  "exclude": ["src/app/**/*.spec.ts", "src/app/dev/**/*.ts"]
}
```

### standard-version

<p class="callout info">version 9.5.0</p>

Permet d'alimenter le fichier `CHANGELOG.md` automatiquement avec les commits.

Installer `standard-version` avec `npm` :

```bash
npm i -D standard-version
```

Scripts possibles dans le `package.json` :

```json
    "release": "standard-version",
    "release:major": "npm run release -- --release-as major",
    "release:minor": "npm run release -- --release-as minor",
    "release:patch": "npm run release -- --release-as patch",
```

Fichier `.versionrc.json`, à la racine du projet :

```json
{
  "header": "Changelog",
  "types": [
    { "type": "feat", "section": "Features" },
    { "type": "fix", "section": "Bug Fixes" },
    { "type": "chore", "section": "Chores" },
    { "type": "docs", "section": "Documentation" },
    { "type": "style", "section": "Code Style" },
    { "type": "refactor", "section": "Refactoring" },
    { "type": "perf", "section": "Performance Improvements" },
    { "type": "test", "section": "Tests" },
    { "type": "build", "section": "Build System" },
    { "type": "ci", "section": "Continuous Integration" }
  ]
}
```

<div id="bkmrk-"><div>  
</div>  
</div>