From 8afcb347749b77205329b172292a2416468567c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <git@minelli.me>
Date: Thu, 28 Mar 2024 22:48:14 +0100
Subject: [PATCH] Adapt to ESM notation (for code compatibility with other Dojo
 projects)

---
 ExpressAPI/.idea/jetbrainsConfiguration       |   2 +-
 ExpressAPI/nodemon.json                       |   2 +-
 ExpressAPI/package-lock.json                  | 474 +++++++++++++++++-
 ExpressAPI/package.json                       |   4 +-
 ExpressAPI/prisma/seed.ts                     |   9 +-
 ExpressAPI/src/InitialImports.ts              |  17 -
 ExpressAPI/src/app.ts                         |  13 +-
 ExpressAPI/src/config/Config.ts               |   4 +-
 ExpressAPI/src/controllers/Session.ts         |   8 +-
 ExpressAPI/src/express/API.ts                 |  18 +-
 ExpressAPI/src/helpers/DatabaseHelper.ts      |  10 +-
 .../src/helpers/DojoCliVersionHelper.ts       |   4 +-
 ExpressAPI/src/helpers/DojoModelsHelper.ts    |   2 +-
 ExpressAPI/src/helpers/DojoValidators.ts      |  14 +-
 ExpressAPI/src/helpers/GlobalHelper.ts        |   6 +-
 .../Extensions/AssignmentResultExtension.ts   |   6 +-
 .../Prisma/Extensions/UserResultExtension.ts  |   4 +-
 ExpressAPI/src/init.ts                        |  15 +
 ExpressAPI/src/logging/MorganMiddleware.ts    |   2 +-
 ExpressAPI/src/managers/AssignmentManager.ts  |   4 +-
 ExpressAPI/src/managers/ExerciseManager.ts    |   4 +-
 ExpressAPI/src/managers/GitlabManager.ts      |  12 +-
 ExpressAPI/src/managers/HttpManager.ts        |   2 +-
 ExpressAPI/src/managers/UserManager.ts        |   4 +-
 .../ClientVersionCheckerMiddleware.ts         |   6 +-
 .../src/middlewares/ParamsCallbackManager.ts  |   4 +-
 .../src/middlewares/SecurityMiddleware.ts     |   6 +-
 .../src/middlewares/SessionMiddleware.ts      |   2 +-
 ExpressAPI/src/process/ClusterManager.ts      |   8 +-
 ExpressAPI/src/process/ClusterStrategy.ts     |   2 +-
 ExpressAPI/src/process/WorkerPool.ts          |   4 +-
 ExpressAPI/src/routes/ApiRoutesManager.ts     |  12 +-
 ExpressAPI/src/routes/AssignmentRoutes.ts     |  30 +-
 ExpressAPI/src/routes/BaseRoutes.ts           |   2 +-
 ExpressAPI/src/routes/ExerciseRoutes.ts       |  34 +-
 ExpressAPI/src/routes/GitlabRoutes.ts         |   8 +-
 ExpressAPI/src/routes/SessionRoutes.ts        |  14 +-
 ExpressAPI/src/shared                         |   2 +-
 ExpressAPI/src/types/DatabaseTypes.ts         |   2 +-
 ExpressAPI/src/types/express/index.d.ts       |   4 +-
 40 files changed, 613 insertions(+), 167 deletions(-)
 delete mode 100644 ExpressAPI/src/InitialImports.ts
 create mode 100644 ExpressAPI/src/init.ts

diff --git a/ExpressAPI/.idea/jetbrainsConfiguration b/ExpressAPI/.idea/jetbrainsConfiguration
index f572bf3..ef5c7bd 160000
--- a/ExpressAPI/.idea/jetbrainsConfiguration
+++ b/ExpressAPI/.idea/jetbrainsConfiguration
@@ -1 +1 @@
-Subproject commit f572bf3afa0a98675247df85c599b5d1e5a62d0d
+Subproject commit ef5c7bd49a57bc28db77bad797de4980133d6523
diff --git a/ExpressAPI/nodemon.json b/ExpressAPI/nodemon.json
index 220b7ed..3b34dc5 100644
--- a/ExpressAPI/nodemon.json
+++ b/ExpressAPI/nodemon.json
@@ -9,5 +9,5 @@
     "verbose": true,
     "ext"    : ".ts,.js",
     "ignore" : [],
-    "exec"   : "npm run lint; npm run build:openapi; ts-node --files ./src/app.ts"
+    "exec"   : "npm run lint; npm run build:openapi; tsc --noEmit && npx tsx src/app.ts"
 }
diff --git a/ExpressAPI/package-lock.json b/ExpressAPI/package-lock.json
index d042438..f1471fc 100644
--- a/ExpressAPI/package-lock.json
+++ b/ExpressAPI/package-lock.json
@@ -58,8 +58,8 @@
                 "nodemon": "^3.0.3",
                 "npm": "^10.4.0",
                 "prisma": "^5.9.1",
-                "ts-node": "^10.9.2",
-                "typescript": "^5.3.3"
+                "tsx": "^4.7.1",
+                "typescript": "^5.4.3"
             }
         },
         "node_modules/@aashutoshrathi/word-wrap": {
@@ -135,6 +135,374 @@
             "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==",
             "dev": true
         },
