mirror of
https://github.com/discordeno/discordeno.git
synced 2026-09-17 08:47:22 +00:00
BREAKING: node migration + major improvements and style changes (#2783)
* Setup turborepo (#2610) * chore: BREAKING move to monorepo structure * chore: setup turborepo * setup more eslint and tsconfig (#2612) * fix packages setting lcoation * add dist to ignore * style * fix: .vscode set prettier and remove deno configs (#2611) * fix: rewrite to process.env * chore: add node types * style: run eslint --fix * fix: tests import ext * chore: fix formatter * chore: add build script * chore: remove site from turborepo * chore: move to seperate packages * chore: seperate util * chore: rename to index * fix: utils * chore: bump typescript * fix: in process of fixing rest * fix: logger * style * chore: fix turbo script * fix: types * fix: types * fix: shard * fix: gateway * fixing: bot * fix: at least it can run now * chore: fix turbo script * chore: move plugins * chore: add type and utils export * chore: working bot type and cache plugin * Add git hooks (#2618) * CI: Setup ci (#2669) * ci: fix test * ci: fix typo * fix: turbo script * fixes: yarn and linter errors in embeds pkg * chore: fix yarn gitignore * Node migration - devcontainer (#2672) * ✨ - feat: devcontainer -> node * 👷♂ - ci: devcontainer - add tabnine, prettier * fix: ignore .env and debug.ts * fix: couple of linter errors * fix: linter error * fix: gateway linter errors * style: update style * style: fix bot style * fix: type * ci: move all old workflow * chore: close #2619 * chore: close #2671 * test: add mocha * chore: add typescript plugin * test: add mocha * test: add test to utils * test/ci: update ci and coverage * chore: change script naming * ci: update include test * test: add coverage * ci: fix cache * ci: fix ci and codecov * Discordeno Documentation (#2673) * Add git hooks * Add documentation generatation * Change Documentation Engine * Add documentation * Remove autogenerated docs * combine lint staged action into one * style: fix Co-authored-by: H01001000 <heiheiho000@gmail.com> * chore: new package client * test: add rest test * ci: enable codecov * fix: type * test: add test to all packages * ci: add release to gh per commit * fix: ci syntax * fix: package version * fix: publish script * fix: remove private from gateway * ci: add filter for changes * fix: ci syntex * ci: try fix path filter * ci: try fix path filter * test: add test * ci: fix string and boolean * fix: package and ci * chore: fix turbo type cache * ci: also publish to npm * ci: change to public * fix: not publish to npm * fix: dependencies * chore: fix fmt script * fix: better rest typecheck Closes #2621 * fix: run yarn install * feat: add transformers to rest * feat: add helpers to rest * test: move bot utils test * reverse change to release.yml * chore: add clean build * refactor: discordeno * chore: add import type * chore: remove bot * fix: change deps from bot to dd * chore: update yarn lock * test: temp remove test from logger * refactor: remove transformers in helpers/channel * type: close #2622 * ci(fix): explicitly define coverage file * refactor: remove transformers in helpers/emoji * type: fix discord guild type * feat: DiscordEditAutomoderationRule type * fix: remove unused type * feat: DiscordCreateGuildEmoji DiscordModifyGuildEmoji & DiscordModifyCHannel types * feat: DiscordCreateChannel DiscordBuDeleteMessages DiscordCreateMessage DiscordEditMessage * feat: DiscordCreateScheduledEvent EditScheduledEvent DiscordCreateInvite * fix: types for guild stuff for rest * feat: thread discord types for rest * feat: channel rest types * feat: member rest types * feat: more discord rest types * fix: type errors * fix: docs bot param name should be rest * type: fix type error * ci(fix): codecov * chore(client) :add export transformer * fix: verifySignature * test: fix types * test: add test prevent #2683 #2678 * fix: export transformer twice * ci: reuse cache * test: add test:unit-noTextCoverage * feat: add transform and constant package * fix: half fix #2683 #2688 * fix: #2688 fix all transformer.spec.ts * fix: transformer name * ci: update style * fix: dependencies * fix: naming * fix: yarn lock * fix: remove validations from helpers. Closes #2700 * fix: rest routes as a constants pkg * fix: esm import with .js * test: add exception case * feat: adding transformer * chore: change script name * chore: add path fixing to coverage file * fix: camelize tuple bug * fix: reverse transformers * fix: transformers folder to camel * fix: transformers as an object * fix: linter error * ci: run test with deno close #2701 * fix: test depends on build * fix: deno import node:crypto * fix: rest improvements * fix: channel type * fix: export user * chore: move to unit dir * test: moving bench * fix: remove transformers from rest package * fix: move toggle transformers to bot pkg * fix: move out gw helpers to gw package * test: add rest e2e test * fix: syntex * ci: add discord token * fix: ci not passing secret * test: add role test * ci: fix secret inherit * fix: role helpers transformer * test: increase timeout to 10s * fix: member helpers transformer * test: add member test * fix: name and type * fix: guild ban * test: fix test * fix: test add await * test: skip some test * test: increase timeout * chore: add transformer to import map * fix: test * test: add why-is-node-still-running * test: add debug hook * ci: add timeout incase any async running * test: try fix * test: turn on rest debug * fix: if undefined * test: reduce timeout * fix: queue not running after some request * fix: increase remaining after request without ratelimit header * fix: partial webhook * fix: fetch hooks not working if debug defined later * fix: nickname null to undefined * test: finish adding webhook test * refactor(test): move rest to utils * fix: add await * fix: sticker * feat: add message embed component transformer * fix: test not done * fix: arg type to bigString * fix: sendMessage * fix: add allowedMentions, interactionResponse * test: add emoji e2e test * test: add guild e2e test * refactor(test): remove extra rest call * fix: create emoji BINARY_TYPE_INVALID_DATA_URI * fix: create guild rate limit * fix: automode rule helpers and test * fix: test run in only * test: add some queue bucket test * test: remove empty test * refactor(test): use new guild * test: use new guild for other test * fix: guild not defind * reactor(test): remove duplicated creat channel * test: increase timeout to 30s * test: add thread test * fix: more transformers * fix: gateway helpers use transformers * fix: types belong in types pkg * fix: helpers use transformers * BREAKING: v19 rewrite to node + major improvements (#2703) * fix: move all to old folder * fix: cleanup types * fix: more cleanup * fix: more base cleanup * fix: token dotenv * fix: add base transformer * fix: partial error handling * fix: handle 429 rate limit * test(rest): fix unit test * fix(script): transform extension * test: fix error and buffer * feat: camelizer util * fix: cleanup * fix: rate limit queues and headers processing * fix: rest exports * fix: no more transformers * fix: queue header null bug * fix: add gateway package base * fix: lint error * fix: add prettier file * fix: prettier is default fmtr * fix: fmt shard file * fix: fmt * fix: types issue * fix: remove unused consts * fix: all import issues * fix: import error * fix: import ending with .js * fix: remove transformers package * Fix eslint (#2710) * fix: typing of button component label to be optional (#2708) * feat: add guild_connections to role tags and toggles (#2706) Co-authored-by: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> * Add lint checks and autofixing workflow (#2702) * Add lint checks and autofixing workflow * Update lint.yml * Fix: use yarn instead npm * fix: add ts to eslint_extensions * fix: update dir * fix: lint.yml format Co-authored-by: Jonathan Ho <heiheiho000@gmail.com> * fix: unused deps * ci: fix e2e test not running * chore: run yarn install * test: this should run test * feat: getCHannel * feat: createEMji helper * feat: collection class in util package * fix: gateway bugs * why on earth is this needed change * fix: cleanup docs on collection * Emoji rest methods (node-migration-clean) (#2713) * feat: all emoji rest methods * Fix code style issues with ESLint Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * fix: stuff * fix: bot types * fix: remove logs * fix: camelize all gateway payloads * fix: remove todos * fix: start deris * fix: lint/ts errors except shard file * thats 1 way to fix type errors * yes (#2714) Co-authored-by: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> * feat: rest channel helpers * Update release.yml * Update release.yml * ci: add build filter * ci: fail fast false * fix: complete webhook related helpers * fix: follow announcement helper * add forum helper * add stage helpers * add thread related helpers * alphabetize * cleanup webhook routes * automod helpers * scheduled events * integrations helpers * invite stuff incomplete * dm channel and avatar url * chore: move ts-node into package * fix: importing esm * fix: tris message helpers * test(rest): add simplifyUrl test * test(rest): add checkRateLimits test * test(rest): add processRateLimitedPaths test * test(rest): fix missing beforeEach * test(utils): enable old test * interaction helpers * perf(utils): optimize snake to camel case conversion (#2717) * perf(utils): optimize snake to camel case conversion * fmt * wont change much but still faster * actually this was a stupid idea * shh * Fix(client): Fix typings. (#2716) Co-authored-by: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> * test: fix rest and utils test (#2723) * test(utils): fix cant import collection * test(rest): await expect * fix(utils): deno compactability * test(utils): typing * fix(utils): add return type * Add rest helpers for templates (#2727) * Add rest helpers for templates * Fix code style issues with ESLint Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * fix: remove frozenAt * fix: cleanup templates * ci: release to npm (#2725) * ci: release to npm * Update release.yml * 🐛 - fix: types - slashcommands - add nsfw prop (#2731) * feat(rest helpers): Add template and member helpers. (#2728) * feat(rest helpers): Add template and member helpers. * format code * feat(rest): add template routes * fix(rest): routes and runMethod * fix(rest): try to fix most of type Co-authored-by: H01001000 <heiheiho000@gmail.com> Co-authored-by: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> * ci: fix release (#2732) * fix: rest type errors * fix: v19 begin * fix: yarn lock * chore: fix deps and script (#2733) * fix: bug camelizer deleting letters * fix: falsy token check * fix: add frozenat check for queue * fix: max stack trace error do to infinite loop * fix: type error * test(rest): fix missing import (#2734) Co-authored-by: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> * fix: file paths for imports * fix: lastShardId should default to 0 * fix: use isomorphic ws * test(rest): fix "TypeError: [Function] is not a thenable" (#2736) * test(utils): add utils tests (#2737) * test(utils): add urltobase64 test * test(utils): add token test * test(utils): fix missing import buffer * test(utils): add casting test * test(utils): add casting test * test(utils): fix use correct function * chore: make eslint error if missing .js extension (#2735) * chore: eslint error if missing .js extension * chore * lint: fix missing .js error Co-authored-by: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> * fix: readme runtime list (#2739) * Bot pkg (#2740) * fix: bot pkg test * Fix code style issues with ESLint * Update Guild.ts * Update Guild.ts * Fix code style issues with ESLint Co-authored-by: Lint Action <lint-action@samuelmeuli.com> Co-authored-by: Jonathan Ho <heiheiho000@gmail.com> * Update tsdoc.json (#2741) Updates tsdoc.json to reflect the current packages. * Interaction types - remove member,channel,role from value type (#2743) https://discord.com/channels/785384884197392384/1067265182776176690/1068189883073572924 * Add missing types (#2742) * Revert "fix: use isomorphic ws" (#2744) This reverts commitad306b0d0a. * fix: interaction requests that sent without full url * fix: lint issues * fix: remote gateway test file * fix: interaction response bug with body being invalid (#2746) * fix: readme runtime list * Fix code style issues with ESLint * node 18 * fix: websocket import type * fix: body for interaction requests --------- Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * fix: interaction followup type (#2747) * fix: readme runtime list * Fix code style issues with ESLint * node 18 * fix: websocket import type * fix: body for interaction requests * fix: perma fix for type error in ci * fix: followupmessage option type --------- Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * fix: e2e exit bug (#2748) * fix: readme runtime list * Fix code style issues with ESLint * node 18 * fix: websocket import type * fix: body for interaction requests * fix: perma fix for type error in ci * fix: followupmessage option type * fix: e2e tests exit bug * fix: color console logger --------- Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * fix: rest sending attachments files (#2749) * fix: readme runtime list * Fix code style issues with ESLint * node 18 * fix: websocket import type * fix: body for interaction requests * fix: perma fix for type error in ci * fix: followupmessage option type * fix: e2e tests exit bug * fix: color console logger * fix: image file sending * Fix code style issues with ESLint --------- Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * fix: guild and role methods (#2751) * fix: readme runtime list * Fix code style issues with ESLint * node 18 * fix: websocket import type * fix: body for interaction requests * fix: perma fix for type error in ci * fix: followupmessage option type * fix: e2e tests exit bug * fix: color console logger * fix: image file sending * Fix code style issues with ESLint * guild and role methods * Fix code style issues with ESLint --------- Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * ci: add bot package (#2752) * ci: add bot package * ci: fix test * e2e test stuff (#2754) * fix: readme runtime list * Fix code style issues with ESLint * node 18 * fix: websocket import type * fix: body for interaction requests * fix: perma fix for type error in ci * fix: followupmessage option type * fix: e2e tests exit bug * fix: color console logger * fix: image file sending * Fix code style issues with ESLint * guild and role methods * Fix code style issues with ESLint * fix: dont send heartbeat if socket is not open * fix: remove logs * fox: remove more logs * fix some bugs in role tests * Switch to after hook style * hoti's speed snaker * auto convert objects for discord * Fix code style issues with ESLint * fix: remove dup imports * fix: i hate linters * speeder --------- Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * fix: delete guilds test (#2758) * fix: readme runtime list * Fix code style issues with ESLint * node 18 * fix: websocket import type * fix: body for interaction requests * fix: perma fix for type error in ci * fix: followupmessage option type * fix: e2e tests exit bug * fix: color console logger * fix: image file sending * Fix code style issues with ESLint * guild and role methods * Fix code style issues with ESLint * fix: dont send heartbeat if socket is not open * fix: remove logs * fox: remove more logs * fix some bugs in role tests * Switch to after hook style * hoti's speed snaker * auto convert objects for discord * Fix code style issues with ESLint * fix: remove dup imports * fix: i hate linters * speeder * fix: tests delete guilds * Fix code style issues with ESLint --------- Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * chore: fix deps (#2757) * ci/test: fix bot pkg e2e test (#2759) * chore: fix script and update import map (#2761) * chore: fix version script * chore: update import map * chore: fix ws import map * chore: fix deno import map * test: fix * fix: more rest e2e tests (#2763) * fix: readme runtime list * Fix code style issues with ESLint * node 18 * fix: websocket import type * fix: body for interaction requests * fix: perma fix for type error in ci * fix: followupmessage option type * fix: e2e tests exit bug * fix: color console logger * fix: image file sending * Fix code style issues with ESLint * guild and role methods * Fix code style issues with ESLint * fix: dont send heartbeat if socket is not open * fix: remove logs * fox: remove more logs * fix some bugs in role tests * Switch to after hook style * hoti's speed snaker * auto convert objects for discord * Fix code style issues with ESLint * fix: remove dup imports * fix: i hate linters * speeder * fix: tests delete guilds * Fix code style issues with ESLint * fix: easier to provide custom intents in bot * fix: shutdown bot after test * fix: add getGuild * fix: multiple guild delete attempts * fix: add emoji e2e tests * fix: remaining old e2e rest tests * Fix code style issues with ESLint --------- Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * test: add gateway integration test (#2756) * test: add gateway integration test * test(gateway): fix connection test * test(gateway): add heartbeat test * ci: add integration test * fix: add uWebSockets.js * ci: add timeout * test(utils): remove old test * Revert "test(utils): remove old test" This reverts commit04fb6dd4b5. * test(gateway): fix uws server * test(gateway): fix type * chore: update codecov flag * test(gateway): remove dev code --------- Co-authored-by: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> * Update release.yml (#2768) * fix: bot logger (#2769) * fix: readme runtime list * Fix code style issues with ESLint * node 18 * fix: websocket import type * fix: body for interaction requests * fix: perma fix for type error in ci * fix: followupmessage option type * fix: e2e tests exit bug * fix: color console logger * fix: image file sending * Fix code style issues with ESLint * guild and role methods * Fix code style issues with ESLint * fix: dont send heartbeat if socket is not open * fix: remove logs * fox: remove more logs * fix some bugs in role tests * Switch to after hook style * hoti's speed snaker * auto convert objects for discord * Fix code style issues with ESLint * fix: remove dup imports * fix: i hate linters * speeder * fix: tests delete guilds * Fix code style issues with ESLint * fix: easier to provide custom intents in bot * fix: shutdown bot after test * fix: add getGuild * fix: multiple guild delete attempts * fix: add emoji e2e tests * fix: remaining old e2e rest tests * Fix code style issues with ESLint * fix: add bot.logger * fix: make logger name capital --------- Co-authored-by: Lint Action <lint-action@samuelmeuli.com> * chore: update readme (#2772) * chore: add coverage per pkg * chore: add npm version * chore: add test status * chore: fix ci * chore: fix ci * ci: fix ci needs * chore: add only push event * style: remove import logger * 📚 - docs: fix README package links (#2773) * test(all): add test importing index (#2774) * test(all): add test importing index * chore: remove old benchmark dir * chore: disable coverage status fail * test(client): add import test with try catch * test(rest): fix narrow import scope * test(utils): add test (#2764) * test(utils): remove old test * test(utils): add color test * test(utils): fix import mocha * test(utils): fix test type error * test(utils): remove dev code * fix(utils): bucket not export all function * test(utils): add some test for bucket * fix(utils): close #2775 * test(utils): add test for permissions.ts * test(utils): fix missing mocha import * fix(utils): better fix for #2775 * feat: addReaction & addReactions * feat: connectToVoice * fix: linters issues * fix: remove aliases and add createGuildFromTemplate * feat: deleteMessages * fix: reaction related helpers * mfa level * voie states editing * image urls * fix: typos * get message typeguards * fix: more helpers * fix: remaining helpers * fix: add logs to gateway manager * fix: rest resolve sends status and body * fix: lots of errors * fix: client errors * fix: remove old pkg * snaker * fix: broken util import for image url * fix: cleanup shard and circular deps * fix: remove ThreadChannel from GuildChannel * fix: generate interaction usage * fix: more bugs * fix: use node:events to import * fix(rest): add interface RestRequestRejection (#2782) * fix: remove invalid todo * fix: timeout bug --------- Co-authored-by: Skillz <skillz@discord.gg/ddeno> Co-authored-by: Jonathan Ho <heiheiho000@gmail.com> Co-authored-by: deepsarda <92147339+deepsarda@users.noreply.github.com> Co-authored-by: Awesome Stickz <awesome@stickz.dev> Co-authored-by: Lint Action <lint-action@samuelmeuli.com> Co-authored-by: Lars_und_so <46791248+Larsundso@users.noreply.github.com> Co-authored-by: ITOH <to@itoh.at> Co-authored-by: Yaikava <83710104+Yaikava@users.noreply.github.com> Co-authored-by: Andreas Fink <mail@afink.dev> --------- Co-authored-by: Jonathan Ho <48591478+H01001000@users.noreply.github.com> Co-authored-by: H01001000 <heiheiho000@gmail.com> Co-authored-by: deepsarda <92147339+deepsarda@users.noreply.github.com> Co-authored-by: Yaikava <83710104+Yaikava@users.noreply.github.com> Co-authored-by: Skillz <skillz@discord.gg/ddeno> Co-authored-by: Awesome Stickz <awesome@stickz.dev> Co-authored-by: Lint Action <lint-action@samuelmeuli.com> Co-authored-by: Lars_und_so <46791248+Larsundso@users.noreply.github.com> Co-authored-by: ITOH <to@itoh.at> Co-authored-by: Andreas Fink <mail@afink.dev>
This commit is contained in:
co-authored by
H01001000
Lint Action
Skillz
deepsarda
Awesome Stickz
Lars_und_so
ITOH
Yaikava
Andreas Fink
Jonathan Ho
parent
1a717ddc7d
commit
2714e1e7d1
@@ -0,0 +1,44 @@
|
||||
import { expect } from 'chai'
|
||||
import { describe, it } from 'mocha'
|
||||
import { Buffer } from 'node:buffer'
|
||||
import { decode, encode } from '../src/base64.js'
|
||||
|
||||
describe('base64.ts', () => {
|
||||
describe('encode', () => {
|
||||
it('can encode string to base64', () => {
|
||||
expect(encode('Man Ё𤭢')).to.be.equal('TWFuINCB8KStog==')
|
||||
})
|
||||
it('can encode Uint8Array to base64', () => {
|
||||
expect(encode(new Uint8Array([77, 97, 110, 32, 208, 129, 240, 164, 173, 162]))).to.be.equal('TWFuINCB8KStog==')
|
||||
})
|
||||
it('can encode Buffer to base64', () => {
|
||||
expect(encode(Buffer.from([77, 97, 110, 32, 208, 129, 240, 164, 173, 162]))).to.be.equal('TWFuINCB8KStog==')
|
||||
})
|
||||
})
|
||||
|
||||
describe('decode', () => {
|
||||
it('can dencode string to Uint8Array', () => {
|
||||
expect(new TextDecoder().decode(decode('TWFuINCB8KStog=='))).to.be.equal('Man Ё𤭢')
|
||||
})
|
||||
})
|
||||
|
||||
/** Old test */
|
||||
it('[utils] encode some bytes to base64', () => {
|
||||
expect(encode(new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))).to.be.deep.equal('AQIDBAUGBwgJCg==')
|
||||
})
|
||||
|
||||
it('[utils] decode some base64 to bytes', () => {
|
||||
expect(decode('AQIDBAUGBwgJCg==')).to.be.deep.equal(new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
|
||||
})
|
||||
|
||||
it('[utils] encode/decode base64 roundtrip should work', () => {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
const bytes: number[] = []
|
||||
for (let i = 0; i < 10000; i++) {
|
||||
bytes.push(Math.floor(Math.random() * 256))
|
||||
}
|
||||
const data = new Uint8Array(bytes)
|
||||
expect(decode(encode(data))).to.be.deep.equal(data)
|
||||
}
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,141 @@
|
||||
import { expect } from 'chai'
|
||||
import { afterEach, beforeEach, describe, it } from 'mocha'
|
||||
import sinon from 'sinon'
|
||||
import * as bucketJs from '../src/bucket.js'
|
||||
import { createLeakyBucket, updateTokens } from '../src/bucket.js'
|
||||
|
||||
describe('bucket.ts', () => {
|
||||
let clock: sinon.SinonFakeTimers
|
||||
|
||||
beforeEach(() => {
|
||||
clock = sinon.useFakeTimers()
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
sinon.restore()
|
||||
clock.restore()
|
||||
})
|
||||
|
||||
describe('createLeakyBucket function', () => {
|
||||
it('will return bucket with given options', () => {
|
||||
const options = {
|
||||
max: 6006,
|
||||
refillInterval: 2002,
|
||||
refillAmount: 3003,
|
||||
tokens: 4004,
|
||||
someThingElse: {
|
||||
thing: 'else',
|
||||
},
|
||||
}
|
||||
const bucket = createLeakyBucket(options)
|
||||
expect(bucket.max).to.equal(options.max)
|
||||
expect(bucket.refillInterval).to.equal(options.refillInterval)
|
||||
expect(bucket.refillAmount).to.equal(options.refillAmount)
|
||||
expect(bucket.tokensState).to.equal(options.tokens)
|
||||
// @ts-expect-error
|
||||
expect(bucket.someThingElse).to.equal(options.someThingElse)
|
||||
})
|
||||
|
||||
it('will return bucket with refillAmount within max', () => {
|
||||
const options = {
|
||||
max: 111,
|
||||
refillInterval: 2002,
|
||||
refillAmount: 3003,
|
||||
tokens: 4004,
|
||||
}
|
||||
const bucket = createLeakyBucket(options)
|
||||
expect(bucket.refillAmount).to.equal(options.max)
|
||||
})
|
||||
|
||||
it('will return bucket with tokensState within max', () => {
|
||||
const options = {
|
||||
max: 111,
|
||||
refillInterval: 2002,
|
||||
refillAmount: 3003,
|
||||
tokens: 4004,
|
||||
}
|
||||
const bucket = createLeakyBucket(options)
|
||||
expect(bucket.refillAmount).to.equal(options.max)
|
||||
})
|
||||
|
||||
it('will return bucket with default property', () => {
|
||||
const bucket = createLeakyBucket({
|
||||
max: 111,
|
||||
refillInterval: 2002,
|
||||
refillAmount: 3003,
|
||||
tokens: 4004,
|
||||
})
|
||||
expect(bucket.lastRefill).to.equal(Date.now())
|
||||
expect(bucket.allowAcquire).to.equal(true)
|
||||
expect(bucket.waiting).to.deep.equal([])
|
||||
})
|
||||
|
||||
it.skip('will call nextRefill with itself when called nextRefill', () => {
|
||||
sinon.stub(bucketJs, 'nextRefill')
|
||||
})
|
||||
|
||||
it.skip('will call updateTokens with itself when called tokens', () => {
|
||||
sinon.stub(bucketJs, 'nextRefill')
|
||||
})
|
||||
|
||||
it.skip('will call acquire with itself when called acquire', () => {
|
||||
sinon.stub(bucketJs, 'nextRefill')
|
||||
})
|
||||
})
|
||||
describe('updateTokens function', () => {
|
||||
it('will not increase bucket token after <1 refillInterval passed', () => {
|
||||
const bucket = createLeakyBucket({
|
||||
max: 10,
|
||||
refillInterval: 100,
|
||||
refillAmount: 1,
|
||||
tokens: 0,
|
||||
})
|
||||
expect(bucket.tokens()).to.equal(0)
|
||||
updateTokens(bucket)
|
||||
expect(bucket.tokens()).to.equal(0)
|
||||
clock.tick(99)
|
||||
expect(bucket.tokens()).to.equal(0)
|
||||
})
|
||||
|
||||
it('will increase 5 bucket token after 5 refillInterval passed', () => {
|
||||
const bucket = createLeakyBucket({
|
||||
max: 10,
|
||||
refillInterval: 100,
|
||||
refillAmount: 1,
|
||||
tokens: 1,
|
||||
})
|
||||
expect(bucket.tokens()).to.equal(1)
|
||||
updateTokens(bucket)
|
||||
expect(bucket.tokens()).to.equal(1)
|
||||
clock.tick(599)
|
||||
expect(bucket.tokens()).to.equal(6)
|
||||
})
|
||||
|
||||
it('will increate lastRefill according to number of refill', () => {
|
||||
const bucket = createLeakyBucket({
|
||||
max: 10,
|
||||
refillInterval: 100,
|
||||
refillAmount: 1,
|
||||
tokens: 1,
|
||||
})
|
||||
expect(bucket.lastRefill).to.equal(Date.now())
|
||||
clock.tick(699)
|
||||
updateTokens(bucket)
|
||||
expect(bucket.lastRefill).to.equal(Date.now() - 99)
|
||||
})
|
||||
|
||||
it('will return bucket token of the bucket', () => {
|
||||
const bucket = createLeakyBucket({
|
||||
max: 10,
|
||||
refillInterval: 100,
|
||||
refillAmount: 1,
|
||||
tokens: 1,
|
||||
})
|
||||
expect(updateTokens(bucket)).to.equal(1)
|
||||
clock.tick(500)
|
||||
expect(updateTokens(bucket)).to.equal(6)
|
||||
})
|
||||
})
|
||||
describe('nextRefill function', () => {})
|
||||
describe('acquire function', () => {})
|
||||
})
|
||||
@@ -0,0 +1,47 @@
|
||||
import { expect } from 'chai'
|
||||
import { describe, it } from 'mocha'
|
||||
import { camelize, snakeToCamelCase } from '../src/casing.js'
|
||||
|
||||
describe('casting.ts', () => {
|
||||
describe('camelize function', () => {
|
||||
it('will convert snake case object to camel case object', () => {
|
||||
expect(
|
||||
camelize({
|
||||
test_ax_by_cz: 'dummy_dx_ey_fz',
|
||||
testgxhyiz: 'dummyjxkylz',
|
||||
32: 'adw_dw',
|
||||
}),
|
||||
).to.deep.equal({
|
||||
testAxByCz: 'dummy_dx_ey_fz',
|
||||
testgxhyiz: 'dummyjxkylz',
|
||||
32: 'adw_dw',
|
||||
})
|
||||
})
|
||||
|
||||
it('will convert array of snake case object to camel case object', () => {
|
||||
expect(
|
||||
camelize([
|
||||
{
|
||||
test_ax_by_cz: 'dummy_dx_ey_fz',
|
||||
},
|
||||
{
|
||||
test_gx_hy_iz: 'dummy_jx_ky_lz',
|
||||
},
|
||||
]),
|
||||
).to.deep.equal([
|
||||
{
|
||||
testAxByCz: 'dummy_dx_ey_fz',
|
||||
},
|
||||
{
|
||||
testGxHyIz: 'dummy_jx_ky_lz',
|
||||
},
|
||||
])
|
||||
})
|
||||
|
||||
describe('snakeToCamelCase function', () => {
|
||||
it('will convert string snake case to camel case', () => {
|
||||
expect(snakeToCamelCase('sd_sd')).to.equal('sdSd')
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,142 @@
|
||||
import { expect } from 'chai'
|
||||
import { beforeEach, describe, it } from 'mocha'
|
||||
import sinon from 'sinon'
|
||||
import { Collection } from '../src/Collection.js'
|
||||
|
||||
describe('collection.ts', () => {
|
||||
let collection: Collection<any, any>
|
||||
|
||||
beforeEach(() => {
|
||||
collection = new Collection()
|
||||
})
|
||||
|
||||
it('[collection] collection values to array', () => {
|
||||
const testCollection = new Collection([
|
||||
['best', 'tri'],
|
||||
['proficient', 'yui'],
|
||||
])
|
||||
expect(testCollection.array()).to.be.deep.equal(['tri', 'yui'])
|
||||
})
|
||||
|
||||
it('[collection] get a random value', () => {
|
||||
const testCollection = new Collection([['best', 'tri']])
|
||||
|
||||
expect(testCollection.random() ?? '').to.be.oneOf(['best', 'tri'])
|
||||
expect(collection.random()).to.be.undefined
|
||||
})
|
||||
|
||||
describe('', () => {
|
||||
beforeEach(() => {
|
||||
collection.set('best developer', 'triformine')
|
||||
})
|
||||
it('[collection] Set a value without maxSize', () => {
|
||||
expect(collection.size).to.be.equal(1)
|
||||
expect(collection.get('best developer')).to.be.equal('triformine')
|
||||
})
|
||||
describe('', () => {
|
||||
beforeEach(() => {
|
||||
collection.set('deno', 'yes')
|
||||
})
|
||||
it('[collection] get the value of the first element', () => {
|
||||
expect(collection.first()).to.be.equal('triformine')
|
||||
})
|
||||
|
||||
it('[collection] get the value of the last element', () => {
|
||||
expect(collection.last()).to.be.equal('yes')
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('[collection] Create a collection with maxSize', () => {
|
||||
const maxSize = 2
|
||||
|
||||
const maxCollection = new Collection([], {
|
||||
maxSize,
|
||||
})
|
||||
|
||||
expect(maxCollection).to.exist
|
||||
expect(maxCollection.maxSize).to.exist
|
||||
expect(maxCollection.maxSize).to.be.equal(maxSize)
|
||||
|
||||
describe('[collection] Test if maxSize works properly', () => {
|
||||
maxCollection.set('foo', 'bar')
|
||||
maxCollection.set('me', 'you')
|
||||
|
||||
expect(maxCollection.size).to.be.equal(2)
|
||||
|
||||
maxCollection.set('this', 'not')
|
||||
|
||||
expect(maxCollection.size).to.be.equal(2)
|
||||
|
||||
it('[collection] Test if forceSet ignore maxSize', () => {
|
||||
maxCollection.forceSet('this', 'not')
|
||||
|
||||
expect(maxCollection.size).to.be.equal(3)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
const testCollection = new Collection([
|
||||
['a', 1],
|
||||
['b', 2],
|
||||
['c', 3],
|
||||
])
|
||||
|
||||
it('[collection] find by key or value', () => {
|
||||
expect(testCollection.find((v, k) => v === 2)).to.be.equal(2)
|
||||
expect(testCollection.find((v, k) => k === 'b')).to.be.equal(2)
|
||||
})
|
||||
|
||||
it('[collection] filter by key or value', () => {
|
||||
expect(testCollection.filter((v, k) => v === 3).size).to.be.equal(1)
|
||||
expect(testCollection.filter((v, k) => k === 'd').size).to.be.equal(0)
|
||||
})
|
||||
|
||||
it('[collection] map', () => {
|
||||
expect(testCollection.map((k, v) => `${v}${k}`)).to.be.deep.equal(['a1', 'b2', 'c3'])
|
||||
})
|
||||
|
||||
it('[collection] some', () => {
|
||||
expect(testCollection.some((v, _) => v === 1)).to.be.equal(true)
|
||||
expect(testCollection.some((v, _) => v === 4)).to.be.equal(false)
|
||||
})
|
||||
|
||||
it('[collection] every', () => {
|
||||
expect(testCollection.every((v, _) => v !== 0)).to.be.equal(true)
|
||||
expect(testCollection.every((v, _) => v === 1)).to.be.equal(false)
|
||||
})
|
||||
|
||||
it('[collection] reduce', () => {
|
||||
expect(testCollection.reduce((acc, val) => acc + val, 0)).to.be.equal(6)
|
||||
})
|
||||
|
||||
it('[collection] start sweeper', async () => {
|
||||
const clock = sinon.useFakeTimers()
|
||||
const sweeperCollection = new Collection(
|
||||
[
|
||||
['a', 1],
|
||||
['b', 2],
|
||||
],
|
||||
{
|
||||
sweeper: {
|
||||
filter: (v, _) => v === 1,
|
||||
interval: 50,
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
try {
|
||||
await clock.tickAsync(49)
|
||||
expect(sweeperCollection.size).to.be.equal(2)
|
||||
await clock.tickAsync(1)
|
||||
expect(sweeperCollection.size).to.be.equal(1)
|
||||
} catch (err) {
|
||||
sweeperCollection.stopSweeper()
|
||||
|
||||
throw err
|
||||
}
|
||||
|
||||
sweeperCollection.stopSweeper()
|
||||
clock.restore()
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,50 @@
|
||||
import { expect } from 'chai'
|
||||
import { describe, it } from 'mocha'
|
||||
import * as colors from '../src/colors.js'
|
||||
|
||||
const arrayOfColors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white']
|
||||
|
||||
describe('color.ts', () => {
|
||||
arrayOfColors.forEach((color, index) => {
|
||||
describe(`${color} function`, () => {
|
||||
it('will return colored word', () => {
|
||||
expect((colors[color as keyof typeof colors] as typeof colors.black)('testWord')).to.equal(`\x1B[${30 + index}mtestWord\x1B[39m`)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe(`grey function`, () => {
|
||||
it('will return colored word', () => {
|
||||
expect(colors.gray('testWord')).to.equal(`\x1B[${90}mtestWord\x1B[39m`)
|
||||
})
|
||||
})
|
||||
arrayOfColors
|
||||
.map((color) => `bright${color.slice(0, 1).toUpperCase()}${color.slice(1)}`)
|
||||
.forEach((color, index) => {
|
||||
describe(`${color} function`, () => {
|
||||
it('will return colored word', () => {
|
||||
expect((colors[color as keyof typeof colors] as typeof colors.brightBlack)('testWord')).to.equal(`\x1B[${90 + index}mtestWord\x1B[39m`)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
arrayOfColors
|
||||
.map((color) => `bg${color.slice(0, 1).toUpperCase()}${color.slice(1)}`)
|
||||
.forEach((color, index) => {
|
||||
describe(`${color} function`, () => {
|
||||
it('will return colored word', () => {
|
||||
expect((colors[color as keyof typeof colors] as typeof colors.bgBlack)('testWord')).to.equal(`\x1B[${40 + index}mtestWord\x1B[49m`)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
arrayOfColors
|
||||
.map((color) => `bgBright${color.slice(0, 1).toUpperCase()}${color.slice(1)}`)
|
||||
.forEach((color, index) => {
|
||||
describe(`${color} function`, () => {
|
||||
it('will return colored word', () => {
|
||||
expect((colors[color as keyof typeof colors] as typeof colors.bgBlack)('testWord')).to.equal(`\x1B[${100 + index}mtestWord\x1B[49m`)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,27 @@
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
import { expect } from 'chai'
|
||||
import { describe, it } from 'mocha'
|
||||
import { iconBigintToHash, iconHashToBigInt } from '../src/hash.js'
|
||||
|
||||
const iconHash = '4bbb271a13f7195031adcc06a2d867ce'
|
||||
const iconBigInt = 3843769888406823508519992434416504301518n
|
||||
const a_iconHash = 'a_4bbb271a13f7195031adcc06a2d867ce'
|
||||
const a_iconBigInt = 3503487521485885045056617826984736090062n
|
||||
|
||||
describe('hash.ts', () => {
|
||||
it('[utils] icon hash to bigint', () => {
|
||||
expect(iconHashToBigInt(iconHash)).to.be.equal(iconBigInt)
|
||||
})
|
||||
|
||||
it('[utils] icon bigint to hash', () => {
|
||||
expect(iconBigintToHash(iconBigInt)).to.be.equal(iconHash)
|
||||
})
|
||||
|
||||
it('[utils] icon hash to bigint a_ (animated)', () => {
|
||||
expect(iconHashToBigInt(a_iconHash)).to.be.equal(a_iconBigInt)
|
||||
})
|
||||
|
||||
it('[utils] icon bigint to hash a_ (animated)', () => {
|
||||
expect(iconBigintToHash(a_iconBigInt)).to.be.equal(a_iconHash)
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,7 @@
|
||||
import { describe, it } from 'mocha'
|
||||
|
||||
describe('index.ts', () => {
|
||||
it('will import without error', async () => {
|
||||
await import('../src/index.js')
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,16 @@
|
||||
import { expect } from 'chai'
|
||||
import { describe, it } from 'mocha'
|
||||
import { calculateBits, calculatePermissions } from '../src/permissions.js'
|
||||
|
||||
describe('permissions.ts', () => {
|
||||
describe('calculatePermissions function', () => {
|
||||
it('will return the array of permissions of bitwise string', () => {
|
||||
expect(calculatePermissions(34393292864n)).to.have.members(['ADD_REACTIONS', 'CREATE_PUBLIC_THREADS', 'USE_VAD'])
|
||||
})
|
||||
})
|
||||
describe('calculateBits function', () => {
|
||||
it('will return the bitwise string of array of permissions', () => {
|
||||
expect(calculateBits(['ADD_REACTIONS', 'CREATE_PUBLIC_THREADS', 'USE_VAD'])).to.equal('34393292864')
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,26 @@
|
||||
import { expect } from 'chai'
|
||||
import { describe, it } from 'mocha'
|
||||
import { Buffer } from 'node:buffer'
|
||||
import { getBotIdFromToken, removeTokenPrefix } from '../src/token.js'
|
||||
|
||||
describe('token.ts', () => {
|
||||
describe('token function', () => {
|
||||
it('Will remove token prefix when Bot is prefixed.', () => {
|
||||
expect(removeTokenPrefix('Bot discordeno is best lib')).to.be.equal('discordeno is best lib')
|
||||
})
|
||||
|
||||
it('Will remove token prefix when Bot is NOT prefixed.', () => {
|
||||
expect(removeTokenPrefix('discordeno is best lib')).to.be.equal('discordeno is best lib')
|
||||
})
|
||||
|
||||
it('Will throw when token is undefined.', () => {
|
||||
expect(() => removeTokenPrefix(undefined)).to.throw
|
||||
})
|
||||
})
|
||||
|
||||
describe('getBotIdFromToken function', () => {
|
||||
it('Will get Bot Id from token', () => {
|
||||
expect(getBotIdFromToken(`${Buffer.from('1033452747380494366').toString('base64')}.zawsxedcrftvgybhu`)).to.equal(1033452747380494366n)
|
||||
})
|
||||
})
|
||||
})
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,37 @@
|
||||
import { expect } from 'chai'
|
||||
import { afterEach, beforeEach, describe, it } from 'mocha'
|
||||
import sinon from 'sinon'
|
||||
import { delay } from '../src/utils.js'
|
||||
import { formatImageUrl } from '../src/images.js'
|
||||
|
||||
describe('utils.ts', () => {
|
||||
let clock: sinon.SinonFakeTimers
|
||||
|
||||
beforeEach(() => {
|
||||
clock = sinon.useFakeTimers()
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
sinon.restore()
|
||||
clock.restore()
|
||||
})
|
||||
|
||||
it('will', async () => {
|
||||
let delayEnded = false
|
||||
delay(31).then(() => {
|
||||
delayEnded = true
|
||||
})
|
||||
expect(delayEnded).to.be.false
|
||||
await clock.tickAsync(30)
|
||||
expect(delayEnded).to.be.false
|
||||
await clock.tickAsync(31)
|
||||
expect(delayEnded).to.be.true
|
||||
})
|
||||
})
|
||||
|
||||
it('[utils] format image url', () => {
|
||||
expect(formatImageUrl('https://skillz.is.pro')).to.be.equal('https://skillz.is.pro.jpg?size=128')
|
||||
expect(formatImageUrl('https://skillz.is.pro', 1024)).to.be.equal('https://skillz.is.pro.jpg?size=1024')
|
||||
expect(formatImageUrl('https://skillz.is.pro', 1024, 'gif')).to.be.equal('https://skillz.is.pro.gif?size=1024')
|
||||
expect(formatImageUrl('https://skillz.is.pro', undefined, 'gif')).to.be.equal('https://skillz.is.pro.gif?size=128')
|
||||
})
|
||||
Reference in New Issue
Block a user