From 210845aa63f625690a83b80aa8029d81a067d275 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Fri, 26 Feb 2021 13:55:49 -0500 Subject: [PATCH 01/38] chore: init @cordis/util --- libs/util/README.md | 12 ++++++++++++ libs/util/package.json | 40 ++++++++++++++++++++++++++++++++++++++++ libs/util/src/index.ts | 0 libs/util/tsconfig.json | 8 ++++++++ 4 files changed, 60 insertions(+) create mode 100644 libs/util/README.md create mode 100644 libs/util/package.json create mode 100644 libs/util/src/index.ts create mode 100644 libs/util/tsconfig.json diff --git a/libs/util/README.md b/libs/util/README.md new file mode 100644 index 0000000..833145f --- /dev/null +++ b/libs/util/README.md @@ -0,0 +1,12 @@ +
+ +# @cordis/util + +
+ +## Description + +Helper REST functions and other utilities for Cordis + +## Documentation +You can find documentation for the whole project over at https://cordis.didinele.me diff --git a/libs/util/package.json b/libs/util/package.json new file mode 100644 index 0000000..b9eba8a --- /dev/null +++ b/libs/util/package.json @@ -0,0 +1,40 @@ +{ + "name": "@cordis/util", + "version": "0.1.0", + "description": "Helper REST functions and other utilities for Cordis", + "main": "./dist/index.js", + "types": "./types/index.d.ts", + "scripts": { + "lint": "eslint src --ext .ts", + "build": "tsc" + }, + "files": [ + "dist", + "types", + "!dist/*.tsbuildinfo", + "!**/**.map", + "!**/*.test.*" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/cordis-lib/cordis.git" + }, + "contributors": [ + "didinele (https://github.com/didinele)", + "Holo-Buckshot (https://github.com/Holo-Buckshot)", + "Nico (https://github.com/zaida04)" + ], + "author": "Zaid \"Nico\"", + "license": "MIT", + "bugs": { + "url": "https://github.com/cordis-lib/cordis/issues" + }, + "devDependencies": { + "@types/node": "^14.14.31", + "typescript": "^4.2.2" + }, + "dependencies": { + "tslib": "^2.1.0" + }, + "homepage": "https://github.com/cordis-lib/cordis#readme" +} diff --git a/libs/util/src/index.ts b/libs/util/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/libs/util/tsconfig.json b/libs/util/tsconfig.json new file mode 100644 index 0000000..5a417fa --- /dev/null +++ b/libs/util/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "declarationDir": "./types" + }, + "include": ["./src/**/*.ts"] +} From 70b6ac4b44cc40fa71863820570e0aa5c2cc16f5 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Fri, 26 Feb 2021 18:17:45 -0500 Subject: [PATCH 02/38] init makeRestUtils func --- libs/util/package.json | 1 + libs/util/src/index.ts | 6 ++++++ pnpm-lock.yaml | 12 ++++++++++++ 3 files changed, 19 insertions(+) diff --git a/libs/util/package.json b/libs/util/package.json index b9eba8a..dc7da56 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -34,6 +34,7 @@ "typescript": "^4.2.2" }, "dependencies": { + "@cordis/rest": "workspace:^0.1.5", "tslib": "^2.1.0" }, "homepage": "https://github.com/cordis-lib/cordis#readme" diff --git a/libs/util/src/index.ts b/libs/util/src/index.ts index e69de29..8eb0e7e 100644 --- a/libs/util/src/index.ts +++ b/libs/util/src/index.ts @@ -0,0 +1,6 @@ +import type { RestManager } from '@cordis/rest'; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function makeRestUtils(restRouter: RestManager) { + return {}; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b495cd8..f5f538a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -230,6 +230,18 @@ importers: '@types/node': ^14.14.31 tslib: ^2.1.0 typescript: ^4.2.2 + libs/util: + dependencies: + '@cordis/rest': link:../rest + tslib: 2.1.0 + devDependencies: + '@types/node': 14.14.31 + typescript: 4.2.2 + specifiers: + '@cordis/rest': workspace:^0.1.0 + '@types/node': ^14.14.31 + tslib: ^2.1.0 + typescript: ^4.2.2 services/gateway: dependencies: '@cordis/brokers': link:../../libs/brokers From 2302ecf04cae1d65d89ce64fe93d41ae15770b01 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Fri, 26 Feb 2021 18:50:23 -0500 Subject: [PATCH 03/38] update pnpm-lock.yaml --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f5f538a..d7bd45b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -238,7 +238,7 @@ importers: '@types/node': 14.14.31 typescript: 4.2.2 specifiers: - '@cordis/rest': workspace:^0.1.0 + '@cordis/rest': workspace:^0.1.5 '@types/node': ^14.14.31 tslib: ^2.1.0 typescript: ^4.2.2 From 3a21e28ec7966857d62213a0b7698eadd3af72c3 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Fri, 26 Feb 2021 18:51:52 -0500 Subject: [PATCH 04/38] bump version and remove wrong license --- libs/util/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/util/package.json b/libs/util/package.json index dc7da56..24359fb 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -1,6 +1,6 @@ { "name": "@cordis/util", - "version": "0.1.0", + "version": "0.1.5", "description": "Helper REST functions and other utilities for Cordis", "main": "./dist/index.js", "types": "./types/index.d.ts", @@ -25,7 +25,6 @@ "Nico (https://github.com/zaida04)" ], "author": "Zaid \"Nico\"", - "license": "MIT", "bugs": { "url": "https://github.com/cordis-lib/cordis/issues" }, From a4ce6bf541a18bd10db9c7924613be959bc39d5e Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Fri, 26 Feb 2021 13:55:49 -0500 Subject: [PATCH 05/38] chore: init @cordis/util --- libs/util/README.md | 12 ++++++++++++ libs/util/package.json | 40 ++++++++++++++++++++++++++++++++++++++++ libs/util/src/index.ts | 0 libs/util/tsconfig.json | 8 ++++++++ 4 files changed, 60 insertions(+) create mode 100644 libs/util/README.md create mode 100644 libs/util/package.json create mode 100644 libs/util/src/index.ts create mode 100644 libs/util/tsconfig.json diff --git a/libs/util/README.md b/libs/util/README.md new file mode 100644 index 0000000..833145f --- /dev/null +++ b/libs/util/README.md @@ -0,0 +1,12 @@ +
+ +# @cordis/util + +
+ +## Description + +Helper REST functions and other utilities for Cordis + +## Documentation +You can find documentation for the whole project over at https://cordis.didinele.me diff --git a/libs/util/package.json b/libs/util/package.json new file mode 100644 index 0000000..b9eba8a --- /dev/null +++ b/libs/util/package.json @@ -0,0 +1,40 @@ +{ + "name": "@cordis/util", + "version": "0.1.0", + "description": "Helper REST functions and other utilities for Cordis", + "main": "./dist/index.js", + "types": "./types/index.d.ts", + "scripts": { + "lint": "eslint src --ext .ts", + "build": "tsc" + }, + "files": [ + "dist", + "types", + "!dist/*.tsbuildinfo", + "!**/**.map", + "!**/*.test.*" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/cordis-lib/cordis.git" + }, + "contributors": [ + "didinele (https://github.com/didinele)", + "Holo-Buckshot (https://github.com/Holo-Buckshot)", + "Nico (https://github.com/zaida04)" + ], + "author": "Zaid \"Nico\"", + "license": "MIT", + "bugs": { + "url": "https://github.com/cordis-lib/cordis/issues" + }, + "devDependencies": { + "@types/node": "^14.14.31", + "typescript": "^4.2.2" + }, + "dependencies": { + "tslib": "^2.1.0" + }, + "homepage": "https://github.com/cordis-lib/cordis#readme" +} diff --git a/libs/util/src/index.ts b/libs/util/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/libs/util/tsconfig.json b/libs/util/tsconfig.json new file mode 100644 index 0000000..5a417fa --- /dev/null +++ b/libs/util/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "declarationDir": "./types" + }, + "include": ["./src/**/*.ts"] +} From 75aea1c6a639721aae5f3d78e9abe11435843ecb Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Fri, 26 Feb 2021 18:17:45 -0500 Subject: [PATCH 06/38] init makeRestUtils func --- libs/util/package.json | 1 + libs/util/src/index.ts | 6 ++++++ pnpm-lock.yaml | 12 ++++++++++++ 3 files changed, 19 insertions(+) diff --git a/libs/util/package.json b/libs/util/package.json index b9eba8a..dc7da56 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -34,6 +34,7 @@ "typescript": "^4.2.2" }, "dependencies": { + "@cordis/rest": "workspace:^0.1.5", "tslib": "^2.1.0" }, "homepage": "https://github.com/cordis-lib/cordis#readme" diff --git a/libs/util/src/index.ts b/libs/util/src/index.ts index e69de29..8eb0e7e 100644 --- a/libs/util/src/index.ts +++ b/libs/util/src/index.ts @@ -0,0 +1,6 @@ +import type { RestManager } from '@cordis/rest'; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function makeRestUtils(restRouter: RestManager) { + return {}; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e9e4ec..20aabc8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -230,6 +230,18 @@ importers: '@types/node': ^14.14.31 tslib: ^2.1.0 typescript: ^4.2.2 + libs/util: + dependencies: + '@cordis/rest': link:../rest + tslib: 2.1.0 + devDependencies: + '@types/node': 14.14.31 + typescript: 4.2.2 + specifiers: + '@cordis/rest': workspace:^0.1.0 + '@types/node': ^14.14.31 + tslib: ^2.1.0 + typescript: ^4.2.2 services/gateway: dependencies: '@cordis/brokers': link:../../libs/brokers From 8694649c6b96cd4cc5f4d83514c141d593c35fc0 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Fri, 26 Feb 2021 18:50:23 -0500 Subject: [PATCH 07/38] update pnpm-lock.yaml --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20aabc8..97c28c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -238,7 +238,7 @@ importers: '@types/node': 14.14.31 typescript: 4.2.2 specifiers: - '@cordis/rest': workspace:^0.1.0 + '@cordis/rest': workspace:^0.1.5 '@types/node': ^14.14.31 tslib: ^2.1.0 typescript: ^4.2.2 From bbf16efad9742e217204f6ce3616d922aacf96a6 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Fri, 26 Feb 2021 18:51:52 -0500 Subject: [PATCH 08/38] bump version and remove wrong license --- libs/util/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/util/package.json b/libs/util/package.json index dc7da56..24359fb 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -1,6 +1,6 @@ { "name": "@cordis/util", - "version": "0.1.0", + "version": "0.1.5", "description": "Helper REST functions and other utilities for Cordis", "main": "./dist/index.js", "types": "./types/index.d.ts", @@ -25,7 +25,6 @@ "Nico (https://github.com/zaida04)" ], "author": "Zaid \"Nico\"", - "license": "MIT", "bugs": { "url": "https://github.com/cordis-lib/cordis/issues" }, From 2353a7f2cff70b1c1a9bfd9e409b623aed2c0ab4 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sun, 28 Feb 2021 14:02:48 -0500 Subject: [PATCH 09/38] update pnpm-lock.yaml --- pnpm-lock.yaml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb38639..97c28c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -242,18 +242,6 @@ importers: '@types/node': ^14.14.31 tslib: ^2.1.0 typescript: ^4.2.2 - libs/util: - dependencies: - '@cordis/rest': link:../rest - tslib: 2.1.0 - devDependencies: - '@types/node': 14.14.31 - typescript: 4.2.2 - specifiers: - '@cordis/rest': workspace:^0.1.5 - '@types/node': ^14.14.31 - tslib: ^2.1.0 - typescript: ^4.2.2 services/gateway: dependencies: '@cordis/brokers': link:../../libs/brokers From 48e7843ae7db93513784dc69147e5d6463552321 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sun, 28 Feb 2021 14:03:01 -0500 Subject: [PATCH 10/38] integrate requested changes --- libs/util/package.json | 4 ++-- libs/util/src/index.ts | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/libs/util/package.json b/libs/util/package.json index 24359fb..e58a227 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -28,6 +28,7 @@ "bugs": { "url": "https://github.com/cordis-lib/cordis/issues" }, + "homepage": "https://github.com/cordis-lib/cordis#readme", "devDependencies": { "@types/node": "^14.14.31", "typescript": "^4.2.2" @@ -35,6 +36,5 @@ "dependencies": { "@cordis/rest": "workspace:^0.1.5", "tslib": "^2.1.0" - }, - "homepage": "https://github.com/cordis-lib/cordis#readme" + } } diff --git a/libs/util/src/index.ts b/libs/util/src/index.ts index 8eb0e7e..7d4a327 100644 --- a/libs/util/src/index.ts +++ b/libs/util/src/index.ts @@ -1,6 +1,4 @@ import type { RestManager } from '@cordis/rest'; // eslint-disable-next-line @typescript-eslint/no-unused-vars -export function makeRestUtils(restRouter: RestManager) { - return {}; -} +export const makeRestUtils = (restRouter: RestManager) => ({}); From e3af4e94fd7aead4eb094ba072057b0f8ac0785d Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Wed, 3 Mar 2021 15:34:11 -0500 Subject: [PATCH 11/38] move makeDiscordCdnUrl to @cordis/util --- libs/common/src/functions/functions.test.ts | 39 +------------------ libs/common/src/functions/index.ts | 1 - libs/util/package.json | 3 +- libs/{common => util}/src/error.ts | 0 libs/util/src/index.ts | 6 +-- libs/util/src/makeDiscordCdnUrl.test.ts | 37 ++++++++++++++++++ .../src}/makeDiscordCdnUrl.ts | 2 +- pnpm-lock.yaml | 4 +- 8 files changed, 46 insertions(+), 46 deletions(-) rename libs/{common => util}/src/error.ts (100%) create mode 100644 libs/util/src/makeDiscordCdnUrl.test.ts rename libs/{common/src/functions => util/src}/makeDiscordCdnUrl.ts (94%) diff --git a/libs/common/src/functions/functions.test.ts b/libs/common/src/functions/functions.test.ts index 73ee2b1..c6b63da 100644 --- a/libs/common/src/functions/functions.test.ts +++ b/libs/common/src/functions/functions.test.ts @@ -1,5 +1,4 @@ -import { getMissingProps, halt, isPromise, keyMirror, makeDiscordCdnUrl } from './'; -import { CordisUtilTypeError, CordisUtilRangeError } from '../error'; +import { getMissingProps, halt, isPromise, keyMirror } from './'; test('get missing props', () => { const obj = { one: 1, two: 2 }; @@ -29,39 +28,3 @@ describe('is promise', () => { test('key mirror', () => { expect(keyMirror(['b'])).toStrictEqual({ b: 'b' }); }); - -describe('make discord cdn url', () => { - describe('invalid options handling', () => { - test('invalid format', () => { - const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; - // @ts-expect-error Intentionally invalid format - expect(() => makeDiscordCdnUrl(root, { format: 'asdf' })).toThrow(CordisUtilTypeError); - }); - - test('invalid size', () => { - const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; - // @ts-expect-error Intentionally invalid size - expect(() => makeDiscordCdnUrl(root, { size: 1 })).toThrow(CordisUtilRangeError); - }); - }); - - test('defaults using an image', () => { - const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; - expect(makeDiscordCdnUrl(root)).toBe(`${root}.webp`); - }); - - test('defaults using a gif', () => { - const root = 'a_bbab2f9b0bcecf438b4810c67798bfca'; - expect(makeDiscordCdnUrl(root)).toBe(`${root}.gif`); - }); - - test('non-dynamic with a gif', () => { - const root = 'a_bbab2f9b0bcecf438b4810c67798bfca'; - expect(makeDiscordCdnUrl(root, { dynamic: false })).toBe(`${root}.webp`); - }); - - test('valid custom size', () => { - const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; - expect(makeDiscordCdnUrl(root, { size: 16 })).toBe(`${root}.webp?size=16`); - }); -}); diff --git a/libs/common/src/functions/index.ts b/libs/common/src/functions/index.ts index 741e5a5..1afe3e1 100644 --- a/libs/common/src/functions/index.ts +++ b/libs/common/src/functions/index.ts @@ -2,4 +2,3 @@ export * from './getMissingProps'; export * from './halt'; export * from './isPromise'; export * from './keyMirror'; -export * from './makeDiscordCdnUrl'; diff --git a/libs/util/package.json b/libs/util/package.json index e58a227..22c9fc0 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -34,7 +34,8 @@ "typescript": "^4.2.2" }, "dependencies": { - "@cordis/rest": "workspace:^0.1.5", + "@cordis/rest": "workspace:^0.1.6", + "@cordis/error": "workspace:^0.1.6", "tslib": "^2.1.0" } } diff --git a/libs/common/src/error.ts b/libs/util/src/error.ts similarity index 100% rename from libs/common/src/error.ts rename to libs/util/src/error.ts diff --git a/libs/util/src/index.ts b/libs/util/src/index.ts index 7d4a327..97d9ddb 100644 --- a/libs/util/src/index.ts +++ b/libs/util/src/index.ts @@ -1,4 +1,2 @@ -import type { RestManager } from '@cordis/rest'; - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const makeRestUtils = (restRouter: RestManager) => ({}); +export * from './makeDiscordCdnUrl'; +export * from './restUtils'; diff --git a/libs/util/src/makeDiscordCdnUrl.test.ts b/libs/util/src/makeDiscordCdnUrl.test.ts new file mode 100644 index 0000000..6eae575 --- /dev/null +++ b/libs/util/src/makeDiscordCdnUrl.test.ts @@ -0,0 +1,37 @@ +import { makeDiscordCdnUrl } from './'; + +describe('make discord cdn url', () => { + describe('invalid options handling', () => { + test('invalid format', () => { + const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; + // @ts-expect-error Intentionally invalid format + expect(() => makeDiscordCdnUrl(root, { format: 'asdf' })).toThrow(CordisUtilTypeError); + }); + + test('invalid size', () => { + const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; + // @ts-expect-error Intentionally invalid size + expect(() => makeDiscordCdnUrl(root, { size: 1 })).toThrow(CordisUtilRangeError); + }); + }); + + test('defaults using an image', () => { + const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; + expect(makeDiscordCdnUrl(root)).toBe(`${root}.webp`); + }); + + test('defaults using a gif', () => { + const root = 'a_bbab2f9b0bcecf438b4810c67798bfca'; + expect(makeDiscordCdnUrl(root)).toBe(`${root}.gif`); + }); + + test('non-dynamic with a gif', () => { + const root = 'a_bbab2f9b0bcecf438b4810c67798bfca'; + expect(makeDiscordCdnUrl(root, { dynamic: false })).toBe(`${root}.webp`); + }); + + test('valid custom size', () => { + const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; + expect(makeDiscordCdnUrl(root, { size: 16 })).toBe(`${root}.webp?size=16`); + }); +}); diff --git a/libs/common/src/functions/makeDiscordCdnUrl.ts b/libs/util/src/makeDiscordCdnUrl.ts similarity index 94% rename from libs/common/src/functions/makeDiscordCdnUrl.ts rename to libs/util/src/makeDiscordCdnUrl.ts index 5dc9c6e..466aae1 100644 --- a/libs/common/src/functions/makeDiscordCdnUrl.ts +++ b/libs/util/src/makeDiscordCdnUrl.ts @@ -1,4 +1,4 @@ -import { CordisUtilTypeError, CordisUtilRangeError } from '../error'; +import { CordisUtilTypeError, CordisUtilRangeError } from './error'; /** * Valid image formats diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97c28c9..bab9da0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -232,13 +232,15 @@ importers: typescript: ^4.2.2 libs/util: dependencies: + '@cordis/error': link:../error '@cordis/rest': link:../rest tslib: 2.1.0 devDependencies: '@types/node': 14.14.31 typescript: 4.2.2 specifiers: - '@cordis/rest': workspace:^0.1.5 + '@cordis/error': workspace:^0.1.6 + '@cordis/rest': workspace:^0.1.6 '@types/node': ^14.14.31 tslib: ^2.1.0 typescript: ^4.2.2 From d5c3d80ccb9a7a02fd5c4c549ff94c4949948d35 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sat, 6 Mar 2021 18:45:30 -0500 Subject: [PATCH 12/38] tests: remove describe layer --- libs/util/src/makeDiscordCdnUrl.test.ts | 52 ++++++++++++------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/libs/util/src/makeDiscordCdnUrl.test.ts b/libs/util/src/makeDiscordCdnUrl.test.ts index 6eae575..751ab80 100644 --- a/libs/util/src/makeDiscordCdnUrl.test.ts +++ b/libs/util/src/makeDiscordCdnUrl.test.ts @@ -1,37 +1,35 @@ import { makeDiscordCdnUrl } from './'; -describe('make discord cdn url', () => { - describe('invalid options handling', () => { - test('invalid format', () => { - const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; - // @ts-expect-error Intentionally invalid format - expect(() => makeDiscordCdnUrl(root, { format: 'asdf' })).toThrow(CordisUtilTypeError); - }); - - test('invalid size', () => { - const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; - // @ts-expect-error Intentionally invalid size - expect(() => makeDiscordCdnUrl(root, { size: 1 })).toThrow(CordisUtilRangeError); - }); +describe('invalid options handling', () => { + test('invalid format', () => { + const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; + // @ts-expect-error Intentionally invalid format + expect(() => makeDiscordCdnUrl(root, { format: 'asdf' })).toThrow(CordisUtilTypeError); }); - test('defaults using an image', () => { + test('invalid size', () => { const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; - expect(makeDiscordCdnUrl(root)).toBe(`${root}.webp`); + // @ts-expect-error Intentionally invalid size + expect(() => makeDiscordCdnUrl(root, { size: 1 })).toThrow(CordisUtilRangeError); }); +}); - test('defaults using a gif', () => { - const root = 'a_bbab2f9b0bcecf438b4810c67798bfca'; - expect(makeDiscordCdnUrl(root)).toBe(`${root}.gif`); - }); +test('defaults using an image', () => { + const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; + expect(makeDiscordCdnUrl(root)).toBe(`${root}.webp`); +}); - test('non-dynamic with a gif', () => { - const root = 'a_bbab2f9b0bcecf438b4810c67798bfca'; - expect(makeDiscordCdnUrl(root, { dynamic: false })).toBe(`${root}.webp`); - }); +test('defaults using a gif', () => { + const root = 'a_bbab2f9b0bcecf438b4810c67798bfca'; + expect(makeDiscordCdnUrl(root)).toBe(`${root}.gif`); +}); - test('valid custom size', () => { - const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; - expect(makeDiscordCdnUrl(root, { size: 16 })).toBe(`${root}.webp?size=16`); - }); +test('non-dynamic with a gif', () => { + const root = 'a_bbab2f9b0bcecf438b4810c67798bfca'; + expect(makeDiscordCdnUrl(root, { dynamic: false })).toBe(`${root}.webp`); +}); + +test('valid custom size', () => { + const root = 'e16be7c509d54bb53b1ee21fe8d8cdac'; + expect(makeDiscordCdnUrl(root, { size: 16 })).toBe(`${root}.webp?size=16`); }); From 2ef101883527b81e342efb66f60c283fd524afbe Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sat, 6 Mar 2021 20:49:16 -0500 Subject: [PATCH 13/38] feat: webhook api endpoints --- libs/util/src/restUtils.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 libs/util/src/restUtils.ts diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts new file mode 100644 index 0000000..156aaf0 --- /dev/null +++ b/libs/util/src/restUtils.ts @@ -0,0 +1,16 @@ +import * as dAPI from 'discord-api-types/v8'; +import { RestManager } from '@cordis/rest'; + +interface webhookIdOrToken { webhookID: dAPI.Snowflake; webhookToken?: string } + +export const makeRestUtils = (rest: RestManager) => ( + { + createWebhook: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelWebhookJSONBody) => rest.post(dAPI.Routes.channelWebhooks(channelID), { data }), + fetchWebhooks: (...args: Parameters) => rest.get(dAPI.Routes.channelWebhooks(...args)), + fetchWebhook: (...args: Parameters) => rest.get(dAPI.Routes.webhook(...args)), + editWebhook: ({ webhookID, webhookToken }: webhookIdOrToken, data: dAPI.RESTPatchAPIWebhookJSONBody | dAPI.RESTPatchAPIWebhookWithTokenJSONBody) => rest.patch(dAPI.Routes.webhook(webhookID, webhookToken), { data }), + deleteWebhook: ({ webhookID, webhookToken }: webhookIdOrToken) => rest.delete(dAPI.Routes.webhook(webhookID, webhookToken)), + sendWebhookMessage: (webhookID: dAPI.Snowflake, webhookToken: string, data: dAPI.RESTPostAPIWebhookWithTokenJSONBody) => rest.post(dAPI.Routes.webhook(webhookID, webhookToken), { data }), + editWebhookMessage: (webhookID: dAPI.Snowflake, webhookToken: string, messageID: dAPI.Snowflake, data: dAPI.RESTPatchAPIWebhookWithTokenMessageJSONBody) => rest.patch(dAPI.Routes.webhookMessage(webhookID, webhookToken, messageID), { data }) + } +); From c65176cad6217f48898a932e9c86762c8c8f6b04 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sat, 6 Mar 2021 20:51:22 -0500 Subject: [PATCH 14/38] feat: audit log endpoints --- libs/util/src/restUtils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index 156aaf0..00e1eba 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -5,6 +5,7 @@ interface webhookIdOrToken { webhookID: dAPI.Snowflake; webhookToken?: string } export const makeRestUtils = (rest: RestManager) => ( { + fetchAuditLogs: (guildID: dAPI.Snowflake, options?: dAPI.RESTGetAPIAuditLogQuery) => rest.get(dAPI.Routes.guildAuditLog(guildID), { query: options }), createWebhook: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelWebhookJSONBody) => rest.post(dAPI.Routes.channelWebhooks(channelID), { data }), fetchWebhooks: (...args: Parameters) => rest.get(dAPI.Routes.channelWebhooks(...args)), fetchWebhook: (...args: Parameters) => rest.get(dAPI.Routes.webhook(...args)), From 2813d12c556cff145a35264f97700c2a461bddcf Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sat, 6 Mar 2021 21:16:40 -0500 Subject: [PATCH 15/38] feat: invite routes --- libs/util/src/restUtils.ts | 100 +++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index 00e1eba..d5539b0 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -1,11 +1,111 @@ import * as dAPI from 'discord-api-types/v8'; import { RestManager } from '@cordis/rest'; +/* +Channel + editChannel - encapsulate permissions + fetchChannelMessages/fetchChannelMessage + sendMessage + crosspostMessage + addMessageReaction + deleteOwnMessageReaction + deleteUserReaction + deleteAllReactions + deleteReaction + fetchMessageReactions + editMessage + deleteMessage + bulkDeleteMessages + fetchChannelInvites + createChannelInvite + followNewsChannel + startTyping + fetchPinnedChannelMessages + deletePinnedChannelMessage + addPinnedChannelMessage + groupDMAddRecipient + groupDMRemoveRecipient + +Emoji + fetchGuildEmojis + fetchGuildEmoji + createGuildEmoji + editGuildEmoji + deleteGuildEmoji + +Guild + createGuild + fetchGuild + fetchGuildPreview + editGuild + deleteGuild + fetchGuildChannels + createGuildChannel + fetchGuildMember + addGuildMember + editGuildMember + setNickname + addRole + removeRole + kickMember + fetchGuildBans + fetchGuildBan + banMember + unbanMember + fetchRoles + createRole + setRolePosition + editRole + deleteRole + pruneGuild + getPredictedPruneResult + fetchGuildVoiceRegions + fetchGuildInvites + createGuildIntegration + editGuildIntegration + deleteGuildIntegration + syncGuildIntegration + fetchGuildWidget + editGuildWidget (settings too) + fetchGuildVanityURL + fetchGuildWidgetImage + +Invite + fetchInvite + deleteInvite + +Template + fetchTemplate + createGuildFromTemplate + fetchGuildTemplates + createGuildTemplate + syncGuildTemplate + modifyGuildTemplate + deleteGuildTemplate + +User + fetchCurrentUser + fetchUser + editCurrentUser + leaveGuild + fetchDMs + createDM + createGroupDM + getUserConnections + + + fetchChannel: (...args: Parameters) => rest.get(dAPI.Routes.channel(...args)), + deleteChannel: (...args: Parameters) => rest.delete(dAPI.Routes.channel(...args)), +*/ + + interface webhookIdOrToken { webhookID: dAPI.Snowflake; webhookToken?: string } export const makeRestUtils = (rest: RestManager) => ( { fetchAuditLogs: (guildID: dAPI.Snowflake, options?: dAPI.RESTGetAPIAuditLogQuery) => rest.get(dAPI.Routes.guildAuditLog(guildID), { query: options }), + fetchInvite: (...args: Parameters) => rest.get(dAPI.Routes.invite(...args)), + deleteInvite: (...args: Parameters) => rest.delete(dAPI.Routes.invite(...args)), createWebhook: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelWebhookJSONBody) => rest.post(dAPI.Routes.channelWebhooks(channelID), { data }), fetchWebhooks: (...args: Parameters) => rest.get(dAPI.Routes.channelWebhooks(...args)), fetchWebhook: (...args: Parameters) => rest.get(dAPI.Routes.webhook(...args)), From d285f7f113cb2a8614668fdc93b1f3687f26ad17 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sat, 6 Mar 2021 21:26:26 -0500 Subject: [PATCH 16/38] tests: fix the test --- libs/util/src/makeDiscordCdnUrl.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/util/src/makeDiscordCdnUrl.test.ts b/libs/util/src/makeDiscordCdnUrl.test.ts index 751ab80..ae44552 100644 --- a/libs/util/src/makeDiscordCdnUrl.test.ts +++ b/libs/util/src/makeDiscordCdnUrl.test.ts @@ -1,4 +1,5 @@ import { makeDiscordCdnUrl } from './'; +import { CordisUtilTypeError, CordisUtilRangeError } from './error'; describe('invalid options handling', () => { test('invalid format', () => { From b3a135752cf3cf09c638f028807e2eea5d063bf3 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sat, 6 Mar 2021 23:48:12 -0500 Subject: [PATCH 17/38] feat: guild emoji endpoints --- libs/util/src/restUtils.ts | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index d5539b0..5d4f66f 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -2,6 +2,8 @@ import * as dAPI from 'discord-api-types/v8'; import { RestManager } from '@cordis/rest'; /* +TO:DO + Channel editChannel - encapsulate permissions fetchChannelMessages/fetchChannelMessage @@ -26,13 +28,6 @@ Channel groupDMAddRecipient groupDMRemoveRecipient -Emoji - fetchGuildEmojis - fetchGuildEmoji - createGuildEmoji - editGuildEmoji - deleteGuildEmoji - Guild createGuild fetchGuild @@ -70,10 +65,6 @@ Guild fetchGuildVanityURL fetchGuildWidgetImage -Invite - fetchInvite - deleteInvite - Template fetchTemplate createGuildFromTemplate @@ -93,9 +84,8 @@ User createGroupDM getUserConnections - - fetchChannel: (...args: Parameters) => rest.get(dAPI.Routes.channel(...args)), - deleteChannel: (...args: Parameters) => rest.delete(dAPI.Routes.channel(...args)), +fetchChannel: (...args: Parameters) => rest.get(dAPI.Routes.channel(...args)), +deleteChannel: (...args: Parameters) => rest.delete(dAPI.Routes.channel(...args)), */ @@ -112,6 +102,11 @@ export const makeRestUtils = (rest: RestManager) => ( editWebhook: ({ webhookID, webhookToken }: webhookIdOrToken, data: dAPI.RESTPatchAPIWebhookJSONBody | dAPI.RESTPatchAPIWebhookWithTokenJSONBody) => rest.patch(dAPI.Routes.webhook(webhookID, webhookToken), { data }), deleteWebhook: ({ webhookID, webhookToken }: webhookIdOrToken) => rest.delete(dAPI.Routes.webhook(webhookID, webhookToken)), sendWebhookMessage: (webhookID: dAPI.Snowflake, webhookToken: string, data: dAPI.RESTPostAPIWebhookWithTokenJSONBody) => rest.post(dAPI.Routes.webhook(webhookID, webhookToken), { data }), - editWebhookMessage: (webhookID: dAPI.Snowflake, webhookToken: string, messageID: dAPI.Snowflake, data: dAPI.RESTPatchAPIWebhookWithTokenMessageJSONBody) => rest.patch(dAPI.Routes.webhookMessage(webhookID, webhookToken, messageID), { data }) + editWebhookMessage: (webhookID: dAPI.Snowflake, webhookToken: string, messageID: dAPI.Snowflake, data: dAPI.RESTPatchAPIWebhookWithTokenMessageJSONBody) => rest.patch(dAPI.Routes.webhookMessage(webhookID, webhookToken, messageID), { data }), + fetchGuildEmojis: (...args: Parameters) => rest.get(dAPI.Routes.guildEmojis(...args)), + fetchGuildEmoji: (...args: Parameters) => rest.get(dAPI.Routes.guildEmoji(...args)), + createGuildEmoji: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildEmojiJSONBody) => rest.post(dAPI.Routes.guildEmojis(guildID), { data }), + editGuildEmoji: (guildID: dAPI.Snowflake, emojiID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildEmojiJSONBody) => rest.patch(dAPI.Routes.guildEmoji(guildID, emojiID), { data }), + deleteGuildEmoji: (...args: Parameters) => rest.delete(dAPI.Routes.guildEmoji(...args)) } ); From fa0aa14e584db744cc13354a421412899ae1cf95 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sun, 7 Mar 2021 13:17:47 -0500 Subject: [PATCH 18/38] merge @cordis/snowflake with @cordis/util --- libs/snowflake/README.md | 12 ------ libs/snowflake/package.json | 39 ------------------- libs/snowflake/tsconfig.json | 8 ---- .../src/Snowflake.test.ts} | 2 +- .../src/index.ts => util/src/Snowflake.ts} | 0 libs/util/src/index.ts | 1 + 6 files changed, 2 insertions(+), 60 deletions(-) delete mode 100644 libs/snowflake/README.md delete mode 100644 libs/snowflake/package.json delete mode 100644 libs/snowflake/tsconfig.json rename libs/{snowflake/src/index.test.ts => util/src/Snowflake.test.ts} (94%) rename libs/{snowflake/src/index.ts => util/src/Snowflake.ts} (100%) diff --git a/libs/snowflake/README.md b/libs/snowflake/README.md deleted file mode 100644 index b53eb53..0000000 --- a/libs/snowflake/README.md +++ /dev/null @@ -1,12 +0,0 @@ -
- -# @cordis/snowflake - -
- -# Description - -Simple package for destructuring (Twitter) Discord snowflakes. - -## Documentation -You can find documentation for the whole project over at https://cordis.didinele.me diff --git a/libs/snowflake/package.json b/libs/snowflake/package.json deleted file mode 100644 index 1cf47bb..0000000 --- a/libs/snowflake/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "@cordis/snowflake", - "description": "Utility structure for dealing with Discord snowflakes", - "main": "./dist/index.js", - "types": "./types/index.d.ts", - "version": "0.1.6", - "scripts": { - "lint": "eslint src --ext .ts", - "build": "tsc" - }, - "files": [ - "dist", - "types", - "!dist/*.tsbuildinfo", - "!**/**.map", - "!**/*.test.*" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/cordis-lib/cordis.git" - }, - "contributors": [ - "didinele (https://github.com/didinele)", - "Holo-Buckshot (https://github.com/Holo-Buckshot)", - "Nico (https://github.com/zaida04)" - ], - "author": "didinele", - "bugs": { - "url": "https://github.com/cordis-lib/cordis/issues" - }, - "homepage": "https://github.com/cordis-lib/cordis#readme", - "devDependencies": { - "@types/node": "^14.14.31", - "typescript": "^4.2.2" - }, - "dependencies": { - "tslib": "^2.1.0" - } -} diff --git a/libs/snowflake/tsconfig.json b/libs/snowflake/tsconfig.json deleted file mode 100644 index 5a417fa..0000000 --- a/libs/snowflake/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "declarationDir": "./types" - }, - "include": ["./src/**/*.ts"] -} diff --git a/libs/snowflake/src/index.test.ts b/libs/util/src/Snowflake.test.ts similarity index 94% rename from libs/snowflake/src/index.test.ts rename to libs/util/src/Snowflake.test.ts index f593c08..c380108 100644 --- a/libs/snowflake/src/index.test.ts +++ b/libs/util/src/Snowflake.test.ts @@ -1,4 +1,4 @@ -import { Snowflake, getCreationData } from './'; +import { Snowflake, getCreationData } from './Snowflake'; const ID = '223703707118731264'; const CREATED_AT = 1473405519991; diff --git a/libs/snowflake/src/index.ts b/libs/util/src/Snowflake.ts similarity index 100% rename from libs/snowflake/src/index.ts rename to libs/util/src/Snowflake.ts diff --git a/libs/util/src/index.ts b/libs/util/src/index.ts index 97d9ddb..c872013 100644 --- a/libs/util/src/index.ts +++ b/libs/util/src/index.ts @@ -1,2 +1,3 @@ export * from './makeDiscordCdnUrl'; export * from './restUtils'; +export * from './Snowflake'; From 69a7119b57fb6b193b984e8d556a43a70cc68694 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sun, 7 Mar 2021 22:16:17 -0500 Subject: [PATCH 19/38] feat: finish user methods and add template methods --- libs/util/src/restUtils.ts | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index 5d4f66f..c74574d 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -65,25 +65,6 @@ Guild fetchGuildVanityURL fetchGuildWidgetImage -Template - fetchTemplate - createGuildFromTemplate - fetchGuildTemplates - createGuildTemplate - syncGuildTemplate - modifyGuildTemplate - deleteGuildTemplate - -User - fetchCurrentUser - fetchUser - editCurrentUser - leaveGuild - fetchDMs - createDM - createGroupDM - getUserConnections - fetchChannel: (...args: Parameters) => rest.get(dAPI.Routes.channel(...args)), deleteChannel: (...args: Parameters) => rest.delete(dAPI.Routes.channel(...args)), */ @@ -107,6 +88,19 @@ export const makeRestUtils = (rest: RestManager) => ( fetchGuildEmoji: (...args: Parameters) => rest.get(dAPI.Routes.guildEmoji(...args)), createGuildEmoji: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildEmojiJSONBody) => rest.post(dAPI.Routes.guildEmojis(guildID), { data }), editGuildEmoji: (guildID: dAPI.Snowflake, emojiID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildEmojiJSONBody) => rest.patch(dAPI.Routes.guildEmoji(guildID, emojiID), { data }), - deleteGuildEmoji: (...args: Parameters) => rest.delete(dAPI.Routes.guildEmoji(...args)) + deleteGuildEmoji: (...args: Parameters) => rest.delete(dAPI.Routes.guildEmoji(...args)), + fetchMe: () => rest.get(dAPI.Routes.user()), + fetchUser: (userID?: dAPI.Snowflake | null) => rest.get(dAPI.Routes.user(userID ?? undefined)), + editMe: (data: dAPI.RESTPatchAPICurrentUserJSONBody) => rest.patch(dAPI.Routes.user(), { data }), + leaveGuild: (...args: Parameters) => rest.delete(dAPI.Routes.guild(...args)), + createDM: (data: dAPI.RESTPostAPICurrentUserCreateDMChannelJSONBody) => rest.post(dAPI.Routes.userChannels(), { data }), + getUserConnections: () => rest.get(dAPI.Routes.userConnections()), + fetchTemplate: (...args: Parameters) => rest.get(dAPI.Routes.template(...args)), + createGuildFromTemplate: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPITemplateCreateGuildJSONBody) => rest.post(dAPI.Routes.template(guildID), { data }), + fetchGuildTemplates: (...args: Parameters) => rest.get(dAPI.Routes.guildTemplates(...args)), + createGuildTemplate: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildTemplatesJSONBody) => rest.post(dAPI.Routes.guildTemplates(guildID), { data }), + syncGuildTemplate: (guildID: dAPI.Snowflake, templateCode: string) => rest.put(dAPI.Routes.guildTemplate(guildID, templateCode)), + editGuildTemplate: (guildID: dAPI.Snowflake, templateCode: string, data: dAPI.RESTPatchAPIGuildTemplateJSONBody) => rest.patch(dAPI.Routes.guildTemplate(guildID, templateCode), { data }), + deleteGuildTemplate: (...args: Parameters) => rest.delete(dAPI.Routes.guildTemplate(...args)) } ); From 8dfde79cdd8ba6c782c8af5389d123cc2d31695d Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Sun, 7 Mar 2021 22:19:29 -0500 Subject: [PATCH 20/38] fix https://github.com/cordis-lib/cordis/issues/46 --- libs/rest/src/RestManager.ts | 4 ++-- libs/routers/src/IRouter.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/rest/src/RestManager.ts b/libs/rest/src/RestManager.ts index 55ecc9f..c5b88a1 100644 --- a/libs/rest/src/RestManager.ts +++ b/libs/rest/src/RestManager.ts @@ -205,7 +205,7 @@ export class RestManager extends EventEmitter { * @param options Other options for the request */ /* istanbul ignore next */ - public post(path: string, options: { data: D; reason?: string; files?: File[] }): Promise { - return this.make({ path, method: 'post', ...options }); + public post(path: string, options: { data: D; reason?: string; files?: File[]; query?: Q }): Promise { + return this.make({ path, method: 'post', ...options }); } } diff --git a/libs/routers/src/IRouter.ts b/libs/routers/src/IRouter.ts index b41b072..505f8a9 100644 --- a/libs/routers/src/IRouter.ts +++ b/libs/routers/src/IRouter.ts @@ -5,5 +5,5 @@ export type IRouter = { delete(options?: { data?: D; reason?: string }): Promise; patch(options: { data: D; reason?: string }): Promise; put(options?: { data?: D; reason?: string }): Promise; - post(options: { data: D; reason?: string; files?: File[] }): Promise; + post(options: { data: D; reason?: string; files?: File[]; query?: Q }): Promise; } & { [key: string]: IRouter }; From 587cc0c258de77d1e5e39970373539047274112a Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Mon, 8 Mar 2021 10:23:22 -0500 Subject: [PATCH 21/38] feat: channel endpoints --- libs/util/src/restUtils.ts | 52 ++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index c74574d..388e99b 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -4,30 +4,6 @@ import { RestManager } from '@cordis/rest'; /* TO:DO -Channel - editChannel - encapsulate permissions - fetchChannelMessages/fetchChannelMessage - sendMessage - crosspostMessage - addMessageReaction - deleteOwnMessageReaction - deleteUserReaction - deleteAllReactions - deleteReaction - fetchMessageReactions - editMessage - deleteMessage - bulkDeleteMessages - fetchChannelInvites - createChannelInvite - followNewsChannel - startTyping - fetchPinnedChannelMessages - deletePinnedChannelMessage - addPinnedChannelMessage - groupDMAddRecipient - groupDMRemoveRecipient - Guild createGuild fetchGuild @@ -65,15 +41,37 @@ Guild fetchGuildVanityURL fetchGuildWidgetImage -fetchChannel: (...args: Parameters) => rest.get(dAPI.Routes.channel(...args)), -deleteChannel: (...args: Parameters) => rest.delete(dAPI.Routes.channel(...args)), -*/ +*/ interface webhookIdOrToken { webhookID: dAPI.Snowflake; webhookToken?: string } export const makeRestUtils = (rest: RestManager) => ( { + fetchChannel: (...args: Parameters) => rest.get(dAPI.Routes.channel(...args)), + editChannel: (channelID: dAPI.Snowflake, data: dAPI.RESTPatchAPIChannelJSONBody) => rest.patch(dAPI.Routes.channel(channelID), { data }), + deleteChannel: (...args: Parameters) => rest.delete(dAPI.Routes.channel(...args)), + fetchChannelMessages: (...args: Parameters) => rest.get(dAPI.Routes.channelMessages(...args)), + fetchChannelMessage: (...args: Parameters) => rest.get(dAPI.Routes.channelMessage(...args)), + sendMessage: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelMessageJSONBody) => rest.post(dAPI.Routes.channelMessages(channelID), { data }), + crosspostMessage: (channelID: dAPI.Snowflake, messageID: dAPI.Snowflake) => rest.post(dAPI.Routes.channelMessageCrosspost(channelID, messageID), { data: null }), + addReaction: (...args: Parameters) => rest.put(dAPI.Routes.channelMessageReaction(...args)), + deleteUserReaction: (channelID: dAPI.Snowflake, messageID: dAPI.Snowflake, emoji: dAPI.Snowflake | string, userID?: dAPI.Snowflake) => userID ? rest.delete(dAPI.Routes.channelMessageUserReaction(channelID, messageID, emoji, userID)) : rest.delete(dAPI.Routes.channelMessageOwnReaction(channelID, messageID, emoji)), + deleteAllMessageReactions: (...args: Parameters) => rest.delete(dAPI.Routes.channelMessageAllReactions(...args)), + deleteAllEmoteReaction: (...args: Parameters) => rest.delete(dAPI.Routes.channelMessageReaction(...args)), + fetchMessageReactions: (channelID: dAPI.Snowflake, messageID: dAPI.Snowflake, emoji: dAPI.Snowflake | string, options: dAPI.RESTGetAPIChannelMessagesQuery) => rest.get(dAPI.Routes.channelMessageReaction(channelID, messageID, emoji), { query: options }), + editMessage: (channelID: dAPI.Snowflake, messageID: dAPI.Snowflake, data: dAPI.RESTPatchAPIChannelMessageJSONBody) => rest.patch(dAPI.Routes.channelMessage(channelID, messageID), { data }), + deleteMessage: (...args: Parameters) => rest.delete(dAPI.Routes.channelMessage(...args)), + bulkDeleteMessages: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelMessagesBulkDeleteJSONBody) => rest.post(dAPI.Routes.channelBulkDelete(channelID), { data }), + editChannelPermissions: (channelID: dAPI.Snowflake, owerwriteID: dAPI.Snowflake, data: dAPI.RESTPutAPIChannelPermissionJSONBody) => rest.put(dAPI.Routes.channelPermission(channelID, owerwriteID), { data }), + deleteChannelPermissions: (...args: Parameters) => rest.delete(dAPI.Routes.channelPermission(...args)), + fetchChannelInvites: (...args: Parameters) => rest.get(dAPI.Routes.channelInvites(...args)), + createChannelInvite: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelInviteJSONBody) => rest.post(dAPI.Routes.channelInvites(channelID), { data }), + followNewsChannel: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelFollowersJSONBody) => rest.post(dAPI.Routes.channelFollowers(channelID), { data }), + startTyping: (...args: Parameters) => rest.get(dAPI.Routes.channelTyping(...args)), + fetchPinnedChannelMessages: (...args: Parameters) => rest.get(dAPI.Routes.channelPins(...args)), + deletePinnedChannelMessage: (...args: Parameters) => rest.delete(dAPI.Routes.channelPin(...args)), + addPinnedChannelMessage: (...args: Parameters) => rest.put(dAPI.Routes.channelPin(...args)), fetchAuditLogs: (guildID: dAPI.Snowflake, options?: dAPI.RESTGetAPIAuditLogQuery) => rest.get(dAPI.Routes.guildAuditLog(guildID), { query: options }), fetchInvite: (...args: Parameters) => rest.get(dAPI.Routes.invite(...args)), deleteInvite: (...args: Parameters) => rest.delete(dAPI.Routes.invite(...args)), From 1c6f063e7e8c726df595e6aa0a52dae972441a91 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Mon, 8 Mar 2021 10:24:19 -0500 Subject: [PATCH 22/38] feat: base embed structure --- libs/util/src/Embed.ts | 51 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 libs/util/src/Embed.ts diff --git a/libs/util/src/Embed.ts b/libs/util/src/Embed.ts new file mode 100644 index 0000000..37b838d --- /dev/null +++ b/libs/util/src/Embed.ts @@ -0,0 +1,51 @@ +import { APIEmbed, APIEmbedAuthor, APIEmbedImage, APIEmbedProvider, APIEmbedFooter, APIEmbedField, APIEmbedThumbnail, APIEmbedVideo } from 'discord-api-types/v8'; + +export default class Embed { + public author: APIEmbedAuthor | null = null; + public color: number | null = null; + public description: string | null = null; + public fields: APIEmbedField[] = []; + public footer: APIEmbedFooter | null = null; + public image: APIEmbedImage | null = null; + public provider: APIEmbedProvider | null = null; + public thumbnail: APIEmbedThumbnail | null = null; + public timestamp: number | null = null; + public title: string | null = null; + public type = 'rich'; + public url: string | null = null; + public readonly video: APIEmbedVideo | null = null; + + public constructor(data?: APIEmbed) { + if (data) { + if ('author' in data) this.author = data.author ?? null; + if ('color' in data) this.color = data.color ?? null; + if ('description' in data) this.description = data.description ?? null; + if ('footer' in data) this.footer = data.footer ?? null; + if ('image' in data) this.image = data.image ?? null; + if ('provider' in data) this.provider = data.provider ?? null; + if ('thumbnail' in data) this.thumbnail = data.thumbnail ?? null; + if ('timestamp' in data) this.timestamp = data.timestamp ? Date.parse(data.timestamp) : null; + if ('title' in data) this.title = data.title ?? null; + if ('url' in data) this.url = data.url ?? null; + if ('video' in data) this.video = data.video ?? null; + } + } + + public toJSON() { + const { author, color, description, footer, image, provider, thumbnail, timestamp, title, url, video } = this; + + return { + author, + color, + description, + footer, + image, + provider, + thumbnail, + timestamp, + title, + url, + video + }; + } +} From 9b4b44f36042fba0df24c67b636b28e466c58b1d Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Mon, 8 Mar 2021 11:16:25 -0500 Subject: [PATCH 23/38] tests: add base embed tests --- libs/util/src/Embed.test.ts | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 libs/util/src/Embed.test.ts diff --git a/libs/util/src/Embed.test.ts b/libs/util/src/Embed.test.ts new file mode 100644 index 0000000..43ef110 --- /dev/null +++ b/libs/util/src/Embed.test.ts @@ -0,0 +1,48 @@ +import Embed from './Embed'; + +test('Dataless value checks', () => { + const embed = new Embed({}); + expect(embed.author).toBe(null); + expect(embed.color).toBe(null); + expect(embed.description).toBe(null); + expect(embed.footer).toBe(null); + expect(embed.fields).toStrictEqual([]); + expect(embed.image).toBe(null); + expect(embed.provider).toBe(null); + expect(embed.thumbnail).toBe(null); + expect(embed.timestamp).toBe(null); + expect(embed.title).toBe(null); + expect(embed.author).toBe(null); + expect(embed.url).toBe(null); + expect(embed.video).toBe(null); +}); + +test('Data value checks', () => { + const timestamp = '2021-03-08T14:40:27.875Z'; + const color = 16753920; + + const embed = new Embed({ + title: 'testing title!', + description: 'testing description', + url: 'https://google.com', + timestamp, + color, + fields: [], + thumbnail: { + url: 'https://google.com' + }, + image: { + url: 'https://lh3.googleusercontent.com/proxy/K6J0xWzyfl729xgnZLj55qd5L0us_QN7m5MbcQgV09xP-HVw8Z_iJDwpXexcy87ZkHHrins6rMFwPahgPI-VI_il_gedMlBD7IIll_0e4AZNBg' + }, + author: { + name: 'Test Author' + }, + footer: { + text: 'Test Footer' + } + }); + + expect(embed.timestamp).toBe(new Date(timestamp).getTime()); + expect(embed.color).toBe(color); + expect(embed.fields).toStrictEqual([]); +}); From ef430751fae5a1d7a516ebedb54ff970e934860d Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Mon, 8 Mar 2021 11:16:39 -0500 Subject: [PATCH 24/38] tests: ignore restutils in tests --- libs/util/src/restUtils.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index 388e99b..8edc15d 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -1,3 +1,5 @@ +/* istanbul ignore file */ + import * as dAPI from 'discord-api-types/v8'; import { RestManager } from '@cordis/rest'; From 5813f16cfe8a97ab8b3701f740e8f3b740a9b417 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Tue, 9 Mar 2021 08:51:55 -0500 Subject: [PATCH 25/38] feat: guild endpoints --- libs/util/src/restUtils.ts | 80 ++++++++++++++++++-------------------- pnpm-lock.yaml | 10 ----- 2 files changed, 37 insertions(+), 53 deletions(-) diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index 8edc15d..2776561 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -3,53 +3,47 @@ import * as dAPI from 'discord-api-types/v8'; import { RestManager } from '@cordis/rest'; -/* -TO:DO - -Guild - createGuild - fetchGuild - fetchGuildPreview - editGuild - deleteGuild - fetchGuildChannels - createGuildChannel - fetchGuildMember - addGuildMember - editGuildMember - setNickname - addRole - removeRole - kickMember - fetchGuildBans - fetchGuildBan - banMember - unbanMember - fetchRoles - createRole - setRolePosition - editRole - deleteRole - pruneGuild - getPredictedPruneResult - fetchGuildVoiceRegions - fetchGuildInvites - createGuildIntegration - editGuildIntegration - deleteGuildIntegration - syncGuildIntegration - fetchGuildWidget - editGuildWidget (settings too) - fetchGuildVanityURL - fetchGuildWidgetImage - - -*/ - interface webhookIdOrToken { webhookID: dAPI.Snowflake; webhookToken?: string } export const makeRestUtils = (rest: RestManager) => ( { + createGuild: (data: dAPI.RESTPostAPIGuildsJSONBody) => rest.post(dAPI.Routes.guilds(), { data }), + fetchGuild: (...args: Parameters) => rest.get(dAPI.Routes.guild(...args)), + fetchGuildPreview: (...args: Parameters) => rest.get(dAPI.Routes.guildPreview(...args)), + editGuild: (guildID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildJSONBody) => rest.patch(dAPI.Routes.guild(guildID), { data }), + deleteGuild: (...args: Parameters) => rest.delete(dAPI.Routes.guild(...args)), + fetchGuildChannels: (...args: Parameters) => rest.get(dAPI.Routes.guildChannels(...args)), + createGuildChannel: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildChannelJSONBody) => rest.post(dAPI.Routes.guildChannels(guildID), { data }), + fetchGuildMember: (...args: Parameters) => rest.get(dAPI.Routes.guildMember(...args)), + addGuildMember: (guildID: dAPI.Snowflake, userID: dAPI.Snowflake, data: dAPI.RESTPutAPIGuildMemberJSONBody) => rest.put(dAPI.Routes.guildMember(guildID, userID), { data }), + editGuildMember: (guildID: dAPI.Snowflake, userID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildMemberJSONBody) => rest.patch(dAPI.Routes.guildMember(guildID, userID), { data }), + setMeNickname: (guildID: dAPI.Snowflake, data: dAPI.RESTPatchAPICurrentGuildMemberNicknameJSONBody) => rest.patch(dAPI.Routes.guildCurrentMemberNickname(guildID), { data }), + addRole: (...args: Parameters) => rest.put(dAPI.Routes.guildMemberRole(...args)), + removeRole: (...args: Parameters) => rest.delete(dAPI.Routes.guildMemberRole(...args)), + kickMember: (...args: Parameters) => rest.delete(dAPI.Routes.guildMember(...args)), + fetchGuildBans: (...args: Parameters) => rest.get(dAPI.Routes.guildBans(...args)), + fetchGuildBan: (...args: Parameters) => rest.get(dAPI.Routes.guildBan(...args)), + banMember: (guildID: dAPI.Snowflake, userID: dAPI.Snowflake, data: dAPI.RESTPutAPIGuildBanJSONBody) => rest.put(dAPI.Routes.guildBan(guildID, userID), { data }), + unbanMember: (guildID: dAPI.Snowflake, userID: dAPI.Snowflake) => rest.delete(dAPI.Routes.guildBan(guildID, userID)), + fetchRoles: (...args: Parameters) => rest.get(dAPI.Routes.guildMemberRole(...args)), + createRole: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildRoleJSONBody) => rest.post(dAPI.Routes.guildRoles(guildID), { data }), + setRolePosition: (guildID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildRolePositionsJSONBody) => rest.patch(dAPI.Routes.guildRoles(guildID), { data }), + editRole: (guildID: dAPI.Snowflake, roleID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildRoleJSONBody) => rest.patch(dAPI.Routes.guildRole(guildID, roleID), { data }), + deleteRole: (...args: Parameters) => rest.delete(dAPI.Routes.guildRole(...args)), + pruneGuild: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildPruneJSONBody) => rest.post(dAPI.Routes.guildPrune(guildID), { data }), + getPredictedPruneResult: (guildID: dAPI.Snowflake, options: dAPI.RESTGetAPIGuildPruneCountQuery) => rest.get(dAPI.Routes.guildPrune(guildID), { query: options }), + fetchGuildVoiceRegions: (...args: Parameters) => rest.get(dAPI.Routes.guildVoiceRegions(...args)), + fetchGuildInvites: (...args: Parameters) => rest.get(dAPI.Routes.guildInvites(...args)), + fetchGuildIntegration: (...args: Parameters) => rest.get(dAPI.Routes.guildIntegrations(...args)), + createGuildIntegration: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildIntegrationJSONBody) => rest.post(dAPI.Routes.guildIntegrations(guildID), { data }), + editGuildIntegration: (guildID: dAPI.Snowflake, integrationID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildIntegrationJSONBody) => rest.patch(dAPI.Routes.guildIntegration(guildID, integrationID), { data }), + deleteGuildIntegration: (...args: Parameters) => rest.delete(dAPI.Routes.guildIntegration(...args)), + syncGuildIntegration: (...args: Parameters) => rest.post(dAPI.Routes.guildIntegrationSync(...args), { data: null }), + fetchGuildWidgetSettings: (...args: Parameters) => rest.get(dAPI.Routes.guildWidgetSettings(...args)), + fetchGuildWidget: (...args: Parameters) => rest.get(dAPI.Routes.guildWidgetImage(...args)), + editGuildWidget: (guildID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildWidgetSettingsJSONBody) => rest.patch(dAPI.Routes.guildWidgetSettings(guildID), { data }), + fetchGuildVanityURL: (...args: Parameters) => rest.get(dAPI.Routes.guildVanityUrl(...args)), + fetchGuildWidgetImage: (guildID: dAPI.Snowflake, options: dAPI.RESTGetAPIGuildWidgetImageQuery) => rest.get(dAPI.Routes.guildWidgetImage(guildID), { query: options }), fetchChannel: (...args: Parameters) => rest.get(dAPI.Routes.channel(...args)), editChannel: (channelID: dAPI.Snowflake, data: dAPI.RESTPatchAPIChannelJSONBody) => rest.patch(dAPI.Routes.channel(channelID), { data }), deleteChannel: (...args: Parameters) => rest.delete(dAPI.Routes.channel(...args)), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2801c7b..118a856 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -210,16 +210,6 @@ importers: '@types/node': ^14.14.31 tslib: ^2.1.0 typescript: ^4.2.2 - libs/snowflake: - dependencies: - tslib: 2.1.0 - devDependencies: - '@types/node': 14.14.31 - typescript: 4.2.2 - specifiers: - '@types/node': ^14.14.31 - tslib: ^2.1.0 - typescript: ^4.2.2 libs/store: dependencies: '@cordis/error': link:../error From 6ffa12e36996aca0968cf759dbd156eac7850eef Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Tue, 9 Mar 2021 09:11:27 -0500 Subject: [PATCH 26/38] feat: missing webhook endpoints --- libs/util/src/restUtils.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index 2776561..1b1b4a2 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -93,6 +93,8 @@ export const makeRestUtils = (rest: RestManager) => ( createGuildFromTemplate: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPITemplateCreateGuildJSONBody) => rest.post(dAPI.Routes.template(guildID), { data }), fetchGuildTemplates: (...args: Parameters) => rest.get(dAPI.Routes.guildTemplates(...args)), createGuildTemplate: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildTemplatesJSONBody) => rest.post(dAPI.Routes.guildTemplates(guildID), { data }), + executeSlackWebhook: (webhookID: dAPI.Snowflake, webhookToken: string, options: dAPI.RESTPostAPIWebhookWithTokenSlackQuery) => rest.post(dAPI.Routes.webhookPlatform(webhookID, webhookToken, 'slack'), { data: null, query: options }), + executeGithubWebhook: (webhookID: dAPI.Snowflake, webhookToken: string, options: dAPI.RESTPostAPIWebhookWithTokenGitHubQuery) => rest.post(dAPI.Routes.webhookPlatform(webhookID, webhookToken, 'github'), { data: null, query: options }), syncGuildTemplate: (guildID: dAPI.Snowflake, templateCode: string) => rest.put(dAPI.Routes.guildTemplate(guildID, templateCode)), editGuildTemplate: (guildID: dAPI.Snowflake, templateCode: string, data: dAPI.RESTPatchAPIGuildTemplateJSONBody) => rest.patch(dAPI.Routes.guildTemplate(guildID, templateCode), { data }), deleteGuildTemplate: (...args: Parameters) => rest.delete(dAPI.Routes.guildTemplate(...args)) From 2b59a38323f799292e9e3dd1a60f077adb87b6e5 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Tue, 9 Mar 2021 10:12:19 -0500 Subject: [PATCH 27/38] a bit of clean up --- README.md | 1 - libs/util/README.md | 21 +++++++++++++++++++++ libs/util/package.json | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 libs/util/README.md diff --git a/README.md b/README.md index 7b9eb0b..d4931ca 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,6 @@ Cordis is cut up in the form of multiple packages/libraries: - [`@cordis/redis-store`](https://github.com/cordis-lib/cordis/tree/main/libs/redis-store) - A Redis implementation of `@cordis/store` - [`@cordis/rest`](https://github.com/cordis-lib/cordis/tree/main/libs/rest) - Tooling for making HTTP requests to Discord, with rate limiting handling - [`@cordis/routers`](https://github.com/cordis-lib/cordis/tree/main/libs/routers) - Make API requests with ease using simple dynamic JavaScript property accessing -- [`@cordis/snowflake`](https://github.com/cordis-lib/cordis/tree/main/libs/snowflake) - A simple snowflake structure for destructuring Discord IDs into relevant information - [`@cordis/store`](https://github.com/cordis-lib/cordis/tree/main/libs/store) - A simple map-like interface for holding key-value pairs - ships with an in-memory implementation # Contributing diff --git a/libs/util/README.md b/libs/util/README.md new file mode 100644 index 0000000..b689125 --- /dev/null +++ b/libs/util/README.md @@ -0,0 +1,21 @@ +# `@cordis/util` + +[![GitHub](https://img.shields.io/badge/License-Apache%202.0-yellow.svg)](https://github.com/cordis-lib/cordis/blob/main/LICENSE) +[![npm](https://img.shields.io/npm/v/@cordis/util?color=crimson&logo=npm)](https://www.npmjs.com/package/@cordis/util) +[![TypeScript](https://github.com/cordis-lib/cordis/actions/workflows/quality.yml/badge.svg)](https://github.com/cordis-lib/cordis/actions/workflows/quality.yml) + +Helper methods and structures for Cordis + +## Installation +- `npm install @cordis/util` +- `pnpm install @cordis/util` +- `yarn add @cordis/util` + +## Documentation +You can find documentation for the whole project over at https://cordis.js.org + +## Contributing +Please see the main [README.md](https://github.com/cordis-lib/cordis) for info on how to contribute to this package or the other `@cordis` packages. + +## LICENSE +Licensed under the [Apache 2.0](https://github.com/cordis-lib/cordis/blob/main/LICENSE) license. \ No newline at end of file diff --git a/libs/util/package.json b/libs/util/package.json index 22c9fc0..5bffed3 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -1,7 +1,7 @@ { "name": "@cordis/util", "version": "0.1.5", - "description": "Helper REST functions and other utilities for Cordis", + "description": "Helper methods and structures for Cordis", "main": "./dist/index.js", "types": "./types/index.d.ts", "scripts": { From 7638f01ecd32dc6caed7a35011019d56dd05c66c Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Tue, 9 Mar 2021 10:16:03 -0500 Subject: [PATCH 28/38] fix whatever muckery the last commit did to package.json --- libs/util/package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libs/util/package.json b/libs/util/package.json index 55f293d..9477c32 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -1,13 +1,9 @@ { "name": "@cordis/util", - "version": "0.1.5", "description": "Helper methods and structures for Cordis", "main": "./dist/index.js", "types": "./types/index.d.ts", -<<<<<<< HEAD:libs/util/package.json -======= "version": "0.1.7", ->>>>>>> origin/main:libs/snowflake/package.json "scripts": { "lint": "eslint src --ext .ts", "build": "tsc" From 402497369755e0852b2587a1f5b578a501db4ebb Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Tue, 9 Mar 2021 10:18:32 -0500 Subject: [PATCH 29/38] move version field in package.json --- libs/util/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/util/package.json b/libs/util/package.json index 9477c32..54de92e 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -1,9 +1,9 @@ { "name": "@cordis/util", + "version": "0.1.7", "description": "Helper methods and structures for Cordis", "main": "./dist/index.js", "types": "./types/index.d.ts", - "version": "0.1.7", "scripts": { "lint": "eslint src --ext .ts", "build": "tsc" From f0a28c64966e3276c35277eaeb78beacf4e3e1dc Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Tue, 9 Mar 2021 10:41:22 -0500 Subject: [PATCH 30/38] refactor: destructure imports --- libs/util/src/restUtils.ts | 317 ++++++++++++++++++++++++++----------- 1 file changed, 224 insertions(+), 93 deletions(-) diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index 1b1b4a2..1d0b53b 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -1,102 +1,233 @@ /* istanbul ignore file */ -import * as dAPI from 'discord-api-types/v8'; +import { Routes, Snowflake } from 'discord-api-types/v8'; import { RestManager } from '@cordis/rest'; +// eslint-disable-next-line no-duplicate-imports +import type { + APIAuditLog, + APIChannel, + APIGuildPreview, + APIMessage, + APIWebhook, + RESTDeleteAPIChannelAllMessageReactionsResult, + RESTDeleteAPIChannelMessageOwnReaction, + RESTDeleteAPIChannelMessageReactionResult, + RESTDeleteAPIChannelMessageUserReactionResult, + RESTDeleteAPIChannelPermissionResult, + RESTDeleteAPIChannelPinResult, + RESTDeleteAPICurrentUserGuildResult, + RESTDeleteAPIGuildBanResult, + RESTDeleteAPIGuildEmojiResult, + RESTDeleteAPIGuildIntegrationResult, + RESTDeleteAPIGuildMemberResult, + RESTDeleteAPIGuildMemberRoleResult, + RESTDeleteAPIGuildResult, + RESTDeleteAPIGuildRoleResult, + RESTDeleteAPIGuildTemplateResult, + RESTDeleteAPIInviteResult, + RESTDeleteAPIWebhookResult, + RESTGetAPIAuditLogQuery, + RESTGetAPIChannelInvitesResult, + RESTGetAPIChannelMessageResult, + RESTGetAPIChannelMessagesQuery, + RESTGetAPIChannelMessagesResult, + RESTGetAPIChannelPinsResult, + RESTGetAPIChannelWebhooksResult, + RESTGetAPICurrentUserConnectionsResult, + RESTGetAPICurrentUserResult, + RESTGetAPIGuildBanResult, + RESTGetAPIGuildBansResult, + RESTGetAPIGuildChannelsResult, + RESTGetAPIGuildEmojiResult, + RESTGetAPIGuildEmojisResult, + RESTGetAPIGuildIntegrationsResult, + RESTGetAPIGuildInvitesResult, + RESTGetAPIGuildMemberResult, + RESTGetAPIGuildPruneCountQuery, + RESTGetAPIGuildPruneCountResult, + RESTGetAPIGuildResult, + RESTGetAPIGuildRolesResult, + RESTGetAPIGuildTemplatesResult, + RESTGetAPIGuildVanityUrlResult, + RESTGetAPIGuildVoiceRegionsResult, + RESTGetAPIGuildWidgetImageQuery, + RESTGetAPIGuildWidgetImageResult, + RESTGetAPIGuildWidgetJSONResult, + RESTGetAPIInviteResult, + RESTGetAPITemplateResult, + RESTGetAPIUserResult, + RESTGetAPIWebhookResult, + RESTPatchAPIChannelJSONBody, + RESTPatchAPIChannelMessageJSONBody, + RESTPatchAPIChannelMessageResult, + RESTPatchAPIChannelResult, + RESTPatchAPICurrentGuildMemberNicknameJSONBody, + RESTPatchAPICurrentGuildMemberNicknameResult, + RESTPatchAPICurrentUserJSONBody, + RESTPatchAPICurrentUserResult, + RESTPatchAPIGuildEmojiJSONBody, + RESTPatchAPIGuildEmojiResult, + RESTPatchAPIGuildIntegrationJSONBody, + RESTPatchAPIGuildIntegrationResult, + RESTPatchAPIGuildJSONBody, + RESTPatchAPIGuildMemberJSONBody, + RESTPatchAPIGuildMemberResult, + RESTPatchAPIGuildResult, + RESTPatchAPIGuildRoleJSONBody, + RESTPatchAPIGuildRolePositionsJSONBody, + RESTPatchAPIGuildRolePositionsResult, + RESTPatchAPIGuildRoleResult, + RESTPatchAPIGuildTemplateJSONBody, + RESTPatchAPIGuildTemplateResult, + RESTPatchAPIGuildWidgetSettingsJSONBody, + RESTPatchAPIGuildWidgetSettingsResult, + RESTPatchAPIWebhookJSONBody, + RESTPatchAPIWebhookResult, + RESTPatchAPIWebhookWithTokenJSONBody, + RESTPatchAPIWebhookWithTokenMessageJSONBody, + RESTPostAPIChannelFollowersJSONBody, + RESTPostAPIChannelFollowersResult, + RESTPostAPIChannelInviteJSONBody, + RESTPostAPIChannelInviteResult, + RESTPostAPIChannelMessageCrosspostResult, + RESTPostAPIChannelMessageJSONBody, + RESTPostAPIChannelMessageResult, + RESTPostAPIChannelMessagesBulkDeleteJSONBody, + RESTPostAPIChannelMessagesBulkDeleteResult, + RESTPostAPIChannelTypingResult, + RESTPostAPIChannelWebhookJSONBody, + RESTPostAPICurrentUserCreateDMChannelJSONBody, + RESTPostAPICurrentUserCreateDMChannelResult, + RESTPostAPIGuildChannelJSONBody, + RESTPostAPIGuildChannelResult, + RESTPostAPIGuildEmojiJSONBody, + RESTPostAPIGuildEmojiResult, + RESTPostAPIGuildIntegrationJSONBody, + RESTPostAPIGuildIntegrationResult, + RESTPostAPIGuildIntegrationSyncResult, + RESTPostAPIGuildPruneJSONBody, + RESTPostAPIGuildPruneResult, + RESTPostAPIGuildRoleJSONBody, + RESTPostAPIGuildRoleResult, + RESTPostAPIGuildTemplatesJSONBody, + RESTPostAPIGuildTemplatesResult, + RESTPostAPIGuildsJSONBody, + RESTPostAPIGuildsResult, + RESTPostAPITemplateCreateGuildJSONBody, + RESTPostAPITemplateCreateGuildResult, + RESTPostAPIWebhookWithTokenGitHubQuery, + RESTPostAPIWebhookWithTokenGitHubResult, + RESTPostAPIWebhookWithTokenGitHubWaitResult, + RESTPostAPIWebhookWithTokenJSONBody, + RESTPostAPIWebhookWithTokenResult, + RESTPostAPIWebhookWithTokenSlackQuery, + RESTPostAPIWebhookWithTokenSlackResult, + RESTPostAPIWebhookWithTokenSlackWaitResult, + RESTPutAPIChannelMessageReactionResult, + RESTPutAPIChannelPermissionJSONBody, + RESTPutAPIChannelPermissionResult, + RESTPutAPIGuildBanJSONBody, + RESTPutAPIGuildBanResult, + RESTPutAPIGuildMemberJSONBody, + RESTPutAPIGuildMemberResult, + RESTPutAPIGuildMemberRoleResult, + RESTPutAPIGuildTemplateSyncResult +} from 'discord-api-types/v8'; -interface webhookIdOrToken { webhookID: dAPI.Snowflake; webhookToken?: string } +interface webhookIdOrToken { webhookID: Snowflake; webhookToken?: string } export const makeRestUtils = (rest: RestManager) => ( { - createGuild: (data: dAPI.RESTPostAPIGuildsJSONBody) => rest.post(dAPI.Routes.guilds(), { data }), - fetchGuild: (...args: Parameters) => rest.get(dAPI.Routes.guild(...args)), - fetchGuildPreview: (...args: Parameters) => rest.get(dAPI.Routes.guildPreview(...args)), - editGuild: (guildID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildJSONBody) => rest.patch(dAPI.Routes.guild(guildID), { data }), - deleteGuild: (...args: Parameters) => rest.delete(dAPI.Routes.guild(...args)), - fetchGuildChannels: (...args: Parameters) => rest.get(dAPI.Routes.guildChannels(...args)), - createGuildChannel: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildChannelJSONBody) => rest.post(dAPI.Routes.guildChannels(guildID), { data }), - fetchGuildMember: (...args: Parameters) => rest.get(dAPI.Routes.guildMember(...args)), - addGuildMember: (guildID: dAPI.Snowflake, userID: dAPI.Snowflake, data: dAPI.RESTPutAPIGuildMemberJSONBody) => rest.put(dAPI.Routes.guildMember(guildID, userID), { data }), - editGuildMember: (guildID: dAPI.Snowflake, userID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildMemberJSONBody) => rest.patch(dAPI.Routes.guildMember(guildID, userID), { data }), - setMeNickname: (guildID: dAPI.Snowflake, data: dAPI.RESTPatchAPICurrentGuildMemberNicknameJSONBody) => rest.patch(dAPI.Routes.guildCurrentMemberNickname(guildID), { data }), - addRole: (...args: Parameters) => rest.put(dAPI.Routes.guildMemberRole(...args)), - removeRole: (...args: Parameters) => rest.delete(dAPI.Routes.guildMemberRole(...args)), - kickMember: (...args: Parameters) => rest.delete(dAPI.Routes.guildMember(...args)), - fetchGuildBans: (...args: Parameters) => rest.get(dAPI.Routes.guildBans(...args)), - fetchGuildBan: (...args: Parameters) => rest.get(dAPI.Routes.guildBan(...args)), - banMember: (guildID: dAPI.Snowflake, userID: dAPI.Snowflake, data: dAPI.RESTPutAPIGuildBanJSONBody) => rest.put(dAPI.Routes.guildBan(guildID, userID), { data }), - unbanMember: (guildID: dAPI.Snowflake, userID: dAPI.Snowflake) => rest.delete(dAPI.Routes.guildBan(guildID, userID)), - fetchRoles: (...args: Parameters) => rest.get(dAPI.Routes.guildMemberRole(...args)), - createRole: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildRoleJSONBody) => rest.post(dAPI.Routes.guildRoles(guildID), { data }), - setRolePosition: (guildID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildRolePositionsJSONBody) => rest.patch(dAPI.Routes.guildRoles(guildID), { data }), - editRole: (guildID: dAPI.Snowflake, roleID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildRoleJSONBody) => rest.patch(dAPI.Routes.guildRole(guildID, roleID), { data }), - deleteRole: (...args: Parameters) => rest.delete(dAPI.Routes.guildRole(...args)), - pruneGuild: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildPruneJSONBody) => rest.post(dAPI.Routes.guildPrune(guildID), { data }), - getPredictedPruneResult: (guildID: dAPI.Snowflake, options: dAPI.RESTGetAPIGuildPruneCountQuery) => rest.get(dAPI.Routes.guildPrune(guildID), { query: options }), - fetchGuildVoiceRegions: (...args: Parameters) => rest.get(dAPI.Routes.guildVoiceRegions(...args)), - fetchGuildInvites: (...args: Parameters) => rest.get(dAPI.Routes.guildInvites(...args)), - fetchGuildIntegration: (...args: Parameters) => rest.get(dAPI.Routes.guildIntegrations(...args)), - createGuildIntegration: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildIntegrationJSONBody) => rest.post(dAPI.Routes.guildIntegrations(guildID), { data }), - editGuildIntegration: (guildID: dAPI.Snowflake, integrationID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildIntegrationJSONBody) => rest.patch(dAPI.Routes.guildIntegration(guildID, integrationID), { data }), - deleteGuildIntegration: (...args: Parameters) => rest.delete(dAPI.Routes.guildIntegration(...args)), - syncGuildIntegration: (...args: Parameters) => rest.post(dAPI.Routes.guildIntegrationSync(...args), { data: null }), - fetchGuildWidgetSettings: (...args: Parameters) => rest.get(dAPI.Routes.guildWidgetSettings(...args)), - fetchGuildWidget: (...args: Parameters) => rest.get(dAPI.Routes.guildWidgetImage(...args)), - editGuildWidget: (guildID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildWidgetSettingsJSONBody) => rest.patch(dAPI.Routes.guildWidgetSettings(guildID), { data }), - fetchGuildVanityURL: (...args: Parameters) => rest.get(dAPI.Routes.guildVanityUrl(...args)), - fetchGuildWidgetImage: (guildID: dAPI.Snowflake, options: dAPI.RESTGetAPIGuildWidgetImageQuery) => rest.get(dAPI.Routes.guildWidgetImage(guildID), { query: options }), - fetchChannel: (...args: Parameters) => rest.get(dAPI.Routes.channel(...args)), - editChannel: (channelID: dAPI.Snowflake, data: dAPI.RESTPatchAPIChannelJSONBody) => rest.patch(dAPI.Routes.channel(channelID), { data }), - deleteChannel: (...args: Parameters) => rest.delete(dAPI.Routes.channel(...args)), - fetchChannelMessages: (...args: Parameters) => rest.get(dAPI.Routes.channelMessages(...args)), - fetchChannelMessage: (...args: Parameters) => rest.get(dAPI.Routes.channelMessage(...args)), - sendMessage: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelMessageJSONBody) => rest.post(dAPI.Routes.channelMessages(channelID), { data }), - crosspostMessage: (channelID: dAPI.Snowflake, messageID: dAPI.Snowflake) => rest.post(dAPI.Routes.channelMessageCrosspost(channelID, messageID), { data: null }), - addReaction: (...args: Parameters) => rest.put(dAPI.Routes.channelMessageReaction(...args)), - deleteUserReaction: (channelID: dAPI.Snowflake, messageID: dAPI.Snowflake, emoji: dAPI.Snowflake | string, userID?: dAPI.Snowflake) => userID ? rest.delete(dAPI.Routes.channelMessageUserReaction(channelID, messageID, emoji, userID)) : rest.delete(dAPI.Routes.channelMessageOwnReaction(channelID, messageID, emoji)), - deleteAllMessageReactions: (...args: Parameters) => rest.delete(dAPI.Routes.channelMessageAllReactions(...args)), - deleteAllEmoteReaction: (...args: Parameters) => rest.delete(dAPI.Routes.channelMessageReaction(...args)), - fetchMessageReactions: (channelID: dAPI.Snowflake, messageID: dAPI.Snowflake, emoji: dAPI.Snowflake | string, options: dAPI.RESTGetAPIChannelMessagesQuery) => rest.get(dAPI.Routes.channelMessageReaction(channelID, messageID, emoji), { query: options }), - editMessage: (channelID: dAPI.Snowflake, messageID: dAPI.Snowflake, data: dAPI.RESTPatchAPIChannelMessageJSONBody) => rest.patch(dAPI.Routes.channelMessage(channelID, messageID), { data }), - deleteMessage: (...args: Parameters) => rest.delete(dAPI.Routes.channelMessage(...args)), - bulkDeleteMessages: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelMessagesBulkDeleteJSONBody) => rest.post(dAPI.Routes.channelBulkDelete(channelID), { data }), - editChannelPermissions: (channelID: dAPI.Snowflake, owerwriteID: dAPI.Snowflake, data: dAPI.RESTPutAPIChannelPermissionJSONBody) => rest.put(dAPI.Routes.channelPermission(channelID, owerwriteID), { data }), - deleteChannelPermissions: (...args: Parameters) => rest.delete(dAPI.Routes.channelPermission(...args)), - fetchChannelInvites: (...args: Parameters) => rest.get(dAPI.Routes.channelInvites(...args)), - createChannelInvite: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelInviteJSONBody) => rest.post(dAPI.Routes.channelInvites(channelID), { data }), - followNewsChannel: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelFollowersJSONBody) => rest.post(dAPI.Routes.channelFollowers(channelID), { data }), - startTyping: (...args: Parameters) => rest.get(dAPI.Routes.channelTyping(...args)), - fetchPinnedChannelMessages: (...args: Parameters) => rest.get(dAPI.Routes.channelPins(...args)), - deletePinnedChannelMessage: (...args: Parameters) => rest.delete(dAPI.Routes.channelPin(...args)), - addPinnedChannelMessage: (...args: Parameters) => rest.put(dAPI.Routes.channelPin(...args)), - fetchAuditLogs: (guildID: dAPI.Snowflake, options?: dAPI.RESTGetAPIAuditLogQuery) => rest.get(dAPI.Routes.guildAuditLog(guildID), { query: options }), - fetchInvite: (...args: Parameters) => rest.get(dAPI.Routes.invite(...args)), - deleteInvite: (...args: Parameters) => rest.delete(dAPI.Routes.invite(...args)), - createWebhook: (channelID: dAPI.Snowflake, data: dAPI.RESTPostAPIChannelWebhookJSONBody) => rest.post(dAPI.Routes.channelWebhooks(channelID), { data }), - fetchWebhooks: (...args: Parameters) => rest.get(dAPI.Routes.channelWebhooks(...args)), - fetchWebhook: (...args: Parameters) => rest.get(dAPI.Routes.webhook(...args)), - editWebhook: ({ webhookID, webhookToken }: webhookIdOrToken, data: dAPI.RESTPatchAPIWebhookJSONBody | dAPI.RESTPatchAPIWebhookWithTokenJSONBody) => rest.patch(dAPI.Routes.webhook(webhookID, webhookToken), { data }), - deleteWebhook: ({ webhookID, webhookToken }: webhookIdOrToken) => rest.delete(dAPI.Routes.webhook(webhookID, webhookToken)), - sendWebhookMessage: (webhookID: dAPI.Snowflake, webhookToken: string, data: dAPI.RESTPostAPIWebhookWithTokenJSONBody) => rest.post(dAPI.Routes.webhook(webhookID, webhookToken), { data }), - editWebhookMessage: (webhookID: dAPI.Snowflake, webhookToken: string, messageID: dAPI.Snowflake, data: dAPI.RESTPatchAPIWebhookWithTokenMessageJSONBody) => rest.patch(dAPI.Routes.webhookMessage(webhookID, webhookToken, messageID), { data }), - fetchGuildEmojis: (...args: Parameters) => rest.get(dAPI.Routes.guildEmojis(...args)), - fetchGuildEmoji: (...args: Parameters) => rest.get(dAPI.Routes.guildEmoji(...args)), - createGuildEmoji: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildEmojiJSONBody) => rest.post(dAPI.Routes.guildEmojis(guildID), { data }), - editGuildEmoji: (guildID: dAPI.Snowflake, emojiID: dAPI.Snowflake, data: dAPI.RESTPatchAPIGuildEmojiJSONBody) => rest.patch(dAPI.Routes.guildEmoji(guildID, emojiID), { data }), - deleteGuildEmoji: (...args: Parameters) => rest.delete(dAPI.Routes.guildEmoji(...args)), - fetchMe: () => rest.get(dAPI.Routes.user()), - fetchUser: (userID?: dAPI.Snowflake | null) => rest.get(dAPI.Routes.user(userID ?? undefined)), - editMe: (data: dAPI.RESTPatchAPICurrentUserJSONBody) => rest.patch(dAPI.Routes.user(), { data }), - leaveGuild: (...args: Parameters) => rest.delete(dAPI.Routes.guild(...args)), - createDM: (data: dAPI.RESTPostAPICurrentUserCreateDMChannelJSONBody) => rest.post(dAPI.Routes.userChannels(), { data }), - getUserConnections: () => rest.get(dAPI.Routes.userConnections()), - fetchTemplate: (...args: Parameters) => rest.get(dAPI.Routes.template(...args)), - createGuildFromTemplate: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPITemplateCreateGuildJSONBody) => rest.post(dAPI.Routes.template(guildID), { data }), - fetchGuildTemplates: (...args: Parameters) => rest.get(dAPI.Routes.guildTemplates(...args)), - createGuildTemplate: (guildID: dAPI.Snowflake, data: dAPI.RESTPostAPIGuildTemplatesJSONBody) => rest.post(dAPI.Routes.guildTemplates(guildID), { data }), - executeSlackWebhook: (webhookID: dAPI.Snowflake, webhookToken: string, options: dAPI.RESTPostAPIWebhookWithTokenSlackQuery) => rest.post(dAPI.Routes.webhookPlatform(webhookID, webhookToken, 'slack'), { data: null, query: options }), - executeGithubWebhook: (webhookID: dAPI.Snowflake, webhookToken: string, options: dAPI.RESTPostAPIWebhookWithTokenGitHubQuery) => rest.post(dAPI.Routes.webhookPlatform(webhookID, webhookToken, 'github'), { data: null, query: options }), - syncGuildTemplate: (guildID: dAPI.Snowflake, templateCode: string) => rest.put(dAPI.Routes.guildTemplate(guildID, templateCode)), - editGuildTemplate: (guildID: dAPI.Snowflake, templateCode: string, data: dAPI.RESTPatchAPIGuildTemplateJSONBody) => rest.patch(dAPI.Routes.guildTemplate(guildID, templateCode), { data }), - deleteGuildTemplate: (...args: Parameters) => rest.delete(dAPI.Routes.guildTemplate(...args)) + createGuild: (data: RESTPostAPIGuildsJSONBody) => rest.post(Routes.guilds(), { data }), + fetchGuild: (...args: Parameters) => rest.get(Routes.guild(...args)), + fetchGuildPreview: (...args: Parameters) => rest.get(Routes.guildPreview(...args)), + editGuild: (guildID: Snowflake, data: RESTPatchAPIGuildJSONBody) => rest.patch(Routes.guild(guildID), { data }), + deleteGuild: (...args: Parameters) => rest.delete(Routes.guild(...args)), + fetchGuildChannels: (...args: Parameters) => rest.get(Routes.guildChannels(...args)), + createGuildChannel: (guildID: Snowflake, data: RESTPostAPIGuildChannelJSONBody) => rest.post(Routes.guildChannels(guildID), { data }), + fetchGuildMember: (...args: Parameters) => rest.get(Routes.guildMember(...args)), + addGuildMember: (guildID: Snowflake, userID: Snowflake, data: RESTPutAPIGuildMemberJSONBody) => rest.put(Routes.guildMember(guildID, userID), { data }), + editGuildMember: (guildID: Snowflake, userID: Snowflake, data: RESTPatchAPIGuildMemberJSONBody) => rest.patch(Routes.guildMember(guildID, userID), { data }), + setMeNickname: (guildID: Snowflake, data: RESTPatchAPICurrentGuildMemberNicknameJSONBody) => rest.patch(Routes.guildCurrentMemberNickname(guildID), { data }), + addRole: (...args: Parameters) => rest.put(Routes.guildMemberRole(...args)), + removeRole: (...args: Parameters) => rest.delete(Routes.guildMemberRole(...args)), + kickMember: (...args: Parameters) => rest.delete(Routes.guildMember(...args)), + fetchGuildBans: (...args: Parameters) => rest.get(Routes.guildBans(...args)), + fetchGuildBan: (...args: Parameters) => rest.get(Routes.guildBan(...args)), + banMember: (guildID: Snowflake, userID: Snowflake, data: RESTPutAPIGuildBanJSONBody) => rest.put(Routes.guildBan(guildID, userID), { data }), + unbanMember: (guildID: Snowflake, userID: Snowflake) => rest.delete(Routes.guildBan(guildID, userID)), + fetchRoles: (...args: Parameters) => rest.get(Routes.guildMemberRole(...args)), + createRole: (guildID: Snowflake, data: RESTPostAPIGuildRoleJSONBody) => rest.post(Routes.guildRoles(guildID), { data }), + setRolePosition: (guildID: Snowflake, data: RESTPatchAPIGuildRolePositionsJSONBody) => rest.patch(Routes.guildRoles(guildID), { data }), + editRole: (guildID: Snowflake, roleID: Snowflake, data: RESTPatchAPIGuildRoleJSONBody) => rest.patch(Routes.guildRole(guildID, roleID), { data }), + deleteRole: (...args: Parameters) => rest.delete(Routes.guildRole(...args)), + pruneGuild: (guildID: Snowflake, data: RESTPostAPIGuildPruneJSONBody) => rest.post(Routes.guildPrune(guildID), { data }), + getPredictedPruneResult: (guildID: Snowflake, options: RESTGetAPIGuildPruneCountQuery) => rest.get(Routes.guildPrune(guildID), { query: options }), + fetchGuildVoiceRegions: (...args: Parameters) => rest.get(Routes.guildVoiceRegions(...args)), + fetchGuildInvites: (...args: Parameters) => rest.get(Routes.guildInvites(...args)), + fetchGuildIntegration: (...args: Parameters) => rest.get(Routes.guildIntegrations(...args)), + createGuildIntegration: (guildID: Snowflake, data: RESTPostAPIGuildIntegrationJSONBody) => rest.post(Routes.guildIntegrations(guildID), { data }), + editGuildIntegration: (guildID: Snowflake, integrationID: Snowflake, data: RESTPatchAPIGuildIntegrationJSONBody) => rest.patch(Routes.guildIntegration(guildID, integrationID), { data }), + deleteGuildIntegration: (...args: Parameters) => rest.delete(Routes.guildIntegration(...args)), + syncGuildIntegration: (...args: Parameters) => rest.post(Routes.guildIntegrationSync(...args), { data: null }), + fetchGuildWidgetSettings: (...args: Parameters) => rest.get(Routes.guildWidgetSettings(...args)), + fetchGuildWidget: (...args: Parameters) => rest.get(Routes.guildWidgetImage(...args)), + editGuildWidget: (guildID: Snowflake, data: RESTPatchAPIGuildWidgetSettingsJSONBody) => rest.patch(Routes.guildWidgetSettings(guildID), { data }), + fetchGuildVanityURL: (...args: Parameters) => rest.get(Routes.guildVanityUrl(...args)), + fetchGuildWidgetImage: (guildID: Snowflake, options: RESTGetAPIGuildWidgetImageQuery) => rest.get(Routes.guildWidgetImage(guildID), { query: options }), + fetchChannel: (...args: Parameters) => rest.get(Routes.channel(...args)), + editChannel: (channelID: Snowflake, data: RESTPatchAPIChannelJSONBody) => rest.patch(Routes.channel(channelID), { data }), + deleteChannel: (...args: Parameters) => rest.delete(Routes.channel(...args)), + fetchChannelMessages: (...args: Parameters) => rest.get(Routes.channelMessages(...args)), + fetchChannelMessage: (...args: Parameters) => rest.get(Routes.channelMessage(...args)), + sendMessage: (channelID: Snowflake, data: RESTPostAPIChannelMessageJSONBody) => rest.post(Routes.channelMessages(channelID), { data }), + crosspostMessage: (channelID: Snowflake, messageID: Snowflake) => rest.post(Routes.channelMessageCrosspost(channelID, messageID), { data: null }), + addReaction: (...args: Parameters) => rest.put(Routes.channelMessageReaction(...args)), + deleteUserReaction: (channelID: Snowflake, messageID: Snowflake, emoji: Snowflake | string, userID?: Snowflake) => userID ? rest.delete(Routes.channelMessageUserReaction(channelID, messageID, emoji, userID)) : rest.delete(Routes.channelMessageOwnReaction(channelID, messageID, emoji)), + deleteAllMessageReactions: (...args: Parameters) => rest.delete(Routes.channelMessageAllReactions(...args)), + deleteAllEmoteReaction: (...args: Parameters) => rest.delete(Routes.channelMessageReaction(...args)), + fetchMessageReactions: (channelID: Snowflake, messageID: Snowflake, emoji: Snowflake | string, options: RESTGetAPIChannelMessagesQuery) => rest.get(Routes.channelMessageReaction(channelID, messageID, emoji), { query: options }), + editMessage: (channelID: Snowflake, messageID: Snowflake, data: RESTPatchAPIChannelMessageJSONBody) => rest.patch(Routes.channelMessage(channelID, messageID), { data }), + deleteMessage: (...args: Parameters) => rest.delete(Routes.channelMessage(...args)), + bulkDeleteMessages: (channelID: Snowflake, data: RESTPostAPIChannelMessagesBulkDeleteJSONBody) => rest.post(Routes.channelBulkDelete(channelID), { data }), + editChannelPermissions: (channelID: Snowflake, owerwriteID: Snowflake, data: RESTPutAPIChannelPermissionJSONBody) => rest.put(Routes.channelPermission(channelID, owerwriteID), { data }), + deleteChannelPermissions: (...args: Parameters) => rest.delete(Routes.channelPermission(...args)), + fetchChannelInvites: (...args: Parameters) => rest.get(Routes.channelInvites(...args)), + createChannelInvite: (channelID: Snowflake, data: RESTPostAPIChannelInviteJSONBody) => rest.post(Routes.channelInvites(channelID), { data }), + followNewsChannel: (channelID: Snowflake, data: RESTPostAPIChannelFollowersJSONBody) => rest.post(Routes.channelFollowers(channelID), { data }), + startTyping: (...args: Parameters) => rest.get(Routes.channelTyping(...args)), + fetchPinnedChannelMessages: (...args: Parameters) => rest.get(Routes.channelPins(...args)), + deletePinnedChannelMessage: (...args: Parameters) => rest.delete(Routes.channelPin(...args)), + addPinnedChannelMessage: (...args: Parameters) => rest.put(Routes.channelPin(...args)), + fetchAuditLogs: (guildID: Snowflake, options?: RESTGetAPIAuditLogQuery) => rest.get(Routes.guildAuditLog(guildID), { query: options }), + fetchInvite: (...args: Parameters) => rest.get(Routes.invite(...args)), + deleteInvite: (...args: Parameters) => rest.delete(Routes.invite(...args)), + createWebhook: (channelID: Snowflake, data: RESTPostAPIChannelWebhookJSONBody) => rest.post(Routes.channelWebhooks(channelID), { data }), + fetchWebhooks: (...args: Parameters) => rest.get(Routes.channelWebhooks(...args)), + fetchWebhook: (...args: Parameters) => rest.get(Routes.webhook(...args)), + editWebhook: ({ webhookID, webhookToken }: webhookIdOrToken, data: RESTPatchAPIWebhookJSONBody | RESTPatchAPIWebhookWithTokenJSONBody) => rest.patch(Routes.webhook(webhookID, webhookToken), { data }), + deleteWebhook: ({ webhookID, webhookToken }: webhookIdOrToken) => rest.delete(Routes.webhook(webhookID, webhookToken)), + sendWebhookMessage: (webhookID: Snowflake, webhookToken: string, data: RESTPostAPIWebhookWithTokenJSONBody) => rest.post(Routes.webhook(webhookID, webhookToken), { data }), + editWebhookMessage: (webhookID: Snowflake, webhookToken: string, messageID: Snowflake, data: RESTPatchAPIWebhookWithTokenMessageJSONBody) => rest.patch(Routes.webhookMessage(webhookID, webhookToken, messageID), { data }), + fetchGuildEmojis: (...args: Parameters) => rest.get(Routes.guildEmojis(...args)), + fetchGuildEmoji: (...args: Parameters) => rest.get(Routes.guildEmoji(...args)), + createGuildEmoji: (guildID: Snowflake, data: RESTPostAPIGuildEmojiJSONBody) => rest.post(Routes.guildEmojis(guildID), { data }), + editGuildEmoji: (guildID: Snowflake, emojiID: Snowflake, data: RESTPatchAPIGuildEmojiJSONBody) => rest.patch(Routes.guildEmoji(guildID, emojiID), { data }), + deleteGuildEmoji: (...args: Parameters) => rest.delete(Routes.guildEmoji(...args)), + fetchMe: () => rest.get(Routes.user()), + fetchUser: (userID?: Snowflake | null) => rest.get(Routes.user(userID ?? undefined)), + editMe: (data: RESTPatchAPICurrentUserJSONBody) => rest.patch(Routes.user(), { data }), + leaveGuild: (...args: Parameters) => rest.delete(Routes.guild(...args)), + createDM: (data: RESTPostAPICurrentUserCreateDMChannelJSONBody) => rest.post(Routes.userChannels(), { data }), + getUserConnections: () => rest.get(Routes.userConnections()), + fetchTemplate: (...args: Parameters) => rest.get(Routes.template(...args)), + createGuildFromTemplate: (guildID: Snowflake, data: RESTPostAPITemplateCreateGuildJSONBody) => rest.post(Routes.template(guildID), { data }), + fetchGuildTemplates: (...args: Parameters) => rest.get(Routes.guildTemplates(...args)), + createGuildTemplate: (guildID: Snowflake, data: RESTPostAPIGuildTemplatesJSONBody) => rest.post(Routes.guildTemplates(guildID), { data }), + executeSlackWebhook: (webhookID: Snowflake, webhookToken: string, options: RESTPostAPIWebhookWithTokenSlackQuery) => rest.post(Routes.webhookPlatform(webhookID, webhookToken, 'slack'), { data: null, query: options }), + executeGithubWebhook: (webhookID: Snowflake, webhookToken: string, options: RESTPostAPIWebhookWithTokenGitHubQuery) => rest.post(Routes.webhookPlatform(webhookID, webhookToken, 'github'), { data: null, query: options }), + syncGuildTemplate: (guildID: Snowflake, templateCode: string) => rest.put(Routes.guildTemplate(guildID, templateCode)), + editGuildTemplate: (guildID: Snowflake, templateCode: string, data: RESTPatchAPIGuildTemplateJSONBody) => rest.patch(Routes.guildTemplate(guildID, templateCode), { data }), + deleteGuildTemplate: (...args: Parameters) => rest.delete(Routes.guildTemplate(...args)) } ); From dbf70325fad697ddfb1215834a76dcb26b035882 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Tue, 9 Mar 2021 10:43:56 -0500 Subject: [PATCH 31/38] fix: pnpm-lock file --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10ae654..ba0e601 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -218,7 +218,7 @@ importers: '@types/node': 14.14.31 typescript: 4.2.2 specifiers: - '@cordis/error': workspace:^0.1.6 + '@cordis/error': workspace:^0.1.7 '@types/node': ^14.14.31 tslib: ^2.1.0 typescript: ^4.2.2 From 9f1448320a9bbbb4c18016bc0fd6174cfc3ef1ab Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Tue, 9 Mar 2021 10:56:52 -0500 Subject: [PATCH 32/38] implement dd feedback --- libs/util/src/restUtils.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index 1d0b53b..47a3511 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -1,9 +1,10 @@ /* istanbul ignore file */ -import { Routes, Snowflake } from 'discord-api-types/v8'; -import { RestManager } from '@cordis/rest'; +import { Routes } from 'discord-api-types/v8'; +import type { RestManager } from '@cordis/rest'; // eslint-disable-next-line no-duplicate-imports import type { + Snowflake, APIAuditLog, APIChannel, APIGuildPreview, From 7c519e67369df3285aebf81b7e676c00d4f88536 Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Thu, 11 Mar 2021 10:29:08 -0500 Subject: [PATCH 33/38] feat: embed --- libs/util/src/Embed.test.ts | 43 ++++++++--------- libs/util/src/Embed.ts | 95 ++++++++++++++++++++++--------------- 2 files changed, 78 insertions(+), 60 deletions(-) diff --git a/libs/util/src/Embed.test.ts b/libs/util/src/Embed.test.ts index 43ef110..743675d 100644 --- a/libs/util/src/Embed.test.ts +++ b/libs/util/src/Embed.test.ts @@ -1,31 +1,30 @@ -import Embed from './Embed'; +import { embed } from './Embed'; test('Dataless value checks', () => { - const embed = new Embed({}); - expect(embed.author).toBe(null); - expect(embed.color).toBe(null); - expect(embed.description).toBe(null); - expect(embed.footer).toBe(null); - expect(embed.fields).toStrictEqual([]); - expect(embed.image).toBe(null); - expect(embed.provider).toBe(null); - expect(embed.thumbnail).toBe(null); - expect(embed.timestamp).toBe(null); - expect(embed.title).toBe(null); - expect(embed.author).toBe(null); - expect(embed.url).toBe(null); - expect(embed.video).toBe(null); + const embed1 = embed({}); + expect(embed1.author).toBe(undefined); + expect(embed1.color).toBe(undefined); + expect(embed1.description).toBe(undefined); + expect(embed1.footer).toBe(undefined); + expect(embed1.fields).toStrictEqual([]); + expect(embed1.image).toBe(undefined); + expect(embed1.provider).toBe(undefined); + expect(embed1.thumbnail).toBe(undefined); + expect(embed1.timestamp).toBe(undefined); + expect(embed1.title).toBe(undefined); + expect(embed1.author).toBe(undefined); + expect(embed1.url).toBe(undefined); + expect(embed1.video).toBe(undefined); }); test('Data value checks', () => { - const timestamp = '2021-03-08T14:40:27.875Z'; + const date = new Date('2021-03-08T14:40:27.875Z').getTime(); const color = 16753920; - const embed = new Embed({ + const embed2 = embed({ title: 'testing title!', description: 'testing description', url: 'https://google.com', - timestamp, color, fields: [], thumbnail: { @@ -40,9 +39,9 @@ test('Data value checks', () => { footer: { text: 'Test Footer' } - }); + }).setTimestamp(date); - expect(embed.timestamp).toBe(new Date(timestamp).getTime()); - expect(embed.color).toBe(color); - expect(embed.fields).toStrictEqual([]); + expect(embed2.timestamp).toBe(date.toString()); + expect(embed2.color).toBe(color); + expect(embed2.fields).toStrictEqual([]); }); diff --git a/libs/util/src/Embed.ts b/libs/util/src/Embed.ts index 37b838d..d945cfb 100644 --- a/libs/util/src/Embed.ts +++ b/libs/util/src/Embed.ts @@ -1,51 +1,70 @@ -import { APIEmbed, APIEmbedAuthor, APIEmbedImage, APIEmbedProvider, APIEmbedFooter, APIEmbedField, APIEmbedThumbnail, APIEmbedVideo } from 'discord-api-types/v8'; +import { APIEmbed, APIEmbedAuthor, APIEmbedImage, APIEmbedProvider, APIEmbedFooter, APIEmbedField, APIEmbedThumbnail, APIEmbedVideo, EmbedType } from 'discord-api-types/v8'; -export default class Embed { - public author: APIEmbedAuthor | null = null; - public color: number | null = null; - public description: string | null = null; - public fields: APIEmbedField[] = []; - public footer: APIEmbedFooter | null = null; - public image: APIEmbedImage | null = null; - public provider: APIEmbedProvider | null = null; - public thumbnail: APIEmbedThumbnail | null = null; - public timestamp: number | null = null; - public title: string | null = null; - public type = 'rich'; - public url: string | null = null; - public readonly video: APIEmbedVideo | null = null; +export const embed = (data?: Partial) => { + const author: APIEmbedAuthor | undefined = data?.author; + const color: number | undefined = data?.color; + const description: string | undefined = data?.description; + const fields: APIEmbedField[] = data?.fields ?? []; + const footer: APIEmbedFooter | undefined = data?.footer; + const image: APIEmbedImage | undefined = data?.image; + const provider: APIEmbedProvider | undefined = data?.provider; + const thumbnail: APIEmbedThumbnail | undefined = data?.thumbnail; + const timestamp: string | undefined = data?.timestamp; + const title: string | undefined = data?.title; + const type: EmbedType = EmbedType.Rich; + const url: string | undefined = data?.url; + const video: APIEmbedVideo | undefined = data?.video; - public constructor(data?: APIEmbed) { - if (data) { - if ('author' in data) this.author = data.author ?? null; - if ('color' in data) this.color = data.color ?? null; - if ('description' in data) this.description = data.description ?? null; - if ('footer' in data) this.footer = data.footer ?? null; - if ('image' in data) this.image = data.image ?? null; - if ('provider' in data) this.provider = data.provider ?? null; - if ('thumbnail' in data) this.thumbnail = data.thumbnail ?? null; - if ('timestamp' in data) this.timestamp = data.timestamp ? Date.parse(data.timestamp) : null; - if ('title' in data) this.title = data.title ?? null; - if ('url' in data) this.url = data.url ?? null; - if ('video' in data) this.video = data.video ?? null; - } - } - - public toJSON() { - const { author, color, description, footer, image, provider, thumbnail, timestamp, title, url, video } = this; - - return { + return { + ...Object.freeze({ author, color, description, fields, footer, image, provider, thumbnail, timestamp, title, type, url, video }), + toJSON: () => ({ author, color, description, footer, image, + fields, + type, provider, thumbnail, timestamp, title, url, video - }; - } -} + }), + + setAuthor(name: string, url?: string, icon_url?: string, proxy_icon_url?: string) { + return embed({ ...this, author: { name, url, icon_url, proxy_icon_url } }); + }, + setColor(color: number) { + return embed({ ...this, color }); + }, + setDescription(description: string) { + return embed({ ...this, description }); + }, + setFooter(text: string, icon_url?: string, proxy_icon_url?: string) { + return embed({ ...this, footer: { text, icon_url, proxy_icon_url } }); + }, + setImage(url: string, proxy_url?: string, height?: number, width?: number) { + return embed({ ...this, image: { url, proxy_url, height, width } }); + }, + setThumbnail(url: string, proxy_url?: string, height?: number, width?: number) { + return embed({ ...this, thumbnail: { url, proxy_url, height, width } }); + }, + setTitle(title: string) { + return embed({ ...this, title }); + }, + setURL(url: string) { + return embed({ ...this, url }); + }, + setTimestamp(timestamp: Date | number = Date.now()) { + return embed({ ...this, timestamp: timestamp.toString() }); + }, + addField(name: string, value: string, inline = false) { + return this.addFields({ name, value, inline }); + }, + addFields(...data: APIEmbedField[]) { + return embed({ ...this, fields: fields.concat(data) }); + } + }; +}; From cd52757e358b50be8d2a515c83b1f041cb32f27d Mon Sep 17 00:00:00 2001 From: didinele Date: Fri, 12 Mar 2021 10:22:31 +0200 Subject: [PATCH 34/38] chore: nitpicks --- libs/util/src/Embed.ts | 42 ++------- libs/util/src/restUtils.ts | 188 ++++++++++++++++++------------------- 2 files changed, 100 insertions(+), 130 deletions(-) diff --git a/libs/util/src/Embed.ts b/libs/util/src/Embed.ts index d945cfb..a8e1f8e 100644 --- a/libs/util/src/Embed.ts +++ b/libs/util/src/Embed.ts @@ -1,37 +1,12 @@ -import { APIEmbed, APIEmbedAuthor, APIEmbedImage, APIEmbedProvider, APIEmbedFooter, APIEmbedField, APIEmbedThumbnail, APIEmbedVideo, EmbedType } from 'discord-api-types/v8'; +import { APIEmbed, APIEmbedField, EmbedType } from 'discord-api-types/v8'; -export const embed = (data?: Partial) => { - const author: APIEmbedAuthor | undefined = data?.author; - const color: number | undefined = data?.color; - const description: string | undefined = data?.description; - const fields: APIEmbedField[] = data?.fields ?? []; - const footer: APIEmbedFooter | undefined = data?.footer; - const image: APIEmbedImage | undefined = data?.image; - const provider: APIEmbedProvider | undefined = data?.provider; - const thumbnail: APIEmbedThumbnail | undefined = data?.thumbnail; - const timestamp: string | undefined = data?.timestamp; - const title: string | undefined = data?.title; - const type: EmbedType = EmbedType.Rich; - const url: string | undefined = data?.url; - const video: APIEmbedVideo | undefined = data?.video; +export const embed = (embedData: Partial = {}) => { + embedData.fields ??= []; + embedData.type = EmbedType.Rich; return { - ...Object.freeze({ author, color, description, fields, footer, image, provider, thumbnail, timestamp, title, type, url, video }), - toJSON: () => ({ - author, - color, - description, - footer, - image, - fields, - type, - provider, - thumbnail, - timestamp, - title, - url, - video - }), + ...Object.freeze(embedData), + toJSON: () => embedData, setAuthor(name: string, url?: string, icon_url?: string, proxy_icon_url?: string) { return embed({ ...this, author: { name, url, icon_url, proxy_icon_url } }); @@ -60,11 +35,8 @@ export const embed = (data?: Partial) => { setTimestamp(timestamp: Date | number = Date.now()) { return embed({ ...this, timestamp: timestamp.toString() }); }, - addField(name: string, value: string, inline = false) { - return this.addFields({ name, value, inline }); - }, addFields(...data: APIEmbedField[]) { - return embed({ ...this, fields: fields.concat(data) }); + return embed({ ...this, fields: embedData.fields?.concat(data) ?? [] }); } }; }; diff --git a/libs/util/src/restUtils.ts b/libs/util/src/restUtils.ts index 47a3511..774285e 100644 --- a/libs/util/src/restUtils.ts +++ b/libs/util/src/restUtils.ts @@ -137,98 +137,96 @@ import type { interface webhookIdOrToken { webhookID: Snowflake; webhookToken?: string } -export const makeRestUtils = (rest: RestManager) => ( - { - createGuild: (data: RESTPostAPIGuildsJSONBody) => rest.post(Routes.guilds(), { data }), - fetchGuild: (...args: Parameters) => rest.get(Routes.guild(...args)), - fetchGuildPreview: (...args: Parameters) => rest.get(Routes.guildPreview(...args)), - editGuild: (guildID: Snowflake, data: RESTPatchAPIGuildJSONBody) => rest.patch(Routes.guild(guildID), { data }), - deleteGuild: (...args: Parameters) => rest.delete(Routes.guild(...args)), - fetchGuildChannels: (...args: Parameters) => rest.get(Routes.guildChannels(...args)), - createGuildChannel: (guildID: Snowflake, data: RESTPostAPIGuildChannelJSONBody) => rest.post(Routes.guildChannels(guildID), { data }), - fetchGuildMember: (...args: Parameters) => rest.get(Routes.guildMember(...args)), - addGuildMember: (guildID: Snowflake, userID: Snowflake, data: RESTPutAPIGuildMemberJSONBody) => rest.put(Routes.guildMember(guildID, userID), { data }), - editGuildMember: (guildID: Snowflake, userID: Snowflake, data: RESTPatchAPIGuildMemberJSONBody) => rest.patch(Routes.guildMember(guildID, userID), { data }), - setMeNickname: (guildID: Snowflake, data: RESTPatchAPICurrentGuildMemberNicknameJSONBody) => rest.patch(Routes.guildCurrentMemberNickname(guildID), { data }), - addRole: (...args: Parameters) => rest.put(Routes.guildMemberRole(...args)), - removeRole: (...args: Parameters) => rest.delete(Routes.guildMemberRole(...args)), - kickMember: (...args: Parameters) => rest.delete(Routes.guildMember(...args)), - fetchGuildBans: (...args: Parameters) => rest.get(Routes.guildBans(...args)), - fetchGuildBan: (...args: Parameters) => rest.get(Routes.guildBan(...args)), - banMember: (guildID: Snowflake, userID: Snowflake, data: RESTPutAPIGuildBanJSONBody) => rest.put(Routes.guildBan(guildID, userID), { data }), - unbanMember: (guildID: Snowflake, userID: Snowflake) => rest.delete(Routes.guildBan(guildID, userID)), - fetchRoles: (...args: Parameters) => rest.get(Routes.guildMemberRole(...args)), - createRole: (guildID: Snowflake, data: RESTPostAPIGuildRoleJSONBody) => rest.post(Routes.guildRoles(guildID), { data }), - setRolePosition: (guildID: Snowflake, data: RESTPatchAPIGuildRolePositionsJSONBody) => rest.patch(Routes.guildRoles(guildID), { data }), - editRole: (guildID: Snowflake, roleID: Snowflake, data: RESTPatchAPIGuildRoleJSONBody) => rest.patch(Routes.guildRole(guildID, roleID), { data }), - deleteRole: (...args: Parameters) => rest.delete(Routes.guildRole(...args)), - pruneGuild: (guildID: Snowflake, data: RESTPostAPIGuildPruneJSONBody) => rest.post(Routes.guildPrune(guildID), { data }), - getPredictedPruneResult: (guildID: Snowflake, options: RESTGetAPIGuildPruneCountQuery) => rest.get(Routes.guildPrune(guildID), { query: options }), - fetchGuildVoiceRegions: (...args: Parameters) => rest.get(Routes.guildVoiceRegions(...args)), - fetchGuildInvites: (...args: Parameters) => rest.get(Routes.guildInvites(...args)), - fetchGuildIntegration: (...args: Parameters) => rest.get(Routes.guildIntegrations(...args)), - createGuildIntegration: (guildID: Snowflake, data: RESTPostAPIGuildIntegrationJSONBody) => rest.post(Routes.guildIntegrations(guildID), { data }), - editGuildIntegration: (guildID: Snowflake, integrationID: Snowflake, data: RESTPatchAPIGuildIntegrationJSONBody) => rest.patch(Routes.guildIntegration(guildID, integrationID), { data }), - deleteGuildIntegration: (...args: Parameters) => rest.delete(Routes.guildIntegration(...args)), - syncGuildIntegration: (...args: Parameters) => rest.post(Routes.guildIntegrationSync(...args), { data: null }), - fetchGuildWidgetSettings: (...args: Parameters) => rest.get(Routes.guildWidgetSettings(...args)), - fetchGuildWidget: (...args: Parameters) => rest.get(Routes.guildWidgetImage(...args)), - editGuildWidget: (guildID: Snowflake, data: RESTPatchAPIGuildWidgetSettingsJSONBody) => rest.patch(Routes.guildWidgetSettings(guildID), { data }), - fetchGuildVanityURL: (...args: Parameters) => rest.get(Routes.guildVanityUrl(...args)), - fetchGuildWidgetImage: (guildID: Snowflake, options: RESTGetAPIGuildWidgetImageQuery) => rest.get(Routes.guildWidgetImage(guildID), { query: options }), - fetchChannel: (...args: Parameters) => rest.get(Routes.channel(...args)), - editChannel: (channelID: Snowflake, data: RESTPatchAPIChannelJSONBody) => rest.patch(Routes.channel(channelID), { data }), - deleteChannel: (...args: Parameters) => rest.delete(Routes.channel(...args)), - fetchChannelMessages: (...args: Parameters) => rest.get(Routes.channelMessages(...args)), - fetchChannelMessage: (...args: Parameters) => rest.get(Routes.channelMessage(...args)), - sendMessage: (channelID: Snowflake, data: RESTPostAPIChannelMessageJSONBody) => rest.post(Routes.channelMessages(channelID), { data }), - crosspostMessage: (channelID: Snowflake, messageID: Snowflake) => rest.post(Routes.channelMessageCrosspost(channelID, messageID), { data: null }), - addReaction: (...args: Parameters) => rest.put(Routes.channelMessageReaction(...args)), - deleteUserReaction: (channelID: Snowflake, messageID: Snowflake, emoji: Snowflake | string, userID?: Snowflake) => userID ? rest.delete(Routes.channelMessageUserReaction(channelID, messageID, emoji, userID)) : rest.delete(Routes.channelMessageOwnReaction(channelID, messageID, emoji)), - deleteAllMessageReactions: (...args: Parameters) => rest.delete(Routes.channelMessageAllReactions(...args)), - deleteAllEmoteReaction: (...args: Parameters) => rest.delete(Routes.channelMessageReaction(...args)), - fetchMessageReactions: (channelID: Snowflake, messageID: Snowflake, emoji: Snowflake | string, options: RESTGetAPIChannelMessagesQuery) => rest.get(Routes.channelMessageReaction(channelID, messageID, emoji), { query: options }), - editMessage: (channelID: Snowflake, messageID: Snowflake, data: RESTPatchAPIChannelMessageJSONBody) => rest.patch(Routes.channelMessage(channelID, messageID), { data }), - deleteMessage: (...args: Parameters) => rest.delete(Routes.channelMessage(...args)), - bulkDeleteMessages: (channelID: Snowflake, data: RESTPostAPIChannelMessagesBulkDeleteJSONBody) => rest.post(Routes.channelBulkDelete(channelID), { data }), - editChannelPermissions: (channelID: Snowflake, owerwriteID: Snowflake, data: RESTPutAPIChannelPermissionJSONBody) => rest.put(Routes.channelPermission(channelID, owerwriteID), { data }), - deleteChannelPermissions: (...args: Parameters) => rest.delete(Routes.channelPermission(...args)), - fetchChannelInvites: (...args: Parameters) => rest.get(Routes.channelInvites(...args)), - createChannelInvite: (channelID: Snowflake, data: RESTPostAPIChannelInviteJSONBody) => rest.post(Routes.channelInvites(channelID), { data }), - followNewsChannel: (channelID: Snowflake, data: RESTPostAPIChannelFollowersJSONBody) => rest.post(Routes.channelFollowers(channelID), { data }), - startTyping: (...args: Parameters) => rest.get(Routes.channelTyping(...args)), - fetchPinnedChannelMessages: (...args: Parameters) => rest.get(Routes.channelPins(...args)), - deletePinnedChannelMessage: (...args: Parameters) => rest.delete(Routes.channelPin(...args)), - addPinnedChannelMessage: (...args: Parameters) => rest.put(Routes.channelPin(...args)), - fetchAuditLogs: (guildID: Snowflake, options?: RESTGetAPIAuditLogQuery) => rest.get(Routes.guildAuditLog(guildID), { query: options }), - fetchInvite: (...args: Parameters) => rest.get(Routes.invite(...args)), - deleteInvite: (...args: Parameters) => rest.delete(Routes.invite(...args)), - createWebhook: (channelID: Snowflake, data: RESTPostAPIChannelWebhookJSONBody) => rest.post(Routes.channelWebhooks(channelID), { data }), - fetchWebhooks: (...args: Parameters) => rest.get(Routes.channelWebhooks(...args)), - fetchWebhook: (...args: Parameters) => rest.get(Routes.webhook(...args)), - editWebhook: ({ webhookID, webhookToken }: webhookIdOrToken, data: RESTPatchAPIWebhookJSONBody | RESTPatchAPIWebhookWithTokenJSONBody) => rest.patch(Routes.webhook(webhookID, webhookToken), { data }), - deleteWebhook: ({ webhookID, webhookToken }: webhookIdOrToken) => rest.delete(Routes.webhook(webhookID, webhookToken)), - sendWebhookMessage: (webhookID: Snowflake, webhookToken: string, data: RESTPostAPIWebhookWithTokenJSONBody) => rest.post(Routes.webhook(webhookID, webhookToken), { data }), - editWebhookMessage: (webhookID: Snowflake, webhookToken: string, messageID: Snowflake, data: RESTPatchAPIWebhookWithTokenMessageJSONBody) => rest.patch(Routes.webhookMessage(webhookID, webhookToken, messageID), { data }), - fetchGuildEmojis: (...args: Parameters) => rest.get(Routes.guildEmojis(...args)), - fetchGuildEmoji: (...args: Parameters) => rest.get(Routes.guildEmoji(...args)), - createGuildEmoji: (guildID: Snowflake, data: RESTPostAPIGuildEmojiJSONBody) => rest.post(Routes.guildEmojis(guildID), { data }), - editGuildEmoji: (guildID: Snowflake, emojiID: Snowflake, data: RESTPatchAPIGuildEmojiJSONBody) => rest.patch(Routes.guildEmoji(guildID, emojiID), { data }), - deleteGuildEmoji: (...args: Parameters) => rest.delete(Routes.guildEmoji(...args)), - fetchMe: () => rest.get(Routes.user()), - fetchUser: (userID?: Snowflake | null) => rest.get(Routes.user(userID ?? undefined)), - editMe: (data: RESTPatchAPICurrentUserJSONBody) => rest.patch(Routes.user(), { data }), - leaveGuild: (...args: Parameters) => rest.delete(Routes.guild(...args)), - createDM: (data: RESTPostAPICurrentUserCreateDMChannelJSONBody) => rest.post(Routes.userChannels(), { data }), - getUserConnections: () => rest.get(Routes.userConnections()), - fetchTemplate: (...args: Parameters) => rest.get(Routes.template(...args)), - createGuildFromTemplate: (guildID: Snowflake, data: RESTPostAPITemplateCreateGuildJSONBody) => rest.post(Routes.template(guildID), { data }), - fetchGuildTemplates: (...args: Parameters) => rest.get(Routes.guildTemplates(...args)), - createGuildTemplate: (guildID: Snowflake, data: RESTPostAPIGuildTemplatesJSONBody) => rest.post(Routes.guildTemplates(guildID), { data }), - executeSlackWebhook: (webhookID: Snowflake, webhookToken: string, options: RESTPostAPIWebhookWithTokenSlackQuery) => rest.post(Routes.webhookPlatform(webhookID, webhookToken, 'slack'), { data: null, query: options }), - executeGithubWebhook: (webhookID: Snowflake, webhookToken: string, options: RESTPostAPIWebhookWithTokenGitHubQuery) => rest.post(Routes.webhookPlatform(webhookID, webhookToken, 'github'), { data: null, query: options }), - syncGuildTemplate: (guildID: Snowflake, templateCode: string) => rest.put(Routes.guildTemplate(guildID, templateCode)), - editGuildTemplate: (guildID: Snowflake, templateCode: string, data: RESTPatchAPIGuildTemplateJSONBody) => rest.patch(Routes.guildTemplate(guildID, templateCode), { data }), - deleteGuildTemplate: (...args: Parameters) => rest.delete(Routes.guildTemplate(...args)) - } -); +export const makeRestUtils = (rest: RestManager) => ({ + createGuild: (data: RESTPostAPIGuildsJSONBody) => rest.post(Routes.guilds(), { data }), + fetchGuild: (...args: Parameters) => rest.get(Routes.guild(...args)), + fetchGuildPreview: (...args: Parameters) => rest.get(Routes.guildPreview(...args)), + editGuild: (guildID: Snowflake, data: RESTPatchAPIGuildJSONBody) => rest.patch(Routes.guild(guildID), { data }), + deleteGuild: (...args: Parameters) => rest.delete(Routes.guild(...args)), + fetchGuildChannels: (...args: Parameters) => rest.get(Routes.guildChannels(...args)), + createGuildChannel: (guildID: Snowflake, data: RESTPostAPIGuildChannelJSONBody) => rest.post(Routes.guildChannels(guildID), { data }), + fetchGuildMember: (...args: Parameters) => rest.get(Routes.guildMember(...args)), + addGuildMember: (guildID: Snowflake, userID: Snowflake, data: RESTPutAPIGuildMemberJSONBody) => rest.put(Routes.guildMember(guildID, userID), { data }), + editGuildMember: (guildID: Snowflake, userID: Snowflake, data: RESTPatchAPIGuildMemberJSONBody) => rest.patch(Routes.guildMember(guildID, userID), { data }), + setMeNickname: (guildID: Snowflake, data: RESTPatchAPICurrentGuildMemberNicknameJSONBody) => rest.patch(Routes.guildCurrentMemberNickname(guildID), { data }), + addRole: (...args: Parameters) => rest.put(Routes.guildMemberRole(...args)), + removeRole: (...args: Parameters) => rest.delete(Routes.guildMemberRole(...args)), + kickMember: (...args: Parameters) => rest.delete(Routes.guildMember(...args)), + fetchGuildBans: (...args: Parameters) => rest.get(Routes.guildBans(...args)), + fetchGuildBan: (...args: Parameters) => rest.get(Routes.guildBan(...args)), + banMember: (guildID: Snowflake, userID: Snowflake, data: RESTPutAPIGuildBanJSONBody) => rest.put(Routes.guildBan(guildID, userID), { data }), + unbanMember: (guildID: Snowflake, userID: Snowflake) => rest.delete(Routes.guildBan(guildID, userID)), + fetchRoles: (...args: Parameters) => rest.get(Routes.guildMemberRole(...args)), + createRole: (guildID: Snowflake, data: RESTPostAPIGuildRoleJSONBody) => rest.post(Routes.guildRoles(guildID), { data }), + setRolePosition: (guildID: Snowflake, data: RESTPatchAPIGuildRolePositionsJSONBody) => rest.patch(Routes.guildRoles(guildID), { data }), + editRole: (guildID: Snowflake, roleID: Snowflake, data: RESTPatchAPIGuildRoleJSONBody) => rest.patch(Routes.guildRole(guildID, roleID), { data }), + deleteRole: (...args: Parameters) => rest.delete(Routes.guildRole(...args)), + pruneGuild: (guildID: Snowflake, data: RESTPostAPIGuildPruneJSONBody) => rest.post(Routes.guildPrune(guildID), { data }), + getPredictedPruneResult: (guildID: Snowflake, options: RESTGetAPIGuildPruneCountQuery) => rest.get(Routes.guildPrune(guildID), { query: options }), + fetchGuildVoiceRegions: (...args: Parameters) => rest.get(Routes.guildVoiceRegions(...args)), + fetchGuildInvites: (...args: Parameters) => rest.get(Routes.guildInvites(...args)), + fetchGuildIntegration: (...args: Parameters) => rest.get(Routes.guildIntegrations(...args)), + createGuildIntegration: (guildID: Snowflake, data: RESTPostAPIGuildIntegrationJSONBody) => rest.post(Routes.guildIntegrations(guildID), { data }), + editGuildIntegration: (guildID: Snowflake, integrationID: Snowflake, data: RESTPatchAPIGuildIntegrationJSONBody) => rest.patch(Routes.guildIntegration(guildID, integrationID), { data }), + deleteGuildIntegration: (...args: Parameters) => rest.delete(Routes.guildIntegration(...args)), + syncGuildIntegration: (...args: Parameters) => rest.post(Routes.guildIntegrationSync(...args), { data: null }), + fetchGuildWidgetSettings: (...args: Parameters) => rest.get(Routes.guildWidgetSettings(...args)), + fetchGuildWidget: (...args: Parameters) => rest.get(Routes.guildWidgetImage(...args)), + editGuildWidget: (guildID: Snowflake, data: RESTPatchAPIGuildWidgetSettingsJSONBody) => rest.patch(Routes.guildWidgetSettings(guildID), { data }), + fetchGuildVanityURL: (...args: Parameters) => rest.get(Routes.guildVanityUrl(...args)), + fetchGuildWidgetImage: (guildID: Snowflake, options: RESTGetAPIGuildWidgetImageQuery) => rest.get(Routes.guildWidgetImage(guildID), { query: options }), + fetchChannel: (...args: Parameters) => rest.get(Routes.channel(...args)), + editChannel: (channelID: Snowflake, data: RESTPatchAPIChannelJSONBody) => rest.patch(Routes.channel(channelID), { data }), + deleteChannel: (...args: Parameters) => rest.delete(Routes.channel(...args)), + fetchChannelMessages: (...args: Parameters) => rest.get(Routes.channelMessages(...args)), + fetchChannelMessage: (...args: Parameters) => rest.get(Routes.channelMessage(...args)), + sendMessage: (channelID: Snowflake, data: RESTPostAPIChannelMessageJSONBody) => rest.post(Routes.channelMessages(channelID), { data }), + crosspostMessage: (channelID: Snowflake, messageID: Snowflake) => rest.post(Routes.channelMessageCrosspost(channelID, messageID), { data: null }), + addReaction: (...args: Parameters) => rest.put(Routes.channelMessageReaction(...args)), + deleteUserReaction: (channelID: Snowflake, messageID: Snowflake, emoji: Snowflake | string, userID?: Snowflake) => userID ? rest.delete(Routes.channelMessageUserReaction(channelID, messageID, emoji, userID)) : rest.delete(Routes.channelMessageOwnReaction(channelID, messageID, emoji)), + deleteAllMessageReactions: (...args: Parameters) => rest.delete(Routes.channelMessageAllReactions(...args)), + deleteAllEmoteReaction: (...args: Parameters) => rest.delete(Routes.channelMessageReaction(...args)), + fetchMessageReactions: (channelID: Snowflake, messageID: Snowflake, emoji: Snowflake | string, options: RESTGetAPIChannelMessagesQuery) => rest.get(Routes.channelMessageReaction(channelID, messageID, emoji), { query: options }), + editMessage: (channelID: Snowflake, messageID: Snowflake, data: RESTPatchAPIChannelMessageJSONBody) => rest.patch(Routes.channelMessage(channelID, messageID), { data }), + deleteMessage: (...args: Parameters) => rest.delete(Routes.channelMessage(...args)), + bulkDeleteMessages: (channelID: Snowflake, data: RESTPostAPIChannelMessagesBulkDeleteJSONBody) => rest.post(Routes.channelBulkDelete(channelID), { data }), + editChannelPermissions: (channelID: Snowflake, owerwriteID: Snowflake, data: RESTPutAPIChannelPermissionJSONBody) => rest.put(Routes.channelPermission(channelID, owerwriteID), { data }), + deleteChannelPermissions: (...args: Parameters) => rest.delete(Routes.channelPermission(...args)), + fetchChannelInvites: (...args: Parameters) => rest.get(Routes.channelInvites(...args)), + createChannelInvite: (channelID: Snowflake, data: RESTPostAPIChannelInviteJSONBody) => rest.post(Routes.channelInvites(channelID), { data }), + followNewsChannel: (channelID: Snowflake, data: RESTPostAPIChannelFollowersJSONBody) => rest.post(Routes.channelFollowers(channelID), { data }), + startTyping: (...args: Parameters) => rest.get(Routes.channelTyping(...args)), + fetchPinnedChannelMessages: (...args: Parameters) => rest.get(Routes.channelPins(...args)), + deletePinnedChannelMessage: (...args: Parameters) => rest.delete(Routes.channelPin(...args)), + addPinnedChannelMessage: (...args: Parameters) => rest.put(Routes.channelPin(...args)), + fetchAuditLogs: (guildID: Snowflake, options?: RESTGetAPIAuditLogQuery) => rest.get(Routes.guildAuditLog(guildID), { query: options }), + fetchInvite: (...args: Parameters) => rest.get(Routes.invite(...args)), + deleteInvite: (...args: Parameters) => rest.delete(Routes.invite(...args)), + createWebhook: (channelID: Snowflake, data: RESTPostAPIChannelWebhookJSONBody) => rest.post(Routes.channelWebhooks(channelID), { data }), + fetchWebhooks: (...args: Parameters) => rest.get(Routes.channelWebhooks(...args)), + fetchWebhook: (...args: Parameters) => rest.get(Routes.webhook(...args)), + editWebhook: ({ webhookID, webhookToken }: webhookIdOrToken, data: RESTPatchAPIWebhookJSONBody | RESTPatchAPIWebhookWithTokenJSONBody) => rest.patch(Routes.webhook(webhookID, webhookToken), { data }), + deleteWebhook: ({ webhookID, webhookToken }: webhookIdOrToken) => rest.delete(Routes.webhook(webhookID, webhookToken)), + sendWebhookMessage: (webhookID: Snowflake, webhookToken: string, data: RESTPostAPIWebhookWithTokenJSONBody) => rest.post(Routes.webhook(webhookID, webhookToken), { data }), + editWebhookMessage: (webhookID: Snowflake, webhookToken: string, messageID: Snowflake, data: RESTPatchAPIWebhookWithTokenMessageJSONBody) => rest.patch(Routes.webhookMessage(webhookID, webhookToken, messageID), { data }), + fetchGuildEmojis: (...args: Parameters) => rest.get(Routes.guildEmojis(...args)), + fetchGuildEmoji: (...args: Parameters) => rest.get(Routes.guildEmoji(...args)), + createGuildEmoji: (guildID: Snowflake, data: RESTPostAPIGuildEmojiJSONBody) => rest.post(Routes.guildEmojis(guildID), { data }), + editGuildEmoji: (guildID: Snowflake, emojiID: Snowflake, data: RESTPatchAPIGuildEmojiJSONBody) => rest.patch(Routes.guildEmoji(guildID, emojiID), { data }), + deleteGuildEmoji: (...args: Parameters) => rest.delete(Routes.guildEmoji(...args)), + fetchMe: () => rest.get(Routes.user()), + fetchUser: (userID?: Snowflake | null) => rest.get(Routes.user(userID ?? undefined)), + editMe: (data: RESTPatchAPICurrentUserJSONBody) => rest.patch(Routes.user(), { data }), + leaveGuild: (...args: Parameters) => rest.delete(Routes.guild(...args)), + createDM: (data: RESTPostAPICurrentUserCreateDMChannelJSONBody) => rest.post(Routes.userChannels(), { data }), + getUserConnections: () => rest.get(Routes.userConnections()), + fetchTemplate: (...args: Parameters) => rest.get(Routes.template(...args)), + createGuildFromTemplate: (guildID: Snowflake, data: RESTPostAPITemplateCreateGuildJSONBody) => rest.post(Routes.template(guildID), { data }), + fetchGuildTemplates: (...args: Parameters) => rest.get(Routes.guildTemplates(...args)), + createGuildTemplate: (guildID: Snowflake, data: RESTPostAPIGuildTemplatesJSONBody) => rest.post(Routes.guildTemplates(guildID), { data }), + executeSlackWebhook: (webhookID: Snowflake, webhookToken: string, options: RESTPostAPIWebhookWithTokenSlackQuery) => rest.post(Routes.webhookPlatform(webhookID, webhookToken, 'slack'), { data: null, query: options }), + executeGithubWebhook: (webhookID: Snowflake, webhookToken: string, options: RESTPostAPIWebhookWithTokenGitHubQuery) => rest.post(Routes.webhookPlatform(webhookID, webhookToken, 'github'), { data: null, query: options }), + syncGuildTemplate: (guildID: Snowflake, templateCode: string) => rest.put(Routes.guildTemplate(guildID, templateCode)), + editGuildTemplate: (guildID: Snowflake, templateCode: string, data: RESTPatchAPIGuildTemplateJSONBody) => rest.patch(Routes.guildTemplate(guildID, templateCode), { data }), + deleteGuildTemplate: (...args: Parameters) => rest.delete(Routes.guildTemplate(...args)) +}); From 5fcbafbe78a220558b334267f1024f4b634bca15 Mon Sep 17 00:00:00 2001 From: didinele Date: Fri, 12 Mar 2021 10:25:55 +0200 Subject: [PATCH 35/38] fix(util/embed): handle timestamp properly --- libs/util/src/Embed.ts | 42 ------------------ .../util/src/{Embed.test.ts => embed.test.ts} | 6 +-- libs/util/src/embed.ts | 43 +++++++++++++++++++ libs/util/src/index.ts | 1 + 4 files changed, 47 insertions(+), 45 deletions(-) delete mode 100644 libs/util/src/Embed.ts rename libs/util/src/{Embed.test.ts => embed.test.ts} (92%) create mode 100644 libs/util/src/embed.ts diff --git a/libs/util/src/Embed.ts b/libs/util/src/Embed.ts deleted file mode 100644 index a8e1f8e..0000000 --- a/libs/util/src/Embed.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { APIEmbed, APIEmbedField, EmbedType } from 'discord-api-types/v8'; - -export const embed = (embedData: Partial = {}) => { - embedData.fields ??= []; - embedData.type = EmbedType.Rich; - - return { - ...Object.freeze(embedData), - toJSON: () => embedData, - - setAuthor(name: string, url?: string, icon_url?: string, proxy_icon_url?: string) { - return embed({ ...this, author: { name, url, icon_url, proxy_icon_url } }); - }, - setColor(color: number) { - return embed({ ...this, color }); - }, - setDescription(description: string) { - return embed({ ...this, description }); - }, - setFooter(text: string, icon_url?: string, proxy_icon_url?: string) { - return embed({ ...this, footer: { text, icon_url, proxy_icon_url } }); - }, - setImage(url: string, proxy_url?: string, height?: number, width?: number) { - return embed({ ...this, image: { url, proxy_url, height, width } }); - }, - setThumbnail(url: string, proxy_url?: string, height?: number, width?: number) { - return embed({ ...this, thumbnail: { url, proxy_url, height, width } }); - }, - setTitle(title: string) { - return embed({ ...this, title }); - }, - setURL(url: string) { - return embed({ ...this, url }); - }, - setTimestamp(timestamp: Date | number = Date.now()) { - return embed({ ...this, timestamp: timestamp.toString() }); - }, - addFields(...data: APIEmbedField[]) { - return embed({ ...this, fields: embedData.fields?.concat(data) ?? [] }); - } - }; -}; diff --git a/libs/util/src/Embed.test.ts b/libs/util/src/embed.test.ts similarity index 92% rename from libs/util/src/Embed.test.ts rename to libs/util/src/embed.test.ts index 743675d..8df2d3d 100644 --- a/libs/util/src/Embed.test.ts +++ b/libs/util/src/embed.test.ts @@ -1,7 +1,7 @@ -import { embed } from './Embed'; +import { buildEmbed } from './embed'; test('Dataless value checks', () => { - const embed1 = embed({}); + const embed1 = buildEmbed({}); expect(embed1.author).toBe(undefined); expect(embed1.color).toBe(undefined); expect(embed1.description).toBe(undefined); @@ -21,7 +21,7 @@ test('Data value checks', () => { const date = new Date('2021-03-08T14:40:27.875Z').getTime(); const color = 16753920; - const embed2 = embed({ + const embed2 = buildEmbed({ title: 'testing title!', description: 'testing description', url: 'https://google.com', diff --git a/libs/util/src/embed.ts b/libs/util/src/embed.ts new file mode 100644 index 0000000..1e5c93d --- /dev/null +++ b/libs/util/src/embed.ts @@ -0,0 +1,43 @@ +import { APIEmbed, APIEmbedField, EmbedType } from 'discord-api-types/v8'; + +export const buildEmbed = (embedData: Partial = {}) => { + embedData.fields ??= []; + embedData.type = EmbedType.Rich; + + return { + ...Object.freeze(embedData), + toJSON: () => embedData, + + setAuthor(name: string, url?: string, icon_url?: string, proxy_icon_url?: string) { + return buildEmbed({ ...this, author: { name, url, icon_url, proxy_icon_url } }); + }, + setColor(color: number) { + return buildEmbed({ ...this, color }); + }, + setDescription(description: string) { + return buildEmbed({ ...this, description }); + }, + setFooter(text: string, icon_url?: string, proxy_icon_url?: string) { + return buildEmbed({ ...this, footer: { text, icon_url, proxy_icon_url } }); + }, + setImage(url: string, proxy_url?: string, height?: number, width?: number) { + return buildEmbed({ ...this, image: { url, proxy_url, height, width } }); + }, + setThumbnail(url: string, proxy_url?: string, height?: number, width?: number) { + return buildEmbed({ ...this, thumbnail: { url, proxy_url, height, width } }); + }, + setTitle(title: string) { + return buildEmbed({ ...this, title }); + }, + setURL(url: string) { + return buildEmbed({ ...this, url }); + }, + setTimestamp(timestamp: Date | number = new Date()) { + if (typeof timestamp === 'number') timestamp = new Date(timestamp); + return buildEmbed({ ...this, timestamp: timestamp.toString() }); + }, + addFields(...data: APIEmbedField[]) { + return buildEmbed({ ...this, fields: embedData.fields?.concat(data) ?? [] }); + } + }; +}; diff --git a/libs/util/src/index.ts b/libs/util/src/index.ts index c872013..b7bffc0 100644 --- a/libs/util/src/index.ts +++ b/libs/util/src/index.ts @@ -1,3 +1,4 @@ +export * from './embed'; export * from './makeDiscordCdnUrl'; export * from './restUtils'; export * from './Snowflake'; From 3723cc949795eef190d7db10ce41ee1b42bf0731 Mon Sep 17 00:00:00 2001 From: didinele Date: Fri, 12 Mar 2021 10:30:31 +0200 Subject: [PATCH 36/38] test(embed): update test to latest changes --- libs/util/src/embed.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/util/src/embed.test.ts b/libs/util/src/embed.test.ts index 8df2d3d..2e5e256 100644 --- a/libs/util/src/embed.test.ts +++ b/libs/util/src/embed.test.ts @@ -18,7 +18,7 @@ test('Dataless value checks', () => { }); test('Data value checks', () => { - const date = new Date('2021-03-08T14:40:27.875Z').getTime(); + const date = new Date('2021-03-08T14:40:27.875Z'); const color = 16753920; const embed2 = buildEmbed({ @@ -39,7 +39,7 @@ test('Data value checks', () => { footer: { text: 'Test Footer' } - }).setTimestamp(date); + }).setTimestamp(date.getTime()); expect(embed2.timestamp).toBe(date.toString()); expect(embed2.color).toBe(color); From 5c6c3500b5157a87073c62475d1034fc7c8092aa Mon Sep 17 00:00:00 2001 From: "Zaid \"Nico" Date: Fri, 12 Mar 2021 08:28:01 -0500 Subject: [PATCH 37/38] tests: improve the embed tests --- libs/util/src/embed.test.ts | 38 ++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/libs/util/src/embed.test.ts b/libs/util/src/embed.test.ts index 2e5e256..ea1eb1a 100644 --- a/libs/util/src/embed.test.ts +++ b/libs/util/src/embed.test.ts @@ -21,7 +21,7 @@ test('Data value checks', () => { const date = new Date('2021-03-08T14:40:27.875Z'); const color = 16753920; - const embed2 = buildEmbed({ + let embed2 = buildEmbed({ title: 'testing title!', description: 'testing description', url: 'https://google.com', @@ -44,4 +44,40 @@ test('Data value checks', () => { expect(embed2.timestamp).toBe(date.toString()); expect(embed2.color).toBe(color); expect(embed2.fields).toStrictEqual([]); + + embed2 = embed2 + .setAuthor('testing_author_3') + .setColor(16753920) + .setDescription('I am testing changing descriptions') + .setFooter('bing bong', 'https://www.youtube.com/watch?v=dQw4w9WgXcQ') + .setImage('https://static.wikia.nocookie.net/youtubepoop/images/2/2a/Rick_Ashley.png/revision/latest/scale-to-width-down/340?cb=20130102175058') + .setThumbnail('https://static.wikia.nocookie.net/youtubepoop/images/2/2a/Rick_Ashley.png/revision/latest/scale-to-width-down/340?cb=20130102175058') + .setTitle('Never gonna give you up') + .setURL('http://yahoo.com') + .addFields({ name: 'never gonna', value: 'let you down', inline: true }, { name: 'never gonna run around and', value: 'desert you' }); + + expect(embed2.toJSON()).toMatchObject( + { + + title: 'Never gonna give you up', + description: 'I am testing changing descriptions', + url: 'http://yahoo.com', + color: 16753920, + fields: [{ name: 'never gonna', value: 'let you down', inline: true }, { name: 'never gonna run around and', value: 'desert you' }], + thumbnail: { + url: 'https://static.wikia.nocookie.net/youtubepoop/images/2/2a/Rick_Ashley.png/revision/latest/scale-to-width-down/340?cb=20130102175058' + }, + image: { + url: 'https://static.wikia.nocookie.net/youtubepoop/images/2/2a/Rick_Ashley.png/revision/latest/scale-to-width-down/340?cb=20130102175058' + }, + author: { + name: 'testing_author_3' + }, + type: 'rich', + footer: { + text: 'bing bong', + icon_url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' + } + } + ); }); From 60d1aeddbeefcfbed1a7ab7b518a154b50969774 Mon Sep 17 00:00:00 2001 From: didinele Date: Fri, 12 Mar 2021 15:34:53 +0200 Subject: [PATCH 38/38] chore: nitpicks --- libs/util/src/embed.test.ts | 43 +++++++++++++++++-------------------- libs/util/src/embed.ts | 2 +- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/libs/util/src/embed.test.ts b/libs/util/src/embed.test.ts index ea1eb1a..2273846 100644 --- a/libs/util/src/embed.test.ts +++ b/libs/util/src/embed.test.ts @@ -56,28 +56,25 @@ test('Data value checks', () => { .setURL('http://yahoo.com') .addFields({ name: 'never gonna', value: 'let you down', inline: true }, { name: 'never gonna run around and', value: 'desert you' }); - expect(embed2.toJSON()).toMatchObject( - { - - title: 'Never gonna give you up', - description: 'I am testing changing descriptions', - url: 'http://yahoo.com', - color: 16753920, - fields: [{ name: 'never gonna', value: 'let you down', inline: true }, { name: 'never gonna run around and', value: 'desert you' }], - thumbnail: { - url: 'https://static.wikia.nocookie.net/youtubepoop/images/2/2a/Rick_Ashley.png/revision/latest/scale-to-width-down/340?cb=20130102175058' - }, - image: { - url: 'https://static.wikia.nocookie.net/youtubepoop/images/2/2a/Rick_Ashley.png/revision/latest/scale-to-width-down/340?cb=20130102175058' - }, - author: { - name: 'testing_author_3' - }, - type: 'rich', - footer: { - text: 'bing bong', - icon_url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' - } + expect(embed2.toJSON()).toMatchObject({ + title: 'Never gonna give you up', + description: 'I am testing changing descriptions', + url: 'http://yahoo.com', + color: 16753920, + fields: [{ name: 'never gonna', value: 'let you down', inline: true }, { name: 'never gonna run around and', value: 'desert you' }], + thumbnail: { + url: 'https://static.wikia.nocookie.net/youtubepoop/images/2/2a/Rick_Ashley.png/revision/latest/scale-to-width-down/340?cb=20130102175058' + }, + image: { + url: 'https://static.wikia.nocookie.net/youtubepoop/images/2/2a/Rick_Ashley.png/revision/latest/scale-to-width-down/340?cb=20130102175058' + }, + author: { + name: 'testing_author_3' + }, + type: 'rich', + footer: { + text: 'bing bong', + icon_url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' } - ); + }); }); diff --git a/libs/util/src/embed.ts b/libs/util/src/embed.ts index 1e5c93d..56fc85d 100644 --- a/libs/util/src/embed.ts +++ b/libs/util/src/embed.ts @@ -37,7 +37,7 @@ export const buildEmbed = (embedData: Partial = {}) => { return buildEmbed({ ...this, timestamp: timestamp.toString() }); }, addFields(...data: APIEmbedField[]) { - return buildEmbed({ ...this, fields: embedData.fields?.concat(data) ?? [] }); + return buildEmbed({ ...this, fields: embedData.fields?.concat(data) ?? data }); } }; };