chore: Code changes & formatting and linting (#3552)

* Do some code changes & run prettier and eslint

* Fix test:test-type script

* Apply code review suggestions

* update heartbeat interval & add a reason for the specific value

* Fix husky error

* Update to TS 5.5

And use ${configDir}

* Fix test.json tsconfig base

---------

Co-authored-by: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com>
This commit is contained in:
Fleny
2024-07-08 22:11:41 +02:00
committed by GitHub
parent 2f89d4da30
commit 97a8016041
83 changed files with 370 additions and 526 deletions

View File

@@ -25,7 +25,7 @@
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "yarn install",
"postCreateCommand": "yarn install",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "node"

View File

@@ -1,5 +1,5 @@
{
"root": true,
// This tells ESLint to load the config from the package `eslint-config-custom`
// This tells ESLint to load the config from the package `eslint-config-discordeno`
"extends": ["discordeno"]
}

View File

@@ -55,7 +55,7 @@ jobs:
- name: Benchmark
if: ${{ steps.cpuCheck.outputs.match == 'true' }}
run: node --expose-gc ./packages/benchmark/dist/index.js | tee output.txt
run: node --expose-gc ./packages/benchmarks/dist/index.js | tee output.txt
- name: Download previous benchmark data
if: ${{ steps.cpuCheck.outputs.match == 'true' }}
@@ -69,7 +69,7 @@ jobs:
if: ${{ steps.cpuCheck.outputs.match == 'true' }}
uses: benchmark-action/github-action-benchmark@v1
with:
tool: "benchmarkjs"
tool: 'benchmarkjs'
output-file-path: output.txt
external-data-json-path: benchmarksResult/data.json
@@ -96,9 +96,9 @@ jobs:
uses: benchmark-action/github-action-benchmark@v1
if: ${{ github.ref == 'refs/heads/main' && steps.cpuCheck.outputs.match == 'true' }}
with:
tool: "benchmarkjs"
tool: 'benchmarkjs'
output-file-path: output.txt
gh-pages-branch: "benchies"
gh-pages-branch: 'benchies'
benchmark-data-dir-path: benchmarksResult
github-token: ${{ secrets.GITHUB_TOKEN }}
auto-push: true

View File

@@ -72,7 +72,7 @@ jobs:
echo "$MESSAGE" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: "Comment on PR"
- name: 'Comment on PR'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -62,7 +62,7 @@ jobs:
node-version: 18
- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.0.6"
bun-version: '1.0.6'
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT

View File

@@ -11,7 +11,6 @@ on:
jobs:
stale:
runs-on: ubuntu-latest
permissions:
issues: write

View File

@@ -6,3 +6,6 @@
!README.md
!dist/**
!bin/**
# ignore the tsbuildinfo file
dist/.tsbuildinfo

View File

@@ -8,6 +8,6 @@ nodeLinker: node-modules
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-after-install.cjs
spec: "https://raw.githubusercontent.com/mhassan1/yarn-plugin-after-install/v0.5.0/bundles/@yarnpkg/plugin-after-install.js"
spec: 'https://raw.githubusercontent.com/mhassan1/yarn-plugin-after-install/v0.5.0/bundles/@yarnpkg/plugin-after-install.js'
yarnPath: .yarn/releases/yarn-4.0.2.cjs

View File

@@ -152,6 +152,9 @@ yarn test:unit-coverage
# unit test with Deno
yarn test:deno-unit
# unit test with Bun
yarn test:bun-unit
# integration test
yarn test:integration

View File

@@ -1,4 +1,3 @@
# Changelog
All notable changes to this project will be documented in this file.

View File

@@ -63,7 +63,7 @@ export const GATEWAY_INTENTS = Intents.Guilds | Intents.GuildMessages
// Helper functions
function assertEnv(env: string): string {
if (process.env[env]) return process.env[env]!
if (process.env[env]) return process.env[env]
throw new TypeError(`The '${env}' environment variable must be set`)
}

View File

@@ -15,9 +15,9 @@
"fmt": "turbo run fmt --no-daemon",
"format": "prettier --write \"**/*.{ts,tsx,md}\"",
"lint": "turbo run lint --no-daemon",
"prepare": "husky install",
"prepare": "husky",
"release-build": "turbo run release-build --no-daemon",
"setup-dd": "husky install",
"setup-dd": "husky",
"test:bun-unit": "turbo run test:bun-unit --no-daemon",
"test:deno-unit": "turbo run test:deno-unit --no-daemon",
"test:e2e": "turbo run test:e2e --no-daemon",
@@ -35,9 +35,9 @@
"lint-staged": "^15.2.7",
"prettier": "^3.2.5",
"turbo": "^1.11.3",
"typedoc": "0.25.11",
"typedoc": "^0.25.13",
"typedoc-plugin-markdown": "3.17.1",
"typescript": "5.4.5"
"typescript": "^5.5.2"
},
"engines": {
"node": ">=18.0.0"

View File

@@ -1,8 +0,0 @@
{
"extends": "tsconfig/base.json",
"compilerOptions": {
"outDir": "./dist"
},
"include": ["./src/**/*.ts", "./src/**/*.tsx"],
"exclude": ["node_modules", "dist", "test", "tests"]
}

View File

@@ -1,10 +1,9 @@
{
"name": "benchmark",
"name": "benchmarks",
"version": "0.0.0",
"main": "./dist/esm/index.js",
"main": "./dist/index.js",
"exports": {
"import": "./dist/esm/index.js",
"require": "./dist/cjs/index.cjs",
"import": "./dist/index.js",
"types": "./dist/types/index.d.ts"
},
"types": "./dist/types/index.d.ts",
@@ -29,19 +28,17 @@
"@discordeno/rest": "19.0.0-alpha.1",
"@discordeno/types": "19.0.0-beta.1",
"@discordeno/utils": "19.0.0-beta.1",
"benchmark": "^2.1.4",
"microtime": "^3.1.1",
"node-fetch": "^3.3.2"
"benchmark": "^2.1.4"
},
"devDependencies": {
"@swc/cli": "^0.3.9",
"@swc/core": "^1.4.2",
"@types/benchmark": "^2.1.5",
"@types/node": "^20.11.25",
"@types/node": "^20.14.7",
"eslint": "^8.57.0",
"eslint-config-discordeno": "*",
"ts-node": "^10.9.2",
"tsconfig": "*",
"typescript": "5.4.5"
"typescript": "^5.5.2"
}
}

View File

@@ -9,7 +9,7 @@ events.forEach((event) => {
})
suite.add(`Camelize 1 event`, () => {
snakelize(events[1])
camelize(events[1])
})
suite.add(`Snakelize 1 event`, () => {

View File

@@ -1,4 +1,4 @@
import { createBot, type Bot } from '@discordeno/bot'
import { createBot, snakeToCamelCase, type Bot } from '@discordeno/bot'
import { events as dbEvents } from '../utils/db.js'
import { memoryBenchmark } from '../utils/memoryBenchmark.js'
@@ -27,12 +27,8 @@ await memoryBenchmark(
}),
),
(bot, event) => {
// @ts-expect-error it works
bot.events[
event.payload.t!.toLowerCase().replace(/_([a-z])/g, (g) => {
return g[1].toUpperCase()
})
]?.(event.payload.d, {})
const eventName = snakeToCamelCase(event.payload.t!)
bot.events[eventName as keyof typeof bot.events]?.(event.payload.d as never, {})
},
dbEvents.filter((event) => event.payload.t),
)

View File

