diff --git a/sentry.js b/sentry.js
index 320ca37..ac170cd 100644
--- a/sentry.js
+++ b/sentry.js
@@ -1,46 +1,46 @@
-import * as Sentry from "@sentry/node";
-import * as Tracing from "@sentry/tracing";
+import * as Sentry from '@sentry/node'
+import * as Tracing from '@sentry/tracing'
 // import config from "./sentry-server.config.json" assert { type: "json" };
 
 export function sentrySetUp(app) {
-  Sentry.init({
-    ...config,
-    integrations: [
-      // enable HTTP calls tracing
-      new Sentry.Integrations.Http({ tracing: true }),
-      // enable Express.js middleware tracing
-      new Tracing.Integrations.Express({ app }),
-    ],
-  });
-
-  // RequestHandler creates a separate execution context using domains, so that every
-  // transaction/span/breadcrumb is attached to its own Hub instance
-  app.use(Sentry.Handlers.requestHandler());
-  // TracingHandler creates a trace for every incoming request
-  app.use(Sentry.Handlers.tracingHandler());
-
-  app.get("/debug-sentry", function mainHandler(req, res) {
-    throw new Error("My first Sentry error!");
-  });
-
-  // The error handler must be before any other error middleware and after all controllers
-  // app.use(Sentry.Handlers.errorHandler());
-  app.use(
-    Sentry.Handlers.errorHandler({
-      shouldHandleError(error) {
-        // Capture all 404 and 500 errors
-        if (error.status === 404 || error.status === 500) {
-          return true;
-        }
-        return false;
-      },
+    Sentry.init({
+        ...config,
+        integrations: [
+            // enable HTTP calls tracing
+            new Sentry.Integrations.Http({ tracing: true }),
+            // enable Express.js middleware tracing
+            new Tracing.Integrations.Express({ app }),
+        ],
     })
-  );
-  // Optional fallthrough error handler
-  app.use(function onError(err, req, res, next) {
+
+    // RequestHandler creates a separate execution context using domains, so that every
+    // transaction/span/breadcrumb is attached to its own Hub instance
+    app.use(Sentry.Handlers.requestHandler())
+    // TracingHandler creates a trace for every incoming request
+    app.use(Sentry.Handlers.tracingHandler())
+
+    app.get('/debug-sentry', function mainHandler(req, res) {
+        throw new Error('My first Sentry error!')
+    })
+
+    // The error handler must be before any other error middleware and after all controllers
+    // app.use(Sentry.Handlers.errorHandler());
+    app.use(
+        Sentry.Handlers.errorHandler({
+            shouldHandleError(error) {
+                // Capture all 404 and 500 errors
+                if (error.status === 404 || error.status === 500) {
+                    return true
+                }
+                return false
+            },
+        })
+    )
+    // Optional fallthrough error handler
+    app.use(function onError(err, req, res, next) {
     // The error id is attached to `res.sentry` to be returned
     // and optionally displayed to the user for support.
-    res.statusCode = 500;
-    res.end(res.sentry + "\n");
-  });
+        res.statusCode = 500
+        res.end(res.sentry + '\n')
+    })
 }
