From 566c734ac5fec7e80a96c5fe532b090c43670235 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <git@minelli.me>
Date: Fri, 19 Apr 2024 14:45:15 +0200
Subject: [PATCH] Update import to add .js extensions

---
 NodeApp/.idea/jetbrainsConfiguration          |   2 +-
 NodeApp/package-lock.json                     | 903 ++++++++++++------
 NodeApp/package.json                          |   7 +-
 NodeApp/src/app.ts                            |  21 +-
 NodeApp/src/commander/CommanderApp.ts         |  26 +-
 NodeApp/src/commander/UpgradeCommand.ts       |   6 +-
 .../commander/assignment/AssignmentCommand.ts |  14 +-
 .../subcommands/AssignmentCheckCommand.ts     |  12 +-
 .../subcommands/AssignmentCreateCommand.ts    |  14 +-
 .../subcommands/AssignmentPublishCommand.ts   |   2 +-
 .../AssignmentPublishUnpublishCommandBase.ts  |  20 +-
 .../subcommands/AssignmentRunCommand.ts       |   6 +-
 .../subcommands/AssignmentUnpublishCommand.ts |   2 +-
 .../correction/AssignmentCorrectionCommand.ts |   6 +-
 .../AssignmentCorrectionLinkCommand.ts        |   2 +-
 .../AssignmentCorrectionLinkUpdateCommand.ts  |  18 +-
 .../AssignmentCorrectionUpdateCommand.ts      |   2 +-
 NodeApp/src/commander/auth/AuthCommand.ts     |   8 +-
 NodeApp/src/commander/auth/SessionCommand.ts  |   2 +-
 .../auth/subcommands/AuthLoginCommand.ts      |  12 +-
 .../auth/subcommands/AuthLogoutCommand.ts     |  10 +-
 .../auth/subcommands/AuthTestCommand.ts       |   6 +-
 .../commander/completion/CompletionCommand.ts |   8 +-
 .../CompletionCreateUpdateCommand.ts          |   6 +-
 .../subcommands/CompletionGetCommand.ts       |   4 +-
 .../subcommands/CompletionScriptCommand.ts    |   2 +-
 .../src/commander/exercise/ExerciseCommand.ts |   8 +-
 .../subcommands/ExerciseCorrectionCommand.ts  |  10 +-
 .../subcommands/ExerciseCreateCommand.ts      |  14 +-
 .../subcommands/ExerciseRunCommand.ts         |   6 +-
 NodeApp/src/config/ConfigFiles.ts             |   4 +-
 NodeApp/src/config/LocalConfigFile.ts         |   2 +-
 NodeApp/src/helpers/AccessesHelper.ts         |   4 +-
 NodeApp/src/helpers/AutoCompletionHelper.ts   |   2 +-
 NodeApp/src/helpers/Dojo/ExerciseRunHelper.ts |  21 +-
 NodeApp/src/helpers/GlobalHelper.ts           |   4 +-
 NodeApp/src/init.ts                           |  11 +
 NodeApp/src/managers/DojoBackendManager.ts    |  20 +-
 NodeApp/src/managers/GitlabManager.ts         |   4 +-
 NodeApp/src/managers/HttpManager.ts           |  14 +-
 NodeApp/src/managers/SessionManager.ts        |  30 +-
 NodeApp/src/shared                            |   2 +-
 NodeApp/src/sharedByClients                   |   2 +-
 NodeApp/tsconfig.json                         |  13 +-
 44 files changed, 819 insertions(+), 473 deletions(-)
 create mode 100644 NodeApp/src/init.ts

diff --git a/NodeApp/.idea/jetbrainsConfiguration b/NodeApp/.idea/jetbrainsConfiguration
index f572bf3..ef5c7bd 160000
--- a/NodeApp/.idea/jetbrainsConfiguration
+++ b/NodeApp/.idea/jetbrainsConfiguration
@@ -1 +1 @@
-Subproject commit f572bf3afa0a98675247df85c599b5d1e5a62d0d
+Subproject commit ef5c7bd49a57bc28db77bad797de4980133d6523
diff --git a/NodeApp/package-lock.json b/NodeApp/package-lock.json
index 6050f51..a5b7438 100644
--- a/NodeApp/package-lock.json
+++ b/NodeApp/package-lock.json
@@ -9,14 +9,14 @@
             "version": "4.0.0",
             "license": "AGPLv3",
             "dependencies": {
-                "@gitbeaker/core": "^40.0.1",
-                "@gitbeaker/requester-utils": "^40.0.1",
-                "@gitbeaker/rest": "^40.0.1",
+                "@gitbeaker/core": "^40.0.2",
+                "@gitbeaker/requester-utils": "^40.0.2",
+                "@gitbeaker/rest": "^40.0.2",
                 "appdata-path": "^1.0.0",
-                "axios": "^1.6.5",
+                "axios": "^1.6.8",
                 "boxen": "^5.1.2",
                 "chalk": "^4.1.2",
-                "commander": "^11.1.0",
+                "commander": "^12.0.0",
                 "dotenv": "^16.3.1",
                 "dotenv-expand": "^10.0.0",
                 "form-data": "^4.0.0",
@@ -27,13 +27,13 @@
                 "jsonwebtoken": "^8.5.1",
                 "open": "^8.4.2",
                 "ora": "^5.4.1",
-                "semver": "^7.5.4",
-                "tar-stream": "^3.1.6",
-                "winston": "^3.11.0",
+                "semver": "^7.6.0",
+                "tar-stream": "^3.1.7",
+                "winston": "^3.13.0",
                 "winston-transport": "^4.7.0",
-                "yaml": "^2.3.4",
+                "yaml": "^2.4.1",
                 "zod": "^3.22.4",
-                "zod-validation-error": "^3.0.0"
+                "zod-validation-error": "^3.0.3"
             },
             "bin": {
                 "dojo": "dist/app.js"
@@ -42,17 +42,17 @@
                 "@types/fs-extra": "^11.0.4",
                 "@types/inquirer": "^8.2.10",
                 "@types/jsonwebtoken": "^8.5.9",
-                "@types/node": "^18.19.2",
-                "@types/semver": "^7.5.6",
+                "@types/node": "^18.19.26",
+                "@types/semver": "^7.5.8",
                 "@types/tar-stream": "^3.1.3",
-                "@typescript-eslint/eslint-plugin": "^6.18.1",
-                "@typescript-eslint/parser": "^6.18.1",
                 "dotenv-vault": "^1.25.0",
+                "eslint": "^8.57.0",
                 "genversion": "^3.2.0",
                 "pkg": "^5.8.1",
                 "tiny-typed-emitter": "^2.1.0",
-                "ts-node": "^10.9.2",
-                "typescript": "^5.3.3"
+                "tsx": "^4.7.1",
+                "typescript": "^5.4.2",
+                "typescript-eslint": "^7.4.0"
             }
         },
         "node_modules/@aashutoshrathi/word-wrap": {
@@ -60,7 +60,6 @@
             "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
             "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -163,6 +162,374 @@
                 "kuler": "^2.0.0"
             }
         },
+        "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",
@@ -192,7 +559,6 @@
             "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
             "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "ajv": "^6.12.4",
                 "debug": "^4.3.2",
@@ -215,26 +581,13 @@
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
             "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-            "dev": true,
-            "peer": true
-        },
-        "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
-            "version": "1.1.11",
-            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-            "dev": true,
-            "peer": true,
-            "dependencies": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-            }
+            "dev": true
         },
         "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
             "version": "4.1.0",
             "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
             "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "argparse": "^2.0.1"
             },
@@ -242,25 +595,11 @@
                 "js-yaml": "bin/js-yaml.js"
             }
         },
-        "node_modules/@eslint/eslintrc/node_modules/minimatch": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-            "dev": true,
-            "peer": true,
-            "dependencies": {
-                "brace-expansion": "^1.1.7"
-            },
-            "engines": {
-                "node": "*"
-            }
-        },
         "node_modules/@eslint/js": {
             "version": "8.57.0",
             "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
             "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
             }
@@ -309,7 +648,6 @@
             "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
             "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "@humanwhocodes/object-schema": "^2.0.2",
                 "debug": "^4.3.1",
@@ -319,36 +657,11 @@
                 "node": ">=10.10.0"
             }
         },
-        "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
-            "version": "1.1.11",
-            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-            "dev": true,
-            "peer": true,
-            "dependencies": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-            }
-        },
-        "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-            "dev": true,
-            "peer": true,
-            "dependencies": {
-                "brace-expansion": "^1.1.7"
-            },
-            "engines": {
-                "node": "*"
-            }
-        },
         "node_modules/@humanwhocodes/module-importer": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
             "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=12.22"
             },
@@ -361,8 +674,7 @@
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
             "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/@jridgewell/gen-mapping": {
             "version": "0.3.5",
@@ -830,9 +1142,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": {
@@ -945,16 +1257,16 @@
             "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="
         },
         "node_modules/@typescript-eslint/eslint-plugin": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