@@ -95,11 +95,11 @@ await memoryBenchmark(
'[transformer] message cache check',
() => ({
cache: [] as any[],
}), // function reutrn a new instance of object wanted to test with
}), // function returns a new instance of object wanted to test with
(object, event: DiscordMessage) => object.cache.push(bot.transformers.message(bot, event)),
// function specify how to add event to the object/ run the object
[...new Array(MESSAGE_SIZE)].map(
(i) =>
() =>
({
activity: {
party_id: 'party_id',

View File

@@ -4,8 +4,6 @@ const benchmarkData = await fetch(`https://raw.githubusercontent.com/discordeno/
.then(async (res) => await res.text())
.then((text) => JSON.parse(text.slice(24)))
// eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
// const commitSha = await fs.readFile('./sha', 'utf-8')
const results = JSON.parse(await fs.readFile('./data.json', 'utf-8'))
interface BenchmarksData {

View File

@@ -1,6 +1,5 @@
/* eslint-disable @typescript-eslint/no-unsafe-argument */
import type { DiscordGatewayPayload } from '@discordeno/types'
import fetch from 'node-fetch'
import fs from 'node:fs/promises'
export const events: Array<{

View File

@@ -0,0 +1,3 @@
{
"extends": "tsconfig/base.json"
}

View File

@@ -26,7 +26,7 @@
"test:e2e": "c8 --r lcov mocha --no-warnings --jobs 1 --t 30000 'tests/e2e/**/*.spec.ts' && node ../../scripts/coveragePathFixing.js rest",
"test:unit:watch": "mocha --no-warnings --watch --parallel 'tests/unit/**/*.spec.ts'",
"test:type": "tsc --noEmit",
"test:test-type": "tsc --project tsconfig.test.json"
"test:test-type": "tsc --project tests/tsconfig.json"
},
"dependencies": {
"@discordeno/gateway": "19.0.0-alpha.1",
@@ -49,6 +49,6 @@
"sinon": "^17.0.1",
"ts-node": "^10.9.2",
"tsconfig": "*",
"typescript": "5.4.5"
"typescript": "^5.5.2"
}
}

View File

@@ -1,5 +1,5 @@
import { Intents } from '@discordeno/types'
import { delay, logger } from '@discordeno/utils'
import { delay, logger, snakeToCamelCase } from '@discordeno/utils'
import { use as chaiUse } from 'chai'
import chaiAsPromised from 'chai-as-promised'
import { describe, it } from 'mocha'
@@ -23,12 +23,9 @@ describe('[Bot] Delete any guild owned guilds', () => {
// RUN DISPATCH CHECK
await bot.events.dispatchRequirements?.(data, shard.id)
bot.events[
data.t.toLowerCase().replace(/_([a-z])/g, function (g) {
return g[1].toUpperCase()
}) as keyof EventHandlers
// @ts-expect-error as any gets removed by linter
]?.(data.d, shard)
const eventName = snakeToCamelCase(data.t)
bot.events[eventName as keyof EventHandlers]?.(data.d as never, shard as never)
},
},
intents: Intents.Guilds,

View File

@@ -0,0 +1,3 @@
{
"extends": "tsconfig/test.json"
}

View File

@@ -1,8 +1,3 @@
{
"extends": "tsconfig/base.json",
"compilerOptions": {
"outDir": "./dist"
},
"include": ["./src/**/*.ts", "./src/**/*.tsx"],
"exclude": ["node_modules", "dist", "test", "tests"]
"extends": "tsconfig/base.json"
}

View File

@@ -1,5 +0,0 @@
{
"extends": "tsconfig/test.json",
"include": ["tests"],
"exclude": ["node_modules", "dist", "src"]
}

View File

@@ -26,7 +26,7 @@
"test:deno-unit": "swc --strip-leading-paths tests --delete-dir-on-start --out-dir denoTestsDist && node ../../scripts/fixDenoTestExtension.js && deno test -A --import-map ../../denoImportMap.json denoTestsDist",
"test:unit:watch": "mocha --no-warnings --watch --parallel 'tests/**/*.spec.ts'",
"test:type": "tsc --noEmit",
"test:test-type": "tsc --project tsconfig.test.json"
"test:test-type": "tsc --project tests/tsconfig.json"
},
"dependencies": {
"@discordeno/bot": "19.0.0-beta.1",
@@ -51,6 +51,6 @@
"sinon": "^17.0.1",
"ts-node": "^10.9.2",
"tsconfig": "*",
"typescript": "5.4.5"
"typescript": "^5.5.2"
}
}

View File

@@ -0,0 +1,3 @@
{
"extends": "tsconfig/test.json"
}

View File

@@ -1,8 +1,3 @@
{
"extends": "tsconfig/base.json",
"compilerOptions": {
"outDir": "./dist"
},
"include": ["./src/**/*.ts", "./src/**/*.tsx"],
"exclude": ["node_modules", "dist", "test", "tests"]
"extends": "tsconfig/base.json"
}

View File

@@ -1,5 +0,0 @@
{
"extends": "tsconfig/test.json",
"include": ["tests"],
"exclude": ["node_modules", "dist", "src"]
}

View File

@@ -15,7 +15,7 @@
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-require-extensions": "^0.1.3",
"prettier": "^3.2.5",
"typescript": "5.4.5"
"typescript": "^5.5.2"
},
"publishConfig": {
"access": "public"

View File

@@ -26,7 +26,7 @@
"test:unit:watch": "mocha --no-warnings --watch --parallel 'tests/unit/**/*.spec.ts'",
"test:integration": "c8 --r lcov mocha --no-warnings 'tests/integration/**/*.spec.ts' && node ../../scripts/coveragePathFixing.js gateway",
"test:type": "tsc --noEmit",
"test:test-type": "tsc --project tsconfig.test.json"
"test:test-type": "tsc --project tests/tsconfig.json"
},
"dependencies": {
"@discordeno/types": "19.0.0-beta.1",
@@ -49,7 +49,7 @@
"sinon": "^17.0.1",
"ts-node": "^10.9.2",
"tsconfig": "*",
"typescript": "5.4.5",
"typescript": "^5.5.2",
"uWebSockets.js": "https://github.com/uNetworking/uWebSockets.js.git#commit=42c9c0d5d31f46ca4115dc75672b0037ec970f28"
}
}

View File

@@ -1,10 +1,17 @@
import { Intents } from '@discordeno/types'
import uWS from 'uWebSockets.js'
import { createGatewayManager, ShardSocketCloseCodes } from '../../src/index.js'
import { ShardSocketCloseCodes, createGatewayManager, type GatewayManager } from '../../src/index.js'
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
const createGatewayManagerWithPort = (port: number) =>
createGatewayManager({
/**
* This value needs to be AT LEAST `1017`
*
* The reason for this is because the calculation in Shard.calculateSafeRequests will return 0 not allowing any sort of message to the websocket server.
* Discord uses a way higher number for this value, but during this test we lower it since it would be annoying and useless make the test last 40+ seconds to test the heartbeat, but to make this work it needs to be at least 1017 so that calculateSafeRequests return 2 allowing for the shard to send messages.
*/
const heartbeatInterval = 1050
function createGatewayManagerWithPort(port: number): GatewayManager {
return createGatewayManager({
connection: {
url: `ws://localhost:${port}`,
shards: 1,
@@ -20,22 +27,22 @@ const createGatewayManagerWithPort = (port: number) =>
intents: Intents.Guilds,
events: {},
})
}
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
const createUws = async (options: {
async function createUws(options: {
onOpen?: () => any
onMessage?: (message: any) => any
onClose?: (code: number, message: string) => any
closing?: boolean
}) => {
}): Promise<{ port: number; uwsToken: uWS.us_listen_socket }> {
options.onOpen ??= () => {}
options.onMessage ??= (message: any) => {}
options.onClose ??= (code: number, message: string) => {}
options.closing ??= false
return await new Promise<{ port: number; uwsToken: any }>((resolve, reject) => {
return await new Promise<{ port: number; uwsToken: uWS.us_listen_socket }>((resolve, reject) => {
let port = 0
let uwsToken = 0
uWS
.App()
.ws('/*', {
@@ -51,7 +58,7 @@ const createUws = async (options: {
JSON.stringify({
op: 10,
d: {
heartbeat_interval: 1017,
heartbeat_interval: heartbeatInterval,
},
}),
)
@@ -118,10 +125,13 @@ const createUws = async (options: {
if (!token) {
reject(new Error())
}
// retrieve listening port
uwsToken = token
port = uWS.us_socket_local_port(token)
resolve({ port, uwsToken })
port = uWS.us_socket_local_port(token as uWS.us_listen_socket)
resolve({
port,
uwsToken: token,
})
})
})
}
@@ -146,7 +156,7 @@ describe('gateway', () => {
let resolveHeartbeat: () => void
let resolveConnected: () => void
const connected = new Promise<void>((resolve) => (resolveConnected = resolve))
const Heartbeated = new Promise<void>((resolve) => (resolveHeartbeat = resolve))
const heartbeated = new Promise<void>((resolve) => (resolveHeartbeat = resolve))
const uwsOptions = {
onOpen: resolveConnected!,
onMessage: (message: any) => {
@@ -159,10 +169,12 @@ describe('gateway', () => {
const gateway = createGatewayManagerWithPort(port)
await gateway.spawnShards()
await connected
const timeout = setTimeout(() => {
throw new Error('Not heartbeat in time')
}, 1017)
await Heartbeated
}, heartbeatInterval)
await heartbeated
clearTimeout(timeout)
uwsOptions.closing = true
await gateway.shutdown(ShardSocketCloseCodes.Shutdown, 'User requested bot stop')

View File

@@ -0,0 +1,3 @@
{
"extends": "tsconfig/test.json"
}

View File

@@ -1 +0,0 @@
export {}

View File

@@ -1,8 +1,3 @@
{
"extends": "tsconfig/base.json",
"compilerOptions": {
"outDir": "./dist"
},
"include": ["./src/**/*.ts", "./src/**/*.tsx"],
"exclude": ["node_modules", "dist", "test", "tests"]
"extends": "tsconfig/base.json"
}

View File

@@ -1,5 +0,0 @@
{
"extends": "tsconfig/test.json",
"include": ["tests"],
"exclude": ["node_modules", "dist", "src"]
}

View File

@@ -27,12 +27,11 @@
"test:e2e": "c8 --r lcov mocha --exit --no-warnings --jobs 1 --t 30000 'tests/e2e/**/*.spec.ts' && node ../../scripts/coveragePathFixing.js rest",
"test:unit:watch": "mocha --no-warnings --watch --parallel 'tests/unit/**/*.spec.ts'",
"test:type": "tsc --noEmit",
"test:test-type": "tsc --project tsconfig.test.json"
"test:test-type": "tsc --project tests/tsconfig.json"
},
"dependencies": {
"@discordeno/types": "19.0.0-beta.1",
"@discordeno/utils": "19.0.0-beta.1",
"dotenv": "^16.4.5"
"@discordeno/utils": "19.0.0-beta.1"
},
"devDependencies": {
"@swc/cli": "^0.3.9",
@@ -45,13 +44,13 @@
"c8": "^9.1.0",
"chai": "^5.1.1",
"chai-as-promised": "^7.1.1",
"dotenv": "^16.4.5",
"eslint": "^8.57.0",
"eslint-config-discordeno": "*",
"mocha": "^10.5.1",
"sinon": "^17.0.1",
"ts-node": "^10.9.2",
"tsconfig": "*",
"typescript": "5.4.5",
"why-is-node-running": "^2.2.2"
"typescript": "^5.5.2"
}
}

View File

@@ -1,26 +1,26 @@
import type { Camelize, DiscordChannel } from '@discordeno/types'
import { AutoModerationActionType, AutoModerationEventTypes, AutoModerationTriggerTypes } from '@discordeno/types'
import { expect } from 'chai'
import { e2ecache, rest } from './utils.js'
import { e2eCache, rest } from './utils.js'
before(async () => {
if (!e2ecache.guild) {
e2ecache.guild = await rest.createGuild({
if (!e2eCache.guild) {
e2eCache.guild = await rest.createGuild({
name: 'Discordeno-test',
})
}
})
after(async () => {
if (e2ecache.guild.id && !e2ecache.deletedGuild) {
e2ecache.deletedGuild = true
await rest.deleteGuild(e2ecache.guild.id)
if (e2eCache.guild.id && !e2eCache.deletedGuild) {
e2eCache.deletedGuild = true
await rest.deleteGuild(e2eCache.guild.id)
}
})
describe('Run automod tests', async () => {
it('Create a MessageSend rule for Keyword with BlockMessage action.', async () => {
const rule = await rest.createAutomodRule(e2ecache.guild.id, {
const rule = await rest.createAutomodRule(e2eCache.guild.id, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
@@ -36,7 +36,7 @@ describe('Run automod tests', async () => {
expect(rule.id).to.be.exist
const fetchedRule = await rest.getAutomodRule(e2ecache.guild.id, rule.id)
const fetchedRule = await rest.getAutomodRule(e2eCache.guild.id, rule.id)
expect(fetchedRule.id).to.be.exist
expect(fetchedRule.name).to.equal(rule.name)
@@ -47,11 +47,11 @@ describe('Run automod tests', async () => {
expect(fetchedRule.actions[0]).to.be.exist
expect(fetchedRule.actions[0].type).to.equal(AutoModerationActionType.BlockMessage)
await rest.deleteAutomodRule(e2ecache.guild.id, rule.id)
await rest.deleteAutomodRule(e2eCache.guild.id, rule.id)
})
it('Create a MessageSend rule for Keyword with Timeout action.', async () => {
const rule = await rest.createAutomodRule(e2ecache.guild.id, {
const rule = await rest.createAutomodRule(e2eCache.guild.id, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
@@ -70,7 +70,7 @@ describe('Run automod tests', async () => {
expect(rule.id).to.be.exist
const fetchedRule = await rest.getAutomodRule(e2ecache.guild.id, rule.id)
const fetchedRule = await rest.getAutomodRule(e2eCache.guild.id, rule.id)
expect(fetchedRule.id).to.be.exist
expect(fetchedRule.name).to.equal(rule.name)
@@ -82,11 +82,11 @@ describe('Run automod tests', async () => {
expect(fetchedRule.actions[0].type).to.equal(AutoModerationActionType.Timeout)
expect(fetchedRule.actions[0].metadata?.durationSeconds).to.equal(10)
await rest.deleteAutomodRule(e2ecache.guild.id, rule.id)
await rest.deleteAutomodRule(e2eCache.guild.id, rule.id)
})
it('Create a MessageSend rule for Keyword with BlockMessage & Timeout action.', async () => {
const rule = await rest.createAutomodRule(e2ecache.guild.id, {
const rule = await rest.createAutomodRule(e2eCache.guild.id, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
@@ -108,14 +108,14 @@ describe('Run automod tests', async () => {
expect(rule.id).to.be.exist
await rest.deleteAutomodRule(e2ecache.guild.id, rule.id)
await rest.deleteAutomodRule(e2eCache.guild.id, rule.id)
})
describe('with a channel', () => {
let channel: Camelize<DiscordChannel>
beforeEach(async () => {
channel = await rest.createChannel(e2ecache.guild.id, {
channel = await rest.createChannel(e2eCache.guild.id, {
name: 'test',
})
})
@@ -125,7 +125,7 @@ describe('Run automod tests', async () => {
})
it('Create a MessageSend rule for Keyword with SendAlertMessage action.', async () => {
const rule = await rest.createAutomodRule(e2ecache.guild.id, {
const rule = await rest.createAutomodRule(e2eCache.guild.id, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
@@ -144,7 +144,7 @@ describe('Run automod tests', async () => {
expect(rule.id).to.be.exist
const fetchedRule = await rest.getAutomodRule(e2ecache.guild.id, rule.id)
const fetchedRule = await rest.getAutomodRule(e2eCache.guild.id, rule.id)
expect(fetchedRule.id).to.be.exist
expect(fetchedRule.name).to.equal(rule.name)
@@ -156,11 +156,11 @@ describe('Run automod tests', async () => {
expect(fetchedRule.actions[0].type).to.equal(AutoModerationActionType.SendAlertMessage)
expect(fetchedRule.actions[0].metadata?.channelId).to.equal(channel.id)
await rest.deleteAutomodRule(e2ecache.guild.id, rule.id)
await rest.deleteAutomodRule(e2eCache.guild.id, rule.id)
})
it('Create a MessageSend rule for Keyword with SendAlertMessage & Timeout action.', async () => {
const rule = await rest.createAutomodRule(e2ecache.guild.id, {
const rule = await rest.createAutomodRule(e2eCache.guild.id, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
@@ -185,11 +185,11 @@ describe('Run automod tests', async () => {
expect(rule.id).to.be.exist
await rest.deleteAutomodRule(e2ecache.guild.id, rule.id)
await rest.deleteAutomodRule(e2eCache.guild.id, rule.id)
})
it('Create a MessageSend rule for Keyword with BlockMessage & SendAlertMessage & Timeout action.', async () => {
const rule = await rest.createAutomodRule(e2ecache.guild.id, {
const rule = await rest.createAutomodRule(e2eCache.guild.id, {
name: 'test',
eventType: AutoModerationEventTypes.MessageSend,
triggerType: AutoModerationTriggerTypes.Keyword,
@@ -218,7 +218,7 @@ describe('Run automod tests', async () => {
expect(rule.id).to.be.exist
// Get the rule again to make sure it was created correctly
const fetchedRule = await rest.getAutomodRule(e2ecache.guild.id, rule.id)
const fetchedRule = await rest.getAutomodRule(e2eCache.guild.id, rule.id)
expect(fetchedRule.id).to.be.exist
expect(fetchedRule.name).to.equal(rule.name)
expect(fetchedRule.eventType).to.equal(AutoModerationEventTypes.MessageSend)
@@ -234,7 +234,7 @@ describe('Run automod tests', async () => {
expect(fetchedRule.actions[1].type).to.equal(AutoModerationActionType.SendAlertMessage)
expect(fetchedRule.actions[2].type).to.equal(AutoModerationActionType.Timeout)
await rest.deleteAutomodRule(e2ecache.guild.id, rule.id)
await rest.deleteAutomodRule(e2eCache.guild.id, rule.id)
})
})
})

View File

@@ -3,28 +3,28 @@ import { urlToBase64 } from '@discordeno/utils'
import { use as chaiUse, expect } from 'chai'
import chaiAsPromised from 'chai-as-promised'
import { after, afterEach, before, beforeEach, describe, it } from 'mocha'
import { e2ecache, rest } from './utils.js'
import { e2eCache, rest } from './utils.js'
chaiUse(chaiAsPromised)
before(async () => {
if (!e2ecache.guild) {
e2ecache.guild = await rest.createGuild({
if (!e2eCache.guild) {
e2eCache.guild = await rest.createGuild({
name: 'Discordeno-test',
})
}
})
after(async () => {
if (e2ecache.guild.id && !e2ecache.deletedGuild) {
e2ecache.deletedGuild = true
await rest.deleteGuild(e2ecache.guild.id)
if (e2eCache.guild.id && !e2eCache.deletedGuild) {
e2eCache.deletedGuild = true
await rest.deleteGuild(e2eCache.guild.id)
}
})
describe('Create and delete emojis', () => {
it('create an emoji', async () => {
const emoji = await rest.createEmoji(e2ecache.guild.id, {
const emoji = await rest.createEmoji(e2eCache.guild.id, {
name: 'blamewolf',
image: await urlToBase64('https://cdn.discordapp.com/emojis/814955268123000832.png'),
roles: [],
@@ -32,12 +32,12 @@ describe('Create and delete emojis', () => {
// Assertions
expect(emoji.id).to.be.exist
await rest.deleteEmoji(e2ecache.guild.id, emoji.id!)
await rest.deleteEmoji(e2eCache.guild.id, emoji.id!)
})
// delete an emoji without a reason
it('delete an emoji without a reason', async () => {
const emoji = await rest.createEmoji(e2ecache.guild.id, {
const emoji = await rest.createEmoji(e2eCache.guild.id, {
name: 'blamewolf',
image: await urlToBase64('https://cdn.discordapp.com/emojis/814955268123000832.png'),
roles: [],
@@ -46,14 +46,14 @@ describe('Create and delete emojis', () => {
// Assertions
expect(emoji.id).to.be.exist
await rest.deleteEmoji(e2ecache.guild.id, emoji.id!)
await rest.deleteEmoji(e2eCache.guild.id, emoji.id!)
await expect(rest.getEmoji(e2ecache.guild.id, emoji.id!)).to.eventually.rejected
await expect(rest.getEmoji(e2eCache.guild.id, emoji.id!)).to.eventually.rejected
})
// delete an emoji with a reason
it('delete an emoji with a reason', async () => {
const emoji = await rest.createEmoji(e2ecache.guild.id, {
const emoji = await rest.createEmoji(e2eCache.guild.id, {
name: 'blamewolf',
image: await urlToBase64('https://cdn.discordapp.com/emojis/814955268123000832.png'),
roles: [],
@@ -62,9 +62,9 @@ describe('Create and delete emojis', () => {
// Assertions
expect(emoji.id).to.be.exist
await rest.deleteEmoji(e2ecache.guild.id, emoji.id!, 'with a reason')
await rest.deleteEmoji(e2eCache.guild.id, emoji.id!, 'with a reason')
await expect(rest.getEmoji(e2ecache.guild.id, emoji.id!)).to.eventually.rejected
await expect(rest.getEmoji(e2eCache.guild.id, emoji.id!)).to.eventually.rejected
})
})
@@ -72,7 +72,7 @@ describe('Edit and get emojis', () => {
let emoji: Camelize<DiscordEmoji> & { id: string }
beforeEach(async () => {
emoji = (await rest.createEmoji(e2ecache.guild.id, {
emoji = (await rest.createEmoji(e2eCache.guild.id, {
name: 'blamewolf',
image: await urlToBase64('https://cdn.discordapp.com/emojis/814955268123000832.png'),
roles: [],
@@ -80,49 +80,49 @@ describe('Edit and get emojis', () => {
})
afterEach(async () => {
await rest.deleteEmoji(e2ecache.guild.id, emoji.id)
await rest.deleteEmoji(e2eCache.guild.id, emoji.id)
})
// edit an emoji name
it('Edit an emoji name', async () => {
await rest.editEmoji(e2ecache.guild.id, emoji.id, {
await rest.editEmoji(e2eCache.guild.id, emoji.id, {
name: 'edited',
})
const edited = await rest.getEmoji(e2ecache.guild.id, emoji.id)
const edited = await rest.getEmoji(e2eCache.guild.id, emoji.id)
expect(edited.name).to.equal('edited')
})
// edit an emoji roles
it("Edit an emoji's roles", async () => {
const role = await rest.createRole(e2ecache.guild.id, {
const role = await rest.createRole(e2eCache.guild.id, {
name: 'dd-test-emoji',
})
await rest.editEmoji(e2ecache.guild.id, emoji.id, {
await rest.editEmoji(e2eCache.guild.id, emoji.id, {
roles: [role.id],
})
const edited = await rest.getEmoji(e2ecache.guild.id, emoji.id)
const edited = await rest.getEmoji(e2eCache.guild.id, emoji.id)
expect(edited.roles?.length).to.equal(1)
})
// get an emoji
it('get an emoji', async () => {
const exists = await rest.getEmoji(e2ecache.guild.id, emoji.id)
const exists = await rest.getEmoji(e2eCache.guild.id, emoji.id)
expect(exists.id).to.be.exist
expect(emoji.id).to.equal(exists.id)
})
it('get all guild emojis', async () => {
await rest.createEmoji(e2ecache.guild.id, {
await rest.createEmoji(e2eCache.guild.id, {
name: 'blamewolf2',
image: await urlToBase64('https://cdn.discordapp.com/emojis/814955268123000832.png'),
roles: [],
})
const exists = await rest.getEmojis(e2ecache.guild.id)
const exists = await rest.getEmojis(e2eCache.guild.id)
expect(exists.length).to.greaterThan(1)
})
})

View File

@@ -2,21 +2,21 @@ import { ChannelTypes } from '@discordeno/types'
import { use as chaiUse, expect } from 'chai'
import chaiAsPromised from 'chai-as-promised'
import { describe, it } from 'mocha'
import { e2ecache, rest } from './utils.js'
import { e2eCache, rest } from './utils.js'
chaiUse(chaiAsPromised)
before(async () => {
if (!e2ecache.guild) {
e2ecache.guild = await rest.createGuild({
if (!e2eCache.guild) {
e2eCache.guild = await rest.createGuild({
name: 'Discordeno-test',
})
}
})
after(async () => {
if (e2ecache.guild.id && !e2ecache.deletedGuild) {
e2ecache.deletedGuild = true
await rest.deleteGuild(e2ecache.guild.id)
if (e2eCache.guild.id && !e2eCache.deletedGuild) {
e2eCache.deletedGuild = true
await rest.deleteGuild(e2eCache.guild.id)
}
})
@@ -25,7 +25,7 @@ describe('Manage Guilds', async () => {
const guild = await rest.createGuild({
name: 'Discordeno-test',
})
expect(e2ecache.guild.id).to.be.exist
expect(e2eCache.guild.id).to.be.exist
await rest.deleteGuild(guild.id)
// Make sure the guild was deleted
const deleted = await rest.getGuild(guild.id).catch(() => undefined)
@@ -33,31 +33,31 @@ describe('Manage Guilds', async () => {
})
it('Get a guild', async () => {
const exists = await rest.getGuild(e2ecache.guild.id)
const exists = await rest.getGuild(e2eCache.guild.id)
expect(exists).to.be.exist
expect(exists.id).to.be.exist
expect(exists.name).to.equal(e2ecache.guild.name)
expect(exists.name).to.equal(e2eCache.guild.name)
})
it('AFK channel', async () => {
const voiceChannel = await rest.createChannel(e2ecache.guild.id, {
const voiceChannel = await rest.createChannel(e2eCache.guild.id, {
name: 'edit-guild-test',
type: ChannelTypes.GuildVoice,
})
expect(voiceChannel.id).to.be.exist
const edited = await rest.editGuild(e2ecache.guild.id, {
const edited = await rest.editGuild(e2eCache.guild.id, {
name: 'Discordeno-test-edited',
afkChannelId: voiceChannel.id,
// afkTimeout: 5,
})
expect(edited.name).to.equal('Discordeno-test-edited')
expect(e2ecache.guild.afkChannelId).to.not.equal(voiceChannel.id)
expect(e2eCache.guild.afkChannelId).to.not.equal(voiceChannel.id)
expect(edited.afkChannelId).to.equal(voiceChannel.id)
// expect(guild.afkTimeout).to.equal(0);
// expect(edited.afkTimeout).to.equal(5);
const edited2 = await rest.editGuild(e2ecache.guild.id, { afkChannelId: null })
const edited2 = await rest.editGuild(e2eCache.guild.id, { afkChannelId: null })
expect(edited.afkChannelId).to.not.equal(edited2.afkChannelId)
// Use boolean to check both undefined or null
expect(!!edited2.afkChannelId).to.equal(false)
@@ -70,48 +70,48 @@ describe('Manage Guilds', async () => {
// });
it('Get audit logs', async () => {
const auditLogs = await rest.getAuditLog(e2ecache.guild.id, { limit: 1 })
const auditLogs = await rest.getAuditLog(e2eCache.guild.id, { limit: 1 })
expect(auditLogs.auditLogEntries.length).to.be.exist
})
// Get available voice regions
it('Get available voice regions', async () => {
const regions = await rest.getVoiceRegions(e2ecache.guild.id)
const regions = await rest.getVoiceRegions(e2eCache.guild.id)
expect(regions.length).to.be.exist
})
it('Banning members', async () => {
await rest.banMember(
e2ecache.guild.id,
e2eCache.guild.id,
'379643682984296448',
{
deleteMessageSeconds: 604800,
},
'Blame Wolf',
)
const fetchedBan = await rest.getBan(e2ecache.guild.id, '379643682984296448')
const fetchedBan = await rest.getBan(e2eCache.guild.id, '379643682984296448')
// Assertions
expect(fetchedBan).to.be.exist
expect(fetchedBan.user.id).to.equal('379643682984296448')
await rest.banMember(e2ecache.guild.id, '416477607966670869')
const fetchedBans = await rest.getBans(e2ecache.guild.id)
await rest.banMember(e2eCache.guild.id, '416477607966670869')
const fetchedBans = await rest.getBans(e2eCache.guild.id)
// Assertions
expect(fetchedBans).to.be.exist
expect(fetchedBans.length).to.greaterThanOrEqual(2)
await rest.unbanMember(e2ecache.guild.id, '416477607966670869')
await rest.unbanMember(e2ecache.guild.id, '379643682984296448')
await rest.unbanMember(e2eCache.guild.id, '416477607966670869')
await rest.unbanMember(e2eCache.guild.id, '379643682984296448')
const unbanned = await rest.getBans(e2ecache.guild.id)
const unbanned = await rest.getBans(e2eCache.guild.id)
expect(unbanned.length).to.equal(0)
})
// Get vanity URL
it('Get vanity URL', async () => {
await expect(rest.getVanityUrl(e2ecache.guild.id)).to.eventually.rejected
await expect(rest.getVanityUrl(e2eCache.guild.id)).to.eventually.rejected
})
// Get a welcome screen

View File

@@ -1,33 +1,33 @@
import { use as chaiUse, expect } from 'chai'
import chaiAsPromised from 'chai-as-promised'
import { describe, it } from 'mocha'
import { e2ecache, rest } from './utils.js'
import { e2eCache, rest } from './utils.js'
chaiUse(chaiAsPromised)
before(async () => {
if (!e2ecache.guild) {
e2ecache.guild = await rest.createGuild({
if (!e2eCache.guild) {
e2eCache.guild = await rest.createGuild({
name: 'Discordeno-test',
})
}
})
after(async () => {
if (e2ecache.guild.id && !e2ecache.deletedGuild) {
e2ecache.deletedGuild = true
await rest.deleteGuild(e2ecache.guild.id)
if (e2eCache.guild.id && !e2eCache.deletedGuild) {
e2eCache.deletedGuild = true
await rest.deleteGuild(e2eCache.guild.id)
}
})
describe('Member tests', () => {
it("Fetches the bot and compares the bot's id with the fetched member's id", async () => {
const member = await rest.getMember(e2ecache.communityGuildId, rest.applicationId)
const member = await rest.getMember(e2eCache.communityGuildId, rest.applicationId)
expect(member?.user.id).to.exist
expect(member?.user.id).to.equal(rest.applicationId.toString())
})
it('Gets a member list and checks if the bot is in the member list', async () => {
const members = await rest.getMembers(e2ecache.communityGuildId, {
const members = await rest.getMembers(e2eCache.communityGuildId, {
limit: 10,
})
expect(members.some((m) => m.user.id === rest.applicationId.toString())).to.equal(true)
@@ -35,20 +35,20 @@ describe('Member tests', () => {
// fetch a single member by id
it('Fetch a single member by id', async () => {
const member = await rest.getMember(e2ecache.communityGuildId, rest.applicationId)
const member = await rest.getMember(e2eCache.communityGuildId, rest.applicationId)
expect(member?.user.id).to.exist
})
it("Edit a bot's nickname", async () => {
const nick = 'lts20050703'
const member = await rest.editBotMember(e2ecache.communityGuildId, {
const member = await rest.editBotMember(e2eCache.communityGuildId, {
nick,
})
expect(member.nick).to.equal(nick)
// Change nickname back
const member2 = await rest.editBotMember(e2ecache.communityGuildId, {
const member2 = await rest.editBotMember(e2eCache.communityGuildId, {
nick: null,
})
expect(member2.nick).to.null

View File

@@ -1,26 +1,26 @@
import { processReactionString, urlToBase64 } from '@discordeno/utils'
import { expect } from 'chai'
import { describe, it } from 'mocha'
import { e2ecache, rest } from './utils.js'
import { e2eCache, rest } from './utils.js'
before(async () => {
if (!e2ecache.guild) {
e2ecache.guild = await rest.createGuild({
if (!e2eCache.guild) {
e2eCache.guild = await rest.createGuild({
name: 'Discordeno-test',
})
}
})
after(async () => {
if (e2ecache.guild.id && !e2ecache.deletedGuild) {
e2ecache.deletedGuild = true
await rest.deleteGuild(e2ecache.guild.id)
if (e2eCache.guild.id && !e2eCache.deletedGuild) {
e2eCache.deletedGuild = true
await rest.deleteGuild(e2eCache.guild.id)
}
})
describe('Send a message', () => {
it('With content', async () => {
const message = await rest.sendMessage(e2ecache.channel.id, { content: 'testing rate limit manager' })
const message = await rest.sendMessage(e2eCache.channel.id, { content: 'testing rate limit manager' })
expect(message.content).to.be.equal('testing rate limit manager')
const edited = await rest.editMessage(message.channelId, message.id, { content: 'testing rate limit manager edited' })
@@ -36,7 +36,7 @@ describe('Send a message', () => {
expect(image).to.not.be.undefined
if (!image) throw new Error('Was not able to fetch the image.')
const message = await rest.sendMessage(e2ecache.channel.id, { files: [{ blob: image, name: 'gamer' }] })
const message = await rest.sendMessage(e2eCache.channel.id, { files: [{ blob: image, name: 'gamer' }] })
expect(message.attachments.length).to.be.greaterThan(0)
const [attachment] = message.attachments
@@ -46,7 +46,7 @@ describe('Send a message', () => {
it('With a file attachment', async () => {
const txtFile = new Blob(['hello world'], { type: 'text/plain' })
const fileMsg = await rest.sendMessage(e2ecache.channel.id, {
const fileMsg = await rest.sendMessage(e2eCache.channel.id, {
content: '222',
files: [
{
@@ -64,7 +64,7 @@ describe('Send a message', () => {
const txtFile2 = new Blob(['hello world edit'], { type: 'text/plain' })
const edited = await rest.editMessage(e2ecache.channel.id, fileMsg.id, {
const edited = await rest.editMessage(e2eCache.channel.id, fileMsg.id, {
content: '222 edit',
files: [
{
@@ -84,7 +84,7 @@ describe('Send a message', () => {
describe('Manage reactions', async () => {
it('Add and delete a unicode reaction', async () => {
const reactionChannel = await rest.createChannel(e2ecache.guild.id, { name: 'reactions' })
const reactionChannel = await rest.createChannel(e2eCache.guild.id, { name: 'reactions' })
const message = await rest.sendMessage(reactionChannel.id, { content: 'add reaction test' })
await rest.addReaction(message.channelId, message.id, '📙')
@@ -98,13 +98,13 @@ describe('Manage reactions', async () => {
})
it('Add and delete a custom reaction', async () => {
const emoji = await rest.createEmoji(e2ecache.guild.id, {
const emoji = await rest.createEmoji(e2eCache.guild.id, {
name: 'discordeno',
image: await urlToBase64('https://cdn.discordapp.com/emojis/785403373817823272.webp?size=96'),
})
const emojiCode = `<:${emoji.name!}:${emoji.id!}>`
const reactionChannel = await rest.createChannel(e2ecache.guild.id, { name: 'reactions' })
const reactionChannel = await rest.createChannel(e2eCache.guild.id, { name: 'reactions' })
const message = await rest.sendMessage(reactionChannel.id, { content: 'add reaction test' })
await rest.addReaction(message.channelId, message.id, emojiCode)
@@ -121,13 +121,13 @@ describe('Manage reactions', async () => {
})
it('Add several reactions with random order and delete all of them', async () => {
const emoji = await rest.createEmoji(e2ecache.guild.id, {
const emoji = await rest.createEmoji(e2eCache.guild.id, {
name: 'discordeno',
image: await urlToBase64('https://cdn.discordapp.com/emojis/785403373817823272.webp?size=96'),
})
const emojiCode = `<:${emoji.name!}:${emoji.id!}>`
const reactionChannel = await rest.createChannel(e2ecache.guild.id, { name: 'reactions' })
const reactionChannel = await rest.createChannel(e2eCache.guild.id, { name: 'reactions' })
const message = await rest.sendMessage(reactionChannel.id, { content: 'add reaction test' })
await rest.addReactions(message.channelId, message.id, [emojiCode, '📙'])
@@ -141,13 +141,13 @@ describe('Manage reactions', async () => {
})
it('Add several reactions in an order and delete emoji reaction', async () => {
const emoji = await rest.createEmoji(e2ecache.guild.id, {
const emoji = await rest.createEmoji(e2eCache.guild.id, {
name: 'discordeno',
image: await urlToBase64('https://cdn.discordapp.com/emojis/785403373817823272.webp?size=96'),
})
const emojiCode = `<:${emoji.name!}:${emoji.id!}>`
const reactionChannel = await rest.createChannel(e2ecache.guild.id, { name: 'reactions' })
const reactionChannel = await rest.createChannel(e2eCache.guild.id, { name: 'reactions' })
const message = await rest.sendMessage(reactionChannel.id, { content: 'add reaction test' })
await rest.addReactions(message.channelId, message.id, [emojiCode, '📙'], true)
@@ -167,7 +167,7 @@ describe('Manage reactions', async () => {
describe('Manage pins', () => {
it('Pin, get, and unpin messages', async () => {
const channel = await rest.createChannel(e2ecache.guild.id, { name: 'pinning' })
const channel = await rest.createChannel(e2eCache.guild.id, { name: 'pinning' })
const message = await rest.sendMessage(channel.id, { content: 'pin me' })
const message2 = await rest.sendMessage(channel.id, { content: 'pin me 2' })
@@ -188,7 +188,7 @@ describe('Manage pins', () => {
describe('Rate limit manager testing', () => {
it('Send 10 messages to 1 channel', async () => {
const channel = await rest.createChannel(e2ecache.guild.id, { name: 'rate-limit-1' })
const channel = await rest.createChannel(e2eCache.guild.id, { name: 'rate-limit-1' })
await Promise.all(
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map(async (i) => {
await rest.sendMessage(channel.id, { content: `10 messages to 1 channel testing rate limit manager ${i}` })
@@ -199,7 +199,7 @@ describe('Rate limit manager testing', () => {
it('Send 10 messages to 10 channels', async () => {
await Promise.all(
[...Array(10).keys()].map(async () => {
const channel = await rest.createChannel(e2ecache.guild.id, { name: 'rate-limit-x' })
const channel = await rest.createChannel(e2eCache.guild.id, { name: 'rate-limit-x' })
await Promise.all(
[...Array(10).keys()].map(async (_, index) => {

View File

@@ -1,9 +1,9 @@
import { describe } from 'mocha'
import { e2ecache, rest } from './utils.js'
import { e2eCache, rest } from './utils.js'
describe('Typings', () => {
it('Trigger Typing Indication', async () => {
const channel = await rest.createChannel(e2ecache.guild.id, { name: 'typing' })
const channel = await rest.createChannel(e2eCache.guild.id, { name: 'typing' })
await rest.triggerTypingIndicator(channel.id)
})
})

View File

@@ -1,19 +1,19 @@
import { calculateBits } from '@discordeno/utils'
import { expect } from 'chai'
import { before, describe, it } from 'mocha'
import { e2ecache, rest } from './utils.js'
import { e2eCache, rest } from './utils.js'
before(async () => {
if (!e2ecache.guild) {
e2ecache.guild = await rest.createGuild({
if (!e2eCache.guild) {
e2eCache.guild = await rest.createGuild({
name: 'Discordeno-test',
})
}
})
after(async () => {
if (e2ecache.guild.id && !e2ecache.deletedGuild) {
await rest.deleteGuild(e2ecache.guild.id)
if (e2eCache.guild.id && !e2eCache.deletedGuild) {
await rest.deleteGuild(e2eCache.guild.id)
}
})
@@ -21,7 +21,7 @@ describe('Role tests', async () => {
// Create a role with a reason
it('Create a role with a reason', async () => {
const role = await rest.createRole(
e2ecache.guild?.id,
e2eCache.guild?.id,
{
name: `test role ${Date.now()}`,
},
@@ -32,7 +32,7 @@ describe('Role tests', async () => {
// Create a role without a reason
it('Create a role without a reason', async () => {
const role = await rest.createRole(e2ecache.guild.id, {
const role = await rest.createRole(e2eCache.guild.id, {
name: `test role ${Date.now()}`,
})
expect(role.id).to.exist
@@ -40,21 +40,21 @@ describe('Role tests', async () => {
// Delete a role
it('Delete a role', async () => {
const role = await rest.createRole(e2ecache.guild.id, {
const role = await rest.createRole(e2eCache.guild.id, {
name: `test role ${Date.now()}`,
})
await rest.deleteRole(e2ecache.guild.id, role.id)
const deletedRoles = await rest.getRoles(e2ecache.guild.id)
await rest.deleteRole(e2eCache.guild.id, role.id)
const deletedRoles = await rest.getRoles(e2eCache.guild.id)
expect(deletedRoles.some((r) => r.id === role.id)).to.equal(false)
})
// Edit a role
it('Edit a role', async () => {
const role = await rest.createRole(e2ecache.guild.id, {
const role = await rest.createRole(e2eCache.guild.id, {
name: `test role ${Date.now()}`,
})
const edited = await rest.editRole(e2ecache.guild.id, role.id, {
const edited = await rest.editRole(e2eCache.guild.id, role.id, {
name: 'test role 4',
color: 0x0000ff,
hoist: true,
@@ -67,11 +67,11 @@ describe('Role tests', async () => {
expect(edited.mentionable).to.equal(true)
expect(edited.permissions.toString()).to.equal(calculateBits(['SEND_MESSAGES', 'VIEW_CHANNEL']))
await rest.editRole(e2ecache.guild.id, role.id, {
await rest.editRole(e2eCache.guild.id, role.id, {
hoist: false,
mentionable: false,
})
const roles = await rest.getRoles(e2ecache.guild.id)
const roles = await rest.getRoles(e2eCache.guild.id)
const unedited = roles.find((r) => r.id === role.id)
expect(unedited?.hoist).to.equal(false)
@@ -79,27 +79,27 @@ describe('Role tests', async () => {
})
it('Add and remove role from user', async () => {
const role = await rest.createRole(e2ecache.guild.id, {
const role = await rest.createRole(e2eCache.guild.id, {
name: `test role ${Date.now()}`,
})
// Assign the role to the user
await rest.addRole(e2ecache.guild.id, rest.applicationId, role.id)
const member = await rest.getMember(e2ecache.guild.id, rest.applicationId)
await rest.addRole(e2eCache.guild.id, rest.applicationId, role.id)
const member = await rest.getMember(e2eCache.guild.id, rest.applicationId)
expect(member?.roles.includes(role.id)).to.equal(true)
await rest.removeRole(e2ecache.guild.id, rest.applicationId, role.id)
const removed = await rest.getMember(e2ecache.guild.id, rest.applicationId)
await rest.removeRole(e2eCache.guild.id, rest.applicationId, role.id)
const removed = await rest.getMember(e2eCache.guild.id, rest.applicationId)
// console.log('member', member.errors.userId.Errors)
expect(removed?.roles.includes(role.id)).to.equal(false)
// With a reason
await rest.addRole(e2ecache.guild.id, rest.applicationId, role.id, 'test reason')
const member2 = await rest.getMember(e2ecache.guild.id, rest.applicationId)
await rest.addRole(e2eCache.guild.id, rest.applicationId, role.id, 'test reason')
const member2 = await rest.getMember(e2eCache.guild.id, rest.applicationId)
expect(member2?.roles.includes(role.id)).to.equal(true)
await rest.removeRole(e2ecache.guild.id, rest.applicationId, role.id, 'test reason')
const member3 = await rest.getMember(e2ecache.guild.id, rest.applicationId)
await rest.removeRole(e2eCache.guild.id, rest.applicationId, role.id, 'test reason')
const member3 = await rest.getMember(e2eCache.guild.id, rest.applicationId)
expect(member3?.roles.includes(role.id)).to.equal(false)
})
})

View File

@@ -2,21 +2,21 @@ import { StickerFormatTypes } from '@discordeno/types'
import { use as chaiUse, expect } from 'chai'
import chaiAsPromised from 'chai-as-promised'
import { describe, it } from 'mocha'
import { e2ecache, rest } from './utils.js'
import { e2eCache, rest } from './utils.js'
chaiUse(chaiAsPromised)
before(async () => {
if (!e2ecache.guild) {
e2ecache.guild = await rest.createGuild({
if (!e2eCache.guild) {
e2eCache.guild = await rest.createGuild({
name: 'Discordeno-test',
})
}
})
after(async () => {
if (e2ecache.guild.id && !e2ecache.deletedGuild) {
e2ecache.deletedGuild = true
await rest.deleteGuild(e2ecache.guild.id)
if (e2eCache.guild.id && !e2eCache.deletedGuild) {
e2eCache.deletedGuild = true
await rest.deleteGuild(e2eCache.guild.id)
}
})
@@ -28,7 +28,7 @@ describe('Sticker tests', async () => {
})
it('Create, edit, get, and delete guild sticker', async () => {
const sticker = await rest.createGuildSticker(e2ecache.guild.id, {
const sticker = await rest.createGuildSticker(e2eCache.guild.id, {
name: 'sticker name',
description: 'sticker description',
tags: 'sticker tags',
@@ -42,7 +42,7 @@ describe('Sticker tests', async () => {
expect(sticker.description).to.equal('sticker description')
expect(sticker.tags).to.equal('sticker tags')
const channel = await rest.createChannel(e2ecache.guild.id, {
const channel = await rest.createChannel(e2eCache.guild.id, {
name: 'test',
})
const message = await rest.sendMessage(channel.id, {
@@ -53,13 +53,13 @@ describe('Sticker tests', async () => {
expect(message.stickerItems?.[0].id).to.equal(sticker.id)
expect(message.stickerItems?.[0].name).to.equal(sticker.name)
const getSticker = await rest.getGuildSticker(e2ecache.guild.id, sticker.id)
const getSticker = await rest.getGuildSticker(e2eCache.guild.id, sticker.id)
expect(getSticker.name).to.equal('sticker name')
expect(getSticker.description).to.equal('sticker description')
expect(getSticker.tags).to.equal('sticker tags')
const editSticker = await rest.editGuildSticker(e2ecache.guild.id, sticker.id, {
const editSticker = await rest.editGuildSticker(e2eCache.guild.id, sticker.id, {
name: 'sticker name',
description: 'sticker description',
tags: 'sticker tags',
@@ -69,7 +69,7 @@ describe('Sticker tests', async () => {
expect(editSticker.description).to.equal('sticker description')
expect(editSticker.tags).to.equal('sticker tags')
await rest.createGuildSticker(e2ecache.guild.id, {
await rest.createGuildSticker(e2eCache.guild.id, {
name: 'sticker 2',
description: 'sticker 2',
tags: 'sticker tags 2',
@@ -78,10 +78,10 @@ describe('Sticker tests', async () => {
name: 'ddlogo.png',
},
})
const stickers = await rest.getGuildStickers(e2ecache.guild.id)
const stickers = await rest.getGuildStickers(e2eCache.guild.id)
expect(stickers.length).to.greaterThan(1)
await rest.deleteGuildSticker(e2ecache.guild.id, sticker.id)
await expect(rest.getGuildSticker(e2ecache.guild.id, sticker.id)).to.eventually.rejected
await rest.deleteGuildSticker(e2eCache.guild.id, sticker.id)
await expect(rest.getGuildSticker(e2eCache.guild.id, sticker.id)).to.eventually.rejected
})
})

View File

@@ -1,20 +1,20 @@
import { use as chaiUse, expect } from 'chai'
import chaiAsPromised from 'chai-as-promised'
import { describe, it } from 'mocha'
import { e2ecache, rest } from './utils.js'
import { e2eCache, rest } from './utils.js'
chaiUse(chaiAsPromised)
before(async () => {
if (!e2ecache.guild) {
e2ecache.guild = await rest.createGuild({
if (!e2eCache.guild) {
e2eCache.guild = await rest.createGuild({
name: 'Discordeno-test',
})
}
})
after(async () => {
if (e2ecache.guild.id && !e2ecache.deletedGuild) {
await rest.deleteGuild(e2ecache.guild.id)
if (e2eCache.guild.id && !e2eCache.deletedGuild) {
await rest.deleteGuild(e2eCache.guild.id)
}
})

View File

@@ -12,7 +12,7 @@ rest.deleteQueueDelay = 10000
const guild = await rest.createGuild({ name: 'ddenotester' })
const channel = await rest.createChannel(guild.id, { name: 'ddenotestchannel' })
export const e2ecache = {
export const e2eCache = {
guild,
channel,
deletedGuild: false,

View File

@@ -1,27 +1,27 @@
import { use as chaiUse, expect } from 'chai'
import chaiAsPromised from 'chai-as-promised'
import { describe, it } from 'mocha'
import { e2ecache, rest } from './utils.js'
import { e2eCache, rest } from './utils.js'
chaiUse(chaiAsPromised)
before(async () => {
if (!e2ecache.guild) {
e2ecache.guild = await rest.createGuild({
if (!e2eCache.guild) {
e2eCache.guild = await rest.createGuild({
name: 'Discordeno-test',
})
}
})
after(async () => {
if (e2ecache.guild.id && !e2ecache.deletedGuild) {
e2ecache.deletedGuild = true
await rest.deleteGuild(e2ecache.guild.id)
if (e2eCache.guild.id && !e2eCache.deletedGuild) {
e2eCache.deletedGuild = true
await rest.deleteGuild(e2eCache.guild.id)
}
})
describe('Webhook helpers', async () => {
it('Manage webhooks', async () => {
const channel = await rest.createChannel(e2ecache.guild.id, {
const channel = await rest.createChannel(e2eCache.guild.id, {
name: 'wbhook',
})
@@ -76,7 +76,7 @@ describe('Webhook helpers', async () => {
})
it('Manage webhook messages', async () => {
const channel = await rest.createChannel(e2ecache.guild.id, {
const channel = await rest.createChannel(e2eCache.guild.id, {
name: 'wbhook',
})
const webhook = await rest.createWebhook(channel.id, {

View File

@@ -0,0 +1,3 @@
{
"extends": "tsconfig/test.json"
}

View File

@@ -1,8 +1,3 @@
{
"extends": "tsconfig/base.json",
"compilerOptions": {
"outDir": "./dist"
},
"include": ["./src/**/*.ts", "./src/**/*.tsx"],
"exclude": ["node_modules", "dist", "test", "tests"]
"extends": "tsconfig/base.json"
}

View File

@@ -1,5 +0,0 @@
{
"extends": "tsconfig/test.json",
"include": ["tests"],
"exclude": ["node_modules", "dist", "src"]
}

View File

@@ -4,6 +4,9 @@
"compilerOptions": {
"target": "es2022",
"module": "es2022",
"rootDir": "${configDir}/src",
"outDir": "${configDir}/dist",
"tsBuildInfoFile": "${configDir}/dist/.tsbuildinfo",
"composite": false,
"declaration": true,
"declarationMap": true,
@@ -16,11 +19,12 @@
"noUnusedParameters": false,
"preserveWatchOutput": true,
"skipLibCheck": true,
"skipDefaultLibCheck": true,
"strict": true,
"incremental": true,
"resolveJsonModule": true
},
"exclude": ["node_modules", "dist", "tests", "test"],
"include": ["${configDir}/src"],
"ts-node": {
"swc": true,
"esm": true

View File

@@ -1,7 +1,12 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"extends": "./base.json",
"compilerOptions": {
"noEmit": true,
"incremental": false
}
"incremental": false,
"tsBuildInfoFile": null,
"rootDir": null,
"outDir": null,
},
"include": ["${configDir}"],
}

View File

@@ -29,17 +29,14 @@
"devDependencies": {
"@swc/cli": "^0.3.9",
"@swc/core": "^1.4.2",
"@types/chai": "^4.3.11",
"@types/mocha": "^10.0.7",
"@types/node": "^20.11.25",
"@types/sinon": "^17.0.3",
"c8": "^9.1.0",
"chai": "^5.1.1",
"eslint": "^8.57.0",
"eslint-config-discordeno": "*",
"mocha": "^10.5.1",
"ts-node": "^10.9.2",
"tsconfig": "*",
"typescript": "5.4.5"
"typescript": "^5.5.2"
}
}

View File

@@ -0,0 +1,3 @@
{
"extends": "tsconfig/test.json"
}

View File

@@ -1,8 +1,3 @@
{
"extends": "tsconfig/base.json",
"compilerOptions": {
"outDir": "./dist"
},
"include": ["./src/**/*.ts", "./src/**/*.tsx"],
"exclude": ["node_modules", "dist", "test", "tests"]
"extends": "tsconfig/base.json"
}

View File

@@ -1,5 +0,0 @@
{
"extends": "tsconfig/test.json",
"include": ["tests"],
"exclude": ["node_modules", "dist", "src"]
}

View File

@@ -26,11 +26,10 @@
"test:bun-unit": "node ../../scripts/fixBunTestExtension.js && bun test bunTestsDist",
"test:unit:watch": "mocha --no-warnings --watch --parallel 'tests/**/*.spec.ts'",
"test:type": "tsc --noEmit",
"test:test-type": "tsc --project tsconfig.test.json"
"test:test-type": "tsc --project tests/tsconfig.json"
},
"dependencies": {
"@discordeno/types": "19.0.0-beta.1",
"tweetnacl": "^1.0.3"
"@discordeno/types": "19.0.0-beta.1"
},
"devDependencies": {
"@swc/cli": "^0.3.9",
@@ -47,6 +46,6 @@
"sinon": "^17.0.1",
"ts-node": "^10.9.2",
"tsconfig": "*",
"typescript": "5.4.5"
"typescript": "^5.5.2"
}
}

View File

@@ -0,0 +1,3 @@
{
"extends": "tsconfig/test.json"
}

View File

@@ -1,8 +1,3 @@
{
"extends": "tsconfig/base.json",
"compilerOptions": {
"outDir": "./dist"
},
"include": ["./src/**/*.ts", "./src/**/*.tsx"],
"exclude": ["node_modules", "dist", "test", "tests"]
"extends": "tsconfig/base.json"
}

View File

@@ -1,5 +0,0 @@
{
"extends": "tsconfig/test.json",
"include": ["tests"],
"exclude": ["node_modules", "dist", "src"]
}

View File

@@ -3,7 +3,7 @@ import os from 'node:os'
const hostCpu = os.cpus()[0].model.trim()
const targetCpu = await fetch('https://raw.githubusercontent.com/discordeno/discordeno/benchies/cpu')
.then((res) => res.text())
.then(async (res) => await res.text())
.then((text) => text.slice(0, -1))
console.dir(`host cpu: ${hostCpu} target cpu: ${targetCpu}`)

View File

@@ -5,7 +5,7 @@ import fs from 'node:fs'
import path from 'node:path'
// these two paths may vary depending on where you place this script, and your project structure including where typedoc generates its output files.
const typedocOutPath = await import('../typedoc.json', { assert: { type: 'json' } }).then((module) => module.default.out)
const typedocOutPath = await import('../typedoc.json', { with: { type: 'json' } }).then((module) => module.default.out)
async function* walk(dir) {
for await (const d of await fs.promises.opendir(dir)) {

View File

@@ -1,10 +1,13 @@
/* eslint-disable @typescript-eslint/explicit-function-return-type */
/* eslint-disable @typescript-eslint/no-unsafe-argument */
import fs from 'fs'
// TODO: replace with fetch of live spec
const DISCORD_SPEC = {}
function schemaRefToName(ref) {
if (!ref) return ""
if (!ref) return ''
return `Discord${ref?.substring(ref.lastIndexOf('/') + 1)}`
}

View File

@@ -1,8 +1,4 @@
{
"extends": "tsconfig/base.json",
"compilerOptions": {
"outDir": "./dist"
},
"include": ["."],
"exclude": ["dist", "build", "node_modules"]
"include": ["."]
}

View File

@@ -33,12 +33,8 @@
"outputs": ["denoTestsDist/**"]
},
"test:bun-unit": {
"dependsOn": [
"^build"
],
"outputs": [
"bunTestsDist/**"
]
"dependsOn": ["^build"],
"outputs": ["bunTestsDist/**"]
},
"test:e2e": {
"dependsOn": ["^build"],

View File

@@ -1,25 +1,24 @@
---
sidebar_position: 2
---
import BrowserOnly from '@docusaurus/BrowserOnly';
import BrowserOnly from '@docusaurus/BrowserOnly'
# Architecture
## Overview
import FlowChart from '@site/src/components/architecture/FlowChart'
<BrowserOnly>
{() => <FlowChart />}
</BrowserOnly>
<BrowserOnly>{() => <FlowChart />}</BrowserOnly>
Discordeno have three main components/process, gateway, bot and rest. Websocket events from Discord, such as connecting, restarting, heartbeating, and transmitting websocket messages to Discord, are handled and maintained by the Gateway process. All Discord events are handled and converted by the Bot process, which also activates your code, such as the execute function upon message creation. All http requests to Discord, including proxying and ratelimiting, are handled by the Rest process.
## Gateway Process
import FlowChart2 from '@site/src/components/architecture/FlowChart2'
<BrowserOnly>
{() => <FlowChart2 />}
</BrowserOnly>
<BrowserOnly>{() => <FlowChart2 />}</BrowserOnly>
The Gateway process have two part the gateway manager and the gateway [shard](https://discord.com/developers/docs/topics/gateway#sharding), the gateway manager oversees the gateway shard.
@@ -32,10 +31,15 @@ The gateway manager spawns the right amount of shard acording to data from disco
Any event is passed to the handleMessage method by the gateway shard, which also establishes a websocket connection to Discord. The handleMessage method will examine the event and only deliver genuine events to the bot by intercepting and processing websocket-related events like hello, resume, heartbeat, and ready. You can modify the handleMessage to suit your needs, but it is not advised unless you are certain of your actions because the connection depends on it. After the function has finished processing the event, it will either pass the event directly (in the same process), via the rest api, a message queue, or another mechanism depending on the user's customization.
## Bot Process
import FlowChart3 from '@site/src/components/architecture/FlowChart3'
<BrowserOnly>
{() => <FlowChart3 handlerFilter={(handler) => handler.startsWith('handleChannel')}/>}
{() => (
<FlowChart3
handlerFilter={handler => handler.startsWith('handleChannel')}
/>
)}
</BrowserOnly>
A simplified version of function used inside of the bot process, showing only the handlers, transformers and event related to channel event

View File

@@ -9,4 +9,3 @@ Benchmark runs on every commit pushed on the Discordeno's main branch
import Benchmark from '@site/src/components/Benchmark'
<Benchmark />

View File

@@ -1,8 +1,8 @@
import ReactFlow, {
Background,
Controls,
Edge,
Node,
type Edge,
type Node,
Position,
} from 'reactflow'
import 'reactflow/dist/style.css'
@@ -15,7 +15,7 @@ export const defaultNodeOptions = {
}
const genServer = (x: number, id: number) => {
const server: Node<any, string>[] = [
const server: Array<Node<any, string>> = [
{
id: `s${id + 1}`,
data: { label: `Server ${id + 1}` },
@@ -24,7 +24,7 @@ const genServer = (x: number, id: number) => {
]
for (let i = 0; i < 4; i++) {
if (i == 2) {
if (i === 2) {
server.push(
{
id: `baseLineNodeText-${id}-${i}`,
@@ -48,17 +48,17 @@ const genServer = (x: number, id: number) => {
server.push(
...[
{
id: `w${id * 50 + (i == 3 ? 49 : i) + 1}`,
data: { label: `Worker ${id * 50 + (i == 3 ? 49 : i)}` },
id: `w${id * 50 + (i === 3 ? 49 : i) + 1}`,
data: { label: `Worker ${id * 50 + (i === 3 ? 49 : i)}` },
position: { x: x - 112.5 + 75 * i, y: 200 },
...defaultNodeOptions,
...{ style: { ...defaultNodeOptions.style, padding: '5px 10px' } },
},
{
id: `w${id * 50 + (i == 3 ? 49 : i) + 1}s`,
id: `w${id * 50 + (i === 3 ? 49 : i) + 1}s`,
data: {
label: `Shard ${id * 500 + (i == 3 ? 49 : i) * 10}-${
id * 500 + (i == 3 ? 49 : i) * 10 + 9
label: `Shard ${id * 500 + (i === 3 ? 49 : i) * 10}-${
id * 500 + (i === 3 ? 49 : i) * 10 + 9
}`,
},
position: { x: x - 112.5 + 75 * i, y: 300 },
@@ -67,10 +67,10 @@ const genServer = (x: number, id: number) => {
...{
style: {
...defaultNodeOptions.style,
...(id == 1 || (id == 0 && i == 3)
...(id === 1 || (id === 0 && i === 3)
? { padding: '5px 10px' }
: { padding: `5px 5px` }),
...(id == 0 && i != 3 ? { padding: '5px 15px' } : {}),
...(id === 0 && i !== 3 ? { padding: '5px 15px' } : {}),
},
},
},
@@ -101,7 +101,7 @@ const nodes = [
},
]
const edges: Edge<any>[] = [
const edges: Array<Edge<any>> = [
{ id: 'gwm-s1', source: 'gwm', target: 's1', type: 'step' },
{ id: 'gwm-s2', source: 'gwm', target: 's2', type: 'step' },
{ id: 'gwm-s10', source: 'gwm', target: 's10', type: 'step' },

183
yarn.lock
View File

@@ -50,7 +50,7 @@ __metadata:
sinon: "npm:^17.0.1"
ts-node: "npm:^10.9.2"
tsconfig: "npm:*"
typescript: "npm:5.4.5"
typescript: "npm:^5.5.2"
languageName: unknown
linkType: soft
@@ -75,7 +75,7 @@ __metadata:
sinon: "npm:^17.0.1"
ts-node: "npm:^10.9.2"
tsconfig: "npm:*"
typescript: "npm:5.4.5"
typescript: "npm:^5.5.2"
uWebSockets.js: "https://github.com/uNetworking/uWebSockets.js.git#commit=42c9c0d5d31f46ca4115dc75672b0037ec970f28"
ws: "npm:^8.18.0"
languageName: unknown
@@ -104,8 +104,7 @@ __metadata:
sinon: "npm:^17.0.1"
ts-node: "npm:^10.9.2"
tsconfig: "npm:*"
typescript: "npm:5.4.5"
why-is-node-running: "npm:^2.2.2"
typescript: "npm:^5.5.2"
languageName: unknown
linkType: soft
@@ -115,18 +114,15 @@ __metadata:
dependencies:
"@swc/cli": "npm:^0.3.9"
"@swc/core": "npm:^1.4.2"
"@types/chai": "npm:^4.3.11"
"@types/mocha": "npm:^10.0.7"
"@types/node": "npm:^20.11.25"
"@types/sinon": "npm:^17.0.3"
c8: "npm:^9.1.0"
chai: "npm:^5.1.1"
eslint: "npm:^8.57.0"
eslint-config-discordeno: "npm:*"
mocha: "npm:^10.5.1"
ts-node: "npm:^10.9.2"
tsconfig: "npm:*"
typescript: "npm:5.4.5"
typescript: "npm:^5.5.2"
languageName: unknown
linkType: soft
@@ -149,8 +145,7 @@ __metadata:
sinon: "npm:^17.0.1"
ts-node: "npm:^10.9.2"
tsconfig: "npm:*"
tweetnacl: "npm:^1.0.3"
typescript: "npm:5.4.5"
typescript: "npm:^5.5.2"
languageName: unknown
linkType: soft
@@ -717,6 +712,15 @@ __metadata:
languageName: node
linkType: hard
"@types/node@npm:^20.14.7":
version: 20.14.7
resolution: "@types/node@npm:20.14.7"
dependencies:
undici-types: "npm:~5.26.4"
checksum: f2cb458126a136719d9da6febdbc7afc9bb622047a30c5e6163db4206ff8c8002ec56b340d722fe1ad6280ebe7a505e0a5a10a39a3b5718837200201b94d5d07
languageName: node
linkType: hard
"@types/responselike@npm:^1.0.0":
version: 1.0.0
resolution: "@types/responselike@npm:1.0.0"
@@ -1310,9 +1314,9 @@ __metadata:
languageName: node
linkType: hard
"benchmark@workspace:packages/benchmark":
"benchmarks@workspace:packages/benchmarks":
version: 0.0.0-use.local
resolution: "benchmark@workspace:packages/benchmark"
resolution: "benchmarks@workspace:packages/benchmarks"
dependencies:
"@discordeno/bot": "npm:19.0.0-beta.1"
"@discordeno/gateway": "npm:19.0.0-alpha.1"
@@ -1322,15 +1326,13 @@ __metadata:
"@swc/cli": "npm:^0.3.9"
"@swc/core": "npm:^1.4.2"
"@types/benchmark": "npm:^2.1.5"
"@types/node": "npm:^20.11.25"
"@types/node": "npm:^20.14.7"
benchmark: "npm:^2.1.4"
eslint: "npm:^8.57.0"
eslint-config-discordeno: "npm:*"
microtime: "npm:^3.1.1"
node-fetch: "npm:^3.3.2"
ts-node: "npm:^10.9.2"
tsconfig: "npm:*"
typescript: "npm:5.4.5"
typescript: "npm:^5.5.2"
languageName: unknown
linkType: soft
@@ -1869,13 +1871,6 @@ __metadata:
languageName: node
linkType: hard
"data-uri-to-buffer@npm:^4.0.0":
version: 4.0.1
resolution: "data-uri-to-buffer@npm:4.0.1"
checksum: 0d0790b67ffec5302f204c2ccca4494f70b4e2d940fea3d36b09f0bb2b8539c2e86690429eb1f1dc4bcc9e4df0644193073e63d9ee48ac9fce79ec1506e4aa4c
languageName: node
linkType: hard
"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
version: 4.3.4
resolution: "debug@npm:4.3.4"
@@ -2069,9 +2064,9 @@ __metadata:
lint-staged: "npm:^15.2.7"
prettier: "npm:^3.2.5"
turbo: "npm:^1.11.3"
typedoc: "npm:0.25.11"
typedoc: "npm:^0.25.13"
typedoc-plugin-markdown: "npm:3.17.1"
typescript: "npm:5.4.5"
typescript: "npm:^5.5.2"
languageName: unknown
linkType: soft
@@ -2099,7 +2094,7 @@ __metadata:
sinon: "npm:^17.0.1"
ts-node: "npm:^10.9.2"
tsconfig: "npm:*"
typescript: "npm:5.4.5"
typescript: "npm:^5.5.2"
bin:
discordeno: ./bin/disocrdeno.js
languageName: unknown
@@ -2306,7 +2301,7 @@ __metadata:
eslint-plugin-promise: "npm:^6.1.1"
eslint-plugin-require-extensions: "npm:^0.1.3"
prettier: "npm:^3.2.5"
typescript: "npm:5.4.5"
typescript: "npm:^5.5.2"
languageName: unknown
linkType: soft
@@ -2751,16 +2746,6 @@ __metadata:
languageName: node
linkType: hard
"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4":
version: 3.2.0
resolution: "fetch-blob@npm:3.2.0"
dependencies:
node-domexception: "npm:^1.0.0"
web-streams-polyfill: "npm:^3.0.3"
checksum: 5264ecceb5fdc19eb51d1d0359921f12730941e333019e673e71eb73921146dceabcb0b8f534582be4497312d656508a439ad0f5edeec2b29ab2e10c72a1f86b
languageName: node
linkType: hard
"file-entry-cache@npm:^6.0.1":
version: 6.0.1
resolution: "file-entry-cache@npm:6.0.1"
@@ -2881,15 +2866,6 @@ __metadata:
languageName: node
linkType: hard
"formdata-polyfill@npm:^4.0.10":
version: 4.0.10
resolution: "formdata-polyfill@npm:4.0.10"
dependencies:
fetch-blob: "npm:^3.1.2"
checksum: 9b5001d2edef3c9449ac3f48bd4f8cc92e7d0f2e7c1a5c8ba555ad4e77535cc5cf621fabe49e97f304067037282dd9093b9160a3cb533e46420b446c4e6bc06f
languageName: node
linkType: hard
"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0":
version: 2.1.0
resolution: "fs-minipass@npm:2.1.0"
@@ -4172,17 +4148,6 @@ __metadata:
languageName: node
linkType: hard
"microtime@npm:^3.1.1":
version: 3.1.1
resolution: "microtime@npm:3.1.1"
dependencies:
node-addon-api: "npm:^5.0.0"
node-gyp: "npm:latest"
node-gyp-build: "npm:^4.4.0"
checksum: 62c29ac611a10e5ce9696c6f1167ba9f7b7955db166828fafccec16f3b8121b358a5066dec160ae7c54187c85ef75253df589e44454685f1aaff4d85cb3a4e53
languageName: node
linkType: hard
"mime-db@npm:^1.28.0":
version: 1.52.0
resolution: "mime-db@npm:1.52.0"
@@ -4455,33 +4420,6 @@ __metadata:
languageName: node
linkType: hard
"node-addon-api@npm:^5.0.0":
version: 5.1.0
resolution: "node-addon-api@npm:5.1.0"
dependencies:
node-gyp: "npm:latest"
checksum: 595f59ffb4630564f587c502119cbd980d302e482781021f3b479f5fc7e41cf8f2f7280fdc2795f32d148e4f3259bd15043c52d4a3442796aa6f1ae97b959636
languageName: node
linkType: hard
"node-domexception@npm:^1.0.0":
version: 1.0.0
resolution: "node-domexception@npm:1.0.0"
checksum: e332522f242348c511640c25a6fc7da4f30e09e580c70c6b13cb0be83c78c3e71c8d4665af2527e869fc96848924a4316ae7ec9014c091e2156f41739d4fa233
languageName: node
linkType: hard
"node-fetch@npm:^3.3.2":
version: 3.3.2
resolution: "node-fetch@npm:3.3.2"
dependencies:
data-uri-to-buffer: "npm:^4.0.0"
fetch-blob: "npm:^3.1.4"
formdata-polyfill: "npm:^4.0.10"
checksum: 24207ca8c81231c7c59151840e3fded461d67a31cf3e3b3968e12201a42f89ce4a0b5fb7079b1fa0a4655957b1ca9257553200f03a9f668b45ebad265ca5593d
languageName: node
linkType: hard
"node-gyp-build@npm:^4.2.2":
version: 4.8.0
resolution: "node-gyp-build@npm:4.8.0"
@@ -4493,17 +4431,6 @@ __metadata:
languageName: node
linkType: hard
"node-gyp-build@npm:^4.4.0":
version: 4.6.0
resolution: "node-gyp-build@npm:4.6.0"
bin:
node-gyp-build: bin.js
node-gyp-build-optional: optional.js
node-gyp-build-test: build-test.js
checksum: c8b57abe5e6e4a28dce450e3c0136bcce88d15602c33f1258ed9c9a52f156d34a00dd8864271b2f2acfd6ef4de0af3e75e5e76e771c4bc4f38dd0ee06ad178d8
languageName: node
linkType: hard
"node-gyp@npm:latest":
version: 9.3.1
resolution: "node-gyp@npm:9.3.1"
@@ -5366,13 +5293,6 @@ __metadata:
languageName: node
linkType: hard
"siginfo@npm:^2.0.0":
version: 2.0.0
resolution: "siginfo@npm:2.0.0"
checksum: e93ff66c6531a079af8fb217240df01f980155b5dc408d2d7bebc398dd284e383eb318153bf8acd4db3c4fe799aa5b9a641e38b0ba3b1975700b1c89547ea4e7
languageName: node
linkType: hard
"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7":
version: 3.0.7
resolution: "signal-exit@npm:3.0.7"
@@ -5497,13 +5417,6 @@ __metadata:
languageName: node
linkType: hard
"stackback@npm:0.0.2":
version: 0.0.2
resolution: "stackback@npm:0.0.2"
checksum: 2d4dc4e64e2db796de4a3c856d5943daccdfa3dd092e452a1ce059c81e9a9c29e0b9badba91b43ef0d5ff5c04ee62feb3bcc559a804e16faf447bac2d883aa99
languageName: node
linkType: hard
"string-argv@npm:~0.3.2":
version: 0.3.2
resolution: "string-argv@npm:0.3.2"
@@ -5919,13 +5832,6 @@ __metadata:
languageName: node
linkType: hard
"tweetnacl@npm:^1.0.3":
version: 1.0.3
resolution: "tweetnacl@npm:1.0.3"
checksum: ca122c2f86631f3c0f6d28efb44af2a301d4a557a62a3e2460286b08e97567b258c2212e4ad1cfa22bd6a57edcdc54ba76ebe946847450ab0999e6d48ccae332
languageName: node
linkType: hard
"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
version: 0.4.0
resolution: "type-check@npm:0.4.0"
@@ -6014,39 +5920,39 @@ __metadata:
languageName: node
linkType: hard
"typedoc@npm:0.25.11":
version: 0.25.11
resolution: "typedoc@npm:0.25.11"
"typedoc@npm:^0.25.13":
version: 0.25.13
resolution: "typedoc@npm:0.25.13"
dependencies:
lunr: "npm:^2.3.9"
marked: "npm:^4.3.0"
minimatch: "npm:^9.0.3"
shiki: "npm:^0.14.7"
peerDependencies:
typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x
typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x
bin:
typedoc: bin/typedoc
checksum: ec1f617c16b5fca455853c329a9958fe41b247d0c1a72dc153654fd5ce323f2ccdfd10ef1f3349d340398e3770a036381d856b90fda4aafe554640b53f5b2a1c
checksum: 3c82603894b5830c4b027b4f4f9ca70f770b6752c6512a42e780c40cb67fe4c9a144e34a837bb35aab14a125e00a5893e1e6feac1ec86a2add80f46833b279d4
languageName: node
linkType: hard
"typescript@npm:5.4.5":
version: 5.4.5
resolution: "typescript@npm:5.4.5"
"typescript@npm:^5.5.2":
version: 5.5.2
resolution: "typescript@npm:5.5.2"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: d04a9e27e6d83861f2126665aa8d84847e8ebabcea9125b9ebc30370b98cb38b5dff2508d74e2326a744938191a83a69aa9fddab41f193ffa43eabfdf3f190a5
checksum: 9118b20f248e76b0dbff8737fef65dfa89d02668d4e633d2c5ceac99033a0ca5e8a1c1a53bc94da68e8f67677a88f318663dde859c9e9a09c1e116415daec2ba
languageName: node
linkType: hard
"typescript@patch:typescript@npm%3A5.4.5#optional!builtin<compat/typescript>":
version: 5.4.5
resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin<compat/typescript>::version=5.4.5&hash=e012d7"
"typescript@patch:typescript@npm%3A^5.5.2#optional!builtin<compat/typescript>":
version: 5.5.2
resolution: "typescript@patch:typescript@npm%3A5.5.2#optional!builtin<compat/typescript>::version=5.5.2&hash=e012d7"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 584be8bac7112ad49a9eb9992f71d542b1ff2fafb5bb315e1c196145e8feab589f1d7223cfb2d5df6770789582e6918f8287d1f2f89911b38eb80e29c560ad00
checksum: 28b3de2ddaf63a7620e7ddbe5d377af71ce93ecc558c41bf0e3d88661d8e6e7aa6c7739164fef98055f69819e41faca49252938ef3633a3dff2734cca6a9042e
languageName: node
linkType: hard
@@ -6158,13 +6064,6 @@ __metadata:
languageName: node
linkType: hard
"web-streams-polyfill@npm:^3.0.3":
version: 3.2.1
resolution: "web-streams-polyfill@npm:3.2.1"
checksum: 08fcf97b7883c1511dd3da794f50e9bde75a660884783baaddb2163643c21a94086f394dc4bd20dff0f55c98d98d60c4bea05a5809ef5005bdf835b63ada8900
languageName: node
linkType: hard
"which-boxed-primitive@npm:^1.0.2":
version: 1.0.2
resolution: "which-boxed-primitive@npm:1.0.2"
@@ -6220,18 +6119,6 @@ __metadata:
languageName: node
linkType: hard
"why-is-node-running@npm:^2.2.2":
version: 2.2.2
resolution: "why-is-node-running@npm:2.2.2"
dependencies:
siginfo: "npm:^2.0.0"
stackback: "npm:0.0.2"
bin:
why-is-node-running: cli.js
checksum: f3582e0337f4b25537d492b1d40f00b978ce04b1d1eeea8f310bfa8aae8a7d11d118d672e2f0760c164ce3753a620a70aa29ff3620e340197624940cf9c08615
languageName: node
linkType: hard
"wide-align@npm:^1.1.5":
version: 1.1.5
resolution: "wide-align@npm:1.1.5"