@lordbex/thelounge 4.4.4-blowfish → 4.5.0-blowfish-pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +2 -2
  2. package/dist/defaults/config.js +31 -2
  3. package/dist/package.json +93 -91
  4. package/dist/server/client.js +188 -194
  5. package/dist/server/clientManager.js +65 -63
  6. package/dist/server/command-line/index.js +44 -43
  7. package/dist/server/command-line/install.js +37 -70
  8. package/dist/server/command-line/outdated.js +12 -17
  9. package/dist/server/command-line/start.js +25 -26
  10. package/dist/server/command-line/storage.js +26 -31
  11. package/dist/server/command-line/uninstall.js +16 -23
  12. package/dist/server/command-line/upgrade.js +20 -26
  13. package/dist/server/command-line/users/add.js +33 -40
  14. package/dist/server/command-line/users/edit.js +18 -24
  15. package/dist/server/command-line/users/index.js +12 -16
  16. package/dist/server/command-line/users/list.js +11 -39
  17. package/dist/server/command-line/users/remove.js +16 -22
  18. package/dist/server/command-line/users/reset.js +34 -35
  19. package/dist/server/command-line/utils.js +231 -87
  20. package/dist/server/config.js +61 -52
  21. package/dist/server/helper.js +29 -28
  22. package/dist/server/identification.js +39 -34
  23. package/dist/server/index.js +1 -3
  24. package/dist/server/log.js +19 -16
  25. package/dist/server/models/chan.js +36 -33
  26. package/dist/server/models/msg.js +15 -19
  27. package/dist/server/models/network.js +88 -86
  28. package/dist/server/models/prefix.js +4 -7
  29. package/dist/server/models/user.js +5 -10
  30. package/dist/server/path-helper.js +8 -0
  31. package/dist/server/plugins/auth/ldap.js +177 -112
  32. package/dist/server/plugins/auth/local.js +10 -15
  33. package/dist/server/plugins/auth.js +6 -35
  34. package/dist/server/plugins/changelog.js +30 -27
  35. package/dist/server/plugins/clientCertificate.js +33 -37
  36. package/dist/server/plugins/dev-server.js +15 -21
  37. package/dist/server/plugins/inputs/action.js +9 -14
  38. package/dist/server/plugins/inputs/away.js +1 -3
  39. package/dist/server/plugins/inputs/ban.js +9 -14
  40. package/dist/server/plugins/inputs/blow.js +9 -14
  41. package/dist/server/plugins/inputs/connect.js +5 -10
  42. package/dist/server/plugins/inputs/ctcp.js +7 -12
  43. package/dist/server/plugins/inputs/disconnect.js +1 -3
  44. package/dist/server/plugins/inputs/ignore.js +23 -29
  45. package/dist/server/plugins/inputs/ignorelist.js +12 -18
  46. package/dist/server/plugins/inputs/index.js +8 -34
  47. package/dist/server/plugins/inputs/invite.js +7 -12
  48. package/dist/server/plugins/inputs/kick.js +7 -12
  49. package/dist/server/plugins/inputs/kill.js +1 -3
  50. package/dist/server/plugins/inputs/list.js +1 -3
  51. package/dist/server/plugins/inputs/mode.js +10 -15
  52. package/dist/server/plugins/inputs/msg.js +13 -18
  53. package/dist/server/plugins/inputs/mute.js +9 -15
  54. package/dist/server/plugins/inputs/nick.js +9 -14
  55. package/dist/server/plugins/inputs/notice.js +5 -7
  56. package/dist/server/plugins/inputs/part.js +11 -16
  57. package/dist/server/plugins/inputs/quit.js +7 -13
  58. package/dist/server/plugins/inputs/rainbow.js +55 -0
  59. package/dist/server/plugins/inputs/raw.js +1 -3
  60. package/dist/server/plugins/inputs/rejoin.js +7 -12
  61. package/dist/server/plugins/inputs/topic.js +7 -12
  62. package/dist/server/plugins/inputs/whois.js +1 -3
  63. package/dist/server/plugins/irc-events/away.js +14 -20
  64. package/dist/server/plugins/irc-events/cap.js +16 -22
  65. package/dist/server/plugins/irc-events/chghost.js +14 -13
  66. package/dist/server/plugins/irc-events/connection.js +61 -63
  67. package/dist/server/plugins/irc-events/ctcp.js +22 -28
  68. package/dist/server/plugins/irc-events/error.js +20 -26
  69. package/dist/server/plugins/irc-events/help.js +7 -13
  70. package/dist/server/plugins/irc-events/info.js +7 -13
  71. package/dist/server/plugins/irc-events/invite.js +7 -13
  72. package/dist/server/plugins/irc-events/join.js +30 -27
  73. package/dist/server/plugins/irc-events/kick.js +21 -17
  74. package/dist/server/plugins/irc-events/link.js +75 -96
  75. package/dist/server/plugins/irc-events/list.js +23 -26
  76. package/dist/server/plugins/irc-events/message.js +46 -52
  77. package/dist/server/plugins/irc-events/mode.js +66 -63
  78. package/dist/server/plugins/irc-events/modelist.js +29 -35
  79. package/dist/server/plugins/irc-events/motd.js +10 -16
  80. package/dist/server/plugins/irc-events/names.js +3 -6
  81. package/dist/server/plugins/irc-events/nick.js +26 -23
  82. package/dist/server/plugins/irc-events/part.js +19 -15
  83. package/dist/server/plugins/irc-events/quit.js +17 -14
  84. package/dist/server/plugins/irc-events/sasl.js +9 -15
  85. package/dist/server/plugins/irc-events/spgroups.js +38 -0
  86. package/dist/server/plugins/irc-events/spjoin.js +52 -0
  87. package/dist/server/plugins/irc-events/topic.js +12 -18
  88. package/dist/server/plugins/irc-events/unhandled.js +12 -12
  89. package/dist/server/plugins/irc-events/welcome.js +7 -13
  90. package/dist/server/plugins/irc-events/whois.js +20 -24
  91. package/dist/server/plugins/massEventAggregator.js +214 -0
  92. package/dist/server/plugins/messageStorage/sqlite.js +322 -141
  93. package/dist/server/plugins/messageStorage/text.js +21 -26
  94. package/dist/server/plugins/packages/index.js +105 -74
  95. package/dist/server/plugins/packages/publicClient.js +7 -16
  96. package/dist/server/plugins/packages/themes.js +11 -16
  97. package/dist/server/plugins/storage.js +28 -33
  98. package/dist/server/plugins/sts.js +12 -17
  99. package/dist/server/plugins/uploader.js +40 -43
  100. package/dist/server/plugins/webpush.js +23 -51
  101. package/dist/server/server.js +318 -271
  102. package/dist/server/storageCleaner.js +29 -37
  103. package/dist/server/utils/fish.js +7 -14
  104. package/dist/shared/irc.js +3 -6
  105. package/dist/shared/linkify.js +7 -14
  106. package/dist/shared/types/chan.js +6 -9
  107. package/dist/shared/types/changelog.js +1 -2
  108. package/dist/shared/types/config.js +1 -2
  109. package/dist/shared/types/mention.js +1 -2
  110. package/dist/shared/types/msg.js +3 -5
  111. package/dist/shared/types/network.js +1 -2
  112. package/dist/shared/types/storage.js +1 -2
  113. package/dist/shared/types/user.js +1 -2
  114. package/index.js +14 -10
  115. package/package.json +93 -91
  116. package/public/css/style.css +9 -6
  117. package/public/css/style.css.map +1 -1
  118. package/public/fonts/font-awesome/fa-brands-400.ttf +0 -0
  119. package/public/fonts/font-awesome/fa-brands-400.woff2 +0 -0
  120. package/public/fonts/font-awesome/fa-duotone-900.ttf +0 -0
  121. package/public/fonts/font-awesome/fa-duotone-900.woff2 +0 -0
  122. package/public/fonts/font-awesome/fa-light-300.ttf +0 -0
  123. package/public/fonts/font-awesome/fa-light-300.woff2 +0 -0
  124. package/public/fonts/font-awesome/fa-regular-400.ttf +0 -0
  125. package/public/fonts/font-awesome/fa-regular-400.woff2 +0 -0
  126. package/public/fonts/font-awesome/fa-solid-900.ttf +0 -0
  127. package/public/fonts/font-awesome/fa-solid-900.woff2 +0 -0
  128. package/public/fonts/font-awesome/fa-thin-100.ttf +0 -0
  129. package/public/fonts/font-awesome/fa-thin-100.woff2 +0 -0
  130. package/public/fonts/font-awesome/fa-v4compatibility.ttf +0 -0
  131. package/public/fonts/font-awesome/fa-v4compatibility.woff2 +0 -0
  132. package/public/js/bundle.js +1 -1
  133. package/public/js/bundle.js.map +1 -1
  134. package/public/js/bundle.vendor.js +1 -1
  135. package/public/js/bundle.vendor.js.LICENSE.txt +24 -6
  136. package/public/js/bundle.vendor.js.map +1 -1
  137. package/public/service-worker.js +1 -1
  138. package/public/themes/default.css +1 -1
  139. package/public/themes/morning.css +1 -1
  140. package/dist/webpack.config.js +0 -224