-            "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz",
+            "integrity": "sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==",
             "dev": true,
             "dependencies": {
                 "@eslint-community/regexpp": "^4.5.1",
-                "@typescript-eslint/scope-manager": "6.21.0",
-                "@typescript-eslint/type-utils": "6.21.0",
-                "@typescript-eslint/utils": "6.21.0",
-                "@typescript-eslint/visitor-keys": "6.21.0",
+                "@typescript-eslint/scope-manager": "7.4.0",
+                "@typescript-eslint/type-utils": "7.4.0",
+                "@typescript-eslint/utils": "7.4.0",
+                "@typescript-eslint/visitor-keys": "7.4.0",
                 "debug": "^4.3.4",
                 "graphemer": "^1.4.0",
                 "ignore": "^5.2.4",
@@ -963,15 +1275,15 @@
                 "ts-api-utils": "^1.0.1"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/typescript-eslint"
             },
             "peerDependencies": {
-                "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
-                "eslint": "^7.0.0 || ^8.0.0"
+                "@typescript-eslint/parser": "^7.0.0",
+                "eslint": "^8.56.0"
             },
             "peerDependenciesMeta": {
                 "typescript": {
@@ -980,26 +1292,26 @@
             }
         },
         "node_modules/@typescript-eslint/parser": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
-            "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz",
+            "integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/scope-manager": "6.21.0",
-                "@typescript-eslint/types": "6.21.0",
-                "@typescript-eslint/typescript-estree": "6.21.0",
-                "@typescript-eslint/visitor-keys": "6.21.0",
+                "@typescript-eslint/scope-manager": "7.4.0",
+                "@typescript-eslint/types": "7.4.0",
+                "@typescript-eslint/typescript-estree": "7.4.0",
+                "@typescript-eslint/visitor-keys": "7.4.0",
                 "debug": "^4.3.4"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/typescript-eslint"
             },
             "peerDependencies": {
-                "eslint": "^7.0.0 || ^8.0.0"
+                "eslint": "^8.56.0"
             },
             "peerDependenciesMeta": {
                 "typescript": {
@@ -1008,16 +1320,16 @@
             }
         },
         "node_modules/@typescript-eslint/scope-manager": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
-            "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz",
+            "integrity": "sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "6.21.0",
-                "@typescript-eslint/visitor-keys": "6.21.0"
+                "@typescript-eslint/types": "7.4.0",
+                "@typescript-eslint/visitor-keys": "7.4.0"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
@@ -1025,25 +1337,25 @@
             }
         },
         "node_modules/@typescript-eslint/type-utils": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
-            "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz",
+            "integrity": "sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/typescript-estree": "6.21.0",
-                "@typescript-eslint/utils": "6.21.0",
+                "@typescript-eslint/typescript-estree": "7.4.0",
+                "@typescript-eslint/utils": "7.4.0",
                 "debug": "^4.3.4",
                 "ts-api-utils": "^1.0.1"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/typescript-eslint"
             },
             "peerDependencies": {
-                "eslint": "^7.0.0 || ^8.0.0"
+                "eslint": "^8.56.0"
             },
             "peerDependenciesMeta": {
                 "typescript": {
@@ -1052,12 +1364,12 @@
             }
         },
         "node_modules/@typescript-eslint/types": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
-            "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.4.0.tgz",
+            "integrity": "sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==",
             "dev": true,
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
@@ -1065,13 +1377,13 @@
             }
         },
         "node_modules/@typescript-eslint/typescript-estree": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
-            "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz",
+            "integrity": "sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "6.21.0",
-                "@typescript-eslint/visitor-keys": "6.21.0",
+                "@typescript-eslint/types": "7.4.0",
+                "@typescript-eslint/visitor-keys": "7.4.0",
                 "debug": "^4.3.4",
                 "globby": "^11.1.0",
                 "is-glob": "^4.0.3",
@@ -1080,7 +1392,7 @@
                 "ts-api-utils": "^1.0.1"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
@@ -1092,42 +1404,66 @@
                 }
             }
         },
+        "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+            "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+            "dev": true,
+            "dependencies": {
+                "balanced-match": "^1.0.0"
+            }
+        },
+        "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+            "version": "9.0.3",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+            "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+            "dev": true,
+            "dependencies": {
+                "brace-expansion": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
         "node_modules/@typescript-eslint/utils": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
-            "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.4.0.tgz",
+            "integrity": "sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==",
             "dev": true,
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.4.0",
                 "@types/json-schema": "^7.0.12",
                 "@types/semver": "^7.5.0",
-                "@typescript-eslint/scope-manager": "6.21.0",
-                "@typescript-eslint/types": "6.21.0",
-                "@typescript-eslint/typescript-estree": "6.21.0",
+                "@typescript-eslint/scope-manager": "7.4.0",
+                "@typescript-eslint/types": "7.4.0",
+                "@typescript-eslint/typescript-estree": "7.4.0",
                 "semver": "^7.5.4"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/typescript-eslint"
             },
             "peerDependencies": {
-                "eslint": "^7.0.0 || ^8.0.0"
+                "eslint": "^8.56.0"
             }
         },
         "node_modules/@typescript-eslint/visitor-keys": {
-            "version": "6.21.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
-            "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz",
+            "integrity": "sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "6.21.0",
+                "@typescript-eslint/types": "7.4.0",
                 "eslint-visitor-keys": "^3.4.1"
             },
             "engines": {
-                "node": "^16.0.0 || >=18.0.0"
+                "node": "^18.18.0 || >=20.0.0"
             },
             "funding": {
                 "type": "opencollective",
@@ -1138,8 +1474,7 @@
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
             "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/acorn": {
             "version": "8.11.3",
@@ -1158,7 +1493,6 @@
             "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
             "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
             "dev": true,
-            "peer": true,
             "peerDependencies": {
                 "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
             }
@@ -1189,7 +1523,6 @@
             "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
             "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "fast-deep-equal": "^3.1.1",
                 "fast-json-stable-stringify": "^2.0.0",
@@ -1397,12 +1730,13 @@
             }
         },
         "node_modules/brace-expansion": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-            "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+            "version": "1.1.11",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
             "dev": true,
             "dependencies": {
-                "balanced-match": "^1.0.0"
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
             }
         },
         "node_modules/braces": {
@@ -1477,7 +1811,6 @@
             "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
             "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=6"
             }
@@ -1687,11 +2020,11 @@
             }
         },
         "node_modules/commander": {
-            "version": "11.1.0",
-            "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
-            "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+            "version": "12.0.0",
+            "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz",
+            "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==",
             "engines": {
-                "node": ">=16"
+                "node": ">=18"
             }
         },
         "node_modules/concat-map": {
@@ -1780,8 +2113,7 @@
             "version": "0.1.4",
             "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
             "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/defaults": {
             "version": "1.0.4",
@@ -1861,7 +2193,6 @@
             "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
             "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "esutils": "^2.0.2"
             },
@@ -1980,6 +2311,44 @@
                 "node": ">= 0.4"
             }
         },
+        "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",
@@ -2006,7 +2375,6 @@
             "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
             "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.2.0",
                 "@eslint-community/regexpp": "^4.6.1",
@@ -2062,7 +2430,6 @@
             "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
             "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "esrecurse": "^4.3.0",
                 "estraverse": "^5.2.0"
@@ -2090,26 +2457,13 @@
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
             "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-            "dev": true,
-            "peer": true
-        },
-        "node_modules/eslint/node_modules/brace-expansion": {
-            "version": "1.1.11",
-            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-            "dev": true,
-            "peer": true,
-            "dependencies": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-            }
+            "dev": true
         },
         "node_modules/eslint/node_modules/js-yaml": {
             "version": "4.1.0",
             "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
             "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "argparse": "^2.0.1"
             },
@@ -2117,25 +2471,11 @@
                 "js-yaml": "bin/js-yaml.js"
             }
         },
-        "node_modules/eslint/node_modules/minimatch": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-            "dev": true,
-            "peer": true,
-            "dependencies": {
-                "brace-expansion": "^1.1.7"
-            },
-            "engines": {
-                "node": "*"
-            }
-        },
         "node_modules/espree": {
             "version": "9.6.1",
             "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
             "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "acorn": "^8.9.0",
                 "acorn-jsx": "^5.3.2",
@@ -2166,7 +2506,6 @@
             "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
             "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "estraverse": "^5.1.0"
             },
@@ -2179,7 +2518,6 @@
             "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
             "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "estraverse": "^5.2.0"
             },
@@ -2192,7 +2530,6 @@
             "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
             "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=4.0"
             }
@@ -2202,7 +2539,6 @@
             "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
             "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -2233,8 +2569,7 @@
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
             "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/fast-fifo": {
             "version": "1.3.2",
@@ -2273,8 +2608,7 @@
             "version": "2.1.0",
             "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
             "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/fast-levenshtein": {
             "version": "3.0.0",
@@ -2335,7 +2669,6 @@
             "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
             "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "flat-cache": "^3.0.4"
             },
@@ -2352,6 +2685,15 @@
                 "minimatch": "^5.0.1"
             }
         },
