diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index a8f6330a..341ba2c0 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -36,7 +36,6 @@ module.exports = {
"no-else-return": "error",
"no-implicit-globals": "error",
"no-restricted-globals": ["error", "event", "fdescribe"],
- "no-shadow": "error",
"no-template-curly-in-string": "error",
"no-unsafe-negation": "error",
"no-useless-computed-key": "error",
@@ -90,12 +89,14 @@ module.exports = {
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-this-alias": "off",
+ "no-shadow": "off",
+ "@typescript-eslint/no-shadow": "error",
},
// TODO: verify
overrides: [
{
- files: ["*.vue", "*.d.ts"],
+ files: ["*.vue"],
rules: {
"import/no-default-export": 0,
},
diff --git a/client/components/App.vue b/client/components/App.vue
index 04857ead..0e6fdbb9 100644
--- a/client/components/App.vue
+++ b/client/components/App.vue
@@ -35,7 +35,8 @@ import VueApp from "vue";
declare module "vue/types/vue" {
interface Vue {
debouncedResize: () => void;
- dayChangeTimeout: number;
+ // TODO; type as Timeout
+ dayChangeTimeout: any;
}
}
diff --git a/client/components/MessageList.vue b/client/components/MessageList.vue
index 61515ff7..c8c47a14 100644
--- a/client/components/MessageList.vue
+++ b/client/components/MessageList.vue
@@ -57,7 +57,7 @@
-
diff --git a/package.json b/package.json
index f331c84b..de5beab4 100644
--- a/package.json
+++ b/package.json
@@ -12,9 +12,10 @@
},
"homepage": "https://thelounge.chat/",
"scripts": {
- "build": "webpack",
+ "build:client": "webpack",
+ "build:server": "tsc -p src/tsconfig.json index.ts",
"coverage": "run-s test:* && nyc --nycrc-path=test/.nycrc-report.json report",
- "dev": "ts-node index start --dev",
+ "dev": "ts-node --project tsconfig.json index.ts start --dev",
"format:prettier": "prettier --write \"**/*.*\"",
"lint:check-eslint": "eslint-config-prettier .eslintrc.cjs",
"lint:eslint": "eslint . --ext .js,.vue --report-unused-disable-directives --color",
diff --git a/src/plugins/auth/local.ts b/src/plugins/auth/local.ts
index 390e8006..c4a4e7cc 100644
--- a/src/plugins/auth/local.ts
+++ b/src/plugins/auth/local.ts
@@ -3,7 +3,7 @@
import colors from "chalk";
import log from "../../log";
import Helper from "../../helper";
-import {AuthHandler} from "types/plugins/auth";
+import {AuthHandler} from "../../types/plugins/auth";
const localAuth: AuthHandler = (manager, client, user, password, callback) => {
// If no user is found, or if the client has not provided a password,
diff --git a/src/plugins/changelog.ts b/src/plugins/changelog.ts
index b0db05bd..8909a612 100644
--- a/src/plugins/changelog.ts
+++ b/src/plugins/changelog.ts
@@ -4,7 +4,7 @@ import got, {Response} from "got";
import colors from "chalk";
import log from "../log";
import pkg from "../../package.json";
-import ClientManager from "clientManager";
+import ClientManager from "../clientManager";
const TIME_TO_LIVE = 15 * 60 * 1000; // 15 minutes, in milliseconds
diff --git a/src/plugins/inputs/index.ts b/src/plugins/inputs/index.ts
index 19db6cd5..c22d7f64 100644
--- a/src/plugins/inputs/index.ts
+++ b/src/plugins/inputs/index.ts
@@ -1,5 +1,5 @@
-import Chan from "models/chan";
-import Network from "models/network";
+import Chan from "../../models/chan";
+import Network from "../../models/network";
const clientSideCommands = ["/collapse", "/expand", "/search"];
diff --git a/src/plugins/inputs/invite.ts b/src/plugins/inputs/invite.ts
index 05eee86d..57203ef7 100644
--- a/src/plugins/inputs/invite.ts
+++ b/src/plugins/inputs/invite.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Chan from "../../models/chan";
import Msg from "../../models/msg";
diff --git a/src/plugins/inputs/msg.ts b/src/plugins/inputs/msg.ts
index 3f110d73..f75d4d68 100644
--- a/src/plugins/inputs/msg.ts
+++ b/src/plugins/inputs/msg.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/inputs/mute.ts b/src/plugins/inputs/mute.ts
index 198dad8a..cf436481 100644
--- a/src/plugins/inputs/mute.ts
+++ b/src/plugins/inputs/mute.ts
@@ -1,10 +1,10 @@
"use strict";
-import Chan from "models/chan";
-import Network from "models/network";
+import Chan from "../../models/chan";
+import Network from "../../models/network";
import Msg from "../../models/msg";
-import Client from "client";
+import Client from "../../client";
const commands = ["mute", "unmute"];
const allowDisconnected = true;
diff --git a/src/plugins/irc-events/ctcp.ts b/src/plugins/irc-events/ctcp.ts
index 1e7d1bdb..c82b30ee 100644
--- a/src/plugins/irc-events/ctcp.ts
+++ b/src/plugins/irc-events/ctcp.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import _ from "lodash";
import Helper from "../../helper";
diff --git a/src/plugins/irc-events/error.ts b/src/plugins/irc-events/error.ts
index bd3ef5b1..e73323cd 100644
--- a/src/plugins/irc-events/error.ts
+++ b/src/plugins/irc-events/error.ts
@@ -2,7 +2,7 @@
import Msg from "../../models/msg";
import Config from "../../config";
-import Network from "models/network";
+import Network from "../../models/network";
export default function (irc, network) {
const client = this;
diff --git a/src/plugins/irc-events/help.ts b/src/plugins/irc-events/help.ts
index f19df3ac..358443a9 100644
--- a/src/plugins/irc-events/help.ts
+++ b/src/plugins/irc-events/help.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/invite.ts b/src/plugins/irc-events/invite.ts
index 81747070..41995164 100644
--- a/src/plugins/irc-events/invite.ts
+++ b/src/plugins/irc-events/invite.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/join.ts b/src/plugins/irc-events/join.ts
index 18841c1d..bf00cd17 100644
--- a/src/plugins/irc-events/join.ts
+++ b/src/plugins/irc-events/join.ts
@@ -1,8 +1,8 @@
"use strict";
-import {ChanState} from "types/models/channel";
+import {ChanState} from "../../types/models/channel";
-import {Network} from "types/models/network";
+import {Network} from "../../types/models/network";
import Chan from "../../models/chan";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/link.ts b/src/plugins/irc-events/link.ts
index 4a1b6d3c..f1fa4e8f 100644
--- a/src/plugins/irc-events/link.ts
+++ b/src/plugins/irc-events/link.ts
@@ -5,14 +5,14 @@ import got from "got";
import {URL} from "url";
import mime from "mime-types";
+import log from "../../log";
import Config from "../../config";
import {findLinksWithSchema} from "../../../client/js/helpers/ircmessageparser/findLinks";
import storage from "../storage";
-import log from "log";
-import Client from "client";
-import Chan from "models/chan";
+import Client from "../../client";
+import Chan from "../../models/chan";
import Msg from "../../models/msg";
-import {Preview} from "types/plugins/preview";
+import {Preview} from "../../types/plugins/preview";
const currentFetchPromises = new Map();
const imageTypeRegex = /^image\/.+/;
diff --git a/src/plugins/irc-events/message.ts b/src/plugins/irc-events/message.ts
index 94d8a28f..92f09287 100644
--- a/src/plugins/irc-events/message.ts
+++ b/src/plugins/irc-events/message.ts
@@ -4,7 +4,7 @@ import Msg from "../../models/msg";
import LinkPrefetch from "./link";
import cleanIrcMessage from "../../../client/js/helpers/ircmessageparser/cleanIrcMessage";
import Helper from "../../helper";
-import Network from "models/network";
+import Network from "../../models/network";
const nickRegExp = /(?:\x03[0-9]{1,2}(?:,[0-9]{1,2})?)?([\w[\]\\`^{|}-]+)/g;
diff --git a/src/plugins/irc-events/mode.ts b/src/plugins/irc-events/mode.ts
index 98d43c34..1f9b0fc4 100644
--- a/src/plugins/irc-events/mode.ts
+++ b/src/plugins/irc-events/mode.ts
@@ -1,7 +1,7 @@
"use strict";
import _ from "lodash";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/modelist.ts b/src/plugins/irc-events/modelist.ts
index e7e763ef..831d4ee9 100644
--- a/src/plugins/irc-events/modelist.ts
+++ b/src/plugins/irc-events/modelist.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Chan from "../../models/chan";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/motd.ts b/src/plugins/irc-events/motd.ts
index 95ffb45f..901ed9d1 100644
--- a/src/plugins/irc-events/motd.ts
+++ b/src/plugins/irc-events/motd.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/names.ts b/src/plugins/irc-events/names.ts
index 29625a51..53137fcc 100644
--- a/src/plugins/irc-events/names.ts
+++ b/src/plugins/irc-events/names.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
export default function (irc, network) {
const client = this;
diff --git a/src/plugins/irc-events/nick.ts b/src/plugins/irc-events/nick.ts
index 44632d83..8f95291a 100644
--- a/src/plugins/irc-events/nick.ts
+++ b/src/plugins/irc-events/nick.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/part.ts b/src/plugins/irc-events/part.ts
index 66b20274..bee71098 100644
--- a/src/plugins/irc-events/part.ts
+++ b/src/plugins/irc-events/part.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/quit.ts b/src/plugins/irc-events/quit.ts
index 94113ae7..b321acab 100644
--- a/src/plugins/irc-events/quit.ts
+++ b/src/plugins/irc-events/quit.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/sasl.ts b/src/plugins/irc-events/sasl.ts
index 98f39ab7..c3c2e33a 100644
--- a/src/plugins/irc-events/sasl.ts
+++ b/src/plugins/irc-events/sasl.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/unhandled.ts b/src/plugins/irc-events/unhandled.ts
index f838fae4..1b94d342 100644
--- a/src/plugins/irc-events/unhandled.ts
+++ b/src/plugins/irc-events/unhandled.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/irc-events/whois.ts b/src/plugins/irc-events/whois.ts
index ccd74ecd..d3e8d9fa 100644
--- a/src/plugins/irc-events/whois.ts
+++ b/src/plugins/irc-events/whois.ts
@@ -1,6 +1,6 @@
"use strict";
-import Network from "models/network";
+import Network from "../../models/network";
import Msg from "../../models/msg";
diff --git a/src/plugins/messageStorage/sqlite.ts b/src/plugins/messageStorage/sqlite.ts
index d83f52d2..0b274365 100644
--- a/src/plugins/messageStorage/sqlite.ts
+++ b/src/plugins/messageStorage/sqlite.ts
@@ -1,15 +1,18 @@
"use strict";
+import type {Database} from "sqlite3";
+
import log from "../../log";
import path from "path";
import fs from "fs";
import Config from "../../config";
import Msg from "../../models/msg";
-import type {Database} from "sqlite3";
-import Client from "client";
-import Chan from "models/chan";
+import Client from "../../client";
+import Chan from "../../models/chan";
+import type {SqliteMessageStorage as ISqliteMessageStorage} from "../../types/plugins/messageStorage";
-let sqlite3;
+// TODO; type
+let sqlite3: any;
try {
sqlite3 = require("sqlite3");
@@ -31,7 +34,7 @@ const schema = [
"CREATE INDEX IF NOT EXISTS time ON messages (time)",
];
-class SqliteMessageStorage implements SqliteMessageStorage {
+class SqliteMessageStorage implements ISqliteMessageStorage {
client: Client;
isEnabled: boolean;
database!: Database;
diff --git a/src/plugins/messageStorage/text.ts b/src/plugins/messageStorage/text.ts
index 1db35eb3..ec89dd24 100644
--- a/src/plugins/messageStorage/text.ts
+++ b/src/plugins/messageStorage/text.ts
@@ -1,13 +1,12 @@
"use strict";
-
-import log from "../../log";
import fs from "fs";
import path from "path";
import filenamify from "filenamify";
+
+import log from "../../log";
import Config from "../../config";
-import Msg from "../../models/msg";
-import {MessageStorage} from "types/plugins/messageStorage";
-import Client from "client";
+import {MessageStorage} from "../../types/plugins/messageStorage";
+import Client from "../../client";
class TextFileMessageStorage implements MessageStorage {
client: Client;
diff --git a/src/plugins/packages/publicClient.ts b/src/plugins/packages/publicClient.ts
index d564e24b..55db5c10 100644
--- a/src/plugins/packages/publicClient.ts
+++ b/src/plugins/packages/publicClient.ts
@@ -1,5 +1,5 @@
-import Client from "client";
-import Chan from "models/chan";
+import Client from "../../client";
+import Chan from "../../models/chan";
import Msg from "../../models/msg";
export default class PublicClient {
diff --git a/src/plugins/sts.ts b/src/plugins/sts.ts
index 684f08a7..a65b2a9d 100644
--- a/src/plugins/sts.ts
+++ b/src/plugins/sts.ts
@@ -5,7 +5,7 @@ import fs from "fs";
import path from "path";
import log from "../log";
import Config from "../config";
-import type {PolicyMap, PolicyOption} from "types/plugins/sts";
+import type {PolicyMap, PolicyOption} from "../types/plugins/sts";
class STSPolicies {
stsFile: string;
diff --git a/src/plugins/webpush.ts b/src/plugins/webpush.ts
index e95ac6ee..bc418a6d 100644
--- a/src/plugins/webpush.ts
+++ b/src/plugins/webpush.ts
@@ -6,7 +6,7 @@ import fs from "fs";
import path from "path";
import WebPushAPI from "web-push";
import Config from "../config";
-import Client from "client";
+import Client from "../client";
import * as os from "os";
class WebPush {
vapidKeys?: {
diff --git a/src/server.ts b/src/server.ts
index 0bd1cd1b..89563054 100644
--- a/src/server.ts
+++ b/src/server.ts
@@ -1,20 +1,22 @@
"use strict";
import _ from "lodash";
-import log from "./log";
-import pkg from "../package.json";
-import Client from "./client";
-import ClientManager from "./clientManager";
+import {Server as wsServer} from "ws";
import express from "express";
import fs from "fs";
import path from "path";
import {Server, Socket} from "socket.io";
import dns from "dns";
+import colors from "chalk";
+import net from "net";
+
+import log from "./log";
+import pkg from "../package.json";
+import Client from "./client";
+import ClientManager from "./clientManager";
import Uploader from "./plugins/uploader";
import Helper from "./helper";
import Config from "./config";
-import colors from "chalk";
-import net from "net";
import Identification from "./identification";
import changelog from "./plugins/changelog";
import inputs from "./plugins/inputs";
@@ -24,15 +26,14 @@ import themes from "./plugins/packages/themes";
themes.loadLocalThemes();
import packages from "./plugins/packages/index";
-import {
+import type {
ClientConfiguration,
Defaults,
IndexTemplateConfiguration,
ServerConfiguration,
} from "./types/config";
-import {Server as wsServer} from "ws";
-import {ServerOptions} from "types/server";
+import type {ServerOptions} from "./types/server";
// A random number that will force clients to reload the page if it differs
const serverHash = Math.floor(Date.now() * Math.random());
@@ -699,7 +700,13 @@ function initializeClient(
});
socket.on("mute:change", ({target, setMutedTo}) => {
- const {chan, network} = client.find(target);
+ const networkAndChan = client.find(target);
+
+ if (!networkAndChan) {
+ return;
+ }
+
+ const {chan, network} = networkAndChan;
// If the user mutes the lobby, we mute the entire network.
if (chan.type === ChanType.LOBBY) {
@@ -756,7 +763,7 @@ function initializeClient(
}
});
- socket.join(client.id);
+ socket.join(client.id?.toString());
const sendInitEvent = (tokenToSend) => {
socket.emit("init", {
@@ -844,7 +851,7 @@ function performAuthentication(this: Socket, data) {
const socket = this;
let client;
- let token = null;
+ let token: string;
const finalInit = () =>
initializeClient(socket, client, token, data.lastMessage || -1, data.openChannel);
diff --git a/src/tsconfig.json b/src/tsconfig.json
index 4969be76..b4737d0e 100644
--- a/src/tsconfig.json
+++ b/src/tsconfig.json
@@ -6,11 +6,15 @@
"../client/js/helpers/ircmessageparser/findLinks.ts",
"../client/js/helpers/ircmessageparser/cleanIrcMessage.ts"
],
+ // TODO: these should be imported from the base config,
+ // but ts-node doesn't seem to care.
"include": ["**/*"],
+ "typeRoots": ["./src/types/"],
+
"compilerOptions": {
"types": ["node"],
"baseUrl": ".",
"noImplicitAny": false
- },
- "references": [{"path": "../"}]
+ }
+ // "references": [{"path": "../"}]
}
diff --git a/src/types/plugins/auth/index.d.ts b/src/types/plugins/auth/index.d.ts
index 6688e430..720ff048 100644
--- a/src/types/plugins/auth/index.d.ts
+++ b/src/types/plugins/auth/index.d.ts
@@ -1,5 +1,5 @@
-import Client from "client";
-import ClientManager from "clientManager";
+import Client from "../../client";
+import ClientManager from "../../clientManager";
type AuthHandler = (
manager: ClientManager,
diff --git a/src/types/plugins/inputs/index.d.ts b/src/types/plugins/inputs/index.d.ts
index 06def2f2..1645c64a 100644
--- a/src/types/plugins/inputs/index.d.ts
+++ b/src/types/plugins/inputs/index.d.ts
@@ -1,4 +1,4 @@
-import Client from "client";
+import Client from "../../../client";
declare global {
type PluginInputHandler = (
diff --git a/src/types/plugins/irc-events/index.d.ts b/src/types/plugins/irc-events/index.d.ts
index 6b92da1e..a1aebd55 100644
--- a/src/types/plugins/irc-events/index.d.ts
+++ b/src/types/plugins/irc-events/index.d.ts
@@ -1,4 +1,4 @@
-import Client from "client";
+import Client from "../../client";
declare global {
type IrcEventHandler = (
diff --git a/src/types/plugins/messageStorage/index.d.ts b/src/types/plugins/messageStorage/index.d.ts
index df3ba41c..1e0ddea5 100644
--- a/src/types/plugins/messageStorage/index.d.ts
+++ b/src/types/plugins/messageStorage/index.d.ts
@@ -1,8 +1,9 @@
+import type {Database} from "sqlite3";
+
import {Channel} from "../../models/channel";
import {Message} from "../../models/message";
import {Network} from "../../models/network";
-import sqlite from "sqlite3";
-import Client from "client";
+import Client from "../../client";
interface MessageStorage {
client: Client;
@@ -21,6 +22,6 @@ interface MessageStorage {
canProvideMessages(): boolean;
}
-interface SqliteMessageStorage extends MessageStorage {
- database: sqlite.Database;
+export interface SqliteMessageStorage extends MessageStorage {
+ database: Database;
}
diff --git a/tsconfig.json b/tsconfig.json
index 9ae22371..ab3fc049 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,6 @@
{
"extends": "./tsconfig.base.json",
- "files": ["./webpack.config.ts", "./babel.config.cjs", "./src/helper.ts"],
+ "files": ["index.ts", "./src/index.d.ts", "./webpack.config.ts", "./src/helper.ts"],
"compilerOptions": {
"types": ["node"],
"paths": {
@@ -8,7 +8,11 @@
"@client/*": ["client/*"]
}
},
+ "ts-node": {
+ "files": true
+ },
"exclude": ["./node_modules"],
+ "include": ["./src/**/*"],
"references": [
{
"path": "./src"