@@ -1,31 +1,25 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.StorageCleaner = void 0;
7
- const config_1 = __importDefault(require("./config"));
8
- const log_1 = __importDefault(require("./log"));
9
- const msg_1 = require("../shared/types/msg");
1
+ import Config from "./config.js";
2
+ import log from "./log.js";
3
+ import { MessageType } from "../shared/types/msg.js";
10
4
  const status_types = [
11
- msg_1.MessageType.AWAY,
12
- msg_1.MessageType.BACK,
13
- msg_1.MessageType.INVITE,
14
- msg_1.MessageType.JOIN,
15
- msg_1.MessageType.KICK,
16
- msg_1.MessageType.MODE,
17
- msg_1.MessageType.MODE_CHANNEL,
18
- msg_1.MessageType.MODE_USER,
19
- msg_1.MessageType.NICK,
20
- msg_1.MessageType.PART,
21
- msg_1.MessageType.QUIT,
22
- msg_1.MessageType.CTCP, // not technically a status, but generally those are only of interest temporarily
23
- msg_1.MessageType.CTCP_REQUEST,
24
- msg_1.MessageType.CHGHOST,
25
- msg_1.MessageType.TOPIC,
26
- msg_1.MessageType.TOPIC_SET_BY,
5
+ MessageType.AWAY,
6
+ MessageType.BACK,
7
+ MessageType.INVITE,
8
+ MessageType.JOIN,
9
+ MessageType.KICK,
10
+ MessageType.MODE,
11
+ MessageType.MODE_CHANNEL,
12
+ MessageType.MODE_USER,
13
+ MessageType.NICK,
14
+ MessageType.PART,
15
+ MessageType.QUIT,
16
+ MessageType.CTCP, // not technically a status, but generally those are only of interest temporarily
17
+ MessageType.CTCP_REQUEST,
18
+ MessageType.CHGHOST,
19
+ MessageType.TOPIC,
20
+ MessageType.TOPIC_SET_BY,
27
21
  ];
