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"