+        "node_modules/filelist/node_modules/brace-expansion": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+            "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+            "dev": true,
+            "dependencies": {
+                "balanced-match": "^1.0.0"
+            }
+        },
         "node_modules/filelist/node_modules/minimatch": {
             "version": "5.1.6",
             "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
@@ -2399,7 +2741,6 @@
             "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
             "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "locate-path": "^6.0.0",
                 "path-exists": "^4.0.0"
@@ -2416,7 +2757,6 @@
             "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
             "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "flatted": "^3.2.9",
                 "keyv": "^4.5.3",
@@ -2430,8 +2770,7 @@
             "version": "3.3.1",
             "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
             "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/fn.name": {
             "version": "1.1.0",
@@ -2533,8 +2872,21 @@
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
             "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+            "dev": true
+        },
+        "node_modules/fsevents": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+            "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
             "dev": true,
-            "peer": true
+            "hasInstallScript": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+            }
         },
         "node_modules/function-bind": {
             "version": "1.1.2",
@@ -2606,6 +2958,18 @@
                 "node": ">=8.0.0"
             }
         },
+        "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/github-from-package": {
             "version": "0.0.0",
             "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
@@ -2617,7 +2981,6 @@
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -2638,7 +3001,6 @@
             "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
             "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "is-glob": "^4.0.3"
             },
@@ -2646,36 +3008,11 @@
                 "node": ">=10.13.0"
             }
         },
-        "node_modules/glob/node_modules/brace-expansion": {
-            "version": "1.1.11",
-            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-            "dev": true,
-            "peer": true,
-            "dependencies": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-            }
-        },
-        "node_modules/glob/node_modules/minimatch": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-            "dev": true,
-            "peer": true,
-            "dependencies": {
-                "brace-expansion": "^1.1.7"
-            },
-            "engines": {
-                "node": "*"
-            }
-        },
         "node_modules/globals": {
             "version": "13.24.0",
             "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
             "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "type-fest": "^0.20.2"
             },
@@ -2877,7 +3214,6 @@
             "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
             "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "parent-module": "^1.0.0",
                 "resolve-from": "^4.0.0"
@@ -2894,7 +3230,6 @@
             "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
             "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=0.8.19"
             }
@@ -2913,7 +3248,6 @@
             "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
             "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "once": "^1.3.0",
                 "wrappy": "1"
@@ -3067,7 +3401,6 @@
             "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
             "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=8"
             }
@@ -3144,28 +3477,6 @@
                 "node": ">=10"
             }
         },
-        "node_modules/jake/node_modules/brace-expansion": {
-            "version": "1.1.11",
-            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-            "dev": true,
-            "dependencies": {
-                "balanced-match": "^1.0.0",
-                "concat-map": "0.0.1"
-            }
-        },
-        "node_modules/jake/node_modules/minimatch": {
-            "version": "3.1.2",
-            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-            "dev": true,
-            "dependencies": {
-                "brace-expansion": "^1.1.7"
-            },
-            "engines": {
-                "node": "*"
-            }
-        },
         "node_modules/js-yaml": {
             "version": "3.14.1",
             "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -3195,8 +3506,7 @@
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
             "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/json-parse-better-errors": {
             "version": "1.0.2",
@@ -3208,15 +3518,13 @@
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
             "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/json-stable-stringify-without-jsonify": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
             "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/json5": {
             "version": "2.2.3",
@@ -3293,7 +3601,6 @@
             "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
             "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "json-buffer": "3.0.1"
             }
@@ -3308,7 +3615,6 @@
             "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
             "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "prelude-ls": "^1.2.1",
                 "type-check": "~0.4.0"
@@ -3322,7 +3628,6 @@
             "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
             "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "p-locate": "^5.0.0"
             },
@@ -3378,8 +3683,7 @@
             "version": "4.6.2",
             "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
             "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/lodash.once": {
             "version": "4.1.1",
@@ -3533,18 +3837,15 @@
             }
         },
         "node_modules/minimatch": {
-            "version": "9.0.3",
-            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
-            "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
             "dev": true,
             "dependencies": {
-                "brace-expansion": "^2.0.1"
+                "brace-expansion": "^1.1.7"
             },
             "engines": {
-                "node": ">=16 || 14 >=14.17"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
+                "node": "*"
             }
         },
         "node_modules/minimist": {
@@ -3718,7 +4019,6 @@
             "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
             "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "@aashutoshrathi/word-wrap": "^1.2.3",
                 "deep-is": "^0.1.3",
@@ -3735,8 +4035,7 @@
             "version": "2.0.6",
             "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
             "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/ora": {
             "version": "5.4.1",
@@ -3782,7 +4081,6 @@
             "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
             "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "yocto-queue": "^0.1.0"
             },
@@ -3798,7 +4096,6 @@
             "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
             "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "p-limit": "^3.0.2"
             },
@@ -3814,7 +4111,6 @@
             "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
             "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "callsites": "^3.0.0"
             },
@@ -3859,7 +4155,6 @@
             "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
             "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=8"
             }
@@ -3869,7 +4164,6 @@
             "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
             "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=0.10.0"
             }
@@ -4043,7 +4337,6 @@
             "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
             "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">= 0.8.0"
             }
@@ -4083,7 +4376,6 @@
             "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
             "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=6"
             }
@@ -4209,11 +4501,19 @@
             "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
             "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "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/resolve/node_modules/is-core-module": {
             "version": "2.13.1",
             "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
@@ -4253,7 +4553,6 @@
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
             "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "glob": "^7.1.3"
             },
@@ -4594,7 +4893,6 @@
             "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
             "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=8"
             },
@@ -4685,8 +4983,7 @@
             "version": "0.2.0",
             "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
             "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
-            "dev": true,
-            "peer": true
+            "dev": true
         },
         "node_modules/through": {
             "version": "2.3.8",
@@ -4805,6 +5102,25 @@
             "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
             "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
         },
+        "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",
@@ -4822,7 +5138,6 @@
             "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
             "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "prelude-ls": "^1.2.1"
             },
@@ -4854,6 +5169,32 @@
                 "node": ">=14.17"
             }
         },
