diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml new file mode 100644 index 000000000..85d89dda2 --- /dev/null +++ b/.github/workflows/benchmark.yml @@ -0,0 +1,51 @@ +name: Benchmark + +on: + workflow_call: + outputs: + cpuMatch: + value: ${{ jobs.benchmark.outputs.cpuMatch }} + +jobs: + benchmark: + name: Benchmark + runs-on: ubuntu-latest + outputs: + cpuMatch: ${{ steps.cpuCheck.outputs.match }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + - name: Check cpu model + id: cpuCheck + run: node ./scripts/checkCpuModel.js + + - name: Get yarn cache directory path + if: ${{ steps.cpuCheck.outputs.match == 'true' }} + id: yarn-cache-dir-path + run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT + - uses: actions/cache@v3 + if: ${{ steps.cpuCheck.outputs.match == 'true' }} + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + - run: yarn install --immutable + if: ${{ steps.cpuCheck.outputs.match == 'true' }} + - name: Build + if: ${{ steps.cpuCheck.outputs.match == 'true' }} + run: yarn build + + # + - name: Download db from benchmark repo + if: ${{ steps.cpuCheck.outputs.match == 'true' }} + run: wget https://github.com/discordeno/benchmarks/raw/main/db.tar.gz + - name: Decompress db + if: ${{ steps.cpuCheck.outputs.match == 'true' }} + run: tar -xzvf db.tar.gz + + - name: Benchmark + if: ${{ steps.cpuCheck.outputs.match == 'true' }} + run: node --expose-gc ./packages/benchmark/dist/index.js diff --git a/.github/workflows/retryBenchmark.yml b/.github/workflows/retryBenchmark.yml new file mode 100644 index 000000000..8c9abc194 --- /dev/null +++ b/.github/workflows/retryBenchmark.yml @@ -0,0 +1,56 @@ +name: Benchmark with retry + +on: + pull_request: + push: + branches: + - main + +jobs: + benchmark-try-1: + uses: ./.github/workflows/benchmark.yml + + benchmark-try-2: + needs: benchmark-try-1 + if: ${{ needs.benchmark-try-1.outputs.cpuMatch == 'false' }} + uses: ./.github/workflows/benchmark.yml + + benchmark-try-3: + needs: benchmark-try-2 + if: ${{ needs.benchmark-try-2.outputs.cpuMatch == 'false' }} + uses: ./.github/workflows/benchmark.yml + + benchmark-try-4: + needs: benchmark-try-3 + if: ${{ needs.benchmark-try-3.outputs.cpuMatch == 'false' }} + uses: ./.github/workflows/benchmark.yml + + benchmark-try-5: + needs: benchmark-try-4 + if: ${{ needs.benchmark-try-4.outputs.cpuMatch == 'false' }} + uses: ./.github/workflows/benchmark.yml + + benchmark-try-6: + needs: benchmark-try-5 + if: ${{ needs.benchmark-try-5.outputs.cpuMatch == 'false' }} + uses: ./.github/workflows/benchmark.yml + + benchmark-try-7: + needs: benchmark-try-6 + if: ${{ needs.benchmark-try-6.outputs.cpuMatch == 'false' }} + uses: ./.github/workflows/benchmark.yml + + benchmark-try-8: + needs: benchmark-try-7 + if: ${{ needs.benchmark-try-7.outputs.cpuMatch == 'false' }} + uses: ./.github/workflows/benchmark.yml + + benchmark-try-9: + needs: benchmark-try-8 + if: ${{ needs.benchmark-try-8.outputs.cpuMatch == 'false' }} + uses: ./.github/workflows/benchmark.yml + + benchmark-try-10: + needs: benchmark-try-9 + if: ${{ needs.benchmark-try-9.outputs.cpuMatch == 'false' }} + uses: ./.github/workflows/benchmark.yml diff --git a/.gitignore b/.gitignore index e474a0678..91d8e5cc9 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ out build .docusaurus .cache-loader +/db # misc .DS_Store diff --git a/packages/benchmark/.swcrc b/packages/benchmark/.swcrc new file mode 100644 index 000000000..0000defd2 --- /dev/null +++ b/packages/benchmark/.swcrc @@ -0,0 +1,24 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "decorators": true, + "dynamicImport": true + }, + "transform": { + "legacyDecorator": true, + "decoratorMetadata": true + }, + "target": "es2022", + "keepClassNames": true, + "loose": true + }, + "module": { + "type": "es6", + "strict": false, + "strictMode": true, + "lazy": false, + "noInterop": false + }, + "sourceMaps": true +} diff --git a/packages/benchmark/package.json b/packages/benchmark/package.json new file mode 100644 index 000000000..ebfd4322a --- /dev/null +++ b/packages/benchmark/package.json @@ -0,0 +1,41 @@ +{ + "name": "benchmark", + "version": "0.0.0", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "type": "module", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/discordeno/discordeno.git" + }, + "scripts": { + "build:type": "tsc --declaration --emitDeclarationOnly --declarationDir dist", + "release-build": "yarn build && yarn build:type", + "fmt": "eslint --fix \"src/**/*.ts*\"", + "lint": "eslint \"src/**/*.ts*\"", + "build": "swc src --delete-dir-on-start --out-dir dist && node ../../scripts/fixBenchExtension.js", + "bench": "node dist/index.js" + }, + "dependencies": { + "@discordeno/bot": "latest", + "@discordeno/gateway": "19.0.0-alpha.1", + "@discordeno/rest": "19.0.0-alpha.1", + "@discordeno/types": "19.0.0-alpha.1", + "@discordeno/utils": "19.0.0-alpha.1", + "benchmark": "^2.1.4", + "microtime": "^3.1.1", + "node-fetch": "^3.3.1" + }, + "devDependencies": { + "@swc/cli": "^0.1.57", + "@swc/core": "^1.3.21", + "@types/benchmark": "^2", + "@types/node": "^18.11.9", + "eslint": "^8.0.1", + "eslint-config-discordeno": "*", + "ts-node": "^10.9.1", + "tsconfig": "*", + "typescript": "^4.9.3" + } +} diff --git a/packages/benchmark/src/benchmarkSuite.ts b/packages/benchmark/src/benchmarkSuite.ts new file mode 100644 index 000000000..edd866745 --- /dev/null +++ b/packages/benchmark/src/benchmarkSuite.ts @@ -0,0 +1,3 @@ +import Benchmark from 'benchmark' + +export const suite = new Benchmark.Suite() diff --git a/packages/benchmark/src/benchmarks/casting.ts b/packages/benchmark/src/benchmarks/casting.ts new file mode 100644 index 000000000..96adcb90f --- /dev/null +++ b/packages/benchmark/src/benchmarks/casting.ts @@ -0,0 +1,17 @@ +import { camelize, snakelize } from '@discordeno/utils' +import { suite } from '../benchmarkSuite.js' +import { events } from '../utils/db.js' + +const camelizedEvents: any[] = [] + +events.forEach((event) => { + camelizedEvents.push(camelize(event)) +}) + +suite.add(`Camelize 1 event`, () => { + snakelize(events[1]) +}) + +suite.add(`Snakelize 1 event`, () => { + snakelize(camelizedEvents[1]) +}) diff --git a/packages/benchmark/src/benchmarks/memory.ts b/packages/benchmark/src/benchmarks/memory.ts new file mode 100644 index 000000000..1ff949541 --- /dev/null +++ b/packages/benchmark/src/benchmarks/memory.ts @@ -0,0 +1,37 @@ +import { createBot, type Bot } from '@discordeno/bot' +import { events as dbEvents } from '../utils/db.js' +import { memoryBenchmark } from '../utils/memoryBenchmark.js' + +/* Example Usage +deno run --v8-flags="--expose-gc" -A .\index.ts +*/ +/* +import { createBot } from "https://deno.land/x/discordeno@17.1.0/mod.ts"; +import { enableCachePlugin } from "https://deno.land/x/discordeno@17.1.0/plugins/mod.ts"; +memoryBenchmark(() => enableCachePlugin(createBot({ + token: " ", + botId: 0n, +}))) +*/ + +const enableCachePlugin = (bot: Bot): Bot => bot + +await memoryBenchmark( + '[Cache Plugin]', + () => + enableCachePlugin( + createBot({ + token: ' ', + events: {}, + }), + ), + (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, {}) + }, + dbEvents.filter((event) => event.payload.t), +) diff --git a/packages/benchmark/src/benchmarks/rest.ts b/packages/benchmark/src/benchmarks/rest.ts new file mode 100644 index 000000000..e677201b9 --- /dev/null +++ b/packages/benchmark/src/benchmarks/rest.ts @@ -0,0 +1,19 @@ +import { createRestManager } from '@discordeno/rest' +import { suite } from '../benchmarkSuite.js' + +const rest = createRestManager({ token: ' ' }) + +suite.add(`rest.simplifyUrl`, () => { + rest.simplifyUrl('/messages/555555555555555555', 'PUT') + rest.simplifyUrl('/users/555555555555555555', 'PUT') + rest.simplifyUrl('/webhooks/555555555555555555', 'PUT') + rest.simplifyUrl('/channel/555555555555555555', 'PUT') + rest.simplifyUrl('/guild/555555555555555555', 'PUT') + rest.simplifyUrl('/channels/555555555555555555', 'PUT') + rest.simplifyUrl('/guilds/555555555555555555', 'PUT') + rest.simplifyUrl('/channels/555555555555555555/reactions/555555555555555555/wdiubaibfwuabfobaowbfoibnion', 'PUT') + rest.simplifyUrl('/channels/555555555555555555/messages/555555555555555555', 'DELETE') + rest.simplifyUrl('/channels/555555555555555555/messages/555555555555555555', 'POST') + rest.simplifyUrl('/channels/555555555555555555/messages/555555555555555555', 'GET') + rest.simplifyUrl('/channels/555555555555555555/messages/555555555555555555', 'PUT') +}) diff --git a/packages/benchmark/src/index.ts b/packages/benchmark/src/index.ts new file mode 100644 index 000000000..0ad2d140f --- /dev/null +++ b/packages/benchmark/src/index.ts @@ -0,0 +1,12 @@ +import fs from 'node:fs/promises' +import { suite } from './benchmarkSuite.js' + +const benchmarks = await fs.readdir('packages/benchmark/dist/benchmarks').then((files) => files.filter((file) => file.endsWith('.js'))) + +await Promise.all(benchmarks.map(async (file) => await import(`./benchmarks/${file}`))) + +suite + .on('cycle', function (event: any) { + console.log(String(event.target)) + }) + .run() diff --git a/packages/benchmark/src/utils/db.ts b/packages/benchmark/src/utils/db.ts new file mode 100644 index 000000000..8261b697b --- /dev/null +++ b/packages/benchmark/src/utils/db.ts @@ -0,0 +1,33 @@ +import type { DiscordGatewayPayload } from '@discordeno/types' +import fetch from 'node-fetch' +import fs from 'node:fs/promises' + +export const events: Array<{ + shardId: number + payload: DiscordGatewayPayload +}> = [] + +try { + const files = await fs.readdir('db/events') + + for await (const file of files) { + const eventsInFile: Array< + | { + shardId: number + payload: DiscordGatewayPayload + } + | string + > = Object.values(await fs.readFile(`db/events/${file}`, 'utf8').then((text) => JSON.parse(text))) + eventsInFile.forEach((eventInFile) => { + if (typeof eventInFile === 'string') return + events.push(eventInFile) + }) + } +} catch { + const event = await fetch('https://raw.githubusercontent.com/discordeno/benchmarks/main/db/events/10.json') + .then(async (res) => await res.json()) + .then((eventsInFile: any) => eventsInFile['0']) + for (let i = 0; i < 10; i++) { + events.push(event) + } +} diff --git a/packages/benchmark/src/utils/memoryBenchmark.ts b/packages/benchmark/src/utils/memoryBenchmark.ts new file mode 100644 index 000000000..353624d73 --- /dev/null +++ b/packages/benchmark/src/utils/memoryBenchmark.ts @@ -0,0 +1,157 @@ +export async function memoryBenchmark( + name: string, + objectCreator: () => O, + objectFeeder: (object: O, event: E) => void, + events: E[], + options: { times: number; log: boolean; table: boolean } = { + times: 3, + log: false, + table: false, + }, +): Promise { + const garbageCollect = global.gc ?? (() => {}) + + const stages = ['start', 'loaded', 'end', 'cached'] as const + const typesOfMemUsages = ['rss', 'heapUsed', 'heapTotal'] as const + + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + async function runTest(object: O) { + // Determine memory stats now before touching anything + const results: { + start: NodeJS.MemoryUsage + loaded?: NodeJS.MemoryUsage + end?: NodeJS.MemoryUsage + cached?: NodeJS.MemoryUsage + } = { + start: process.memoryUsage(), + } + garbageCollect() + results.start = process.memoryUsage() + if (options.log) console.log(`[INFO] Loading json files.`) + + if (options.log) { + console.log(`[INFO] DB files loaded into memory.`, events.length) + } + // Set the memory stats for when files are loaded in. + results.loaded = process.memoryUsage() + + events.forEach((event) => { + objectFeeder(object, event) + }) + + if (options.log) { + console.log(`[INFO] Processed ${events.length} events.`) + } + + // Set results for data once all events are processed + results.end = process.memoryUsage() + + // @ts-expect-error init the object + results.cached = {} + for (const typeOfMemUsage of typesOfMemUsages) { + results.cached![typeOfMemUsage] = results.end[typeOfMemUsage] - results.loaded[typeOfMemUsage] + } + + return results + } + + const allResults = { + start: { + rss: [] as number[], + heapUsed: [] as number[], + heapTotal: [] as number[], + }, + loaded: { + rss: [] as number[], + heapUsed: [] as number[], + heapTotal: [] as number[], + }, + end: { + rss: [] as number[], + heapUsed: [] as number[], + heapTotal: [] as number[], + }, + cached: { + rss: [] as number[], + heapUsed: [] as number[], + heapTotal: [] as number[], + }, + } + + const BYTES = 1000000 + + for (let index = 0; index < options.times; index++) { + if (options.log) console.log('running the', index + 1, 'time') + const currentResult = await runTest(objectCreator()) + for (const typeOfMemUsage of typesOfMemUsages) { + for (const stage of stages) { + allResults[stage][typeOfMemUsage].push(currentResult[stage]![typeOfMemUsage]) + } + } + } + + type ArrayElement = ArrayType extends ReadonlyArray ? ElementType : never + + const tableRows = ['Starting', 'Loaded', 'End', 'Cached'] as const + const tableFields = ['RSS', 'Heap Used', 'Heap Total'] as const + + const preprocessedResults: { + [K in ArrayElement]?: { + [K in ArrayElement]?: { + value: number + min: number + max: number + } + } + } = {} + + for (const [index, tableRow] of tableRows.entries()) { + for (const [index2, tableField] of tableFields.entries()) { + if (index2 === 0) preprocessedResults[tableRow] = {} + preprocessedResults[tableRow]![tableField] = { + value: + Math.round( + (allResults[stages[index]][typesOfMemUsages[index2]].reduce((acc, c) => acc + c, 0) / allResults.start.rss.length / BYTES) * 100, + ) / 100, + min: Math.round((Math.min(...allResults[stages[index]][typesOfMemUsages[index2]]) / BYTES) * 100) / 100, + max: Math.round((Math.max(...allResults[stages[index]][typesOfMemUsages[index2]]) / BYTES) * 100) / 100, + } + } + } + + const processedResults = preprocessedResults as { + [K in ArrayElement]: { + [K in ArrayElement]: { + value: number + min: number + max: number + } + } + } + + const humanReadable: { + [K in ArrayElement]?: { + [K in ArrayElement]?: string + } + } = {} + + for (const tableRow of tableRows) { + for (const [index, tableField] of tableFields.entries()) { + if (index === 0) humanReadable[tableRow] = {} + humanReadable[tableRow]![ + tableField + ] = `${processedResults[tableRow][tableField].value} MB (${processedResults[tableRow][tableField].min} MB … ${processedResults[tableRow][tableField].max} MB)` + } + } + + if (options.table) console.table(humanReadable) + + for (const resultKey of Object.keys(processedResults.Cached) as Array) { + const range = Math.max( + Math.round((processedResults.Cached[resultKey].min / processedResults.Cached[resultKey].value) * 100) / 100, + Math.round((processedResults.Cached[resultKey].max / processedResults.Cached[resultKey].value) * 100) / 100, + ) + + console.log(`${name} ${resultKey.toString()} x ${processedResults.Cached[resultKey].value} MB ±${isFinite(range) ? range : 0}% (3 runs sampled)`) + } +} diff --git a/packages/benchmark/tsconfig.json b/packages/benchmark/tsconfig.json new file mode 100644 index 000000000..50e6ef6eb --- /dev/null +++ b/packages/benchmark/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "tsconfig/base.json", + "compilerOptions": { + "outDir": "./dist", + }, + "include": [ + "./src/**/*.ts", + "./src/**/*.tsx" + ], + "exclude": [ + "node_modules", + "dist", + "test", + "tests" + ] +} \ No newline at end of file diff --git a/scripts/checkCpuModel.js b/scripts/checkCpuModel.js new file mode 100644 index 000000000..3126c773c --- /dev/null +++ b/scripts/checkCpuModel.js @@ -0,0 +1,12 @@ +import fs from 'node:fs' +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((text) => text.slice(0, -1)) +console.dir(`host cpu: ${hostCpu} target cpu: ${targetCpu}`) + +let outputFile = fs.readFileSync(process.env.GITHUB_OUTPUT, 'utf8') +outputFile += `\nmatch=${hostCpu === targetCpu}` +fs.writeFileSync(process.env.GITHUB_OUTPUT, outputFile, 'utf8') diff --git a/scripts/fixBenchExtension.js b/scripts/fixBenchExtension.js index 9f98f5fe4..68604c718 100644 --- a/scripts/fixBenchExtension.js +++ b/scripts/fixBenchExtension.js @@ -3,19 +3,13 @@ import fs from 'node:fs' const dirs = [''] for await (const dir of dirs) { await Promise.all( - fs.readdirSync(`benchDist${dir}`).map(async (file) => { - if (!file.endsWith('.js')) { + fs.readdirSync(`dist${dir}`).map(async (file) => { + if (!file.endsWith('.js') && !file.endsWith('.map') && !file.endsWith('.ts')) { dirs.push(`${dir}/${file}`) return } - const content = await fs.promises.readFile( - `benchDist${dir}/${file}`, - 'utf-8' - ) - fs.promises.writeFile( - `benchDist${dir}/${file}`, - content.replace(/src\//g, 'dist/').replace(/\.ts/g, '.js') - ) - }) + const content = await fs.promises.readFile(`dist${dir}/${file}`, 'utf-8') + fs.promises.writeFile(`dist${dir}/${file}`, content.replace(/src\//g, 'dist/').replace(/\.ts/g, '.js')) + }), ) } diff --git a/yarn.lock b/yarn.lock index 38ace17a8..6afd87798 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47,6 +47,18 @@ __metadata: languageName: unknown linkType: soft +"@discordeno/bot@npm:latest": + version: 19.0.0-next.abe8c0f + resolution: "@discordeno/bot@npm:19.0.0-next.abe8c0f" + dependencies: + "@discordeno/gateway": 19.0.0-next.abe8c0f + "@discordeno/rest": 19.0.0-next.abe8c0f + "@discordeno/types": 19.0.0-next.abe8c0f + "@discordeno/utils": 19.0.0-next.abe8c0f + checksum: 12091b3d06c89f6cf7c5ae93cef6af28922665cddbbdf4b07804795214833092f3292cb7a150c74ada1eddfa4cd2f958f888c582df7be794ab6dc1b0296cbf3f + languageName: node + linkType: hard + "@discordeno/gateway@19.0.0-alpha.1, @discordeno/gateway@workspace:packages/gateway": version: 0.0.0-use.local resolution: "@discordeno/gateway@workspace:packages/gateway" @@ -74,6 +86,17 @@ __metadata: languageName: unknown linkType: soft +"@discordeno/gateway@npm:19.0.0-next.abe8c0f": + version: 19.0.0-next.abe8c0f + resolution: "@discordeno/gateway@npm:19.0.0-next.abe8c0f" + dependencies: + "@discordeno/types": 19.0.0-next.abe8c0f + "@discordeno/utils": 19.0.0-next.abe8c0f + ws: ^8.13.0 + checksum: bf75ea743cd0d78e6bce8a2e450310eb7e5495429eeaa4a3e79de7178bc75239f100bfbe0c793df0415587713d2f89919b2a661e3526ac5999bcd7fdd52e8f45 + languageName: node + linkType: hard + "@discordeno/rest@19.0.0-alpha.1, @discordeno/rest@workspace:packages/rest": version: 0.0.0-use.local resolution: "@discordeno/rest@workspace:packages/rest" @@ -103,6 +126,18 @@ __metadata: languageName: unknown linkType: soft +"@discordeno/rest@npm:19.0.0-next.abe8c0f": + version: 19.0.0-next.abe8c0f + resolution: "@discordeno/rest@npm:19.0.0-next.abe8c0f" + dependencies: + "@discordeno/types": 19.0.0-next.abe8c0f + "@discordeno/utils": 19.0.0-next.abe8c0f + dotenv: ^16.0.3 + node-fetch: ^3.3.1 + checksum: 34002f0d07e73fb8e309a62379489b6a134ac31d29d4a991d1641e5f8740c6ed95df0ea4bba976ea5e9c5a358db6d5755a0daecc1357325eb604340835af7889 + languageName: node + linkType: hard + "@discordeno/types@19.0.0-alpha.1, @discordeno/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@discordeno/types@workspace:packages/types" @@ -124,6 +159,13 @@ __metadata: languageName: unknown linkType: soft +"@discordeno/types@npm:19.0.0-next.abe8c0f": + version: 19.0.0-next.abe8c0f + resolution: "@discordeno/types@npm:19.0.0-next.abe8c0f" + checksum: 1d71386b6b05d2d4c584519b8a2baf21d9a8ef51cca950e8811a88bbf7c1edc4ed636d53bd41492b10c5a12f5d719b0a4df6a4f64a3034594c6f71506de064a2 + languageName: node + linkType: hard + "@discordeno/utils@19.0.0-alpha.1, @discordeno/utils@workspace:packages/utils": version: 0.0.0-use.local resolution: "@discordeno/utils@workspace:packages/utils" @@ -149,6 +191,17 @@ __metadata: languageName: unknown linkType: soft +"@discordeno/utils@npm:19.0.0-next.abe8c0f": + version: 19.0.0-next.abe8c0f + resolution: "@discordeno/utils@npm:19.0.0-next.abe8c0f" + dependencies: + "@discordeno/types": 19.0.0-next.abe8c0f + node-fetch: ^3.3.1 + tweetnacl: ^1.0.3 + checksum: 23f6889998725dee0fc414e739fcf6baf6ec03c84e7768863244b9201783046b8744c6fe64c5799d3ebfd2ab613cfd9de026e851230386ce31f1dfd426dea064 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.2.0 resolution: "@eslint-community/eslint-utils@npm:4.2.0" @@ -184,6 +237,23 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^2.0.2": + version: 2.0.2 + resolution: "@eslint/eslintrc@npm:2.0.2" + dependencies: + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^9.5.1 + globals: ^13.19.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: cfcf5e12c7b2c4476482e7f12434e76eae16fcd163ee627309adb10b761e5caa4a4e52ed7be464423320ff3d11eca5b50de5bf8be3e25834222470835dd5c801 + languageName: node + linkType: hard + "@eslint/js@npm:8.36.0": version: 8.36.0 resolution: "@eslint/js@npm:8.36.0" @@ -191,6 +261,13 @@ __metadata: languageName: node linkType: hard +"@eslint/js@npm:8.37.0": + version: 8.37.0 + resolution: "@eslint/js@npm:8.37.0" + checksum: 7a07fb085c94ce1538949012c292fd3a6cd734f149bc03af6157dfbd8a7477678899ef57b4a27e15b36470a997389ad79a0533d5880c71e67720ae1a7de7c62d + languageName: node + linkType: hard + "@gar/promisify@npm:^1.1.3": version: 1.1.3 resolution: "@gar/promisify@npm:1.1.3" @@ -379,7 +456,7 @@ __metadata: languageName: node linkType: hard -"@swc/cli@npm:^0.1.62": +"@swc/cli@npm:^0.1.57, @swc/cli@npm:^0.1.62": version: 0.1.62 resolution: "@swc/cli@npm:0.1.62" dependencies: @@ -410,6 +487,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-arm64@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-darwin-arm64@npm:1.3.42" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@swc/core-darwin-x64@npm:1.3.40": version: 1.3.40 resolution: "@swc/core-darwin-x64@npm:1.3.40" @@ -417,6 +501,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-x64@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-darwin-x64@npm:1.3.42" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@swc/core-linux-arm-gnueabihf@npm:1.3.40": version: 1.3.40 resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.40" @@ -424,6 +515,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm-gnueabihf@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.42" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@swc/core-linux-arm64-gnu@npm:1.3.40": version: 1.3.40 resolution: "@swc/core-linux-arm64-gnu@npm:1.3.40" @@ -431,6 +529,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm64-gnu@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.42" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@swc/core-linux-arm64-musl@npm:1.3.40": version: 1.3.40 resolution: "@swc/core-linux-arm64-musl@npm:1.3.40" @@ -438,6 +543,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm64-musl@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.42" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@swc/core-linux-x64-gnu@npm:1.3.40": version: 1.3.40 resolution: "@swc/core-linux-x64-gnu@npm:1.3.40" @@ -445,6 +557,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-x64-gnu@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.42" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@swc/core-linux-x64-musl@npm:1.3.40": version: 1.3.40 resolution: "@swc/core-linux-x64-musl@npm:1.3.40" @@ -452,6 +571,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-x64-musl@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-linux-x64-musl@npm:1.3.42" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@swc/core-win32-arm64-msvc@npm:1.3.40": version: 1.3.40 resolution: "@swc/core-win32-arm64-msvc@npm:1.3.40" @@ -459,6 +585,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-arm64-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.42" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@swc/core-win32-ia32-msvc@npm:1.3.40": version: 1.3.40 resolution: "@swc/core-win32-ia32-msvc@npm:1.3.40" @@ -466,6 +599,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-ia32-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.42" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@swc/core-win32-x64-msvc@npm:1.3.40": version: 1.3.40 resolution: "@swc/core-win32-x64-msvc@npm:1.3.40" @@ -473,6 +613,52 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-x64-msvc@npm:1.3.42": + version: 1.3.42 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.42" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@swc/core@npm:^1.3.21": + version: 1.3.42 + resolution: "@swc/core@npm:1.3.42" + dependencies: + "@swc/core-darwin-arm64": 1.3.42 + "@swc/core-darwin-x64": 1.3.42 + "@swc/core-linux-arm-gnueabihf": 1.3.42 + "@swc/core-linux-arm64-gnu": 1.3.42 + "@swc/core-linux-arm64-musl": 1.3.42 + "@swc/core-linux-x64-gnu": 1.3.42 + "@swc/core-linux-x64-musl": 1.3.42 + "@swc/core-win32-arm64-msvc": 1.3.42 + "@swc/core-win32-ia32-msvc": 1.3.42 + "@swc/core-win32-x64-msvc": 1.3.42 + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + checksum: 5c28c03ee6a4e1f630c4a519b56d7e23a0102f70fad977a3ab144a3da96231cf4849e473cdc9ee7be6b9266ba0838d0bc0b6b3575a75540f302befe96cc9606e + languageName: node + linkType: hard + "@swc/core@npm:^1.3.40": version: 1.3.40 resolution: "@swc/core@npm:1.3.40" @@ -563,6 +749,13 @@ __metadata: languageName: node linkType: hard +"@types/benchmark@npm:^2": + version: 2.1.2 + resolution: "@types/benchmark@npm:2.1.2" + checksum: dc5e544ffca59bdc61008d89f007c14c281c17e80d50385da81eb9182e4466a9208ceb7af72ddfb4df1e2445ea35f2af36854168f698edd4c015a4262232462d + languageName: node + linkType: hard + "@types/cacheable-request@npm:^6.0.1": version: 6.0.3 resolution: "@types/cacheable-request@npm:6.0.3" @@ -642,6 +835,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^18.11.9": + version: 18.15.11 + resolution: "@types/node@npm:18.15.11" + checksum: 977b4ad04708897ff0eb049ecf82246d210939c82461922d20f7d2dcfd81bbc661582ba3af28869210f7e8b1934529dcd46bff7d448551400f9d48b9d3bddec3 + languageName: node + linkType: hard + "@types/node@npm:^18.15.3": version: 18.15.3 resolution: "@types/node@npm:18.15.3" @@ -1051,6 +1251,40 @@ __metadata: languageName: node linkType: hard +"benchmark@npm:^2.1.4": + version: 2.1.4 + resolution: "benchmark@npm:2.1.4" + dependencies: + lodash: ^4.17.4 + platform: ^1.3.3 + checksum: aa466561d4f2b0a2419a3069b8f90fd35ffacf26849697eea9de525ecfbd10b44da11070cc51c88d772076db8cb2415641b493de7d6c024fdf8551019c6fcf1c + languageName: node + linkType: hard + +"benchmark@workspace:packages/benchmark": + version: 0.0.0-use.local + resolution: "benchmark@workspace:packages/benchmark" + dependencies: + "@discordeno/bot": latest + "@discordeno/gateway": 19.0.0-alpha.1 + "@discordeno/rest": 19.0.0-alpha.1 + "@discordeno/types": 19.0.0-alpha.1 + "@discordeno/utils": 19.0.0-alpha.1 + "@swc/cli": ^0.1.57 + "@swc/core": ^1.3.21 + "@types/benchmark": ^2 + "@types/node": ^18.11.9 + benchmark: ^2.1.4 + eslint: ^8.0.1 + eslint-config-discordeno: "*" + microtime: ^3.1.1 + node-fetch: ^3.3.1 + ts-node: ^10.9.1 + tsconfig: "*" + typescript: ^4.9.3 + languageName: unknown + linkType: soft + "bin-check@npm:^4.1.0": version: 4.1.0 resolution: "bin-check@npm:4.1.0" @@ -1995,6 +2229,63 @@ __metadata: languageName: node linkType: hard +"eslint-visitor-keys@npm:^3.4.0": + version: 3.4.0 + resolution: "eslint-visitor-keys@npm:3.4.0" + checksum: 33159169462d3989321a1ec1e9aaaf6a24cc403d5d347e9886d1b5bfe18ffa1be73bdc6203143a28a606b142b1af49787f33cff0d6d0813eb5f2e8d2e1a6043c + languageName: node + linkType: hard + +"eslint@npm:^8.0.1": + version: 8.37.0 + resolution: "eslint@npm:8.37.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.4.0 + "@eslint/eslintrc": ^2.0.2 + "@eslint/js": 8.37.0 + "@humanwhocodes/config-array": ^0.11.8 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.1.1 + eslint-visitor-keys: ^3.4.0 + espree: ^9.5.1 + esquery: ^1.4.2 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 + grapheme-splitter: ^1.0.4 + ignore: ^5.2.0 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + is-path-inside: ^3.0.3 + js-sdsl: ^4.1.4 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.1 + strip-ansi: ^6.0.1 + strip-json-comments: ^3.1.0 + text-table: ^0.2.0 + bin: + eslint: bin/eslint.js + checksum: 80f3d5cdce2d671f4794e392d234a78d039c347673defb0596268bd481e8f30a53d93c01ff4f66a546c87d97ab4122c0e9cafe1371f87cb03cee6b7d5aa97595 + languageName: node + linkType: hard + "eslint@npm:^8.36.0": version: 8.36.0 resolution: "eslint@npm:8.36.0" @@ -2056,6 +2347,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^9.5.1": + version: 9.5.1 + resolution: "espree@npm:9.5.1" + dependencies: + acorn: ^8.8.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.0 + checksum: cdf6e43540433d917c4f2ee087c6e987b2063baa85a1d9cdaf51533d78275ebd5910c42154e7baf8e3e89804b386da0a2f7fad2264d8f04420e7506bf87b3b88 + languageName: node + linkType: hard + "esquery@npm:^1.4.2": version: 1.5.0 resolution: "esquery@npm:1.5.0" @@ -3250,6 +3552,13 @@ __metadata: languageName: node linkType: hard +"lodash@npm:^4.17.4": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + "log-symbols@npm:4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" @@ -3394,6 +3703,17 @@ __metadata: languageName: node linkType: hard +"microtime@npm:^3.1.1": + version: 3.1.1 + resolution: "microtime@npm:3.1.1" + dependencies: + node-addon-api: ^5.0.0 + node-gyp: latest + node-gyp-build: ^4.4.0 + checksum: 1161571d9c994070139d8dd65160bb5ebb87044cb0ea9828a65fde201fcf9b90da9c2897e352a26e852a7fa9dd7b6774128b50854462d117be1b019abff41887 + languageName: node + linkType: hard + "mime-db@npm:^1.28.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" @@ -3656,6 +3976,15 @@ __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: latest + checksum: 2508bd2d2981945406243a7bd31362fc7af8b70b8b4d65f869c61731800058fb818cc2fd36c8eac714ddd0e568cc85becf5e165cebbdf7b5024d5151bbc75ea1 + languageName: node + linkType: hard + "node-domexception@npm:^1.0.0": version: 1.0.0 resolution: "node-domexception@npm:1.0.0" @@ -3674,6 +4003,17 @@ __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: 25d78c5ef1f8c24291f4a370c47ba52fcea14f39272041a90a7894cd50d766f7c8cb8fb06c0f42bf6f69b204b49d9be3c8fc344aac09714d5bdb95965499eb15 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 9.3.1 resolution: "node-gyp@npm:9.3.1" @@ -3997,6 +4337,13 @@ __metadata: languageName: node linkType: hard +"platform@npm:^1.3.3": + version: 1.3.6 + resolution: "platform@npm:1.3.6" + checksum: 6f472a09c61d418c7e26c1c16d0bdc029549d512dbec6526216a1e59ec68100d07007d0097dcba69dddad883d6f2a83361b4bdfe0094a3d9a2af24158643d85e + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -4962,7 +5309,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.9.5": +"typescript@npm:^4.9.3, typescript@npm:^4.9.5": version: 4.9.5 resolution: "typescript@npm:4.9.5" bin: @@ -4972,7 +5319,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@^4.9.5#~builtin": +"typescript@patch:typescript@^4.9.3#~builtin, typescript@patch:typescript@^4.9.5#~builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=d73830" bin: