diff --git a/.lintstagedrc.mjs b/.lintstagedrc.mjs
index f0ae6d5d..1bf04eda 100644
--- a/.lintstagedrc.mjs
+++ b/.lintstagedrc.mjs
@@ -1,4 +1,4 @@
export default {
- "*.{j,t}s": ["eslint", "prettier --write"],
+ "*.{j,t}s": ["eslint --concurrency 4" /* sweet spot it seems */, "prettier --write"],
"src/schemas/{*,**/*}.ts": [() => "tsc -b -v", () => "node scripts/schema.js", () => "node scripts/openapi.js"],
};
diff --git a/eslint.config.mjs b/eslint.config.mjs
index eb865c2a..b52ab1f7 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -6,6 +6,7 @@ import { fileURLToPath } from "node:url";
import js from "@eslint/js";
import { FlatCompat } from "@eslint/eslintrc";
import { defineConfig } from "eslint/config";
+import nodeImport from "eslint-plugin-node-import";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
@@ -17,7 +18,7 @@ const compat = new FlatCompat({
export default defineConfig([
{
- ignores: ["**/node_modules", "**/dist", "**/README.md", "**/COPYING", "**/scripts/", "**/assets", "**/extra/"],
+ ignores: ["./node_modules", "./dist", "**/README.md", "**/COPYING", "./scripts/", "./assets/", "./extra/", "./files/"],
},
...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"),
{
@@ -46,10 +47,28 @@ export default defineConfig([
"@typescript-eslint/no-require-imports": "off",
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-deprecated": "warn",
+ "array-callback-return": "error",
+ "no-restricted-imports": [
+ "error",
+ { name: "@spacebar/api*", message: "Did you mean @spacebar/api?" },
+ { name: "@spacebar/bundle*", message: "Did you mean @spacebar/bundle?" },
+ { name: "@spacebar/cdn*", message: "Did you mean @spacebar/cdn?" },
+ { name: "@spacebar/connections*", message: "Did you mean @spacebar/connections?" },
+ { name: "@spacebar/gateway*", message: "Did you mean @spacebar/gateway?" },
+ { name: "@spacebar/schemas*", message: "Did you mean @spacebar/schemas?" },
+ { name: "@spacebar/util*", message: "Did you mean @spacebar/util?" },
+ { name: "node:console" },
+ ],
},
},
{
files: ["**/*.js", "**/*.cjs", "**/*.mjs"],
extends: typescriptEslint.configs?.disableTypeChecked ? [typescriptEslint.configs.disableTypeChecked] : [],
},
+ {
+ plugins: { "node-import": nodeImport },
+ rules: {
+ "node-import/prefer-node-protocol": "error",
+ },
+ },
]);
diff --git a/package-lock.json b/package-lock.json
index 9fe8fc74..827b0fea 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -77,6 +77,7 @@
"@typescript-eslint/parser": "^8.58.2",
"@typescript/native-preview": "^7.0.0-dev.20260119.1",
"eslint": "^9.39.4",
+ "eslint-plugin-node-import": "^1.2.0",
"globals": "^17.5.0",
"husky": "^9.1.7",
"patch-package": "^8.0.1",
@@ -3396,6 +3397,22 @@
}
}
},
+ "node_modules/eslint-plugin-node-import": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-node-import/-/eslint-plugin-node-import-1.2.0.tgz",
+ "integrity": "sha512-PO/98sYHIwXiHaX7pFl1h1ZFFTdtPDZmq4VU2ks/7kLjzDK+5cmMWN9A08wjUErYDuVdH8q4Ft0bXt39Fu/Eng==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "globals": "^17.3.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || ^16.0.0 || >= 18.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
"node_modules/eslint-scope": {
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
diff --git a/package.json b/package.json
index 30470555..63fdd923 100644
--- a/package.json
+++ b/package.json
@@ -67,6 +67,7 @@
"@typescript-eslint/parser": "^8.58.2",
"@typescript/native-preview": "^7.0.0-dev.20260119.1",
"eslint": "^9.39.4",
+ "eslint-plugin-node-import": "^1.2.0",
"globals": "^17.5.0",
"husky": "^9.1.7",
"patch-package": "^8.0.1",
diff --git a/src/api/Server.ts b/src/api/Server.ts
index 1e5786ed..a2e63f46 100644
--- a/src/api/Server.ts
+++ b/src/api/Server.ts
@@ -21,7 +21,7 @@ import { Authentication, CORS, ImageProxy, BodyParser, ErrorHandler, initRateLim
import { Request, Response, Router } from "express";
import { Server, ServerOptions } from "lambert-server";
import morgan from "morgan";
-import path from "path";
+import path from "node:path";
import { red } from "picocolors";
import { initInstance } from "./util/handlers/Instance";
import { route } from "./util";
diff --git a/src/api/middlewares/ImageProxy.ts b/src/api/middlewares/ImageProxy.ts
index e950ea85..66d39bd6 100644
--- a/src/api/middlewares/ImageProxy.ts
+++ b/src/api/middlewares/ImageProxy.ts
@@ -19,7 +19,7 @@
import { Config, JimpType } from "@spacebar/util";
import { Request, Response } from "express";
import { yellow } from "picocolors";
-import crypto from "crypto";
+import crypto from "node:crypto";
let sharp: undefined | false | { default: typeof import("sharp") } = undefined;
diff --git a/src/api/middlewares/Translation.ts b/src/api/middlewares/Translation.ts
index 3ca204b6..1d8e0984 100644
--- a/src/api/middlewares/Translation.ts
+++ b/src/api/middlewares/Translation.ts
@@ -16,8 +16,8 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import fs from "fs";
-import path from "path";
+import fs from "node:fs";
+import path from "node:path";
import i18next from "i18next";
import i18nextMiddleware from "i18next-http-middleware";
import i18nextBackend from "i18next-fs-backend";
diff --git a/src/api/routes/auth/login.ts b/src/api/routes/auth/login.ts
index 466d264a..64211de8 100644
--- a/src/api/routes/auth/login.ts
+++ b/src/api/routes/auth/login.ts
@@ -19,7 +19,7 @@
import { route, verifyCaptcha } from "@spacebar/api";
import { Config, FieldErrors, User, WebAuthn, generateToken, generateWebAuthnTicket } from "@spacebar/util";
import bcrypt from "bcrypt";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { Request, Response, Router } from "express";
import { LoginSchema } from "@spacebar/schemas";
diff --git a/src/api/routes/channels/#channel_id/messages/index.ts b/src/api/routes/channels/#channel_id/messages/index.ts
index a484c35c..b117e3ac 100644
--- a/src/api/routes/channels/#channel_id/messages/index.ts
+++ b/src/api/routes/channels/#channel_id/messages/index.ts
@@ -47,7 +47,7 @@ import { Request, Response, Router } from "express";
import { HTTPError } from "lambert-server";
import multer from "multer";
import { FindManyOptions, FindOperator, LessThan, MoreThan, MoreThanOrEqual } from "typeorm";
-import { URL } from "url";
+import { URL } from "node:url";
import {
AcknowledgeDeleteSchema,
isTextChannel,
@@ -438,19 +438,22 @@ router.post(
// Only one recipients should be closed here, since in group DMs the recipient is deleted not closed
await Promise.all(
- channel.recipients?.map((recipient) => {
- if (recipient.closed) {
- recipient.closed = false;
- return Promise.all([
- recipient.save(),
- emitEvent({
- event: "CHANNEL_CREATE",
- data: channel_dto.excludedRecipients([recipient.user_id]),
- user_id: recipient.user_id,
- }),
- ]);
- }
- }) || [],
+ channel.recipients
+ ?.map((recipient) => {
+ if (recipient.closed) {
+ recipient.closed = false;
+ return Promise.all([
+ recipient.save(),
+ emitEvent({
+ event: "CHANNEL_CREATE",
+ data: channel_dto.excludedRecipients([recipient.user_id]),
+ user_id: recipient.user_id,
+ }),
+ ]);
+ }
+ return null;
+ })
+ .filter((x) => x !== null) || [],
);
}
diff --git a/src/api/routes/channels/#channel_id/webhooks.ts b/src/api/routes/channels/#channel_id/webhooks.ts
index ee801db7..ed2dd0ea 100644
--- a/src/api/routes/channels/#channel_id/webhooks.ts
+++ b/src/api/routes/channels/#channel_id/webhooks.ts
@@ -18,7 +18,7 @@
import { route } from "@spacebar/api";
import { Channel, Config, DiscordApiErrors, User, Webhook, handleFile, trimSpecial, ValidateName, Application } from "@spacebar/util";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { Request, Response, Router } from "express";
import { HTTPError } from "lambert-server";
import { isTextChannel, WebhookCreateSchema, WebhookType } from "@spacebar/schemas";
diff --git a/src/api/routes/guilds/#guild_id/shield.svg.ts b/src/api/routes/guilds/#guild_id/shield.svg.ts
index bb5e1c7d..983e5a35 100644
--- a/src/api/routes/guilds/#guild_id/shield.svg.ts
+++ b/src/api/routes/guilds/#guild_id/shield.svg.ts
@@ -20,8 +20,8 @@ import { route } from "@spacebar/api";
import { DiscordApiErrors, Guild, Member } from "@spacebar/util";
import { Request, Response, Router } from "express";
import { makeBadge } from "badge-maker";
-import path from "path";
-import fs from "fs";
+import path from "node:path";
+import fs from "node:fs";
const router: Router = Router({ mergeParams: true });
diff --git a/src/api/routes/guilds/#guild_id/widget.json.ts b/src/api/routes/guilds/#guild_id/widget.json.ts
index 945a0db0..0df3f3c0 100644
--- a/src/api/routes/guilds/#guild_id/widget.json.ts
+++ b/src/api/routes/guilds/#guild_id/widget.json.ts
@@ -108,8 +108,8 @@ async function getWidgetJsonData(guild_id: string) {
// Fetch voice channels, and the @everyone permissions object
const channels: { id: string; name: string; position: number }[] = [];
- (await Channel.getOrderedChannels(guild.id, guild)).filter((doc) => {
- if (doc.type !== ChannelType.GUILD_VOICE) return false;
+ (await Channel.getOrderedChannels(guild.id, guild)).forEach((doc) => {
+ if (doc.type !== ChannelType.GUILD_VOICE) return;
// Only return voice channels where @everyone has the CONNECT permission
if (doc.permission_overwrites === undefined || Permissions.channelPermission(doc.permission_overwrites, Permissions.FLAGS.CONNECT) === Permissions.FLAGS.CONNECT) {
channels.push({
diff --git a/src/api/routes/guilds/#guild_id/widget.png.ts b/src/api/routes/guilds/#guild_id/widget.png.ts
index ee623214..000c1b45 100644
--- a/src/api/routes/guilds/#guild_id/widget.png.ts
+++ b/src/api/routes/guilds/#guild_id/widget.png.ts
@@ -21,9 +21,9 @@
import { route } from "@spacebar/api";
import { DiscordApiErrors, Guild } from "@spacebar/util";
import { Request, Response, Router } from "express";
-import fs from "fs";
+import fs from "node:fs";
import { HTTPError } from "lambert-server";
-import path from "path";
+import path from "node:path";
import { storage } from "@spacebar/cdn";
const router: Router = Router({ mergeParams: true });
diff --git a/src/api/routes/interactions/index.ts b/src/api/routes/interactions/index.ts
index 33375b14..599a364e 100644
--- a/src/api/routes/interactions/index.ts
+++ b/src/api/routes/interactions/index.ts
@@ -16,7 +16,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import { randomBytes } from "crypto";
+import { randomBytes } from "node:crypto";
import { InteractionFailureReason, InteractionSchema } from "@spacebar/schemas";
import { route } from "@spacebar/api";
import { Request, Response, Router } from "express";
diff --git a/src/api/routes/reporting/index.ts b/src/api/routes/reporting/index.ts
index 20103c95..76b5169a 100644
--- a/src/api/routes/reporting/index.ts
+++ b/src/api/routes/reporting/index.ts
@@ -19,11 +19,11 @@
import { route } from "@spacebar/api";
import { Request, Response, Router } from "express";
import { ReportMenuType, ReportMenuTypeNames } from "../../../schemas/api/reports/ReportMenu";
-import path from "path";
+import path from "node:path";
import { HTTPError } from "lambert-server";
import { CreateReportSchema } from "../../../schemas/api/reports/CreateReport";
import { FieldErrors } from "@spacebar/util";
-import fs from "fs";
+import fs from "node:fs";
const router = Router({ mergeParams: true });
if (process.env.LOG_ROUTES !== "false") console.log("[Server] Registering reporting menu routes...");
diff --git a/src/api/start.ts b/src/api/start.ts
index 44e028a0..bb5b23ce 100644
--- a/src/api/start.ts
+++ b/src/api/start.ts
@@ -24,9 +24,9 @@ process.on("unhandledRejection", console.error);
import { config } from "dotenv";
config({ quiet: true });
import { SpacebarServer } from "./Server";
-import cluster from "cluster";
-import os from "os";
-import fs from "fs";
+import cluster from "node:cluster";
+import os from "node:os";
+import fs from "node:fs";
let cores = 1;
try {
cores = Number(process.env.THREADS) || os.cpus().length;
diff --git a/src/api/util/handlers/Instance.ts b/src/api/util/handlers/Instance.ts
index 6b8d1ec6..f899d07d 100644
--- a/src/api/util/handlers/Instance.ts
+++ b/src/api/util/handlers/Instance.ts
@@ -17,7 +17,7 @@
*/
import { Session, TimeSpan } from "@spacebar/util";
-import { setInterval } from "timers";
+import { setInterval } from "node:timers";
export async function initInstance() {
// TODO: clean up database and delete tombstone data
diff --git a/src/api/util/handlers/Message.ts b/src/api/util/handlers/Message.ts
index ea42283f..3ebf50e4 100644
--- a/src/api/util/handlers/Message.ts
+++ b/src/api/util/handlers/Message.ts
@@ -16,13 +16,12 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import { EmbedHandlers, randomString, fillMessageUrlEmbeds } from "@spacebar/api";
+import { randomString, fillMessageUrlEmbeds } from "@spacebar/api";
import {
Application,
Attachment,
Channel,
Config,
- EmbedCache,
emitEvent,
EVERYONE_MENTION,
getPermission,
@@ -31,7 +30,6 @@ import {
HERE_MENTION,
Message,
MessageCreateEvent,
- MessageUpdateEvent,
Role,
ROLE_MENTION,
Sticker,
@@ -41,7 +39,6 @@ import {
Webhook,
handleFile,
Permissions,
- normalizeUrl,
DiscordApiErrors,
CloudAttachment,
ReadState,
@@ -49,7 +46,6 @@ import {
Session,
MessageFlags,
FieldErrors,
- Snowflake,
getDatabase,
} from "@spacebar/util";
import { HTTPError } from "lambert-server";
@@ -70,7 +66,6 @@ import {
UnfurledMediaItem,
BaseMessageComponents,
v1CompTypes,
- PartialUser,
} from "@spacebar/schemas";
const allow_empty = false;
// TODO: check webhook, application, system author, stickers
diff --git a/src/api/util/utility/EmbedHandlers.ts b/src/api/util/utility/EmbedHandlers.ts
index b799e623..e9165a13 100644
--- a/src/api/util/utility/EmbedHandlers.ts
+++ b/src/api/util/utility/EmbedHandlers.ts
@@ -19,7 +19,7 @@
import { arrayDistinctBy, arrayGroupBy, Config, EmbedCache, emitEvent, Message, MessageUpdateEvent, normalizeUrl, OrmUtils, sleep } from "@spacebar/util";
import { Embed, EmbedImage, EmbedType } from "@spacebar/schemas";
import * as cheerio from "cheerio";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { yellow } from "picocolors";
import probe from "probe-image-size";
import { FindOptionsWhere, In } from "typeorm";
diff --git a/src/api/util/utility/RandomInviteID.ts b/src/api/util/utility/RandomInviteID.ts
index d7f2c629..ec54a9fc 100644
--- a/src/api/util/utility/RandomInviteID.ts
+++ b/src/api/util/utility/RandomInviteID.ts
@@ -17,7 +17,7 @@
*/
import { Snowflake } from "@spacebar/util";
-import crypto from "crypto";
+import crypto from "node:crypto";
// TODO: 'random'? seriously? who named this?
// And why is this even here? Just use cryto.randomBytes?
diff --git a/src/bundle/Server.ts b/src/bundle/Server.ts
index 7dfe0081..bc36e90a 100644
--- a/src/bundle/Server.ts
+++ b/src/bundle/Server.ts
@@ -21,7 +21,7 @@ import morgan from "morgan";
process.on("unhandledRejection", console.error);
process.on("uncaughtException", console.error);
-import http from "http";
+import http from "node:http";
import * as Api from "@spacebar/api";
import * as Gateway from "@spacebar/gateway";
import * as Webrtc from "@spacebar/webrtc";
@@ -29,8 +29,8 @@ import { CDNServer } from "@spacebar/cdn";
import express from "express";
import { green, bold } from "picocolors";
import { Config, initDatabase } from "@spacebar/util";
-import fs from "fs";
-import cluster from "cluster";
+import fs from "node:fs";
+import cluster from "node:cluster";
const app = express();
const server = http.createServer();
diff --git a/src/bundle/start.ts b/src/bundle/start.ts
index 54be1129..0ffe3779 100644
--- a/src/bundle/start.ts
+++ b/src/bundle/start.ts
@@ -20,8 +20,8 @@ import moduleAlias from "module-alias";
moduleAlias(__dirname + "../../../package.json");
import "reflect-metadata";
-import cluster, { Worker } from "cluster";
-import os from "os";
+import cluster, { Worker } from "node:cluster";
+import os from "node:os";
import { red, bold, yellow, cyan, blueBright, redBright } from "picocolors";
import { initStats } from "./stats";
import { config } from "dotenv";
diff --git a/src/bundle/stats.ts b/src/bundle/stats.ts
index d4ad8177..cabcdcc7 100644
--- a/src/bundle/stats.ts
+++ b/src/bundle/stats.ts
@@ -16,7 +16,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import os from "os";
+import os from "node:os";
import { readFileSync } from "node:fs";
import { red } from "picocolors";
diff --git a/src/cdn/Server.ts b/src/cdn/Server.ts
index b75dbfe6..8260407e 100644
--- a/src/cdn/Server.ts
+++ b/src/cdn/Server.ts
@@ -19,7 +19,7 @@
import { Server, ServerOptions } from "lambert-server";
import { Attachment, Config, initDatabase, registerRoutes } from "@spacebar/util";
import { CORS, BodyParser } from "@spacebar/api";
-import path from "path";
+import path from "node:path";
import guildProfilesRoute from "./routes/guild-profiles";
import morgan from "morgan";
import { storage } from "./util";
diff --git a/src/cdn/routes/app-assets.ts b/src/cdn/routes/app-assets.ts
index 13d5703b..e3df7fd9 100644
--- a/src/cdn/routes/app-assets.ts
+++ b/src/cdn/routes/app-assets.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/routes/app-icons.ts b/src/cdn/routes/app-icons.ts
index 7670d927..378d2092 100644
--- a/src/cdn/routes/app-icons.ts
+++ b/src/cdn/routes/app-icons.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/routes/avatars.ts b/src/cdn/routes/avatars.ts
index f50303b9..bf2ab437 100644
--- a/src/cdn/routes/avatars.ts
+++ b/src/cdn/routes/avatars.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache } from "../util/cache";
diff --git a/src/cdn/routes/banners.ts b/src/cdn/routes/banners.ts
index 2fedf41b..6867a58e 100644
--- a/src/cdn/routes/banners.ts
+++ b/src/cdn/routes/banners.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/routes/channel-icons.ts b/src/cdn/routes/channel-icons.ts
index 23437057..daea1633 100644
--- a/src/cdn/routes/channel-icons.ts
+++ b/src/cdn/routes/channel-icons.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/routes/discover-splashes.ts b/src/cdn/routes/discover-splashes.ts
index eca15a3e..d8da7373 100644
--- a/src/cdn/routes/discover-splashes.ts
+++ b/src/cdn/routes/discover-splashes.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/routes/discovery-splashes.ts b/src/cdn/routes/discovery-splashes.ts
index ba6fee36..7d0f5058 100644
--- a/src/cdn/routes/discovery-splashes.ts
+++ b/src/cdn/routes/discovery-splashes.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/routes/embed.ts b/src/cdn/routes/embed.ts
index 463279af..e63936d0 100644
--- a/src/cdn/routes/embed.ts
+++ b/src/cdn/routes/embed.ts
@@ -17,9 +17,9 @@
*/
import { Request, Response, Router } from "express";
-import fs from "fs/promises";
+import fs from "node:fs/promises";
import { HTTPError } from "lambert-server";
-import { join } from "path";
+import { join } from "node:path";
import { fileTypeFromBuffer } from "file-type";
import { cache } from "../util/cache";
diff --git a/src/cdn/routes/emojis.ts b/src/cdn/routes/emojis.ts
index 2890d3b3..ad3238a1 100644
--- a/src/cdn/routes/emojis.ts
+++ b/src/cdn/routes/emojis.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/routes/guild-profiles.ts b/src/cdn/routes/guild-profiles.ts
index 97e3a47a..20ff2e23 100644
--- a/src/cdn/routes/guild-profiles.ts
+++ b/src/cdn/routes/guild-profiles.ts
@@ -17,7 +17,7 @@
*/
import { Config } from "@spacebar/util";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { Request, Response, Router } from "express";
import { HTTPError } from "lambert-server";
import { multer } from "../util/multer";
diff --git a/src/cdn/routes/icons.ts b/src/cdn/routes/icons.ts
index a42a4fec..5a6a10e9 100644
--- a/src/cdn/routes/icons.ts
+++ b/src/cdn/routes/icons.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/routes/role-icons.ts b/src/cdn/routes/role-icons.ts
index 7539fed6..26c41cad 100644
--- a/src/cdn/routes/role-icons.ts
+++ b/src/cdn/routes/role-icons.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache } from "../util/cache";
diff --git a/src/cdn/routes/splashes.ts b/src/cdn/routes/splashes.ts
index 85a0b90b..8199441d 100644
--- a/src/cdn/routes/splashes.ts
+++ b/src/cdn/routes/splashes.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/routes/stickers.ts b/src/cdn/routes/stickers.ts
index 67e7625e..241ecdab 100644
--- a/src/cdn/routes/stickers.ts
+++ b/src/cdn/routes/stickers.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/routes/team-icons.ts b/src/cdn/routes/team-icons.ts
index ad943a19..03db4142 100644
--- a/src/cdn/routes/team-icons.ts
+++ b/src/cdn/routes/team-icons.ts
@@ -21,7 +21,7 @@ import { Config } from "@spacebar/util";
import { storage } from "@spacebar/cdn";
import { fileTypeFromBuffer } from "file-type";
import { HTTPError } from "lambert-server";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { multer } from "../util/multer";
import { cache, cacheNotFound } from "../util/cache";
diff --git a/src/cdn/start.ts b/src/cdn/start.ts
index 3d98d5f2..97eaa5f9 100644
--- a/src/cdn/start.ts
+++ b/src/cdn/start.ts
@@ -22,8 +22,8 @@ import { config } from "dotenv";
config({ quiet: true });
import { CDNServer } from "./Server";
-import fs from "fs";
-import cluster from "cluster";
+import fs from "node:fs";
+import cluster from "node:cluster";
const server = new CDNServer({ port: Number(process.env.PORT) || 3003 });
server
.start()
diff --git a/src/cdn/util/FileStorage.ts b/src/cdn/util/FileStorage.ts
index d81aa7ec..eaedbc90 100644
--- a/src/cdn/util/FileStorage.ts
+++ b/src/cdn/util/FileStorage.ts
@@ -17,10 +17,10 @@
*/
import { Storage } from "./Storage";
-import fs from "fs";
-import fsp from "fs/promises";
-import { join, dirname } from "path";
-import { Readable } from "stream";
+import fs from "node:fs";
+import fsp from "node:fs/promises";
+import { join, dirname } from "node:path";
+import { Readable } from "node:stream";
import ExifTransformer from "exif-be-gone";
export class FileStorage implements Storage {
diff --git a/src/cdn/util/S3Storage.ts b/src/cdn/util/S3Storage.ts
index 82d9954f..22afd88e 100644
--- a/src/cdn/util/S3Storage.ts
+++ b/src/cdn/util/S3Storage.ts
@@ -16,7 +16,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import { Readable } from "stream";
+import { Readable } from "node:stream";
import { Storage } from "./Storage";
const readableToBuffer = (readable: Readable): Promise<Buffer> =>
diff --git a/src/cdn/util/Storage.ts b/src/cdn/util/Storage.ts
index 03d71d1d..581ebf4d 100644
--- a/src/cdn/util/Storage.ts
+++ b/src/cdn/util/Storage.ts
@@ -17,8 +17,8 @@
*/
import { FileStorage } from "./FileStorage";
-import path from "path";
-import fs from "fs";
+import path from "node:path";
+import fs from "node:fs";
import { red } from "picocolors";
process.cwd();
diff --git a/src/gateway/Server.ts b/src/gateway/Server.ts
index 72faa983..d86d7570 100644
--- a/src/gateway/Server.ts
+++ b/src/gateway/Server.ts
@@ -21,10 +21,10 @@ dotenv.config({ quiet: true });
import { checkToken, closeDatabase, Config, initDatabase, initEvent, Rights } from "@spacebar/util";
import ws from "ws";
import { Connection, openConnections } from "./events/Connection";
-import http from "http";
+import http from "node:http";
import { cleanupOnStartup } from "./util";
import { randomString } from "@spacebar/api";
-import { setInterval } from "timers";
+import { setInterval } from "node:timers";
export class Server {
public ws: ws.Server;
diff --git a/src/gateway/events/Connection.ts b/src/gateway/events/Connection.ts
index d3405050..ae3d1220 100644
--- a/src/gateway/events/Connection.ts
+++ b/src/gateway/events/Connection.ts
@@ -22,11 +22,11 @@ import { genSessionId, WebSocket } from "@spacebar/gateway";
import { Send } from "../util/Send";
import { CLOSECODES, OPCODES } from "../util/Constants";
import { setHeartbeat } from "../util/Heartbeat";
-import { IncomingMessage } from "http";
+import { IncomingMessage } from "node:http";
import { Close } from "./Close";
import { Message } from "./Message";
import { Deflate, Inflate } from "fast-zlib";
-import { URL } from "url";
+import { URL } from "node:url";
import { Config, ErlpackType } from "@spacebar/util";
import { Decoder, Encoder } from "@toondepauw/node-zstd";
diff --git a/src/gateway/events/Message.ts b/src/gateway/events/Message.ts
index b4263b40..8bd1adda 100644
--- a/src/gateway/events/Message.ts
+++ b/src/gateway/events/Message.ts
@@ -18,9 +18,9 @@
import { CLOSECODES, Payload, WebSocket } from "@spacebar/gateway";
import { ErlpackType } from "@spacebar/util";
-import fs from "fs/promises";
+import fs from "node:fs/promises";
import BigIntJson from "json-bigint";
-import path from "path";
+import path from "node:path";
import WS from "ws";
import OPCodeHandlers from "../opcodes";
import { check } from "../opcodes/instanceOf";
diff --git a/src/gateway/start.ts b/src/gateway/start.ts
index 79c4ca19..3ee87115 100644
--- a/src/gateway/start.ts
+++ b/src/gateway/start.ts
@@ -23,8 +23,8 @@ process.on("unhandledRejection", console.error);
import { Server } from "./Server";
import { config } from "dotenv";
-import fs from "fs";
-import cluster from "cluster";
+import fs from "node:fs";
+import cluster from "node:cluster";
config({ quiet: true });
let port = Number(process.env.PORT);
diff --git a/src/gateway/util/Send.ts b/src/gateway/util/Send.ts
index 95902ca4..00fd4b45 100644
--- a/src/gateway/util/Send.ts
+++ b/src/gateway/util/Send.ts
@@ -17,8 +17,8 @@
*/
import { Payload, WebSocket } from "@spacebar/gateway";
-import fs from "fs/promises";
-import path from "path";
+import fs from "node:fs/promises";
+import path from "node:path";
import { ErlpackType, JSONReplacer } from "@spacebar/util";
let erlpack: ErlpackType | null = null;
diff --git a/src/schemas/Validator.ts b/src/schemas/Validator.ts
index e7a227a9..c719effc 100644
--- a/src/schemas/Validator.ts
+++ b/src/schemas/Validator.ts
@@ -18,8 +18,8 @@
import Ajv from "ajv";
import addFormats from "ajv-formats";
-import fs from "fs";
-import path from "path";
+import fs from "node:fs";
+import path from "node:path";
const SchemaPath = path.join(__dirname, "..", "..", "assets", "schemas.json");
const schemas = JSON.parse(fs.readFileSync(SchemaPath, { encoding: "utf8" }).replaceAll("#/definitions/", ""));
diff --git a/src/util/Signing.ts b/src/util/Signing.ts
index 24f3c206..141ca0ff 100644
--- a/src/util/Signing.ts
+++ b/src/util/Signing.ts
@@ -17,9 +17,8 @@
*/
import { Config } from "@spacebar/util";
-import { createHmac, timingSafeEqual } from "crypto";
+import { createHmac, timingSafeEqual } from "node:crypto";
import ms, { StringValue } from "ms";
-import * as console from "node:console";
export class NewUrlUserSignatureData {
ip?: string;
diff --git a/src/util/config/types/SecurityConfiguration.ts b/src/util/config/types/SecurityConfiguration.ts
index 10900c58..67e7a758 100644
--- a/src/util/config/types/SecurityConfiguration.ts
+++ b/src/util/config/types/SecurityConfiguration.ts
@@ -16,7 +16,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import crypto from "crypto";
+import crypto from "node:crypto";
import { CaptchaConfiguration, TwoFactorConfiguration } from ".";
export class SecurityConfiguration {
diff --git a/src/util/connections/Connection.ts b/src/util/connections/Connection.ts
index d5934164..56b2b899 100644
--- a/src/util/connections/Connection.ts
+++ b/src/util/connections/Connection.ts
@@ -16,7 +16,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import crypto from "crypto";
+import crypto from "node:crypto";
import { ConnectedAccount } from "../entities";
import { ConnectedAccountSchema, ConnectionCallbackSchema } from "@spacebar/schemas";
import { Config, DiscordApiErrors } from "../util";
diff --git a/src/util/connections/ConnectionLoader.ts b/src/util/connections/ConnectionLoader.ts
index 021ef3a6..f6031ac6 100644
--- a/src/util/connections/ConnectionLoader.ts
+++ b/src/util/connections/ConnectionLoader.ts
@@ -17,8 +17,8 @@
*/
import { Connection } from "@spacebar/util";
-import fs from "fs";
-import path from "path";
+import fs from "node:fs";
+import path from "node:path";
import { ConnectionConfig } from "./ConnectionConfig";
import { ConnectionStore } from "./ConnectionStore";
import { greenBright, redBright } from "picocolors";
diff --git a/src/util/entities/BackupCodes.ts b/src/util/entities/BackupCodes.ts
index 2a55613e..6759a9a3 100644
--- a/src/util/entities/BackupCodes.ts
+++ b/src/util/entities/BackupCodes.ts
@@ -19,7 +19,7 @@
import { Column, Entity, JoinColumn, ManyToOne } from "typeorm";
import { BaseClass } from "./BaseClass";
import { User } from "./User";
-import crypto from "crypto";
+import crypto from "node:crypto";
import { Config } from "../util";
@Entity({
diff --git a/src/util/entities/Guild.ts b/src/util/entities/Guild.ts
index 213c2c96..aa6816c2 100644
--- a/src/util/entities/Guild.ts
+++ b/src/util/entities/Guild.ts
@@ -404,19 +404,20 @@ export class Guild extends BaseClass {
// create custom roles if provided
if (body.roles && body.roles.length) {
await Promise.all(
- body.roles?.map((role) => {
- new Promise((resolve) => {
- Role.create({
- ...role,
- guild_id,
- id:
- // role.id === body.template_guild_id indicates that this is the @everyone role
- role.id === body.source_guild_id || role.id == "0" ? guild_id : Snowflake.generate(),
- })
- .save()
- .then(resolve);
- });
- }),
+ body.roles?.map(
+ (role) =>
+ new Promise((resolve) => {
+ Role.create({
+ ...role,
+ guild_id,
+ id:
+ // role.id === body.template_guild_id indicates that this is the @everyone role
+ role.id === body.source_guild_id || role.id == "0" ? guild_id : Snowflake.generate(),
+ })
+ .save()
+ .then(resolve);
+ }),
+ ),
);
}
diff --git a/src/util/entities/Session.ts b/src/util/entities/Session.ts
index eb28c389..058961f6 100644
--- a/src/util/entities/Session.ts
+++ b/src/util/entities/Session.ts
@@ -16,7 +16,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import crypto from "crypto";
+import crypto from "node:crypto";
import { User } from "./User";
import { BaseClassWithoutId } from "./BaseClass";
import { Column, CreateDateColumn, Entity, Index, JoinColumn, ManyToOne, PrimaryColumn, RelationId } from "typeorm";
diff --git a/src/util/util/Config.ts b/src/util/util/Config.ts
index 42bb0744..bc34879c 100644
--- a/src/util/util/Config.ts
+++ b/src/util/util/Config.ts
@@ -16,8 +16,8 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import { existsSync } from "fs";
-import fs from "fs/promises";
+import { existsSync } from "node:fs";
+import fs from "node:fs/promises";
import { OrmUtils } from "..";
import { ConfigValue } from "../config";
import { ConfigEntity } from "../entities";
diff --git a/src/util/util/Database.ts b/src/util/util/Database.ts
index 5e0a1065..9622bfb1 100644
--- a/src/util/util/Database.ts
+++ b/src/util/util/Database.ts
@@ -17,12 +17,12 @@
*/
import { config } from "dotenv";
-import path from "path";
+import path from "node:path";
import { green, red, yellow } from "picocolors";
import { DataSource } from "typeorm";
// noinspection ES6PreferShortImport
import { ConfigEntity } from "../entities/Config";
-import fs from "fs";
+import fs from "node:fs";
// UUID extension option is only supported with postgres
// We want to generate all id's with Snowflakes that's why we have our own BaseEntity class
diff --git a/src/util/util/Event.ts b/src/util/util/Event.ts
index 78f487b8..9dda083c 100644
--- a/src/util/util/Event.ts
+++ b/src/util/util/Event.ts
@@ -18,16 +18,16 @@
import { Channel } from "amqplib";
import { RabbitMQ } from "./RabbitMQ";
-import EventEmitter from "events";
+import EventEmitter from "node:events";
import { EVENT, Event } from "../interfaces";
-import { randomUUID } from "crypto";
-import path from "path";
+import { randomUUID } from "node:crypto";
+import path from "node:path";
import { Socket } from "node:net";
import { FSWatcher } from "node:fs";
import { Stopwatch } from "./Stopwatch";
import { Config } from "./Config";
-import net from "net";
-import fs from "fs";
+import net from "node:net";
+import fs from "node:fs";
import { red } from "picocolors";
export const events = new EventEmitter();
diff --git a/src/util/util/RabbitMQ.ts b/src/util/util/RabbitMQ.ts
index 7969bb8b..44bcf2a6 100644
--- a/src/util/util/RabbitMQ.ts
+++ b/src/util/util/RabbitMQ.ts
@@ -18,7 +18,7 @@
import amqp, { Channel, ChannelModel } from "amqplib";
import { Config } from "./Config";
-import EventEmitter from "events";
+import EventEmitter from "node:events";
export class RabbitMQ {
public static connection: ChannelModel | null = null;
diff --git a/src/util/util/Snowflake.ts b/src/util/util/Snowflake.ts
index 06b8c0d0..3d62480f 100644
--- a/src/util/util/Snowflake.ts
+++ b/src/util/util/Snowflake.ts
@@ -1,6 +1,6 @@
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
-import * as cluster from "cluster";
+import * as cluster from "node:cluster";
// https://github.com/discordjs/discord.js/blob/master/src/util/Snowflake.js
// Apache License Version 2.0 Copyright 2015 - 2021 Amish Shah
diff --git a/src/util/util/Token.ts b/src/util/util/Token.ts
index 601fb275..83459144 100644
--- a/src/util/util/Token.ts
+++ b/src/util/util/Token.ts
@@ -20,14 +20,14 @@ import jwt from "jsonwebtoken";
import { Config } from "./Config";
import { InstanceBan, Session, User } from "../entities";
import crypto from "node:crypto";
-import fs from "fs/promises";
-import { existsSync } from "fs";
+import fs from "node:fs/promises";
+import { existsSync } from "node:fs";
// TODO: dont use deprecated APIs lol
import { FindOptionsRelationByString, FindOptionsSelectByString } from "typeorm";
import { randomUpperString } from "@spacebar/api";
import { TimeSpan } from "./Timespan";
import { HTTPError } from "lambert-server";
-import path from "path";
+import path from "node:path";
/// Change history:
/// 1 - Initial version with HS256
diff --git a/src/util/util/Version.ts b/src/util/util/Version.ts
index 2d7c4b56..6ebaebd5 100644
--- a/src/util/util/Version.ts
+++ b/src/util/util/Version.ts
@@ -16,9 +16,9 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import path from "path";
-import fs from "fs";
-import { execSync } from "child_process";
+import path from "node:path";
+import fs from "node:fs";
+import { execSync } from "node:child_process";
import { red } from "picocolors";
export function getRevInfoOrFail(): { rev: string | null; lastModified: number } {
diff --git a/src/util/util/email/index.ts b/src/util/util/email/index.ts
index 802ed271..cceb99f4 100644
--- a/src/util/util/email/index.ts
+++ b/src/util/util/email/index.ts
@@ -16,7 +16,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import fs from "fs/promises";
+import fs from "node:fs/promises";
import path from "node:path";
import { User } from "../../entities";
import { Config } from "../Config";
diff --git a/src/util/util/json/JsonSerializer.test.ts b/src/util/util/json/JsonSerializer.test.ts
index 31624db7..5adf6c1e 100644
--- a/src/util/util/json/JsonSerializer.test.ts
+++ b/src/util/util/json/JsonSerializer.test.ts
@@ -1,7 +1,7 @@
import { JsonSerializer } from "./JsonSerializer";
import { describe, it } from "node:test";
-import { strict as assert } from "assert";
-import fs from "fs/promises";
+import { strict as assert } from "node:assert";
+import fs from "node:fs/promises";
import { Stopwatch } from "../Stopwatch";
import { JsonValue } from "@protobuf-ts/runtime";
diff --git a/src/util/util/json/JsonSerializer.ts b/src/util/util/json/JsonSerializer.ts
index a35bb947..d8259afc 100644
--- a/src/util/util/json/JsonSerializer.ts
+++ b/src/util/util/json/JsonSerializer.ts
@@ -1,7 +1,7 @@
import { JsonSerializerOptions } from "./JsonSerializerOptions";
-import { Worker } from "worker_threads";
-import { join } from "path";
-import os from "os";
+import { Worker } from "node:worker_threads";
+import { join } from "node:path";
+import os from "node:os";
import { ReadStream, WriteStream } from "node:fs";
// const worker = new Worker(join(process.cwd(), 'dist', 'util', 'util', 'json', 'jsonWorker.js'));
diff --git a/src/util/util/json/jsonWorker.ts b/src/util/util/json/jsonWorker.ts
index f12c9f67..d24bff5e 100644
--- a/src/util/util/json/jsonWorker.ts
+++ b/src/util/util/json/jsonWorker.ts
@@ -1,4 +1,4 @@
-import { parentPort } from "worker_threads";
+import { parentPort } from "node:worker_threads";
parentPort?.on("message", (message) => {
try {
diff --git a/src/util/util/lambert-server/Server.ts b/src/util/util/lambert-server/Server.ts
index bb60acb4..c291fbfe 100644
--- a/src/util/util/lambert-server/Server.ts
+++ b/src/util/util/lambert-server/Server.ts
@@ -1,6 +1,6 @@
import express, { Application, Router } from "express";
-import { Server as HTTPServer } from "http";
-import http from "http";
+import { Server as HTTPServer } from "node:http";
+import http from "node:http";
export type ServerOptions = {
port: number;
diff --git a/src/util/util/lambert-server/Utils.ts b/src/util/util/lambert-server/Utils.ts
index 07f8eadc..df424b00 100644
--- a/src/util/util/lambert-server/Utils.ts
+++ b/src/util/util/lambert-server/Utils.ts
@@ -1,4 +1,4 @@
-import fs from "fs";
+import fs from "node:fs";
export interface traverseDirectoryOptions {
dirname: string;
diff --git a/src/webrtc/Server.ts b/src/webrtc/Server.ts
index f3e9043b..0f8ead2c 100644
--- a/src/webrtc/Server.ts
+++ b/src/webrtc/Server.ts
@@ -18,12 +18,11 @@
import dotenv from "dotenv";
dotenv.config({ quiet: true });
import { closeDatabase, Config, initDatabase, initEvent, Session, TimeSpan } from "@spacebar/util";
-import http from "http";
+import http from "node:http";
import ws from "ws";
import { Connection } from "./events/Connection";
import { loadWebRtcLibrary, mediaServer, WRTC_PORT_MAX, WRTC_PORT_MIN, WRTC_PUBLIC_IP } from "./util";
import { green, yellow } from "picocolors";
-import { storage } from "@spacebar/cdn*";
export class Server {
public ws: ws.Server;
diff --git a/src/webrtc/events/Connection.ts b/src/webrtc/events/Connection.ts
index b31b8993..114471af 100644
--- a/src/webrtc/events/Connection.ts
+++ b/src/webrtc/events/Connection.ts
@@ -17,8 +17,8 @@
*/
import { CLOSECODES, setHeartbeat } from "@spacebar/gateway";
-import { IncomingMessage } from "http";
-import { URL } from "url";
+import { IncomingMessage } from "node:http";
+import { URL } from "node:url";
import WS from "ws";
import { VoiceOPCodes, WebRtcWebSocket, Send } from "../util";
import { onClose } from "./Close";
diff --git a/src/webrtc/start.ts b/src/webrtc/start.ts
index 54190436..f35bba2b 100644
--- a/src/webrtc/start.ts
+++ b/src/webrtc/start.ts
@@ -22,8 +22,8 @@ process.on("unhandledRejection", console.error);
import { config } from "dotenv";
import { Server } from "./Server";
-import fs from "fs";
-import cluster from "cluster";
+import fs from "node:fs";
+import cluster from "node:cluster";
config({ quiet: true });
const port = Number(process.env.PORT) || 3004;
|