+        "node_modules/typescript-eslint": {
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.4.0.tgz",
+            "integrity": "sha512-8GYQsb/joknlAZEAs/kqonfrsAc98C5DoellmwHREPqKwSTKSY2YB93IwmvNuX6+WE5QkKc31X9wHo/UcpYXpw==",
+            "dev": true,
+            "dependencies": {
+                "@typescript-eslint/eslint-plugin": "7.4.0",
+                "@typescript-eslint/parser": "7.4.0",
+                "@typescript-eslint/utils": "7.4.0"
+            },
+            "engines": {
+                "node": "^18.18.0 || >=20.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            },
+            "peerDependencies": {
+                "eslint": "^8.56.0"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/undici-types": {
             "version": "5.26.5",
             "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
@@ -4873,7 +5214,6 @@
             "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
             "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
             "dev": true,
-            "peer": true,
             "dependencies": {
                 "punycode": "^2.1.0"
             }
@@ -5072,7 +5412,6 @@
             "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
             "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
             "dev": true,
-            "peer": true,
             "engines": {
                 "node": ">=10"
             },
diff --git a/NodeApp/package.json b/NodeApp/package.json
index 669694a..b251123 100644
--- a/NodeApp/package.json
+++ b/NodeApp/package.json
@@ -29,7 +29,7 @@
         "lint"        : "npx eslint .",
         "genversion"  : "npx genversion -s -e src/config/Version.ts",
         "build"       : "npm run genversion; npx tsc",
-        "start:dev"   : "npm run genversion; npm run lint; npx ts-node src/app.ts",
+        "start:dev"   : "npm run genversion; npm run lint; tsc --noEmit && npx tsx dist/app.js",
         "test"        : "echo \"Error: no test specified\" && exit 1"
     },
     "dependencies"   : {
@@ -71,8 +71,7 @@
         "dotenv-vault"                    : "^1.25.0",
         "genversion"                      : "^3.2.0",
         "pkg"                             : "^5.8.1",
-        "tiny-typed-emitter"              : "^2.1.0",
-        "ts-node"                         : "^10.9.2",
-        "typescript"                      : "^5.3.3"
+        "tsx"                             : "^4.7.1",
+        "typescript"                      : "^5.4.2"
     }
 }
diff --git a/NodeApp/src/app.ts b/NodeApp/src/app.ts
index 2f99488..3228486 100644
--- a/NodeApp/src/app.ts
+++ b/NodeApp/src/app.ts
@@ -1,20 +1,7 @@
-// Read from the .env file
-// ATTENTION : These lines MUST be the first of this file (except for the path import)
-import path = require('node:path');
-import myEnv = require('dotenv');
-import dotenvExpand = require('dotenv-expand');
-
-
-dotenvExpand.expand(myEnv.config({
-                                     path      : path.join(__dirname, '../.env'),
-                                     DOTENV_KEY: 'dotenv://:key_fc323d8e0a02349342f1c6a119bb38495958ce3a43a87d19a3f674b7e2896dcb@dotenv.local/vault/.env.vault?environment=development'
-                                 }));
-
-require('./shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be the second of this file
-
-
-import CommanderApp from './commander/CommanderApp';
-import HttpManager  from './managers/HttpManager';
+// ATTENTION : This line MUST be the first of this file
+import './init.js';
+import CommanderApp from './commander/CommanderApp.js';
+import HttpManager  from './managers/HttpManager.js';
 
 
 HttpManager.registerAxiosInterceptor();
diff --git a/NodeApp/src/commander/CommanderApp.ts b/NodeApp/src/commander/CommanderApp.ts
index 56d33f5..c2d236f 100644
--- a/NodeApp/src/commander/CommanderApp.ts
+++ b/NodeApp/src/commander/CommanderApp.ts
@@ -1,18 +1,18 @@
 import { Command, Option } from 'commander';
-import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig';
-import AssignmentCommand   from './assignment/AssignmentCommand';
-import ExerciseCommand     from './exercise/ExerciseCommand';
-import SharedConfig        from '../shared/config/SharedConfig';
+import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig.js';
+import AssignmentCommand   from './assignment/AssignmentCommand.js';
+import ExerciseCommand     from './exercise/ExerciseCommand.js';
+import SharedConfig        from '../shared/config/SharedConfig.js';
 import boxen               from 'boxen';
-import { stateConfigFile } from '../config/ConfigFiles';
-import semver              from 'semver/preload';
-import { version }         from '../config/Version';
-import Config              from '../config/Config';
-import CompletionCommand   from './completion/CompletionCommand';
-import AuthCommand         from './auth/AuthCommand';
-import SessionCommand      from './auth/SessionCommand';
-import UpgradeCommand      from './UpgradeCommand';
-import TextStyle           from '../types/TextStyle';
+import { stateConfigFile } from '../config/ConfigFiles.js';
+import semver              from 'semver/preload.js';
+import { version }         from '../config/Version.js';
+import Config              from '../config/Config.js';
+import CompletionCommand   from './completion/CompletionCommand.js';
+import AuthCommand         from './auth/AuthCommand.js';
+import SessionCommand      from './auth/SessionCommand.js';
+import UpgradeCommand      from './UpgradeCommand.js';
+import TextStyle           from '../types/TextStyle.js';
 
 
 class CommanderApp {
diff --git a/NodeApp/src/commander/UpgradeCommand.ts b/NodeApp/src/commander/UpgradeCommand.ts
index 432fa31..18a96ab 100644
--- a/NodeApp/src/commander/UpgradeCommand.ts
+++ b/NodeApp/src/commander/UpgradeCommand.ts
@@ -1,7 +1,7 @@
-import CommanderCommand from './CommanderCommand';
+import CommanderCommand from './CommanderCommand.js';
 import ora              from 'ora';
-import Config           from '../config/Config';
-import TextStyle        from '../types/TextStyle';
+import Config           from '../config/Config.js';
+import TextStyle        from '../types/TextStyle.js';
 import os               from 'os';
 import { spawn }        from 'child_process';
 
diff --git a/NodeApp/src/commander/assignment/AssignmentCommand.ts b/NodeApp/src/commander/assignment/AssignmentCommand.ts
index d306aca..8d36acc 100644
--- a/NodeApp/src/commander/assignment/AssignmentCommand.ts
+++ b/NodeApp/src/commander/assignment/AssignmentCommand.ts
@@ -1,10 +1,10 @@
-import CommanderCommand            from '../CommanderCommand';
-import AssignmentCreateCommand     from './subcommands/AssignmentCreateCommand';
-import AssignmentPublishCommand    from './subcommands/AssignmentPublishCommand';
-import AssignmentUnpublishCommand  from './subcommands/AssignmentUnpublishCommand';
-import AssignmentCheckCommand      from './subcommands/AssignmentCheckCommand';
-import AssignmentRunCommand        from './subcommands/AssignmentRunCommand';
-import AssignmentCorrectionCommand from './subcommands/correction/AssignmentCorrectionCommand';
+import CommanderCommand            from '../CommanderCommand.js';
+import AssignmentCreateCommand     from './subcommands/AssignmentCreateCommand.js';
+import AssignmentPublishCommand    from './subcommands/AssignmentPublishCommand.js';
+import AssignmentUnpublishCommand  from './subcommands/AssignmentUnpublishCommand.js';
+import AssignmentCheckCommand      from './subcommands/AssignmentCheckCommand.js';
+import AssignmentRunCommand        from './subcommands/AssignmentRunCommand.js';
+import AssignmentCorrectionCommand from './subcommands/correction/AssignmentCorrectionCommand.js';
 
 
 class AssignmentCommand extends CommanderCommand {
diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts
index 0f5a726..04993b5 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCheckCommand.ts
@@ -1,11 +1,11 @@
-import CommanderCommand              from '../../CommanderCommand';
-import Config                        from '../../../config/Config';
+import CommanderCommand              from '../../CommanderCommand.js';
+import Config                        from '../../../config/Config.js';
 import ora                           from 'ora';
 import chalk                         from 'chalk';
-import AssignmentValidator           from '../../../sharedByClients/helpers/Dojo/AssignmentValidator';
-import ClientsSharedAssignmentHelper from '../../../sharedByClients/helpers/Dojo/ClientsSharedAssignmentHelper';
-import SharedConfig                  from '../../../shared/config/SharedConfig';
-import GlobalHelper                  from '../../../helpers/GlobalHelper';
+import AssignmentValidator           from '../../../sharedByClients/helpers/Dojo/AssignmentValidator.js';
+import ClientsSharedAssignmentHelper from '../../../sharedByClients/helpers/Dojo/ClientsSharedAssignmentHelper.js';
+import SharedConfig                  from '../../../shared/config/SharedConfig.js';
+import GlobalHelper                  from '../../../helpers/GlobalHelper.js';
 
 
 class AssignmentCheckCommand extends CommanderCommand {
diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
index 1bff535..922c126 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentCreateCommand.ts
@@ -1,12 +1,12 @@
-import CommanderCommand   from '../../CommanderCommand';
+import CommanderCommand   from '../../CommanderCommand.js';
 import ora                from 'ora';
-import AccessesHelper     from '../../../helpers/AccessesHelper';
-import Assignment         from '../../../sharedByClients/models/Assignment';
-import DojoBackendManager from '../../../managers/DojoBackendManager';
-import Toolbox            from '../../../shared/helpers/Toolbox';
+import AccessesHelper     from '../../../helpers/AccessesHelper.js';
+import Assignment         from '../../../sharedByClients/models/Assignment.js';
+import DojoBackendManager from '../../../managers/DojoBackendManager.js';
+import Toolbox            from '../../../shared/helpers/Toolbox.js';
 import * as Gitlab        from '@gitbeaker/rest';
-import TextStyle          from '../../../types/TextStyle';
-import GitlabManager      from '../../../managers/GitlabManager';
+import TextStyle          from '../../../types/TextStyle.js';
+import GitlabManager      from '../../../managers/GitlabManager.js';
 
 
 type CommandOptions = { name: string, template?: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean }
diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentPublishCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentPublishCommand.ts
index 6816aa3..8188c3b 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentPublishCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentPublishCommand.ts
@@ -1,4 +1,4 @@
-import AssignmentPublishUnpublishCommandBase from './AssignmentPublishUnpublishCommandBase';
+import AssignmentPublishUnpublishCommandBase from './AssignmentPublishUnpublishCommandBase.js';
 
 
 class AssignmentPublishCommand extends AssignmentPublishUnpublishCommandBase {
diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentPublishUnpublishCommandBase.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentPublishUnpublishCommandBase.ts
index c5745c4..ab16340 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentPublishUnpublishCommandBase.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentPublishUnpublishCommandBase.ts
@@ -1,11 +1,11 @@
-import CommanderCommand       from '../../CommanderCommand';
+import CommanderCommand       from '../../CommanderCommand.js';
 import inquirer               from 'inquirer';
-import SessionManager         from '../../../managers/SessionManager';
+import SessionManager         from '../../../managers/SessionManager.js';
 import ora                    from 'ora';
-import DojoBackendManager     from '../../../managers/DojoBackendManager';
-import Assignment             from '../../../sharedByClients/models/Assignment';
-import SharedAssignmentHelper from '../../../shared/helpers/Dojo/SharedAssignmentHelper';
-import TextStyle              from '../../../types/TextStyle';
+import DojoBackendManager     from '../../../managers/DojoBackendManager.js';
+import Assignment             from '../../../sharedByClients/models/Assignment.js';
+import SharedAssignmentHelper from '../../../shared/helpers/Dojo/SharedAssignmentHelper.js';
+import TextStyle              from '../../../types/TextStyle.js';
 
 
 abstract class AssignmentPublishUnpublishCommandBase extends CommanderCommand {
@@ -13,10 +13,10 @@ abstract class AssignmentPublishUnpublishCommandBase extends CommanderCommand {
 
     protected defineCommand() {
         this.command
-        .description(`${ this.publish ? 'publish' : 'unpublish' } an assignment`)
-        .argument('<name or url>', 'name or url (http/s or ssh) of the assignment')
-        .option('-f, --force', 'don\'t ask for confirmation')
-        .action(this.commandAction.bind(this));
+            .description(`${ this.publish ? 'publish' : 'unpublish' } an assignment`)
+            .argument('<name or url>', 'name or url (http/s or ssh) of the assignment')
+            .option('-f, --force', 'don\'t ask for confirmation')
+            .action(this.commandAction.bind(this));
     }
 
     protected async commandAction(assignmentNameOrUrl: string, options: { force: boolean }): Promise<void> {
diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentRunCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentRunCommand.ts
index 81636fd..e20719e 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentRunCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentRunCommand.ts
@@ -1,6 +1,6 @@
-import CommanderCommand  from '../../CommanderCommand';
-import ExerciseRunHelper from '../../../helpers/Dojo/ExerciseRunHelper';
-import GlobalHelper      from '../../../helpers/GlobalHelper';
+import CommanderCommand  from '../../CommanderCommand.js';
+import ExerciseRunHelper from '../../../helpers/Dojo/ExerciseRunHelper.js';
+import GlobalHelper      from '../../../helpers/GlobalHelper.js';
 
 
 class AssignmentRunCommand extends CommanderCommand {
diff --git a/NodeApp/src/commander/assignment/subcommands/AssignmentUnpublishCommand.ts b/NodeApp/src/commander/assignment/subcommands/AssignmentUnpublishCommand.ts
index e329c48..6aa5e9f 100644
--- a/NodeApp/src/commander/assignment/subcommands/AssignmentUnpublishCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/AssignmentUnpublishCommand.ts
@@ -1,4 +1,4 @@
-import AssignmentPublishUnpublishCommandBase from './AssignmentPublishUnpublishCommandBase';
+import AssignmentPublishUnpublishCommandBase from './AssignmentPublishUnpublishCommandBase.js';
 
 
 class AssignmentUnpublishCommand extends AssignmentPublishUnpublishCommandBase {
diff --git a/NodeApp/src/commander/assignment/subcommands/correction/AssignmentCorrectionCommand.ts b/NodeApp/src/commander/assignment/subcommands/correction/AssignmentCorrectionCommand.ts
index bd7ebce..1ff39af 100644
--- a/NodeApp/src/commander/assignment/subcommands/correction/AssignmentCorrectionCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/correction/AssignmentCorrectionCommand.ts
@@ -1,6 +1,6 @@
-import CommanderCommand                  from '../../../CommanderCommand';
-import AssignmentCorrectionLinkCommand   from './subcommands/AssignmentCorrectionLinkCommand';
-import AssignmentCorrectionUpdateCommand from './subcommands/AssignmentCorrectionUpdateCommand';
+import CommanderCommand                  from '../../../CommanderCommand.js';
+import AssignmentCorrectionLinkCommand   from './subcommands/AssignmentCorrectionLinkCommand.js';
+import AssignmentCorrectionUpdateCommand from './subcommands/AssignmentCorrectionUpdateCommand.js';
 
 
 class AssignmentCorrectionCommand extends CommanderCommand {
diff --git a/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionLinkCommand.ts b/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionLinkCommand.ts
index 5d17320..431e192 100644
--- a/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionLinkCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionLinkCommand.ts
@@ -1,4 +1,4 @@
-import AssignmentCorrectionLinkUpdateCommand from './AssignmentCorrectionLinkUpdateCommand';
+import AssignmentCorrectionLinkUpdateCommand from './AssignmentCorrectionLinkUpdateCommand.js';
 
 
 class AssignmentCorrectionLinkCommand extends AssignmentCorrectionLinkUpdateCommand {
diff --git a/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionLinkUpdateCommand.ts b/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionLinkUpdateCommand.ts
index 6e5c6d3..230e020 100644
--- a/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionLinkUpdateCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionLinkUpdateCommand.ts
@@ -1,9 +1,9 @@
-import CommanderCommand   from '../../../../CommanderCommand';
+import CommanderCommand   from '../../../../CommanderCommand.js';
 import ora                from 'ora';
-import DojoBackendManager from '../../../../../managers/DojoBackendManager';
-import SessionManager     from '../../../../../managers/SessionManager';
-import Assignment         from '../../../../../sharedByClients/models/Assignment';
-import TextStyle          from '../../../../../types/TextStyle';
+import DojoBackendManager from '../../../../../managers/DojoBackendManager.js';
+import SessionManager     from '../../../../../managers/SessionManager.js';
+import Assignment         from '../../../../../sharedByClients/models/Assignment.js';
+import TextStyle          from '../../../../../types/TextStyle.js';
 
 
 abstract class AssignmentCorrectionLinkUpdateCommand extends CommanderCommand {
@@ -11,10 +11,10 @@ abstract class AssignmentCorrectionLinkUpdateCommand extends CommanderCommand {
 
     protected defineCommand() {
         this.command
-        .description(this.isUpdate ? 'update a correction of an assignment' : 'link an exercise repo as a correction for an assignment')
-        .argument('<string>', 'id or url of the exercise that is the correction')
-        .requiredOption('-a, --assignment <string>', 'id or url of the assignment of the correction')
-        .action(this.commandAction.bind(this));
+            .description(this.isUpdate ? 'update a correction of an assignment' : 'link an exercise repo as a correction for an assignment')
+            .argument('<string>', 'id or url of the exercise that is the correction')
+            .requiredOption('-a, --assignment <string>', 'id or url of the assignment of the correction')
+            .action(this.commandAction.bind(this));
     }
 
     protected async commandAction(exerciseIdOrUrl: string, options: { assignment: string }): Promise<void> {
diff --git a/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionUpdateCommand.ts b/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionUpdateCommand.ts
index 88a9f48..b38aec1 100644
--- a/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionUpdateCommand.ts
+++ b/NodeApp/src/commander/assignment/subcommands/correction/subcommands/AssignmentCorrectionUpdateCommand.ts
@@ -1,4 +1,4 @@
-import AssignmentCorrectionLinkUpdateCommand from './AssignmentCorrectionLinkUpdateCommand';
+import AssignmentCorrectionLinkUpdateCommand from './AssignmentCorrectionLinkUpdateCommand.js';
 
 
 class AssignmentCorrectionUpdateCommand extends AssignmentCorrectionLinkUpdateCommand {
diff --git a/NodeApp/src/commander/auth/AuthCommand.ts b/NodeApp/src/commander/auth/AuthCommand.ts
index 85fac50..299e94f 100644
--- a/NodeApp/src/commander/auth/AuthCommand.ts
+++ b/NodeApp/src/commander/auth/AuthCommand.ts
@@ -1,7 +1,7 @@
-import CommanderCommand     from '../CommanderCommand';
-import SessionTestCommand   from './subcommands/AuthTestCommand';
-import SessionLoginCommand  from './subcommands/AuthLoginCommand';
-import SessionLogoutCommand from './subcommands/AuthLogoutCommand';
+import CommanderCommand     from '../CommanderCommand.js';
+import SessionTestCommand   from './subcommands/AuthTestCommand.js';
+import SessionLoginCommand  from './subcommands/AuthLoginCommand.js';
+import SessionLogoutCommand from './subcommands/AuthLogoutCommand.js';
 
 
 class AuthCommand extends CommanderCommand {
diff --git a/NodeApp/src/commander/auth/SessionCommand.ts b/NodeApp/src/commander/auth/SessionCommand.ts
index 75fe630..9185fa5 100644
--- a/NodeApp/src/commander/auth/SessionCommand.ts
+++ b/NodeApp/src/commander/auth/SessionCommand.ts
@@ -1,4 +1,4 @@
-import AuthCommand        from './AuthCommand';
+import AuthCommand        from './AuthCommand.js';
 import { CommandOptions } from 'commander';
 
 
diff --git a/NodeApp/src/commander/auth/subcommands/AuthLoginCommand.ts b/NodeApp/src/commander/auth/subcommands/AuthLoginCommand.ts
index 615fc20..a234046 100644
--- a/NodeApp/src/commander/auth/subcommands/AuthLoginCommand.ts
+++ b/NodeApp/src/commander/auth/subcommands/AuthLoginCommand.ts
@@ -1,6 +1,6 @@
-import CommanderCommand from '../../CommanderCommand';
-import SessionManager   from '../../../managers/SessionManager';
-import TextStyle        from '../../../types/TextStyle';
+import CommanderCommand from '../../CommanderCommand.js';
+import SessionManager   from '../../../managers/SessionManager.js';
+import TextStyle        from '../../../types/TextStyle.js';
 
 
 class AuthLoginCommand extends CommanderCommand {
@@ -8,9 +8,9 @@ class AuthLoginCommand extends CommanderCommand {
 
     protected defineCommand() {
         this.command
-        .description('login to Dojo')
-        .option('-c, --cli', 'proceed to the login in headless mode (do not try to open web browser).')
-        .action(this.commandAction.bind(this));
+            .description('login to Dojo')
+            .option('-c, --cli', 'proceed to the login in headless mode (do not try to open web browser).')
+            .action(this.commandAction.bind(this));
     }
 
     protected async commandAction(options: { cli: boolean }): Promise<void> {
diff --git a/NodeApp/src/commander/auth/subcommands/AuthLogoutCommand.ts b/NodeApp/src/commander/auth/subcommands/AuthLogoutCommand.ts
index bce2444..4cc88bb 100644
--- a/NodeApp/src/commander/auth/subcommands/AuthLogoutCommand.ts
+++ b/NodeApp/src/commander/auth/subcommands/AuthLogoutCommand.ts
@@ -1,7 +1,7 @@
-import CommanderCommand from '../../CommanderCommand';
+import CommanderCommand from '../../CommanderCommand.js';
 import inquirer         from 'inquirer';
 import ora              from 'ora';
-import SessionManager   from '../../../managers/SessionManager';
+import SessionManager   from '../../../managers/SessionManager.js';
 
 
 class AuthLogoutCommand extends CommanderCommand {
@@ -9,9 +9,9 @@ class AuthLogoutCommand extends CommanderCommand {
 
     protected defineCommand() {
         this.command
-        .description('logout of Dojo')
-        .option('-f, --force', 'attempt to logout without prompting for confirmation')
-        .action(this.commandAction.bind(this));
+            .description('logout of Dojo')
+            .option('-f, --force', 'attempt to logout without prompting for confirmation')
+            .action(this.commandAction.bind(this));
     }
 
     protected async commandAction(options: { force: boolean }): Promise<void> {
diff --git a/NodeApp/src/commander/auth/subcommands/AuthTestCommand.ts b/NodeApp/src/commander/auth/subcommands/AuthTestCommand.ts
index e2d18f8..e2e9d67 100644
--- a/NodeApp/src/commander/auth/subcommands/AuthTestCommand.ts
+++ b/NodeApp/src/commander/auth/subcommands/AuthTestCommand.ts
@@ -1,6 +1,6 @@
-import CommanderCommand from '../../CommanderCommand';
-import SessionManager   from '../../../managers/SessionManager';
-import GitlabManager    from '../../../managers/GitlabManager';
+import CommanderCommand from '../../CommanderCommand.js';
+import SessionManager   from '../../../managers/SessionManager.js';
+import GitlabManager    from '../../../managers/GitlabManager.js';
 
 
 class AuthTestCommand extends CommanderCommand {
diff --git a/NodeApp/src/commander/completion/CompletionCommand.ts b/NodeApp/src/commander/completion/CompletionCommand.ts
index ba4f3cf..e3cddf9 100644
--- a/NodeApp/src/commander/completion/CompletionCommand.ts
+++ b/NodeApp/src/commander/completion/CompletionCommand.ts
@@ -1,7 +1,7 @@
-import CommanderCommand              from '../CommanderCommand';
-import CompletionCreateUpdateCommand from './subcommands/CompletionCreateUpdateCommand';
-import CompletionGetCommand          from './subcommands/CompletionGetCommand';
-import CompletionScriptCommand       from './subcommands/CompletionScriptCommand';
+import CommanderCommand              from '../CommanderCommand.js';
+import CompletionCreateUpdateCommand from './subcommands/CompletionCreateUpdateCommand.js';
+import CompletionGetCommand          from './subcommands/CompletionGetCommand.js';
+import CompletionScriptCommand       from './subcommands/CompletionScriptCommand.js';
 
 
 class CompletionCommand extends CommanderCommand {
diff --git a/NodeApp/src/commander/completion/subcommands/CompletionCreateUpdateCommand.ts b/NodeApp/src/commander/completion/subcommands/CompletionCreateUpdateCommand.ts
index edc5219..f1b6fa2 100644
--- a/NodeApp/src/commander/completion/subcommands/CompletionCreateUpdateCommand.ts
+++ b/NodeApp/src/commander/completion/subcommands/CompletionCreateUpdateCommand.ts
@@ -1,11 +1,11 @@
-import CommanderCommand                                                 from '../../CommanderCommand';
+import CommanderCommand                                                 from '../../CommanderCommand.js';
 import { Option }                                                       from 'commander';
-import { generateFishCompletion, getRoot, tryRenameFile, updateRcFile } from '../../../helpers/AutoCompletionHelper';
+import { generateFishCompletion, getRoot, tryRenameFile, updateRcFile } from '../../../helpers/AutoCompletionHelper.js';
 import os, { homedir }                                                  from 'os';
 import path                                                             from 'path';
 import ora                                                              from 'ora';
 import fs                                                               from 'fs-extra';
-import TextStyle                                                        from '../../../types/TextStyle';
+import TextStyle                                                        from '../../../types/TextStyle.js';
 
 
 class CompletionCreateUpdateCommand extends CommanderCommand {
diff --git a/NodeApp/src/commander/completion/subcommands/CompletionGetCommand.ts b/NodeApp/src/commander/completion/subcommands/CompletionGetCommand.ts
index f57aa70..bf207f4 100644
--- a/NodeApp/src/commander/completion/subcommands/CompletionGetCommand.ts
+++ b/NodeApp/src/commander/completion/subcommands/CompletionGetCommand.ts
@@ -1,6 +1,6 @@
-import CommanderCommand                    from '../../CommanderCommand';
+import CommanderCommand                    from '../../CommanderCommand.js';
 import { Command, CommandOptions, Option } from 'commander';
-import * as AutoCompletionHelper           from '../../../helpers/AutoCompletionHelper';
+import * as AutoCompletionHelper           from '../../../helpers/AutoCompletionHelper.js';
 
 
 type CompletionProposal = { name: string, description: string };
diff --git a/NodeApp/src/commander/completion/subcommands/CompletionScriptCommand.ts b/NodeApp/src/commander/completion/subcommands/CompletionScriptCommand.ts
index a72d622..9a51fc2 100644
--- a/NodeApp/src/commander/completion/subcommands/CompletionScriptCommand.ts
+++ b/NodeApp/src/commander/completion/subcommands/CompletionScriptCommand.ts
@@ -1,4 +1,4 @@
-import CommanderCommand from '../../CommanderCommand';
+import CommanderCommand from '../../CommanderCommand.js';
 import { Argument }     from 'commander';
 
 
diff --git a/NodeApp/src/commander/exercise/ExerciseCommand.ts b/NodeApp/src/commander/exercise/ExerciseCommand.ts
index 13bd0b3..8089092 100644
--- a/NodeApp/src/commander/exercise/ExerciseCommand.ts
+++ b/NodeApp/src/commander/exercise/ExerciseCommand.ts
@@ -1,7 +1,7 @@
-import CommanderCommand          from '../CommanderCommand';
-import ExerciseCreateCommand     from './subcommands/ExerciseCreateCommand';
-import ExerciseRunCommand        from './subcommands/ExerciseRunCommand';
-import ExerciseCorrectionCommand from './subcommands/ExerciseCorrectionCommand';
+import CommanderCommand          from '../CommanderCommand.js';
+import ExerciseCreateCommand     from './subcommands/ExerciseCreateCommand.js';
+import ExerciseRunCommand        from './subcommands/ExerciseRunCommand.js';
+import ExerciseCorrectionCommand from './subcommands/ExerciseCorrectionCommand.js';
 
 
 class ExerciseCommand extends CommanderCommand {
diff --git a/NodeApp/src/commander/exercise/subcommands/ExerciseCorrectionCommand.ts b/NodeApp/src/commander/exercise/subcommands/ExerciseCorrectionCommand.ts
index e2405a9..146829d 100644
--- a/NodeApp/src/commander/exercise/subcommands/ExerciseCorrectionCommand.ts
+++ b/NodeApp/src/commander/exercise/subcommands/ExerciseCorrectionCommand.ts
@@ -1,12 +1,12 @@
-import CommanderCommand   from '../../CommanderCommand';
+import CommanderCommand   from '../../CommanderCommand.js';
 import ora                from 'ora';
-import DojoBackendManager from '../../../managers/DojoBackendManager';
-import Config             from '../../../config/Config';
-import Assignment         from '../../../sharedByClients/models/Assignment';
+import DojoBackendManager from '../../../managers/DojoBackendManager.js';
+import Config             from '../../../config/Config.js';
+import Assignment         from '../../../sharedByClients/models/Assignment.js';
 import inquirer           from 'inquirer';
 import open               from 'open';
 import chalk              from 'chalk';
-import TextStyle          from '../../../types/TextStyle';
+import TextStyle          from '../../../types/TextStyle.js';
 
 
 type CorrectionResume = { name: string, value: string }
diff --git a/NodeApp/src/commander/exercise/subcommands/ExerciseCreateCommand.ts b/NodeApp/src/commander/exercise/subcommands/ExerciseCreateCommand.ts
index 4b6c953..b82e7c5 100644
--- a/NodeApp/src/commander/exercise/subcommands/ExerciseCreateCommand.ts
+++ b/NodeApp/src/commander/exercise/subcommands/ExerciseCreateCommand.ts
@@ -1,12 +1,12 @@
-import CommanderCommand   from '../../CommanderCommand';
+import CommanderCommand   from '../../CommanderCommand.js';
 import ora                from 'ora';
-import DojoBackendManager from '../../../managers/DojoBackendManager';
-import AccessesHelper     from '../../../helpers/AccessesHelper';
-import Assignment         from '../../../sharedByClients/models/Assignment';
-import Exercise           from '../../../sharedByClients/models/Exercise';
+import DojoBackendManager from '../../../managers/DojoBackendManager.js';
+import AccessesHelper     from '../../../helpers/AccessesHelper.js';
+import Assignment         from '../../../sharedByClients/models/Assignment.js';
+import Exercise           from '../../../sharedByClients/models/Exercise.js';
 import * as Gitlab        from '@gitbeaker/rest';
-import TextStyle          from '../../../types/TextStyle';
-import GitlabManager      from '../../../managers/GitlabManager';
+import TextStyle          from '../../../types/TextStyle.js';
+import GitlabManager      from '../../../managers/GitlabManager.js';
 
 
 type CommandOptions = { assignment: string, members_id?: Array<number>, members_username?: Array<string>, clone?: string | boolean }
diff --git a/NodeApp/src/commander/exercise/subcommands/ExerciseRunCommand.ts b/NodeApp/src/commander/exercise/subcommands/ExerciseRunCommand.ts
index db7be9b..061c9cb 100644
--- a/NodeApp/src/commander/exercise/subcommands/ExerciseRunCommand.ts
+++ b/NodeApp/src/commander/exercise/subcommands/ExerciseRunCommand.ts
@@ -1,6 +1,6 @@
-import CommanderCommand  from '../../CommanderCommand';
-import ExerciseRunHelper from '../../../helpers/Dojo/ExerciseRunHelper';
-import GlobalHelper      from '../../../helpers/GlobalHelper';
+import CommanderCommand  from '../../CommanderCommand.js';
+import ExerciseRunHelper from '../../../helpers/Dojo/ExerciseRunHelper.js';
+import GlobalHelper      from '../../../helpers/GlobalHelper.js';
 
 
 class ExerciseRunCommand extends CommanderCommand {
diff --git a/NodeApp/src/config/ConfigFiles.ts b/NodeApp/src/config/ConfigFiles.ts
index 3bce1b7..9744e26 100644
--- a/NodeApp/src/config/ConfigFiles.ts
+++ b/NodeApp/src/config/ConfigFiles.ts
@@ -1,5 +1,5 @@
-import LocalConfigFile from './LocalConfigFile';
-import Config          from './Config';
+import LocalConfigFile from './LocalConfigFile.js';
+import Config          from './Config.js';
 
 
 const sessionConfigFile = new LocalConfigFile(Config.localConfig.sessionFile);
diff --git a/NodeApp/src/config/LocalConfigFile.ts b/NodeApp/src/config/LocalConfigFile.ts
index 390e95b..a292b4e 100644
--- a/NodeApp/src/config/LocalConfigFile.ts
+++ b/NodeApp/src/config/LocalConfigFile.ts
@@ -1,5 +1,5 @@
 import * as fs from 'fs';
-import Config  from './Config';
+import Config  from './Config.js';
 import JSON5   from 'json5';
 
 
diff --git a/NodeApp/src/helpers/AccessesHelper.ts b/NodeApp/src/helpers/AccessesHelper.ts
index c9ff5e1..1be0777 100644
--- a/NodeApp/src/helpers/AccessesHelper.ts
+++ b/NodeApp/src/helpers/AccessesHelper.ts
@@ -1,5 +1,5 @@
-import SessionManager from '../managers/SessionManager';
-import GitlabManager  from '../managers/GitlabManager';
+import SessionManager from '../managers/SessionManager.js';
+import GitlabManager  from '../managers/GitlabManager.js';
 
 
 class AccessesHelper {
diff --git a/NodeApp/src/helpers/AutoCompletionHelper.ts b/NodeApp/src/helpers/AutoCompletionHelper.ts
index 13760c3..28dea1d 100644
--- a/NodeApp/src/helpers/AutoCompletionHelper.ts
+++ b/NodeApp/src/helpers/AutoCompletionHelper.ts
@@ -1,7 +1,7 @@
 import { Command }                from 'commander';
 import { existsSync, renameSync } from 'fs';
 import ora                        from 'ora';
-import TextStyle                  from '../types/TextStyle';
+import TextStyle                  from '../types/TextStyle.js';
 import inquirer                   from 'inquirer';
 import fs                         from 'fs-extra';
 
diff --git a/NodeApp/src/helpers/Dojo/ExerciseRunHelper.ts b/NodeApp/src/helpers/Dojo/ExerciseRunHelper.ts
index da2ff6f..a3067c3 100644
--- a/NodeApp/src/helpers/Dojo/ExerciseRunHelper.ts
+++ b/NodeApp/src/helpers/Dojo/ExerciseRunHelper.ts
@@ -1,20 +1,21 @@
 import ora                                  from 'ora';
 import chalk                                from 'chalk';
-import Config                               from '../../config/Config';
-import AssignmentFile                       from '../../shared/types/Dojo/AssignmentFile';
-import ExerciseDockerCompose                from '../../sharedByClients/helpers/Dojo/ExerciseDockerCompose';
-import ExerciseResultsSanitizerAndValidator from '../../sharedByClients/helpers/Dojo/ExerciseResultsSanitizerAndValidator';
+import Config                               from '../../config/Config.js';
+import AssignmentFile                       from '../../shared/types/Dojo/AssignmentFile.js';
+import ExerciseDockerCompose                from '../../sharedByClients/helpers/Dojo/ExerciseDockerCompose.js';
+import ExerciseResultsSanitizerAndValidator from '../../sharedByClients/helpers/Dojo/ExerciseResultsSanitizerAndValidator.js';
 import fs                                   from 'node:fs';
-import ClientsSharedConfig                  from '../../sharedByClients/config/ClientsSharedConfig';
-import SharedAssignmentHelper               from '../../shared/helpers/Dojo/SharedAssignmentHelper';
+import ClientsSharedConfig                  from '../../sharedByClients/config/ClientsSharedConfig.js';
+import SharedAssignmentHelper               from '../../shared/helpers/Dojo/SharedAssignmentHelper.js';
 import path                                 from 'path';
-import ExerciseCheckerError                 from '../../shared/types/Dojo/ExerciseCheckerError';
-import ClientsSharedExerciseHelper          from '../../sharedByClients/helpers/Dojo/ClientsSharedExerciseHelper';
+import ExerciseCheckerError                 from '../../shared/types/Dojo/ExerciseCheckerError.js';
+import ClientsSharedExerciseHelper          from '../../sharedByClients/helpers/Dojo/ClientsSharedExerciseHelper.js';
 import os                                   from 'os';
 import util                                 from 'util';
 import { exec }                             from 'child_process';
-import SharedConfig                         from '../../shared/config/SharedConfig';
-import TextStyle                            from '../../types/TextStyle';
+import SharedConfig                         from '../../shared/config/SharedConfig.js';
+import TextStyle                            from '../../types/TextStyle.js';
+import { fileURLToPath }                    from 'url';
 
 
 const execAsync = util.promisify(exec);
diff --git a/NodeApp/src/helpers/GlobalHelper.ts b/NodeApp/src/helpers/GlobalHelper.ts
index 8ecac86..d14735a 100644
--- a/NodeApp/src/helpers/GlobalHelper.ts
+++ b/NodeApp/src/helpers/GlobalHelper.ts
@@ -1,6 +1,6 @@
 import { Command, Option } from 'commander';
-import Config              from '../config/Config';
-import SessionManager      from '../managers/SessionManager';
+import Config              from '../config/Config.js';
+import SessionManager      from '../managers/SessionManager.js';
 
 
 class GlobalHelper {
diff --git a/NodeApp/src/init.ts b/NodeApp/src/init.ts
new file mode 100644
index 0000000..a31cf4a
--- /dev/null
+++ b/NodeApp/src/init.ts
@@ -0,0 +1,11 @@
+import path         from 'node:path';
+import myEnv        from 'dotenv';
+import dotenvExpand from 'dotenv-expand';
+import './shared/helpers/TypeScriptExtensions.js';
+
+
+dotenvExpand.expand(myEnv.config({
+                                     path      : path.join(__dirname, '../.env'),
+                                     DOTENV_KEY: 'dotenv://:key_fc323d8e0a02349342f1c6a119bb38495958ce3a43a87d19a3f674b7e2896dcb@dotenv.local/vault/.env.vault?environment=development'
+                                 }));
+
diff --git a/NodeApp/src/managers/DojoBackendManager.ts b/NodeApp/src/managers/DojoBackendManager.ts
index 5e48221..ff4e83e 100644
--- a/NodeApp/src/managers/DojoBackendManager.ts
+++ b/NodeApp/src/managers/DojoBackendManager.ts
@@ -1,16 +1,16 @@
 import axios, { AxiosError } from 'axios';
 import ora                   from 'ora';
-import ApiRoute              from '../sharedByClients/types/Dojo/ApiRoute';
-import ClientsSharedConfig   from '../sharedByClients/config/ClientsSharedConfig';
-import Assignment            from '../sharedByClients/models/Assignment';
-import DojoBackendResponse   from '../shared/types/Dojo/DojoBackendResponse';
-import Exercise              from '../sharedByClients/models/Exercise';
-import GitlabToken           from '../shared/types/Gitlab/GitlabToken';
-import User                  from '../sharedByClients/models/User';
-import DojoStatusCode        from '../shared/types/Dojo/DojoStatusCode';
+import ApiRoute              from '../sharedByClients/types/Dojo/ApiRoute.js';
+import ClientsSharedConfig   from '../sharedByClients/config/ClientsSharedConfig.js';
+import Assignment            from '../sharedByClients/models/Assignment.js';
+import DojoBackendResponse   from '../shared/types/Dojo/DojoBackendResponse.js';
+import Exercise              from '../sharedByClients/models/Exercise.js';
+import GitlabToken           from '../shared/types/Gitlab/GitlabToken.js';
+import User                  from '../sharedByClients/models/User.js';
+import DojoStatusCode        from '../shared/types/Dojo/DojoStatusCode.js';
 import * as Gitlab           from '@gitbeaker/rest';
-import DojoBackendHelper     from '../sharedByClients/helpers/Dojo/DojoBackendHelper';
-import GitlabPipelineStatus  from '../shared/types/Gitlab/GitlabPipelineStatus';
+import DojoBackendHelper     from '../sharedByClients/helpers/Dojo/DojoBackendHelper.js';
+import GitlabPipelineStatus  from '../shared/types/Gitlab/GitlabPipelineStatus.js';
 
 
 class DojoBackendManager {
diff --git a/NodeApp/src/managers/GitlabManager.ts b/NodeApp/src/managers/GitlabManager.ts
index dc5f0ed..0e6c92e 100644
--- a/NodeApp/src/managers/GitlabManager.ts
+++ b/NodeApp/src/managers/GitlabManager.ts
@@ -3,8 +3,8 @@ import fs                                        from 'fs-extra';
 import { spawn }                                 from 'child_process';
 import { NotificationSettingSchema, UserSchema } from '@gitbeaker/rest';
 import * as GitlabCore                           from '@gitbeaker/core';
-import SharedGitlabManager                       from '../shared/managers/SharedGitlabManager';
-import GlobalHelper                              from '../helpers/GlobalHelper';
+import SharedGitlabManager                       from '../shared/managers/SharedGitlabManager.js';
+import GlobalHelper                              from '../helpers/GlobalHelper.js';
 
 
 type getGitlabUser = (param: number | string) => Promise<UserSchema | undefined>
diff --git a/NodeApp/src/managers/HttpManager.ts b/NodeApp/src/managers/HttpManager.ts
index be8ac3b..e854c4b 100644
--- a/NodeApp/src/managers/HttpManager.ts
+++ b/NodeApp/src/managers/HttpManager.ts
@@ -1,14 +1,14 @@
 import axios, { AxiosError, AxiosRequestHeaders } from 'axios';
-import SessionManager                             from './SessionManager';
+import SessionManager                             from './SessionManager.js';
 import FormData                                   from 'form-data';
 import { StatusCodes }                            from 'http-status-codes';
-import ClientsSharedConfig                        from '../sharedByClients/config/ClientsSharedConfig';
-import { version }                                from '../config/Version';
-import DojoBackendResponse                        from '../shared/types/Dojo/DojoBackendResponse';
-import DojoStatusCode                             from '../shared/types/Dojo/DojoStatusCode';
+import ClientsSharedConfig                        from '../sharedByClients/config/ClientsSharedConfig.js';
+import { version }                                from '../config/Version.js';
+import DojoBackendResponse                        from '../shared/types/Dojo/DojoBackendResponse.js';
+import DojoStatusCode                             from '../shared/types/Dojo/DojoStatusCode.js';
 import boxen                                      from 'boxen';
-import { stateConfigFile }                        from '../config/ConfigFiles';
-import TextStyle                                  from '../types/TextStyle';
+import { stateConfigFile }                        from '../config/ConfigFiles.js';
+import TextStyle                                  from '../types/TextStyle.js';
 
 
 class HttpManager {
diff --git a/NodeApp/src/managers/SessionManager.ts b/NodeApp/src/managers/SessionManager.ts
index 1f2ed42..e3f6b2f 100644
--- a/NodeApp/src/managers/SessionManager.ts
+++ b/NodeApp/src/managers/SessionManager.ts
@@ -1,26 +1,26 @@
 import * as jwt              from 'jsonwebtoken';
-import User                  from '../sharedByClients/models/User';
-import LocalConfigKeys       from '../types/LocalConfigKeys';
+import User                  from '../sharedByClients/models/User.js';
+import LocalConfigKeys       from '../types/LocalConfigKeys.js';
 import axios                 from 'axios';
-import HttpManager           from './HttpManager';
+import HttpManager           from './HttpManager.js';
 import ora                   from 'ora';
-import Permissions           from '../types/Permissions';
-import ApiRoute              from '../sharedByClients/types/Dojo/ApiRoute';
-import DojoBackendManager    from './DojoBackendManager';
-import Config                from '../config/Config';
-import ClientsSharedConfig   from '../sharedByClients/config/ClientsSharedConfig';
-import DojoGitlabCredentials from '../sharedByClients/types/Dojo/DojoGitlabCredentials';
+import Permissions           from '../types/Permissions.js';
+import ApiRoute              from '../sharedByClients/types/Dojo/ApiRoute.js';
+import DojoBackendManager    from './DojoBackendManager.js';
+import Config                from '../config/Config.js';
+import ClientsSharedConfig   from '../sharedByClients/config/ClientsSharedConfig.js';
+import DojoGitlabCredentials from '../sharedByClients/types/Dojo/DojoGitlabCredentials.js';
 import * as http             from 'http';
 import EventEmitter          from 'events';
-import SharedConfig          from '../shared/config/SharedConfig';
+import SharedConfig          from '../shared/config/SharedConfig.js';
 import chalk                 from 'chalk';
 import inquirer              from 'inquirer';
-import GitlabToken           from '../shared/types/Gitlab/GitlabToken';
+import GitlabToken           from '../shared/types/Gitlab/GitlabToken.js';
 import open                  from 'open';
-import { sessionConfigFile } from '../config/ConfigFiles';
-import TextStyle             from '../types/TextStyle';
-import DojoBackendHelper     from '../sharedByClients/helpers/Dojo/DojoBackendHelper';
-import GitlabManager         from './GitlabManager';
+import { sessionConfigFile } from '../config/ConfigFiles.js';
+import TextStyle             from '../types/TextStyle.js';
+import DojoBackendHelper     from '../sharedByClients/helpers/Dojo/DojoBackendHelper.js';
+import GitlabManager         from './GitlabManager.js';
 import { StatusCodes }       from 'http-status-codes';
 
 
diff --git a/NodeApp/src/shared b/NodeApp/src/shared
index 6e78095..771f8cd 160000
--- a/NodeApp/src/shared
+++ b/NodeApp/src/shared
@@ -1 +1 @@
-Subproject commit 6e78095b3fe73f2c2987de1a3d3b55511335a2bf
+Subproject commit 771f8cd079b39ec4050c5ece024dc4d70f342529
diff --git a/NodeApp/src/sharedByClients b/NodeApp/src/sharedByClients
index 8ae82ab..8514d5e 160000
--- a/NodeApp/src/sharedByClients
+++ b/NodeApp/src/sharedByClients
@@ -1 +1 @@
-Subproject commit 8ae82abcc7f11e595060b1a48f340290e7b2ebac
+Subproject commit 8514d5ef589a8aa34e4d2260c618781d81368c22
diff --git a/NodeApp/tsconfig.json b/NodeApp/tsconfig.json
index 6dd8b7e..96fb474 100644
--- a/NodeApp/tsconfig.json
+++ b/NodeApp/tsconfig.json
@@ -6,11 +6,20 @@
         "target"          : "ES2022",
         "module"          : "commonjs",
         "sourceMap"       : true,
+        "noImplicitAny"   : true,
         "esModuleInterop" : true,
-        "moduleResolution": "node",
-        "noImplicitAny"   : true
+        "lib"             : [
+            "ES2022",
+            "DOM"
+        ],
+        "types"           : [
+            "node"
+        ]
     },
     "exclude"        : [
         "node_modules"
+    ],
+    "include"        : [
+        "src/**/*.ts"
     ]
 }
\ No newline at end of file
-- 
GitLab