# Setup Express, Typescript, dan Jest

Halo semuanya, ini adalah artikel kedua saya dan disini mungkin saya akan membahas atau memberikan tutorial tentang cara setup aplikasi **Express** dengan **Typescript** dan **Jest**. Nah alasan saya bikin artikel ini sebenarnya karena saya sendiri itu kadang pelupa, saya sering gonta-ganti framework dalam ngerjain suatu project, misal projek pertama saya pakai Express, projek kedua pakai Laravel, projek ketiga pindah lagi ke Flutter, nah ini yang bikin saya sering lupa. Akhirnya saya buat artikel ini biar gampang ngingatnya sekalian share juga ke kalian tentang cara setupnya. Kalau begitu tanpa basa basi lagi kita mulai pembahasannya..

## Langkah Setup
1. Langkah pertama yang harus dilakukan adalah kita buat projectnya terlebih dahulu, yaitu kita pakai..
```
npm init -y
``` 

2. Kemudian kita perlu setup tsconfig nya.
```
tsc --init
```

3. Selanjutnya kita install terlebih dahulu dependecy-dependency nya.
```
yarn add express
yarn add -D typescript @types/express @types/node jest @types/jest ts-jest supertest @types/supertest ts-node-dev
```
Note: Jadi disini kita perlu install typescript, express, jest, ts-jest, supertest dan ts-node-dev. `ts-jest` disini dipakai supaya kita bisa menggunakan `import` di file test kita.

4. Kita buat file `jest.config.json` dan kita ketik.
```
module.exports = {
    "testPathIgnorePatterns": [
      "./build",
      "./node_modules"
    ],
    "transform": {
      "^.+\\.ts?$": "ts-jest"
    }
}
```

5. Kita ubah sedikit konfigurasi di `tsconfig.json` seperti ini.
```
"outDir": "./build", 
"rootDir": "./src",
```

6. Kita coba bikin file entrypoint nya di `src/index.ts` seperti ini.
```
import express from "express"
const app = express()
const port = process.env.PORT || 3000
export default app
```

7. Kemudian kita bikin file unit testnya di `src/index.unit.test.ts`.
```
import app from './index'
import request from 'supertest'  
describe('Test App', () => {
    it('should run without problem', () => {
        expect(true).toBe(true);
    })
})
```

8. Langkah terakhir yaitu kita setting di `package.json`.
```
"scripts": {
    "dev": "tsnd --respawn src/index",
    "build": "tsc",
    "test": "jest",
    "test:watch": "jest --watchAll",
    "test:unit": "jest unit",
    "test:int": "jest int",
    "start": "node build/index"
  },
```

9. Selesai! Tinggal kita run aja sesuai scriptnya.

Oke setupnya semua udah selesai, disini aku mau jelasin sedikit lagi karena mungkin temen-temen disini ada yang sedikit belum paham. Di langkah ke **3** itu ada beberapa dependency seperti `ts-jest`, `supertest` dan `ts-node-dev`. 
- `ts-jest` ini disini dibutuhin banget biar kita bisa pakai `import` statement di file test kita. Kalo kita nggak pakai ini maka setiap kali kita mau pakai module kita perlu pakai `require`. Saya sendiri lebih suka pakai `import` ketimbang pakai `require`.
- `supertest` ini diperlukan supaya kita bisa ngetes api (http) kita. Misal kita mau ngetest `GET /api/hello` maka kita pakai dependency `supertest` ini.
- `ts-node-dev` ini digunakan untuk debug/run file typescript kita secara **watch**. Maksud **watch** disini yaitu ketika kita ubah code kita maka secara otomatis server kita akan restart sendiri tanpa perlu kita stop-run manual.

Kemudian di langkah ke **4** itu ada code `testPathIgnorePatterns`, ini digunakan supaya ketika kita jalankan test, directory **build** dan **node_modules** akan diabaikan. Jika tidak maka script `test` akan menjalankan test yang ada di directory manapun dan kita nggak mau karena kita cuma pingin jalanin test yang ada di folder **src** dan folder **tests**.

Jadi itu dia cara setup dan juga sedikit penjelasannya, semoga bermanfaat. Jika dirasa artikel ini bermanfaat jangan lupa di like dan share ya, terimakasih.