+        "node_modules/@esbuild/aix-ppc64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
+            "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
+            "cpu": [
+                "ppc64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "aix"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/android-arm": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
+            "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/android-arm64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
+            "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/android-x64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
+            "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/darwin-arm64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
+            "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/darwin-x64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
+            "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/freebsd-arm64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
+            "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/freebsd-x64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
+            "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-arm": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
+            "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-arm64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
+            "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-ia32": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
+            "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-loong64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
+            "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
+            "cpu": [
+                "loong64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-mips64el": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
+            "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
+            "cpu": [
+                "mips64el"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-ppc64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
+            "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
+            "cpu": [
+                "ppc64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-riscv64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
+            "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
+            "cpu": [
+                "riscv64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-s390x": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
+            "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
+            "cpu": [
+                "s390x"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-x64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
+            "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/netbsd-x64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
+            "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "netbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/openbsd-x64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
+            "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "openbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/sunos-x64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
+            "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "sunos"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-arm64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
+            "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-ia32": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
+            "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-x64": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
+            "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/@eslint-community/eslint-utils": {
             "version": "4.4.0",
             "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -882,9 +1250,9 @@
             }
         },
         "node_modules/@redocly/config": {
-            "version": "0.1.5",
-            "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.1.5.tgz",
-            "integrity": "sha512-nE7jePALlLDC7hueRy/yWFlTqNv6yrVQnKQVwVepOzuf0PTUYsBWQ2fNxh7Z2L/3PDjTs/Jc2IHmkwAkFyHmnw==",
+            "version": "0.1.6",
+            "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.1.6.tgz",
+            "integrity": "sha512-8vXiTEKAqun98i7LksmhtMUIMl34ePiPchDdsikQLwh3/Hg8J9FyEZujwm5QvYQE2evo78W6x8pcHJtzSmyZgQ==",
             "dev": true
         },
         "node_modules/@redocly/openapi-core": {
@@ -910,9 +1278,9 @@
             }
         },
         "node_modules/@tsconfig/node10": {
-            "version": "1.0.10",
-            "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.10.tgz",
-            "integrity": "sha512-PiaIWIoPvO6qm6t114ropMCagj6YAF24j9OkCA2mJDXFnlionEwhsBCJ8yek4aib575BI3OkART/90WsgHgLWw==",
+            "version": "1.0.11",
+            "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
+            "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
             "dev": true
         },
         "node_modules/@tsconfig/node12": {
@@ -2549,6 +2917,44 @@
             "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==",
             "dev": true
         },
+        "node_modules/esbuild": {
+            "version": "0.19.12",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
+            "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
+            "dev": true,
+            "hasInstallScript": true,
+            "bin": {
+                "esbuild": "bin/esbuild"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "optionalDependencies": {
+                "@esbuild/aix-ppc64": "0.19.12",
+                "@esbuild/android-arm": "0.19.12",
+                "@esbuild/android-arm64": "0.19.12",
+                "@esbuild/android-x64": "0.19.12",
+                "@esbuild/darwin-arm64": "0.19.12",
+                "@esbuild/darwin-x64": "0.19.12",
+                "@esbuild/freebsd-arm64": "0.19.12",
+                "@esbuild/freebsd-x64": "0.19.12",
+                "@esbuild/linux-arm": "0.19.12",
+                "@esbuild/linux-arm64": "0.19.12",
+                "@esbuild/linux-ia32": "0.19.12",
+                "@esbuild/linux-loong64": "0.19.12",
+                "@esbuild/linux-mips64el": "0.19.12",
+                "@esbuild/linux-ppc64": "0.19.12",
+                "@esbuild/linux-riscv64": "0.19.12",
+                "@esbuild/linux-s390x": "0.19.12",
+                "@esbuild/linux-x64": "0.19.12",
+                "@esbuild/netbsd-x64": "0.19.12",
+                "@esbuild/openbsd-x64": "0.19.12",
+                "@esbuild/sunos-x64": "0.19.12",
+                "@esbuild/win32-arm64": "0.19.12",
+                "@esbuild/win32-ia32": "0.19.12",
+                "@esbuild/win32-x64": "0.19.12"
+            }
+        },
         "node_modules/escalade": {
             "version": "3.1.2",
             "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
@@ -3294,6 +3700,18 @@
             "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==",
             "dev": true
         },
+        "node_modules/get-tsconfig": {
+            "version": "4.7.3",
+            "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz",
+            "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==",
+            "dev": true,
+            "dependencies": {
+                "resolve-pkg-maps": "^1.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+            }
+        },
         "node_modules/glob": {
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -4555,9 +4973,9 @@
             "dev": true
         },
         "node_modules/node": {
-            "version": "20.11.1",
-            "resolved": "https://registry.npmjs.org/node/-/node-20.11.1.tgz",
-            "integrity": "sha512-Xn8PkfFD6TYj/zqL2iK6ENtpEWvEymEHTycYdZydZNkzdqXwopqQKG+Yz+8xDsAJO15Db7VFNzRPVpYk0cbBJg==",
+            "version": "20.12.0",
+            "resolved": "https://registry.npmjs.org/node/-/node-20.12.0.tgz",
+            "integrity": "sha512-2Mk6hEMKBXh6KdiG1DHqI68EU7fEvF6icNJ0/ormVXTv1SXii3tLaIObhUEmCBv15qob23n0yoFPmB6CEos5/Q==",
             "hasInstallScript": true,
             "dependencies": {
                 "node-bin-setup": "^1.0.0"
@@ -8273,6 +8691,15 @@
                 "node": ">=4"
             }
         },
+        "node_modules/resolve-pkg-maps": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+            "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+            "dev": true,
+            "funding": {
+                "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+            }
+        },
         "node_modules/restore-cursor": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -8877,9 +9304,9 @@
             }
         },
         "node_modules/swagger-ui-dist": {
-            "version": "5.12.2",
-            "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.12.2.tgz",
-            "integrity": "sha512-Fk8qZCBgZPkDli81pLrkSN15rs49xKnPkjhtKmUImmak4l2HdLiR/R7RgPkMGn1MuXvoIoLjIWgjE7NBgLWZHg=="
+            "version": "5.12.3",
+            "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.12.3.tgz",
+            "integrity": "sha512-UAFxQSzxVkY/yfmipeMLj4LwH6I/ZGcfezwSquPm2U9CqOiHp8L6fD7TcyPDYfCZuHFaPw5y4io+fny37Ov9NQ=="
         },
         "node_modules/swagger-ui-express": {
             "version": "5.0.0",
@@ -9110,6 +9537,25 @@
             "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
             "dev": true
         },
+        "node_modules/tsx": {
+            "version": "4.7.1",
+            "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.1.tgz",
+            "integrity": "sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==",
+            "dev": true,
+            "dependencies": {
+                "esbuild": "~0.19.10",
+                "get-tsconfig": "^4.7.2"
+            },
+            "bin": {
+                "tsx": "dist/cli.mjs"
+            },
+            "engines": {
+                "node": ">=18.0.0"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.3"
+            }
+        },
         "node_modules/tunnel-agent": {
             "version": "0.6.0",
             "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
diff --git a/ExpressAPI/package.json b/ExpressAPI/package.json
index 6ecabeb..5756151 100644
--- a/ExpressAPI/package.json
+++ b/ExpressAPI/package.json
@@ -77,7 +77,7 @@
         "nodemon"                         : "^3.0.3",
         "npm"                             : "^10.4.0",
         "prisma"                          : "^5.9.1",
-        "ts-node"                         : "^10.9.2",
-        "typescript"                      : "^5.3.3"
+        "tsx"                             : "^4.7.1",
+        "typescript"                      : "^5.4.3"
     }
 }
diff --git a/ExpressAPI/prisma/seed.ts b/ExpressAPI/prisma/seed.ts
index 74d814d..93680f6 100644
--- a/ExpressAPI/prisma/seed.ts
+++ b/ExpressAPI/prisma/seed.ts
@@ -1,10 +1,11 @@
-require('../src/InitialImports'); // ATTENTION : These lines MUST be the first of this file
+// ATTENTION : This line MUST be the first of this file
+import '../src/init.js';
 
 import * as process from 'process';
-import SharedConfig from '../src/shared/config/SharedConfig';
+import SharedConfig from '../src/shared/config/SharedConfig.js';
 import { UserRole } from '@prisma/client';
-import logger       from '../src/shared/logging/WinstonLogger';
-import db           from '../src/helpers/DatabaseHelper';
+import logger       from '../src/shared/logging/WinstonLogger.js';
+import db           from '../src/helpers/DatabaseHelper.js';
 
 
 async function main() {
diff --git a/ExpressAPI/src/InitialImports.ts b/ExpressAPI/src/InitialImports.ts
deleted file mode 100644
index 98e4273..0000000
--- a/ExpressAPI/src/InitialImports.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import path    from 'node:path';
-import cluster from 'node:cluster';
-import myEnv = require('dotenv');
-import dotenvExpand = require('dotenv-expand');
-
-
-if ( cluster.isPrimary ) {
-    if ( process.env.NODE_ENV && process.env.NODE_ENV === 'production' ) {
-        dotenvExpand.expand(myEnv.config());
-    } else {
-        myEnv.config({ path: path.join(__dirname, '../.env.keys') });
-        dotenvExpand.expand(myEnv.config({ DOTENV_KEY: process.env.DOTENV_KEY_DEVELOPMENT }));
-    }
-}
-
-
-require('./shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be after the dotenv.config() calls
diff --git a/ExpressAPI/src/app.ts b/ExpressAPI/src/app.ts
index b1eb7d2..cf216ab 100644
--- a/ExpressAPI/src/app.ts
+++ b/ExpressAPI/src/app.ts
@@ -1,10 +1,11 @@
-require('./InitialImports'); // ATTENTION : These lines MUST be the first of this file
+// ATTENTION : This line MUST be the first of this file
+import './init.js';
 
-import SharedConfig   from './shared/config/SharedConfig';
-import WorkerRole     from './process/WorkerRole';
-import ClusterManager from './process/ClusterManager';
-import API            from './express/API';
-import HttpManager    from './managers/HttpManager';
+import SharedConfig   from './shared/config/SharedConfig.js';
+import WorkerRole     from './process/WorkerRole.js';
+import ClusterManager from './process/ClusterManager.js';
+import API            from './express/API.js';
+import HttpManager    from './managers/HttpManager.js';
 
 
 HttpManager.registerAxiosInterceptor();
diff --git a/ExpressAPI/src/config/Config.ts b/ExpressAPI/src/config/Config.ts
index 2eaa5ec..9d5766c 100644
--- a/ExpressAPI/src/config/Config.ts
+++ b/ExpressAPI/src/config/Config.ts
@@ -1,8 +1,8 @@
 import path             from 'path';
 import fs               from 'fs';
-import { Exercise }     from '../types/DatabaseTypes';
+import { Exercise }     from '../types/DatabaseTypes.js';
 import JSON5            from 'json5';
-import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility';
+import GitlabVisibility from '../shared/types/Gitlab/GitlabVisibility.js';
 
 
 type ConfigGitlabBadge = {
diff --git a/ExpressAPI/src/controllers/Session.ts b/ExpressAPI/src/controllers/Session.ts
index d264c7a..3c3bae2 100644
--- a/ExpressAPI/src/controllers/Session.ts
+++ b/ExpressAPI/src/controllers/Session.ts
@@ -1,11 +1,11 @@
 import { getReasonPhrase, StatusCodes } from 'http-status-codes';
 import * as jwt                         from 'jsonwebtoken';
 import { JwtPayload }                   from 'jsonwebtoken';
-import Config                           from '../config/Config';
+import Config                           from '../config/Config.js';
 import express                          from 'express';
-import UserManager                      from '../managers/UserManager';
-import { User }                         from '../types/DatabaseTypes';
-import DojoBackendResponse              from '../shared/types/Dojo/DojoBackendResponse';
+import UserManager                      from '../managers/UserManager.js';
+import { User }                         from '../types/DatabaseTypes.js';
+import DojoBackendResponse              from '../shared/types/Dojo/DojoBackendResponse.js';
 
 
 class Session {
diff --git a/ExpressAPI/src/express/API.ts b/ExpressAPI/src/express/API.ts
index 519918e..4245d92 100644
--- a/ExpressAPI/src/express/API.ts
+++ b/ExpressAPI/src/express/API.ts
@@ -1,22 +1,22 @@
 import { Express }                    from 'express-serve-static-core';
 import cors                           from 'cors';
-import morganMiddleware               from '../logging/MorganMiddleware';
+import morganMiddleware               from '../logging/MorganMiddleware.js';
 import { AddressInfo }                from 'net';
 import http                           from 'http';
 import helmet                         from 'helmet';
 import express                        from 'express';
-import WorkerTask                     from '../process/WorkerTask';
+import WorkerTask                     from '../process/WorkerTask.js';
 import multer                         from 'multer';
-import SessionMiddleware              from '../middlewares/SessionMiddleware';
-import Config                         from '../config/Config';
-import logger                         from '../shared/logging/WinstonLogger';
-import ParamsCallbackManager          from '../middlewares/ParamsCallbackManager';
-import ApiRoutesManager               from '../routes/ApiRoutesManager';
+import SessionMiddleware              from '../middlewares/SessionMiddleware.js';
+import Config                         from '../config/Config.js';
+import logger                         from '../shared/logging/WinstonLogger.js';
+import ParamsCallbackManager          from '../middlewares/ParamsCallbackManager.js';
+import ApiRoutesManager               from '../routes/ApiRoutesManager.js';
 import compression                    from 'compression';
-import ClientVersionCheckerMiddleware from '../middlewares/ClientVersionCheckerMiddleware';
+import ClientVersionCheckerMiddleware from '../middlewares/ClientVersionCheckerMiddleware.js';
 import swaggerUi                      from 'swagger-ui-express';
 import path                           from 'path';
-import DojoCliVersionHelper           from '../helpers/DojoCliVersionHelper';
+import DojoCliVersionHelper           from '../helpers/DojoCliVersionHelper.js';
 
 
 class API implements WorkerTask {
diff --git a/ExpressAPI/src/helpers/DatabaseHelper.ts b/ExpressAPI/src/helpers/DatabaseHelper.ts
index 797615f..21fbff4 100644
--- a/ExpressAPI/src/helpers/DatabaseHelper.ts
+++ b/ExpressAPI/src/helpers/DatabaseHelper.ts
@@ -1,9 +1,9 @@
 import { PrismaClient }          from '@prisma/client';
-import logger                    from '../shared/logging/WinstonLogger';
-import UserQueryExtension        from './Prisma/Extensions/UserQueryExtension';
-import UserResultExtension       from './Prisma/Extensions/UserResultExtension';
-import AssignmentResultExtension from './Prisma/Extensions/AssignmentResultExtension';
-import ExerciseResultExtension   from './Prisma/Extensions/ExerciseResultExtension';
+import logger                    from '../shared/logging/WinstonLogger.js';
+import UserQueryExtension        from './Prisma/Extensions/UserQueryExtension.js';
+import UserResultExtension       from './Prisma/Extensions/UserResultExtension.js';
+import AssignmentResultExtension from './Prisma/Extensions/AssignmentResultExtension.js';
+import ExerciseResultExtension   from './Prisma/Extensions/ExerciseResultExtension.js';
 
 
 const prisma = new PrismaClient({
diff --git a/ExpressAPI/src/helpers/DojoCliVersionHelper.ts b/ExpressAPI/src/helpers/DojoCliVersionHelper.ts
index 4fd8d25..3ee9982 100644
--- a/ExpressAPI/src/helpers/DojoCliVersionHelper.ts
+++ b/ExpressAPI/src/helpers/DojoCliVersionHelper.ts
@@ -1,5 +1,5 @@
-import Config        from '../config/Config';
-import GitlabManager from '../managers/GitlabManager';
+import Config        from '../config/Config.js';
+import GitlabManager from '../managers/GitlabManager.js';
 import * as Gitlab   from '@gitbeaker/rest';
 
 
diff --git a/ExpressAPI/src/helpers/DojoModelsHelper.ts b/ExpressAPI/src/helpers/DojoModelsHelper.ts
index 3b3c35c..a54c2ac 100644
--- a/ExpressAPI/src/helpers/DojoModelsHelper.ts
+++ b/ExpressAPI/src/helpers/DojoModelsHelper.ts
@@ -1,4 +1,4 @@
-import LazyVal from '../shared/helpers/LazyVal';
+import LazyVal from '../shared/helpers/LazyVal.js';
 
 
 class DojoModelsHelper {
diff --git a/ExpressAPI/src/helpers/DojoValidators.ts b/ExpressAPI/src/helpers/DojoValidators.ts
index 26f60f4..cef01a0 100644
--- a/ExpressAPI/src/helpers/DojoValidators.ts
+++ b/ExpressAPI/src/helpers/DojoValidators.ts
@@ -1,13 +1,13 @@
-import Config                                                       from '../config/Config';
+import Config                                                       from '../config/Config.js';
 import { CustomValidator, ErrorMessage, FieldMessageFactory, Meta } from 'express-validator/src/base';
 import { BailOptions, ValidationChain }                             from 'express-validator/src/chain';
-import GitlabManager                                                from '../managers/GitlabManager';
+import GitlabManager                                                from '../managers/GitlabManager.js';
 import express                                                      from 'express';
-import logger                                                       from '../shared/logging/WinstonLogger';
-import Json5FileValidator                                           from '../shared/helpers/Json5FileValidator';
-import ExerciseResultsFile                                          from '../shared/types/Dojo/ExerciseResultsFile';
-import ParamsCallbackManager                                        from '../middlewares/ParamsCallbackManager';
-import ExerciseManager                                              from '../managers/ExerciseManager';
+import logger                                                       from '../shared/logging/WinstonLogger.js';
+import Json5FileValidator                                           from '../shared/helpers/Json5FileValidator.js';
+import ExerciseResultsFile                                          from '../shared/types/Dojo/ExerciseResultsFile.js';
+import ParamsCallbackManager                                        from '../middlewares/ParamsCallbackManager.js';
+import ExerciseManager                                              from '../managers/ExerciseManager.js';
 
 
 declare type DojoMeta = Meta & {
diff --git a/ExpressAPI/src/helpers/GlobalHelper.ts b/ExpressAPI/src/helpers/GlobalHelper.ts
index 6bd7b88..308a941 100644
--- a/ExpressAPI/src/helpers/GlobalHelper.ts
+++ b/ExpressAPI/src/helpers/GlobalHelper.ts
@@ -1,7 +1,7 @@
 import express                   from 'express';
-import logger                    from '../shared/logging/WinstonLogger';
-import GitlabManager             from '../managers/GitlabManager';
-import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode';
+import logger                    from '../shared/logging/WinstonLogger.js';
+import GitlabManager             from '../managers/GitlabManager.js';
+import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode.js';
 import { StatusCodes }           from 'http-status-codes';
 import { GitbeakerRequestError } from '@gitbeaker/requester-utils';
 import * as Gitlab               from '@gitbeaker/rest';
diff --git a/ExpressAPI/src/helpers/Prisma/Extensions/AssignmentResultExtension.ts b/ExpressAPI/src/helpers/Prisma/Extensions/AssignmentResultExtension.ts
index 4c1d8be..41919c8 100644
--- a/ExpressAPI/src/helpers/Prisma/Extensions/AssignmentResultExtension.ts
+++ b/ExpressAPI/src/helpers/Prisma/Extensions/AssignmentResultExtension.ts
@@ -1,7 +1,7 @@
 import { Prisma }   from '@prisma/client';
-import { Exercise } from '../../../types/DatabaseTypes';
-import db           from '../../DatabaseHelper';
-import LazyVal      from '../../../shared/helpers/LazyVal';
+import { Exercise } from '../../../types/DatabaseTypes.js';
+import db           from '../../DatabaseHelper.js';
+import LazyVal      from '../../../shared/helpers/LazyVal.js';
 
 
 async function getCorrections(assignment: { name: string }): Promise<Array<Partial<Exercise>> | undefined> {
diff --git a/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts b/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts
index af63f05..434ff40 100644
--- a/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts
+++ b/ExpressAPI/src/helpers/Prisma/Extensions/UserResultExtension.ts
@@ -1,7 +1,7 @@
 import { Prisma, UserRole } from '@prisma/client';
-import LazyVal              from '../../../shared/helpers/LazyVal';
+import LazyVal              from '../../../shared/helpers/LazyVal.js';
 import * as Gitlab          from '@gitbeaker/rest';
-import GitlabManager        from '../../../managers/GitlabManager';
+import GitlabManager        from '../../../managers/GitlabManager.js';
 
 
 export default Prisma.defineExtension(client => {
diff --git a/ExpressAPI/src/init.ts b/ExpressAPI/src/init.ts
new file mode 100644
index 0000000..59695b2
--- /dev/null
+++ b/ExpressAPI/src/init.ts
@@ -0,0 +1,15 @@
+import path         from 'node:path';
+import cluster      from 'node:cluster';
+import dotenv       from 'dotenv';
+import dotenvExpand from 'dotenv-expand';
+import './shared/helpers/TypeScriptExtensions.js';
+
+
+if ( cluster.isPrimary ) {
+    if ( process.env.NODE_ENV && process.env.NODE_ENV === 'production' ) {
+        dotenvExpand.expand(dotenv.config());
+    } else {
+        dotenv.config({ path: path.join(__dirname, '../.env.keys') });
+        dotenvExpand.expand(dotenv.config({ DOTENV_KEY: process.env.DOTENV_KEY_DEVELOPMENT }));
+    }
+}
diff --git a/ExpressAPI/src/logging/MorganMiddleware.ts b/ExpressAPI/src/logging/MorganMiddleware.ts
index 6da9b45..a23c0d5 100644
--- a/ExpressAPI/src/logging/MorganMiddleware.ts
+++ b/ExpressAPI/src/logging/MorganMiddleware.ts
@@ -1,5 +1,5 @@
 import morgan, { StreamOptions } from 'morgan';
-import logger                    from '../shared/logging/WinstonLogger';
+import logger                    from '../shared/logging/WinstonLogger.js';
 
 
 const stream: StreamOptions = {
diff --git a/ExpressAPI/src/managers/AssignmentManager.ts b/ExpressAPI/src/managers/AssignmentManager.ts
index 9053b8e..7a42824 100644
--- a/ExpressAPI/src/managers/AssignmentManager.ts
+++ b/ExpressAPI/src/managers/AssignmentManager.ts
@@ -1,6 +1,6 @@
 import { Prisma }           from '@prisma/client';
-import { Assignment, User } from '../types/DatabaseTypes';
-import db                   from '../helpers/DatabaseHelper';
+import { Assignment, User } from '../types/DatabaseTypes.js';
+import db                   from '../helpers/DatabaseHelper.js';
 
 
 class AssignmentManager {
diff --git a/ExpressAPI/src/managers/ExerciseManager.ts b/ExpressAPI/src/managers/ExerciseManager.ts
index 8020352..258f963 100644
--- a/ExpressAPI/src/managers/ExerciseManager.ts
+++ b/ExpressAPI/src/managers/ExerciseManager.ts
@@ -1,6 +1,6 @@
 import { Prisma }   from '@prisma/client';
-import { Exercise } from '../types/DatabaseTypes';
-import db           from '../helpers/DatabaseHelper';
+import { Exercise } from '../types/DatabaseTypes.js';
+import db           from '../helpers/DatabaseHelper.js';
 
 
 class ExerciseManager {
diff --git a/ExpressAPI/src/managers/GitlabManager.ts b/ExpressAPI/src/managers/GitlabManager.ts
index f48e939..5571185 100644
--- a/ExpressAPI/src/managers/GitlabManager.ts
+++ b/ExpressAPI/src/managers/GitlabManager.ts
@@ -1,13 +1,13 @@
-import Config                                                                                                                                                                                 from '../config/Config';
+import Config                                                                                                                                                                                 from '../config/Config.js';
 import { StatusCodes }                                                                                                                                                                        from 'http-status-codes';
-import GitlabVisibility                                                                                                                                                                       from '../shared/types/Gitlab/GitlabVisibility';
+import GitlabVisibility                                                                                                                                                                       from '../shared/types/Gitlab/GitlabVisibility.js';
 import express                                                                                                                                                                                from 'express';
-import SharedConfig                                                                                                                                                                           from '../shared/config/SharedConfig';
+import SharedConfig                                                                                                                                                                           from '../shared/config/SharedConfig.js';
 import { CommitSchema, ExpandedUserSchema, Gitlab, MemberSchema, ProjectBadgeSchema, ProjectSchema, ReleaseSchema, RepositoryFileExpandedSchema, RepositoryFileSchema, RepositoryTreeSchema } from '@gitbeaker/rest';
-import logger                                                                                                                                                                                 from '../shared/logging/WinstonLogger';
+import logger                                                                                                                                                                                 from '../shared/logging/WinstonLogger.js';
 import { AccessLevel, EditProjectOptions, ProjectVariableSchema, ProtectedBranchAccessLevel, ProtectedBranchSchema }                                                                          from '@gitbeaker/core';
-import DojoStatusCode                                                                                                                                                                         from '../shared/types/Dojo/DojoStatusCode';
-import SharedGitlabManager                                                                                                                                                                    from '../shared/managers/SharedGitlabManager';
+import DojoStatusCode                                                                                                                                                                         from '../shared/types/Dojo/DojoStatusCode.js';
+import SharedGitlabManager                                                                                                                                                                    from '../shared/managers/SharedGitlabManager.js';
 
 
 class GitlabManager extends SharedGitlabManager {
diff --git a/ExpressAPI/src/managers/HttpManager.ts b/ExpressAPI/src/managers/HttpManager.ts
index 408adc5..0d9b7d2 100644
--- a/ExpressAPI/src/managers/HttpManager.ts
+++ b/ExpressAPI/src/managers/HttpManager.ts
@@ -1,6 +1,6 @@
 import axios, { AxiosError, AxiosRequestHeaders } from 'axios';
 import FormData                                   from 'form-data';
-import logger                                     from '../shared/logging/WinstonLogger';
+import logger                                     from '../shared/logging/WinstonLogger.js';
 
 
 class HttpManager {
diff --git a/ExpressAPI/src/managers/UserManager.ts b/ExpressAPI/src/managers/UserManager.ts
index 6008cf5..871ea38 100644
--- a/ExpressAPI/src/managers/UserManager.ts
+++ b/ExpressAPI/src/managers/UserManager.ts
@@ -1,6 +1,6 @@
 import { Prisma }  from '@prisma/client';
-import db          from '../helpers/DatabaseHelper';
-import { User }    from '../types/DatabaseTypes';
+import db          from '../helpers/DatabaseHelper.js';
+import { User }    from '../types/DatabaseTypes.js';
 import * as Gitlab from '@gitbeaker/rest';
 
 
diff --git a/ExpressAPI/src/middlewares/ClientVersionCheckerMiddleware.ts b/ExpressAPI/src/middlewares/ClientVersionCheckerMiddleware.ts
index f58b2b7..d4d1cba 100644
--- a/ExpressAPI/src/middlewares/ClientVersionCheckerMiddleware.ts
+++ b/ExpressAPI/src/middlewares/ClientVersionCheckerMiddleware.ts
@@ -1,8 +1,8 @@
 import express         from 'express';
-import Config          from '../config/Config';
+import Config          from '../config/Config.js';
 import semver          from 'semver/preload';
-import Session         from '../controllers/Session';
-import DojoStatusCode  from '../shared/types/Dojo/DojoStatusCode';
+import Session         from '../controllers/Session.js';
+import DojoStatusCode  from '../shared/types/Dojo/DojoStatusCode.js';
 import { StatusCodes } from 'http-status-codes';
 
 
diff --git a/ExpressAPI/src/middlewares/ParamsCallbackManager.ts b/ExpressAPI/src/middlewares/ParamsCallbackManager.ts
index 6dd5303..a1836d1 100644
--- a/ExpressAPI/src/middlewares/ParamsCallbackManager.ts
+++ b/ExpressAPI/src/middlewares/ParamsCallbackManager.ts
@@ -1,8 +1,8 @@
 import { Express }       from 'express-serve-static-core';
 import express           from 'express';
 import { StatusCodes }   from 'http-status-codes';
-import ExerciseManager   from '../managers/ExerciseManager';
-import AssignmentManager from '../managers/AssignmentManager';
+import ExerciseManager   from '../managers/ExerciseManager.js';
+import AssignmentManager from '../managers/AssignmentManager.js';
 
 
 type GetFunction = (id: string | number, ...args: Array<unknown>) => Promise<unknown>
diff --git a/ExpressAPI/src/middlewares/SecurityMiddleware.ts b/ExpressAPI/src/middlewares/SecurityMiddleware.ts
index a3a5059..cffbfae 100644
--- a/ExpressAPI/src/middlewares/SecurityMiddleware.ts
+++ b/ExpressAPI/src/middlewares/SecurityMiddleware.ts
@@ -1,8 +1,8 @@
 import express           from 'express';
 import { StatusCodes }   from 'http-status-codes';
-import SecurityCheckType from '../types/SecurityCheckType';
-import logger            from '../shared/logging/WinstonLogger';
-import AssignmentManager from '../managers/AssignmentManager';
+import SecurityCheckType from '../types/SecurityCheckType.js';
+import logger            from '../shared/logging/WinstonLogger.js';
+import AssignmentManager from '../managers/AssignmentManager.js';
 
 
 class SecurityMiddleware {
diff --git a/ExpressAPI/src/middlewares/SessionMiddleware.ts b/ExpressAPI/src/middlewares/SessionMiddleware.ts
index bf237bf..0fb5209 100644
--- a/ExpressAPI/src/middlewares/SessionMiddleware.ts
+++ b/ExpressAPI/src/middlewares/SessionMiddleware.ts
@@ -1,5 +1,5 @@
 import express     from 'express';
-import Session     from '../controllers/Session';
+import Session     from '../controllers/Session.js';
 import { Express } from 'express-serve-static-core';
 
 
diff --git a/ExpressAPI/src/process/ClusterManager.ts b/ExpressAPI/src/process/ClusterManager.ts
index fd061eb..8607287 100644
--- a/ExpressAPI/src/process/ClusterManager.ts
+++ b/ExpressAPI/src/process/ClusterManager.ts
@@ -1,9 +1,9 @@
 import cluster, { Worker } from 'node:cluster';
-import WorkerRole          from './WorkerRole';
+import WorkerRole          from './WorkerRole.js';
 import os                  from 'os';
-import ClusterStrategy     from './ClusterStrategy';
-import WorkerPool          from './WorkerPool';
-import logger              from '../shared/logging/WinstonLogger';
+import ClusterStrategy     from './ClusterStrategy.js';
+import WorkerPool          from './WorkerPool.js';
+import logger              from '../shared/logging/WinstonLogger.js';
 
 
 /*
diff --git a/ExpressAPI/src/process/ClusterStrategy.ts b/ExpressAPI/src/process/ClusterStrategy.ts
index 4628b6c..7fb8f74 100644
--- a/ExpressAPI/src/process/ClusterStrategy.ts
+++ b/ExpressAPI/src/process/ClusterStrategy.ts
@@ -1,4 +1,4 @@
-import WorkerPool from './WorkerPool';
+import WorkerPool from './WorkerPool.js';
 
 
 type ClusterStrategy = Array<WorkerPool>
diff --git a/ExpressAPI/src/process/WorkerPool.ts b/ExpressAPI/src/process/WorkerPool.ts
index 79c469e..13d5be1 100644
--- a/ExpressAPI/src/process/WorkerPool.ts
+++ b/ExpressAPI/src/process/WorkerPool.ts
@@ -1,5 +1,5 @@
-import WorkerRole from './WorkerRole';
-import WorkerTask from './WorkerTask';
+import WorkerRole from './WorkerRole.js';
+import WorkerTask from './WorkerTask.js';
 
 
 /*
diff --git a/ExpressAPI/src/routes/ApiRoutesManager.ts b/ExpressAPI/src/routes/ApiRoutesManager.ts
index ec4eeb9..57a4188 100644
--- a/ExpressAPI/src/routes/ApiRoutesManager.ts
+++ b/ExpressAPI/src/routes/ApiRoutesManager.ts
@@ -1,10 +1,10 @@
 import { Express }      from 'express-serve-static-core';
-import RoutesManager    from '../express/RoutesManager';
-import BaseRoutes       from './BaseRoutes';
-import SessionRoutes    from './SessionRoutes';
-import AssignmentRoutes from './AssignmentRoutes';
-import GitlabRoutes     from './GitlabRoutes';
-import ExerciseRoutes   from './ExerciseRoutes';
+import RoutesManager    from '../express/RoutesManager.js';
+import BaseRoutes       from './BaseRoutes.js';
+import SessionRoutes    from './SessionRoutes.js';
+import AssignmentRoutes from './AssignmentRoutes.js';
+import GitlabRoutes     from './GitlabRoutes.js';
+import ExerciseRoutes   from './ExerciseRoutes.js';
 
 
 class AdminRoutesManager implements RoutesManager {
diff --git a/ExpressAPI/src/routes/AssignmentRoutes.ts b/ExpressAPI/src/routes/AssignmentRoutes.ts
index 121c4c4..4a330a5 100644
--- a/ExpressAPI/src/routes/AssignmentRoutes.ts
+++ b/ExpressAPI/src/routes/AssignmentRoutes.ts
@@ -2,24 +2,24 @@ import { Express }               from 'express-serve-static-core';
 import express                   from 'express';
 import * as ExpressValidator     from 'express-validator';
 import { StatusCodes }           from 'http-status-codes';
-import RoutesManager             from '../express/RoutesManager';
-import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware';
-import SecurityMiddleware        from '../middlewares/SecurityMiddleware';
-import SecurityCheckType         from '../types/SecurityCheckType';
-import GitlabManager             from '../managers/GitlabManager';
-import Config                    from '../config/Config';
-import logger                    from '../shared/logging/WinstonLogger';
-import DojoValidators            from '../helpers/DojoValidators';
+import RoutesManager             from '../express/RoutesManager.js';
+import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware.js';
+import SecurityMiddleware        from '../middlewares/SecurityMiddleware.js';
+import SecurityCheckType         from '../types/SecurityCheckType.js';
+import GitlabManager             from '../managers/GitlabManager.js';
+import Config                    from '../config/Config.js';
+import logger                    from '../shared/logging/WinstonLogger.js';
+import DojoValidators            from '../helpers/DojoValidators.js';
 import { Prisma }                from '@prisma/client';
-import db                        from '../helpers/DatabaseHelper';
-import { Assignment }            from '../types/DatabaseTypes';
-import AssignmentManager         from '../managers/AssignmentManager';
+import db                        from '../helpers/DatabaseHelper.js';
+import { Assignment }            from '../types/DatabaseTypes.js';
+import AssignmentManager         from '../managers/AssignmentManager.js';
 import fs                        from 'fs';
 import path                      from 'path';
-import SharedAssignmentHelper    from '../shared/helpers/Dojo/SharedAssignmentHelper';
-import GlobalHelper              from '../helpers/GlobalHelper';
-import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode';
-import DojoModelsHelper          from '../helpers/DojoModelsHelper';
+import SharedAssignmentHelper    from '../shared/helpers/Dojo/SharedAssignmentHelper.js';
+import GlobalHelper              from '../helpers/GlobalHelper.js';
+import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode.js';
+import DojoModelsHelper          from '../helpers/DojoModelsHelper.js';
 import * as Gitlab               from '@gitbeaker/rest';
 import { GitbeakerRequestError } from '@gitbeaker/requester-utils';
 
diff --git a/ExpressAPI/src/routes/BaseRoutes.ts b/ExpressAPI/src/routes/BaseRoutes.ts
index 474f5bb..57a215f 100644
--- a/ExpressAPI/src/routes/BaseRoutes.ts
+++ b/ExpressAPI/src/routes/BaseRoutes.ts
@@ -1,7 +1,7 @@
 import { Express }     from 'express-serve-static-core';
 import express         from 'express';
 import { StatusCodes } from 'http-status-codes';
-import RoutesManager   from '../express/RoutesManager';
+import RoutesManager   from '../express/RoutesManager.js';
 
 
 class BaseRoutes implements RoutesManager {
diff --git a/ExpressAPI/src/routes/ExerciseRoutes.ts b/ExpressAPI/src/routes/ExerciseRoutes.ts
index 34607a0..116fd1d 100644
--- a/ExpressAPI/src/routes/ExerciseRoutes.ts
+++ b/ExpressAPI/src/routes/ExerciseRoutes.ts
@@ -2,29 +2,29 @@ import { Express }               from 'express-serve-static-core';
 import express                   from 'express';
 import * as ExpressValidator     from 'express-validator';
 import { StatusCodes }           from 'http-status-codes';
-import RoutesManager             from '../express/RoutesManager';
-import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware';
-import SecurityMiddleware        from '../middlewares/SecurityMiddleware';
-import GitlabManager             from '../managers/GitlabManager';
-import Config                    from '../config/Config';
-import logger                    from '../shared/logging/WinstonLogger';
-import DojoValidators            from '../helpers/DojoValidators';
+import RoutesManager             from '../express/RoutesManager.js';
+import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware.js';
+import SecurityMiddleware        from '../middlewares/SecurityMiddleware.js';
+import GitlabManager             from '../managers/GitlabManager.js';
+import Config                    from '../config/Config.js';
+import logger                    from '../shared/logging/WinstonLogger.js';
+import DojoValidators            from '../helpers/DojoValidators.js';
 import { v4 as uuidv4 }          from 'uuid';
 import { Prisma }                from '@prisma/client';
-import { Assignment, Exercise }  from '../types/DatabaseTypes';
-import db                        from '../helpers/DatabaseHelper';
-import SecurityCheckType         from '../types/SecurityCheckType';
+import { Assignment, Exercise }  from '../types/DatabaseTypes.js';
+import db                        from '../helpers/DatabaseHelper.js';
+import SecurityCheckType         from '../types/SecurityCheckType.js';
 import JSON5                     from 'json5';
 import fs                        from 'fs';
 import path                      from 'path';
-import AssignmentFile            from '../shared/types/Dojo/AssignmentFile';
-import ExerciseResultsFile       from '../shared/types/Dojo/ExerciseResultsFile';
-import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode';
-import GlobalHelper              from '../helpers/GlobalHelper';
-import { IFileDirStat }          from '../shared/helpers/recursiveFilesStats/RecursiveFilesStats';
-import ExerciseManager           from '../managers/ExerciseManager';
+import AssignmentFile            from '../shared/types/Dojo/AssignmentFile.js';
+import ExerciseResultsFile       from '../shared/types/Dojo/ExerciseResultsFile.js';
+import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode.js';
+import GlobalHelper              from '../helpers/GlobalHelper.js';
+import { IFileDirStat }          from '../shared/helpers/recursiveFilesStats/RecursiveFilesStats.js';
+import ExerciseManager           from '../managers/ExerciseManager.js';
 import * as Gitlab               from '@gitbeaker/rest';
-import GitlabTreeFileType        from '../shared/types/Gitlab/GitlabTreeFileType';
+import GitlabTreeFileType        from '../shared/types/Gitlab/GitlabTreeFileType.js';
 import { GitbeakerRequestError } from '@gitbeaker/requester-utils';
 
 
diff --git a/ExpressAPI/src/routes/GitlabRoutes.ts b/ExpressAPI/src/routes/GitlabRoutes.ts
index 2d8ced0..1a5c00d 100644
--- a/ExpressAPI/src/routes/GitlabRoutes.ts
+++ b/ExpressAPI/src/routes/GitlabRoutes.ts
@@ -1,9 +1,9 @@
 import { Express }        from 'express-serve-static-core';
 import express            from 'express';
-import RoutesManager      from '../express/RoutesManager';
-import SecurityMiddleware from '../middlewares/SecurityMiddleware';
-import SecurityCheckType  from '../types/SecurityCheckType';
-import GitlabManager      from '../managers/GitlabManager';
+import RoutesManager      from '../express/RoutesManager.js';
+import SecurityMiddleware from '../middlewares/SecurityMiddleware.js';
+import SecurityCheckType  from '../types/SecurityCheckType.js';
+import GitlabManager      from '../managers/GitlabManager.js';
 
 
 class GitlabRoutes implements RoutesManager {
diff --git a/ExpressAPI/src/routes/SessionRoutes.ts b/ExpressAPI/src/routes/SessionRoutes.ts
index b4f223e..4ea2571 100644
--- a/ExpressAPI/src/routes/SessionRoutes.ts
+++ b/ExpressAPI/src/routes/SessionRoutes.ts
@@ -2,13 +2,13 @@ import { Express }               from 'express-serve-static-core';
 import express                   from 'express';
 import * as ExpressValidator     from 'express-validator';
 import { StatusCodes }           from 'http-status-codes';
-import RoutesManager             from '../express/RoutesManager';
-import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware';
-import SecurityMiddleware        from '../middlewares/SecurityMiddleware';
-import GitlabManager             from '../managers/GitlabManager';
-import UserManager               from '../managers/UserManager';
-import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode';
-import Config                    from '../config/Config';
+import RoutesManager             from '../express/RoutesManager.js';
+import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware.js';
+import SecurityMiddleware        from '../middlewares/SecurityMiddleware.js';
+import GitlabManager             from '../managers/GitlabManager.js';
+import UserManager               from '../managers/UserManager.js';
+import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode.js';
+import Config                    from '../config/Config.js';
 
 
 class SessionRoutes implements RoutesManager {
diff --git a/ExpressAPI/src/shared b/ExpressAPI/src/shared
index 6e78095..021300d 160000
--- a/ExpressAPI/src/shared
+++ b/ExpressAPI/src/shared
@@ -1 +1 @@
-Subproject commit 6e78095b3fe73f2c2987de1a3d3b55511335a2bf
+Subproject commit 021300d29473dee2ad229384d22a521c0e5c14aa
diff --git a/ExpressAPI/src/types/DatabaseTypes.ts b/ExpressAPI/src/types/DatabaseTypes.ts
index 2a97269..011d2ef 100644
--- a/ExpressAPI/src/types/DatabaseTypes.ts
+++ b/ExpressAPI/src/types/DatabaseTypes.ts
@@ -1,5 +1,5 @@
 import { Prisma }  from '@prisma/client';
-import LazyVal     from '../shared/helpers/LazyVal';
+import LazyVal     from '../shared/helpers/LazyVal.js';
 import * as Gitlab from '@gitbeaker/rest';
 
 
diff --git a/ExpressAPI/src/types/express/index.d.ts b/ExpressAPI/src/types/express/index.d.ts
index e7ac814..744609f 100644
--- a/ExpressAPI/src/types/express/index.d.ts
+++ b/ExpressAPI/src/types/express/index.d.ts
@@ -1,5 +1,5 @@
-import Session                  from '../../controllers/Session';
-import { Assignment, Exercise } from '../DatabaseTypes';
+import Session                  from '../../controllers/Session.js';
+import { Assignment, Exercise } from '../DatabaseTypes.js';
 
 // to make the file a module and avoid the TypeScript error
 export {};
-- 
GitLab