server: new backend

This CR adds a new backend based on TypeScript, Express, WebSocket and
Rollup.
To build the server:
> npm run build
To develop with dev mode:
> npm run start

GitLab: #47
Change-Id: I6cdacab14104ea67c559e3f9e892fbc1b17a022d
diff --git a/server/src/router.ts b/server/src/router.ts
new file mode 100644
index 0000000..0b00780
--- /dev/null
+++ b/server/src/router.ts
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+import express, { json, Router as ERouter } from 'express';
+import asyncHandler from 'express-async-handler';
+import { Service } from 'typedi';
+
+import { StatusCode } from './constants.js';
+
+@Service()
+class Router {
+  async build() {
+    const router = ERouter();
+
+    router.use(json());
+
+    await Promise.resolve(42);
+
+    router.post(
+      '/new-account',
+      asyncHandler(async (_req, res, _next) => {
+        await Promise.resolve(42);
+        res.sendStatus(StatusCode.NOT_IMPLEMENTED);
+      })
+    );
+
+    router.post(
+      '/login',
+      asyncHandler(async (_req, res, _next) => {
+        await Promise.resolve(42);
+        res.sendStatus(StatusCode.NOT_IMPLEMENTED);
+      })
+    );
+
+    const app = express();
+    app.use('/', router);
+    return app;
+  }
+}
+
+export { Router };