28
- class StorageCleaner {
22
+ export class StorageCleaner {
29
23
  db;
30
24
  olderThanDays;
31
25
  messageTypes;
@@ -38,7 +32,7 @@ class StorageCleaner {
38
32
  this.isStopped = true;
39
33
  this.db = db;
40
34
  this.limit = 200;
41
- const policy = config_1.default.values.storagePolicy;
35
+ const policy = Config.values.storagePolicy;
42
36
  this.olderThanDays = policy.maxAgeDays;
43
37
  switch (policy.deletionPolicy) {
44
38
  case "statusOnly":
@@ -49,7 +43,7 @@ class StorageCleaner {
49
43
  break;
50
44
  default:
51
45
  // exhaustive switch guard, blows up when user specifies a invalid policy enum
52
- this.messageTypes = assertNoBadPolicy(policy.deletionPolicy);
46
+ this.messageTypes = assertNoBadPolicy();
53
47
  }
54
48
  }
55
49
  genDeletionRequest() {
@@ -60,7 +54,7 @@ class StorageCleaner {
60
54
  };
61
55
  }
62
56
  async runDeletesNoLimit() {
63
- if (!config_1.default.values.storagePolicy.enabled) {
57
+ if (!Config.values.storagePolicy.enabled) {
64
58
  // this is meant to be used by cli tools, so we guard against this
65
59
  throw new Error("storage policy is disabled");
66
60
  }
@@ -86,9 +80,9 @@ class StorageCleaner {
86
80
  }
87
81
  catch (err) {
88
82
  this.errCount++;
89
- log_1.default.error("can't clean messages", err.message);
83
+ log.error("can't clean messages", err instanceof Error ? err.message : String(err));
90
84
  if (this.errCount === 2) {
91
- log_1.default.error("Cleaning failed too many times, will not retry");
85
+ log.error("Cleaning failed too many times, will not retry");
92
86
  this.stop();
93
87
  return;
94
88
  }
@@ -105,10 +99,9 @@ class StorageCleaner {
105
99
  }
106
100
  }
107
101
  schedule(ms) {
108
- const self = this;
109
102
  this.ticker = setTimeout(() => {
110
- self.runDeletes().catch((err) => {
111
- log_1.default.error("storageCleaner: unexpected failure");
103
+ this.runDeletes().catch((err) => {
104
+ log.error("storageCleaner: unexpected failure");
112
105
  throw err;
113
106
  });
114
107
  }, ms);
@@ -125,7 +118,6 @@ class StorageCleaner {
125
118
  clearTimeout(this.ticker);
126
119
  }
127
120
  }
128
- exports.StorageCleaner = StorageCleaner;
129
- function assertNoBadPolicy(_) {
130
- throw new Error(`Invalid deletion policy "${config_1.default.values.storagePolicy.deletionPolicy}" in the \`storagePolicy\` object, fix your config.`);
121
+ function assertNoBadPolicy() {
122
+ throw new Error(`Invalid deletion policy "${Config.values.storagePolicy.deletionPolicy}" in the \`storagePolicy\` object, fix your config.`);
131
123
  }
@@ -1,8 +1,5 @@
1
- "use strict";
2
1
  // Modern TypeScript FiSH Blowfish implementation
3
2
  // Functional approach with proper typing and error handling
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.tryDecryptFishLine = exports.createFishMessage = exports.tryDecryptFishMessage = exports.fishDecrypt = exports.fishEncrypt = void 0;
6
3
  // Constants
7
4
  const FISH_BASE64 = "./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
8
5
  const INITIAL_P = [
@@ -302,7 +299,7 @@ const decodeBase64Block = (chunk) => {
302
299
  return [left >>> 0, right >>> 0];
303
300
  };
304
301
  // Main encryption function
305
- const fishEncrypt = (plaintext, key) => {
302
+ export const fishEncrypt = (plaintext, key) => {
306
303
  const blowfish = createBlowfish(stringToBytes(key));
307
304
  const data = padData(stringToBytes(plaintext));
308
305
  let result = "";
@@ -325,9 +322,8 @@ const fishEncrypt = (plaintext, key) => {
325
322
  }
326
323
  return result;
327
324
  };
328
- exports.fishEncrypt = fishEncrypt;
329
325
  // Main decryption function
330
- const fishDecrypt = (ciphertext, key) => {
326
+ export const fishDecrypt = (ciphertext, key) => {
331
327
  if (ciphertext.length < 12) {
332
328
  return { text: "", status: "error" };
333
329
  }
@@ -376,9 +372,8 @@ const fishDecrypt = (ciphertext, key) => {
376
372
  return { text: "", status: "error" };
377
373
  }
378
374
  };
379
- exports.fishDecrypt = fishDecrypt;
380
375
  // High-level functions
381
- const tryDecryptFishMessage = (message, key) => {
376
+ export const tryDecryptFishMessage = (message, key) => {
382
377
  if (!key) {
383
378
  return null;
384
379
  }
@@ -387,13 +382,11 @@ const tryDecryptFishMessage = (message, key) => {
387
382
  return null;
388
383
  }
389
384
  const payload = match[1].trim();
390
- const result = (0, exports.fishDecrypt)(payload, key);
385
+ const result = fishDecrypt(payload, key);
391
386
  return result.status !== "error" ? `\u000314[ECB]\u0003 ${result.text}` : null;
392
387
  };
393
- exports.tryDecryptFishMessage = tryDecryptFishMessage;
394
- const createFishMessage = (plaintext, key) => {
395
- const encrypted = (0, exports.fishEncrypt)(plaintext, key);
388
+ export const createFishMessage = (plaintext, key) => {
389
+ const encrypted = fishEncrypt(plaintext, key);
396
390
  return `+OK ${encrypted}`;
397
391
  };
398
- exports.createFishMessage = createFishMessage;
399
- exports.tryDecryptFishLine = exports.tryDecryptFishMessage;
392
+ export const tryDecryptFishLine = tryDecryptFishMessage;
@@ -1,17 +1,14 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.condensedTypes = exports.cleanIrcMessage = void 0;
4
1
  const matchFormatting = /\x02|\x1D|\x1F|\x16|\x0F|\x11|\x1E|\x03(?:[0-9]{1,2}(?:,[0-9]{1,2})?)?|\x04(?:[0-9a-f]{6}(?:,[0-9a-f]{6})?)?/gi;
5
- function cleanIrcMessage(message) {
2
+ export function cleanIrcMessage(message) {
6
3
  return message.replace(matchFormatting, "").trim();
7
4
  }
8
- exports.cleanIrcMessage = cleanIrcMessage;
9
- exports.condensedTypes = new Set([
5
+ export const condensedTypes = new Set([
10
6
  "away",
11
7
  "back",
12
8
  "chghost",
13
9
  "join",
14
10
  "kick",
11
+ "mass_event",
15
12
  "mode",
16
13
  "nick",
17
14
  "part",
@@ -1,12 +1,6 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.findLinksWithSchema = exports.findLinks = void 0;
7
- const linkify_it_1 = __importDefault(require("linkify-it"));
8
- const tlds_1 = __importDefault(require("tlds"));
9
- const linkify = (0, linkify_it_1.default)().tlds(tlds_1.default).tlds("onion", true);
1
+ import LinkifyIt from "linkify-it";
2
+ import tlds from "tlds/index.json" with { type: "json" };
3
+ const linkify = LinkifyIt().tlds(tlds).tlds("onion", true);
10
4
  // Known schemes to detect in text
11
5
  const commonSchemes = [
12
6
  "sftp",
@@ -50,28 +44,27 @@ linkify.add("web+", {
50
44
  // We take the validation logic from linkify and just add our own
51
45
  // normalizer.
52
46
  linkify.add("//", {
53
- validate: linkify.__schemas__["//"].validate,
47
+ validate: linkify
48
+ .__schemas__["//"].validate,
54
49
  normalize(match) {
55
50
  match.schema = ""; // this counts as not having a schema
56
51
  match.url = "http:" + match.url;
57
52
  },
58
53
  });
59
- function findLinks(text) {
54
+ export function findLinks(text) {
60
55
  const matches = linkify.match(text);
61
56
  if (!matches) {
62
57
  return [];
63
58
  }
64
59
  return matches.map(makeLinkPart);
65
60
  }
66
- exports.findLinks = findLinks;
67
- function findLinksWithSchema(text) {
61
+ export function findLinksWithSchema(text) {
68
62
  const matches = linkify.match(text);
69
63
  if (!matches) {
70
64
  return [];
71
65
  }
72
66
  return matches.filter((url) => !!url.schema).map(makeLinkPart);
73
67
  }
74
- exports.findLinksWithSchema = findLinksWithSchema;
75
68
  function makeLinkPart(url) {
76
69
  return {
77
70
  start: url.index,
@@ -1,22 +1,19 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ChanState = exports.SpecialChanType = exports.ChanType = void 0;
4
- var ChanType;
1
+ export var ChanType;
5
2
  (function (ChanType) {
6
3
  ChanType["CHANNEL"] = "channel";
7
4
  ChanType["LOBBY"] = "lobby";
8
5
  ChanType["QUERY"] = "query";
9
6
  ChanType["SPECIAL"] = "special";
10
- })(ChanType || (exports.ChanType = ChanType = {}));
11
- var SpecialChanType;
7
+ })(ChanType || (ChanType = {}));
8
+ export var SpecialChanType;
12
9
  (function (SpecialChanType) {
13
10
  SpecialChanType["BANLIST"] = "list_bans";
14
11
  SpecialChanType["INVITELIST"] = "list_invites";
15
12
  SpecialChanType["CHANNELLIST"] = "list_channels";
16
13
  SpecialChanType["IGNORELIST"] = "list_ignored";
17
- })(SpecialChanType || (exports.SpecialChanType = SpecialChanType = {}));
18
- var ChanState;
14
+ })(SpecialChanType || (SpecialChanType = {}));
15
+ export var ChanState;
19
16
  (function (ChanState) {
20
17
  ChanState[ChanState["PARTED"] = 0] = "PARTED";
21
18
  ChanState[ChanState["JOINED"] = 1] = "JOINED";
22
- })(ChanState || (exports.ChanState = ChanState = {}));
19
+ })(ChanState || (ChanState = {}));
@@ -1,2 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
@@ -1,2 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
@@ -1,2 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MessageType = void 0;
4
- var MessageType;
1
+ export var MessageType;
5
2
  (function (MessageType) {
6
3
  MessageType["UNHANDLED"] = "unhandled";
7
4
  MessageType["ACTION"] = "action";
@@ -31,4 +28,5 @@ var MessageType;
31
28
  MessageType["RAW"] = "raw";
32
29
  MessageType["PLUGIN"] = "plugin";
33
30
  MessageType["WALLOPS"] = "wallops";
34
- })(MessageType || (exports.MessageType = MessageType = {}));
31
+ MessageType["MASS_EVENT"] = "mass_event";
32
+ })(MessageType || (MessageType = {}));
@@ -1,2 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
@@ -1,2 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
@@ -1,2 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
package/index.js CHANGED
@@ -1,19 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- "use strict";
3
+ import {existsSync} from "node:fs";
4
+ import {resolve} from "node:path";
5
+ import {fileURLToPath} from "node:url";
6
+ import semver from "semver";
7
+ import pkg from "./package.json" with {type: "json"};
8
+
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = resolve(__filename, "..");
4
11
 
5
12
  process.chdir(__dirname);
6
13
 
7
- // Perform node version check before loading any other files or modules
8
- // Doing this check as soon as possible allows us to
9
- // avoid ES6 parser errors or other issues
10
- const pkg = require("./package.json");
14
+ const requiredNodeVersion = pkg.engines?.node ?? "";
11
15
 
12
- if (!require("semver").satisfies(process.version, pkg.engines.node)) {
16
+ if (!semver.satisfies(process.version, requiredNodeVersion)) {
13
17
  /* eslint-disable no-console */
14
18
  console.error(
15
19
  "The Lounge requires Node.js " +
16
- pkg.engines.node +
20
+ requiredNodeVersion +
17
21
  " (current version: " +
18
22
  process.version +
19
23
  ")"
@@ -25,10 +29,10 @@ if (!require("semver").satisfies(process.version, pkg.engines.node)) {
25
29
  process.exit(1);
26
30
  }
27
31
 
28
- const fs = require("fs");
32
+ const distEntry = resolve(__dirname, "./dist/server/index.js");
29
33
 
30
- if (fs.existsSync("./dist/server/index.js")) {
31
- require("./dist/server/index.js");
34
+ if (existsSync(distEntry)) {
35
+ await import("./dist/server/index.js");
32
36
  } else {
33
37
  console.error(
34
38
  "Files in ./dist/server/ not found. Please run `yarn build` before trying to run `node index.js`."
package/package.json CHANGED
@@ -1,11 +1,10 @@
1
1
  {
2
2
  "name": "@lordbex/thelounge",
3
3
  "description": "The self-hosted Web IRC client",
4
- "version": "4.4.4-blowfish",
4
+ "version": "4.5.0-blowfish-pre",
5
+ "type": "module",
5
6
  "preferGlobal": true,
6
- "bin": {
7
- "thelounge": "index.js"
8
- },
7
+ "bin": "index.js",
9
8
  "repository": {
10
9
  "type": "git",
11
10
  "url": "https://github.com/LordBex/thelounge.git"
@@ -13,21 +12,20 @@
13
12
  "homepage": "https://thelounge.chat/",
14
13
  "scripts": {
15
14
  "build:client": "webpack",
16
- "build:server": "tsc -p server/tsconfig.json",
15
+ "build:server": "tsc --build server/tsconfig.json",
17
16
  "build": "run-p --aggregate-output build:client build:server",
18
- "coverage": "run-s test:* && nyc --nycrc-path=test/.nycrc-report.json report",
19
- "dev": "cross-env NODE_ENV=development ts-node --project server/tsconfig.json server/index.ts start --dev",
17
+ "coverage": "run-s test:mocha test:nospec && nyc --nycrc-path=test/.nycrc-report.json report",
18
+ "dev": "cross-env NODE_ENV=development tsx server/index.ts start --dev",
20
19
  "format:prettier": "prettier --write \"**/*.*\"",
21
20
  "generate:config:doc": "ts-node scripts/generate-config-doc.js",
22
- "lint:check-eslint": "eslint-config-prettier .eslintrc.cjs",
23
21
  "lint:eslint": "eslint . --report-unused-disable-directives --color",
24
22
  "lint:prettier": "prettier --list-different \"**/*.*\"",
25
23
  "lint:stylelint": "stylelint --color \"client/**/*.css\"",
26
- "lint": "run-p --aggregate-output --continue-on-error lint:*",
24
+ "lint": "run-p --aggregate-output --continue-on-error lint:eslint lint:prettier lint:stylelint",
27
25
  "start": "node index start",
28
- "test": "run-p --aggregate-output --continue-on-error lint:* test:mocha",
29
- "test:mocha": "webpack --mode=development && cross-env NODE_ENV=test TS_NODE_PROJECT='./test/tsconfig.json' mocha --config=test/.mocharc.yml 'test/**/*.ts'",
30
- "test:nospec": "webpack --mode=development && cross-env NODE_ENV=test TS_NODE_PROJECT='./test/tsconfig.json' mocha --config=test/.mocharc.yml",
26
+ "test": "run-p --aggregate-output --continue-on-error lint:eslint lint:prettier lint:stylelint test:mocha",
27
+ "test:mocha": "webpack --mode=development && cross-env NODE_ENV=test tsx node_modules/.bin/mocha --config=test/.mocharc.yml 'test/**/*.ts'",
28
+ "test:nospec": "webpack --mode=development && cross-env NODE_ENV=test tsx node_modules/.bin/mocha --config=test/.mocharc.yml",
31
29
  "watch": "webpack --watch",
32
30
  "githooks-install": "git config core.hooksPath scripts/git-hooks"
33
31
  },
@@ -44,7 +42,7 @@
44
42
  ],
45
43
  "license": "MIT",
46
44
  "engines": {
47
- "node": ">=18.0.0"
45
+ "node": ">=20.0.0"
48
46
  },
49
47
  "files": [
50
48
  "./.thelounge_home",
@@ -56,120 +54,124 @@
56
54
  "./public/**"
57
55
  ],
58
56
  "dependencies": {
59
- "@fastify/busboy": "1.0.0",
60
- "bcryptjs": "2.4.3",
61
- "chalk": "4.1.2",
62
- "cheerio": "1.0.0",
63
- "commander": "9.0.0",
57
+ "@fastify/busboy": "3.2.0",
58
+ "bcryptjs": "3.0.3",
59
+ "chalk": "5.6.2",
60
+ "cheerio": "1.1.2",
61
+ "commander": "14.0.2",
64
62
  "content-disposition": "0.5.4",
65
- "express": "4.20.0",
66
- "file-type": "16.5.4",
67
- "filenamify": "4.3.0",
68
- "got": "11.8.6",
63
+ "express": "5.1.0",
64
+ "file-type": "21.1.0",
65
+ "filenamify": "7.0.1",
69
66
  "irc-framework": "4.14.0",
70
- "is-utf8": "0.2.1",
71
- "ldapjs": "2.3.3",
72
- "linkify-it": "3.0.3",
67
+ "ldapts": "8.0.9",
68
+ "linkify-it": "5.0.0",
73
69
  "lodash": "4.17.21",
74
- "mime-types": "2.1.35",
70
+ "mime-types": "3.0.1",
75
71
  "node-forge": "1.3.1",
76
- "package-json": "7.0.0",
77
- "read": "1.0.7",
78
- "read-chunk": "3.2.0",
79
- "semver": "7.5.2",
80
- "socket.io": "4.6.2",
81
- "tlds": "1.228.0",
82
- "ua-parser-js": "1.0.39",
83
- "uuid": "8.3.2",
84
- "web-push": "3.4.5",
85
- "yarn": "1.22.22"
72
+ "package-json": "10.0.1",
73
+ "read": "5.0.1",
74
+ "read-chunk": "5.0.0",
75
+ "semver": "7.7.3",
76
+ "socket.io": "4.8.1",
77
+ "tlds": "1.261.0",
78
+ "ua-parser-js": "2.0.6",
79
+ "undici": "7.16.0",
80
+ "uuid": "13.0.0",
81
+ "web-push": "3.6.7"
86
82
  },
87
83
  "optionalDependencies": {
88
- "sqlite3": "5.1.7"
84
+ "better-sqlite3": "12.4.1"
89
85
  },
90
86
  "devDependencies": {
91
- "@babel/core": "7.17.10",
92
- "@babel/plugin-transform-runtime": "7.18.2",
93
- "@babel/preset-env": "7.17.10",
87
+ "@babel/core": "7.28.5",
88
+ "@babel/plugin-transform-runtime": "7.28.5",
89
+ "@babel/preset-env": "7.28.5",
94
90
  "@fortawesome/fontawesome-free": "5.15.4",
95
91
  "@istanbuljs/nyc-config-typescript": "1.0.2",
96
- "@textcomplete/core": "0.1.10",
92
+ "@stylistic/stylelint-plugin": "^4.0.0",
93
+ "@textcomplete/core": "0.1.13",
97
94
  "@textcomplete/textarea": "0.1.13",
98
95
  "@types/bcryptjs": "2.4.6",
99
- "@types/chai": "4.3.5",
96
+ "@types/better-sqlite3": "7.6.11",
97
+ "@types/chai": "5.2.3",
100
98
  "@types/cheerio": "0.22.35",
101
99
  "@types/content-disposition": "0.5.8",
102
- "@types/express": "4.17.21",
103
- "@types/is-utf8": "0.2.3",
104
- "@types/ldapjs": "2.2.5",
100
+ "@types/express": "5.0.5",
105
101
  "@types/linkify-it": "3.0.5",
106
- "@types/lodash": "4.14.202",
107
- "@types/mime-types": "2.1.4",
108
- "@types/mocha": "9.1.1",
102
+ "@types/lodash": "4.17.20",
103
+ "@types/mime-types": "3.0.1",
104
+ "@types/mocha": "^10.0.10",
109
105
  "@types/mousetrap": "1.6.15",
110
- "@types/node": "17.0.45",
106
+ "@types/node": "24.10.1",
111
107
  "@types/read": "0.0.32",
112
- "@types/semver": "7.3.9",
108
+ "@types/semver": "7.7.1",
109
+ "@types/sinon": "^20.0.0",
113
110
  "@types/sortablejs": "1.15.8",
114
- "@types/sqlite3": "3.1.11",
115
111
  "@types/ua-parser-js": "0.7.39",
116
112
  "@types/uuid": "8.3.4",
117
- "@types/web-push": "3.3.2",
113
+ "@types/web-push": "3.6.4",
118
114
  "@types/webpack-env": "1.16.4",
119
115
  "@types/webpack-hot-middleware": "2.25.6",
120
116
  "@types/ws": "8.5.12",
121
- "@typescript-eslint/eslint-plugin": "7.8.0",
122
- "@typescript-eslint/parser": "7.8.0",
123
- "@vue/runtime-dom": "3.2.33",
117
+ "@types/wtfnode": "^0",
118
+ "@typescript-eslint/eslint-plugin": "8.46.4",
119
+ "@typescript-eslint/parser": "8.46.4",
120
+ "@vue/runtime-dom": "3.5.24",
124
121
  "@vue/test-utils": "2.4.6",
125
- "babel-loader": "8.2.5",
122
+ "babel-loader": "10.0.0",
126
123
  "babel-plugin-istanbul": "6.1.1",
127
124
  "babel-preset-typescript-vue3": "2.0.17",
128
- "chai": "4.3.7",
129
- "copy-webpack-plugin": "10.2.4",
125
+ "chai": "6.2.1",
126
+ "copy-webpack-plugin": "13.0.1",
130
127
  "cross-env": "7.0.3",
131
- "css-loader": "6.5.1",
132
- "cssnano": "5.0.17",
128
+ "css-loader": "7.1.2",
129
+ "cssnano": "7.1.2",
133
130
  "dayjs": "1.10.8",
134
131
  "emoji-regex": "10.2.1",
135
- "eslint": "8.57.0",
136
- "eslint-config-prettier": "9.1.0",
137
- "eslint-define-config": "2.1.0",
138
- "eslint-plugin-vue": "9.25.0",
139
- "fork-ts-checker-webpack-plugin": "7.2.13",
132
+ "eslint": "9.39.1",
133
+ "eslint-config-prettier": "10.1.8",
134
+ "eslint-plugin-vue": "10.5.1",
135
+ "fork-ts-checker-webpack-plugin": "9.1.0",
140
136
  "fuzzy": "0.1.3",
141
- "mini-css-extract-plugin": "2.5.3",
142
- "mocha": "9.2.2",
137
+ "globals": "16.5.0",
138
+ "mini-css-extract-plugin": "2.9.4",
139
+ "mocha": "^11.7.5",
143
140
  "mousetrap": "1.6.5",
144
141
  "normalize.css": "8.0.1",
145
142
  "npm-run-all": "4.1.5",
146
- "nyc": "15.1.0",
147
- "postcss": "8.4.47",
148
- "postcss-import": "14.0.2",
149
- "postcss-loader": "6.2.1",
150
- "postcss-preset-env": "7.3.0",
151
- "prettier": "2.5.1",
152
- "pretty-quick": "3.1.3",
143
+ "nyc": "17.1.0",
144
+ "postcss": "8.5.6",
145
+ "postcss-import": "16.1.1",
146
+ "postcss-loader": "8.2.0",
147
+ "postcss-preset-env": "10.4.0",
148
+ "prettier": "3.6.2",
149
+ "pretty-quick": "4.2.2",
153
150
  "primer-tooltips": "2.0.0",
154
- "sinon": "13.0.2",
155
- "socket.io-client": "4.5.0",
151
+ "sinon": "21.0.0",
152
+ "socket.io-client": "4.8.1",
156
153
  "sortablejs": "1.15.2",
157
- "stylelint": "14.3.0",
158
- "stylelint-config-standard": "24.0.0",
159
- "ts-loader": "9.3.0",
160
- "ts-node": "10.7.0",
154
+ "stylelint": "16.25.0",
155
+ "stylelint-config-standard": "36.0.1",
156
+ "ts-loader": "9.5.4",
157
+ "ts-node": "10.9.2",
161
158
  "ts-sinon": "2.0.2",
162
- "typescript": "5.4.5",
159
+ "tsx": "^4.20.6",
160
+ "typescript": "5.9.3",
163
161
  "undate": "0.3.0",
164
- "vue": "3.2.35",
165
- "vue-eslint-parser": "9.4.3",
166
- "vue-loader": "17.0.1",
167
- "vue-router": "4.0.15",
168
- "vuex": "4.0.2",
169
- "webpack": "5.94.0",
170
- "webpack-cli": "4.9.2",
171
- "webpack-dev-middleware": "5.3.4",
172
- "webpack-hot-middleware": "2.25.4"
162
+ "vue": "3.5.24",
163
+ "vue-eslint-parser": "10.2.0",
164
+ "vue-loader": "17.4.2",
165
+ "vue-router": "4.6.3",
166
+ "vuex": "4.1.0",
167
+ "webpack": "5.102.1",
168
+ "webpack-cli": "6.0.1",
169
+ "webpack-dev-middleware": "7.4.2",
170
+ "webpack-hot-middleware": "2.26.1",
171
+ "wtfnode": "^0.10.1"
172
+ },
173
+ "resolutions": {
174
+ "js-yaml": "^4.1.1"
173
175
  },
174
- "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
176
+ "packageManager": "yarn@4.11.0"
175
177
  }