From 9126ed349c57e2c4ae1429e14c0dda5d4decff3a Mon Sep 17 00:00:00 2001 From: Gorniaky Date: Fri, 11 Jul 2025 15:23:08 -0300 Subject: [PATCH 1/2] fix: remove the default "all" parameter from all application routes --- .../src/managers/AppAptManager.ts | 6 +- .../discloud.app/src/managers/AppManager.ts | 56 +++++++++++++------ .../src/managers/AppTeamManager.ts | 16 +++--- .../src/managers/TeamAppManager.ts | 40 ++++++++----- packages/discloud.app/src/util/assertions.ts | 13 +++++ 5 files changed, 88 insertions(+), 43 deletions(-) create mode 100644 packages/discloud.app/src/util/assertions.ts diff --git a/packages/discloud.app/src/managers/AppAptManager.ts b/packages/discloud.app/src/managers/AppAptManager.ts index d4a289556..71f84acc1 100644 --- a/packages/discloud.app/src/managers/AppAptManager.ts +++ b/packages/discloud.app/src/managers/AppAptManager.ts @@ -1,6 +1,6 @@ import { Routes, type APTString, type RESTDeleteApiAppAptResult, type RESTPutApiAppAptResult } from "@discloudapp/api-types/v2"; -import z from "zod"; import type DiscloudApp from "../discloudApp/DiscloudApp"; +import { validateStringType } from "../util/assertions"; import BaseManager from "./BaseManager"; /** @@ -18,7 +18,7 @@ export default class AppAptManager extends BaseManager { * @param apt - One or more APTs to install. See {@link AptString}. */ async install(appID: string, apt: APTString | APTString[]): Promise { - z.string().parse(appID); + validateStringType(appID); if (Array.isArray(apt)) apt = apt.join(); @@ -34,7 +34,7 @@ export default class AppAptManager extends BaseManager { * @param apt - One or more APTs to uninstall. See {@link AptString}. */ async uninstall(appID: string, apt: APTString | APTString[]): Promise { - z.string().parse(appID); + validateStringType(appID); if (Array.isArray(apt)) apt = apt.join(); diff --git a/packages/discloud.app/src/managers/AppManager.ts b/packages/discloud.app/src/managers/AppManager.ts index e95995065..edba3a9aa 100644 --- a/packages/discloud.app/src/managers/AppManager.ts +++ b/packages/discloud.app/src/managers/AppManager.ts @@ -2,13 +2,13 @@ import { Routes, type ApiAppManagerRemovedAll, type ApiAppManagerRestartedAll, t import { DiscloudAPIError } from "@discloudapp/rest"; import { resolveFile } from "@discloudapp/util"; import { constants } from "http2"; -import z from "zod"; import { ProfileOptions, type CreateAppOptions, type UpdateAppOptions } from "../@types"; import type DiscloudApp from "../discloudApp/DiscloudApp"; import App from "../structures/App"; import AppBackup from "../structures/AppBackup"; import type AppStatus from "../structures/AppStatus"; import AppUploaded from "../structures/AppUploaded"; +import { validateNumberType, validateStringType } from "../util/assertions"; import CachedManager from "./CachedManager"; /** @@ -26,6 +26,8 @@ export default class AppManager extends CachedManager { */ async status(appID: string): Promise async status(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.get(Routes.appStatus(appID)); return this._add(data.apps).status; @@ -38,6 +40,9 @@ export default class AppManager extends CachedManager { * @param command - The command */ async console(appID: string, command: string): Promise { + validateStringType(appID); + validateStringType(command); + const data = await this.discloudApp.rest.put(Routes.appConsole(appID), { body: { command }, }); @@ -51,8 +56,10 @@ export default class AppManager extends CachedManager { * @param appID - Your app id */ async terminal(appID: string): Promise - async terminal(appID?: "all"): Promise> - async terminal(appID = "all") { + async terminal(appID: "all"): Promise> + async terminal(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.get< | RESTGetApiAppLogResult | RESTGetApiAppAllLogResult @@ -77,8 +84,10 @@ export default class AppManager extends CachedManager { * @param appID - Your app id */ async backup(appID: string): Promise - async backup(appID?: "all"): Promise> - async backup(appID = "all") { + async backup(appID: "all"): Promise> + async backup(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.get< | RESTGetApiAppBackupResult | RESTGetApiAppAllBackupResult @@ -104,8 +113,8 @@ export default class AppManager extends CachedManager { * @param quantity - Minimum values is `100` to `bot` or `512` for `site` */ async ram(appID: string, quantity: number) { - z.string().parse(appID); - z.number().min(100).parse(quantity); + validateStringType(appID); + validateNumberType(quantity); const data = await this.discloudApp.rest.put(Routes.appRam(appID), { body: { @@ -150,7 +159,7 @@ export default class AppManager extends CachedManager { * @param options - Options to update your app. */ async update(appID: string, options: UpdateAppOptions) { - z.string().parse(appID); + validateStringType(appID); options.file = await resolveFile(options.file); @@ -167,8 +176,10 @@ export default class AppManager extends CachedManager { * @param appID - Your app id */ async delete(appID: string): Promise - async delete(appID?: "all"): Promise - async delete(appID = "all") { + async delete(appID: "all"): Promise + async delete(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.delete< | RESTDeleteApiAppDeleteResult | RESTDeleteApiAppAllDeleteResult @@ -194,6 +205,7 @@ export default class AppManager extends CachedManager { * @param options - Options to update your app. */ async profile(appID: string, options: ProfileOptions) { + validateStringType(appID); ProfileOptions.parse(options); const data = await this.discloudApp.rest.put(Routes.appProfile(appID), { @@ -212,8 +224,10 @@ export default class AppManager extends CachedManager { * @param appID - You app id */ async restart(appID: string): Promise - async restart(appID?: "all"): Promise - async restart(appID = "all") { + async restart(appID: "all"): Promise + async restart(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.put< | RESTPutApiAppRestartResult | RESTPutApiAppAllRestartResult @@ -242,8 +256,10 @@ export default class AppManager extends CachedManager { * @param appID - You app id */ async start(appID: string): Promise - async start(appID?: "all"): Promise - async start(appID = "all") { + async start(appID: "all"): Promise + async start(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.put< | RESTPutApiAppStartResult | RESTPutApiAppAllStartResult @@ -272,8 +288,10 @@ export default class AppManager extends CachedManager { * @param appID - You app id */ async stop(appID: string): Promise - async stop(appID?: "all"): Promise - async stop(appID = "all") { + async stop(appID: "all"): Promise + async stop(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.put< | RESTPutApiAppStopResult | RESTPutApiAppAllStopResult @@ -302,8 +320,10 @@ export default class AppManager extends CachedManager { * @param appID - You app id. */ async fetch(appID: string): Promise - async fetch(appID?: "all"): Promise> - async fetch(appID = "all") { + async fetch(appID: "all"): Promise> + async fetch(appID: string) { + validateStringType(appID); + if (appID === "all") return this.#fetchMany(); try { diff --git a/packages/discloud.app/src/managers/AppTeamManager.ts b/packages/discloud.app/src/managers/AppTeamManager.ts index 46254bf60..fda74a553 100644 --- a/packages/discloud.app/src/managers/AppTeamManager.ts +++ b/packages/discloud.app/src/managers/AppTeamManager.ts @@ -1,7 +1,7 @@ import { Routes, type ApiAppTeamManager, type RESTDeleteApiAppTeamResult, type RESTGetApiAppTeamResult, type RESTPostApiAppTeamResult, type RESTPutApiAppTeamResult } from "@discloudapp/api-types/v2"; import { ModPermissionsBF, type ModPermissionsResolvable } from "@discloudapp/util"; -import z from "zod"; import type DiscloudApp from "../discloudApp/DiscloudApp"; +import { validateStringType } from "../util/assertions"; import BaseManager from "./BaseManager"; /** @@ -20,8 +20,8 @@ export default class AppTeamManager extends BaseManager { * @param perms - The permissions for the mod. See {@link ModPermissionsResolvable} */ async create(appID: string, modID: string, perms: ModPermissionsResolvable): Promise { - z.string().parse(appID); - z.string().parse(modID); + validateStringType(appID); + validateStringType(modID); const data = await this.discloudApp.rest.post(Routes.appTeam(appID), { body: { @@ -41,8 +41,8 @@ export default class AppTeamManager extends BaseManager { * @param perms - The permissions for the mod. See {@link ModPermissionsResolvable} */ async edit(appID: string, modID: string, perms: ModPermissionsResolvable): Promise { - z.string().parse(appID); - z.string().parse(modID); + validateStringType(appID); + validateStringType(modID); const data = await this.discloudApp.rest.put(Routes.appTeam(appID), { body: { @@ -62,8 +62,8 @@ export default class AppTeamManager extends BaseManager { * @param modID - The mod id */ async delete(appID: string, modID: string): Promise { - z.string().parse(appID); - z.string().parse(modID); + validateStringType(appID); + validateStringType(modID); const data = await this.discloudApp.rest.delete< RESTDeleteApiAppTeamResult @@ -76,7 +76,7 @@ export default class AppTeamManager extends BaseManager { * Get mods information for your app on Discloud */ async fetch(appID: string) { - z.string().parse(appID); + validateStringType(appID); const data = await this.discloudApp.rest.get(Routes.appTeam(appID)); diff --git a/packages/discloud.app/src/managers/TeamAppManager.ts b/packages/discloud.app/src/managers/TeamAppManager.ts index e28df5cfd..84d9eeb88 100644 --- a/packages/discloud.app/src/managers/TeamAppManager.ts +++ b/packages/discloud.app/src/managers/TeamAppManager.ts @@ -2,12 +2,12 @@ import { Routes, type ApiAppManagerRestartedAll, type ApiAppManagerStartedAll, t import { DiscloudAPIError } from "@discloudapp/rest"; import { resolveFile } from "@discloudapp/util"; import { constants } from "http2"; -import z from "zod"; import type { UpdateAppOptions } from "../@types"; import type DiscloudApp from "../discloudApp/DiscloudApp"; import AppBackup from "../structures/AppBackup"; import TeamApp from "../structures/TeamApp"; import type TeamAppStatus from "../structures/TeamAppStatus"; +import { validateNumberType, validateStringType } from "../util/assertions"; import CachedManager from "./CachedManager"; /** @@ -25,6 +25,8 @@ export default class TeamAppManager extends CachedManager { */ async status(appID: string): Promise async status(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.get(Routes.teamStatus(appID)); return this._add(data.apps).status; @@ -36,8 +38,10 @@ export default class TeamAppManager extends CachedManager { * @param appID - Your team app id */ async terminal(appID: string): Promise - async terminal(appID?: "all"): Promise> - async terminal(appID = "all") { + async terminal(appID: "all"): Promise> + async terminal(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.get< | RESTGetApiAppLogResult | RESTGetApiAppAllLogResult @@ -61,8 +65,10 @@ export default class TeamAppManager extends CachedManager { * @param appID - Your team app id */ async backup(appID: string): Promise - async backup(appID?: "all"): Promise> - async backup(appID = "all") { + async backup(appID: "all"): Promise> + async backup(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.get< | RESTGetApiAppBackupResult | RESTGetApiAppAllBackupResult @@ -88,8 +94,8 @@ export default class TeamAppManager extends CachedManager { * @param quantity - Minimum values is `100` to `bot` or `512` for `site` */ async ram(appID: string, quantity: number) { - z.string().parse(appID); - z.number().parse(quantity); + validateStringType(appID); + validateNumberType(quantity); const data = await this.discloudApp.rest.put(Routes.teamRam(appID), { body: { @@ -113,7 +119,7 @@ export default class TeamAppManager extends CachedManager { * @param options - Options to update your app. */ async update(appID: string, options: UpdateAppOptions) { - z.string().parse(appID); + validateStringType(appID); options.file = await resolveFile(options.file); @@ -132,8 +138,10 @@ export default class TeamAppManager extends CachedManager { * @param appID - Your team app id */ async restart(appID: string): Promise - async restart(appID?: "all"): Promise - async restart(appID = "all") { + async restart(appID: "all"): Promise + async restart(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.put< | RESTPutApiAppRestartResult | RESTPutApiAppAllRestartResult @@ -162,8 +170,10 @@ export default class TeamAppManager extends CachedManager { * @param appID - Your team app id */ async start(appID: string): Promise - async start(appID?: "all"): Promise - async start(appID = "all") { + async start(appID: "all"): Promise + async start(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.put< | RESTPutApiAppStartResult | RESTPutApiAppAllStartResult @@ -192,8 +202,10 @@ export default class TeamAppManager extends CachedManager { * @param appID - Your team app id */ async stop(appID: string): Promise - async stop(appID?: "all"): Promise - async stop(appID = "all") { + async stop(appID: "all"): Promise + async stop(appID: string) { + validateStringType(appID); + const data = await this.discloudApp.rest.put< | RESTPutApiAppStopResult | RESTPutApiAppAllStopResult diff --git a/packages/discloud.app/src/util/assertions.ts b/packages/discloud.app/src/util/assertions.ts new file mode 100644 index 000000000..c13e06652 --- /dev/null +++ b/packages/discloud.app/src/util/assertions.ts @@ -0,0 +1,13 @@ +import assert from "assert"; + +export function validateStringType(value: string): void +export function validateStringType(value: unknown): void +export function validateStringType(value: unknown) { + assert(typeof value === "string"); +} + +export function validateNumberType(value: number): void +export function validateNumberType(value: unknown): void +export function validateNumberType(value: unknown) { + assert(typeof value === "number"); +} From cf34269ea0baaa970a1d9d682dbc8dda2dfae41b Mon Sep 17 00:00:00 2001 From: Gorniaky Date: Fri, 11 Jul 2025 15:36:26 -0300 Subject: [PATCH 2/2] feat: improve validation --- .../src/managers/AppAptManager.ts | 6 ++-- .../discloud.app/src/managers/AppManager.ts | 28 +++++++++---------- .../src/managers/AppTeamManager.ts | 16 +++++------ .../src/managers/TeamAppManager.ts | 18 ++++++------ packages/discloud.app/src/util/assertions.ts | 11 ++++++-- 5 files changed, 43 insertions(+), 36 deletions(-) diff --git a/packages/discloud.app/src/managers/AppAptManager.ts b/packages/discloud.app/src/managers/AppAptManager.ts index 71f84acc1..5613642c6 100644 --- a/packages/discloud.app/src/managers/AppAptManager.ts +++ b/packages/discloud.app/src/managers/AppAptManager.ts @@ -1,6 +1,6 @@ import { Routes, type APTString, type RESTDeleteApiAppAptResult, type RESTPutApiAppAptResult } from "@discloudapp/api-types/v2"; import type DiscloudApp from "../discloudApp/DiscloudApp"; -import { validateStringType } from "../util/assertions"; +import { validateNonEmptyString } from "../util/assertions"; import BaseManager from "./BaseManager"; /** @@ -18,7 +18,7 @@ export default class AppAptManager extends BaseManager { * @param apt - One or more APTs to install. See {@link AptString}. */ async install(appID: string, apt: APTString | APTString[]): Promise { - validateStringType(appID); + validateNonEmptyString(appID); if (Array.isArray(apt)) apt = apt.join(); @@ -34,7 +34,7 @@ export default class AppAptManager extends BaseManager { * @param apt - One or more APTs to uninstall. See {@link AptString}. */ async uninstall(appID: string, apt: APTString | APTString[]): Promise { - validateStringType(appID); + validateNonEmptyString(appID); if (Array.isArray(apt)) apt = apt.join(); diff --git a/packages/discloud.app/src/managers/AppManager.ts b/packages/discloud.app/src/managers/AppManager.ts index edba3a9aa..21318c570 100644 --- a/packages/discloud.app/src/managers/AppManager.ts +++ b/packages/discloud.app/src/managers/AppManager.ts @@ -8,7 +8,7 @@ import App from "../structures/App"; import AppBackup from "../structures/AppBackup"; import type AppStatus from "../structures/AppStatus"; import AppUploaded from "../structures/AppUploaded"; -import { validateNumberType, validateStringType } from "../util/assertions"; +import { validateNonEmptyString, validateNumberType } from "../util/assertions"; import CachedManager from "./CachedManager"; /** @@ -26,7 +26,7 @@ export default class AppManager extends CachedManager { */ async status(appID: string): Promise async status(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.get(Routes.appStatus(appID)); @@ -40,8 +40,8 @@ export default class AppManager extends CachedManager { * @param command - The command */ async console(appID: string, command: string): Promise { - validateStringType(appID); - validateStringType(command); + validateNonEmptyString(appID); + validateNonEmptyString(command); const data = await this.discloudApp.rest.put(Routes.appConsole(appID), { body: { command }, @@ -58,7 +58,7 @@ export default class AppManager extends CachedManager { async terminal(appID: string): Promise async terminal(appID: "all"): Promise> async terminal(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.get< | RESTGetApiAppLogResult @@ -86,7 +86,7 @@ export default class AppManager extends CachedManager { async backup(appID: string): Promise async backup(appID: "all"): Promise> async backup(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.get< | RESTGetApiAppBackupResult @@ -113,7 +113,7 @@ export default class AppManager extends CachedManager { * @param quantity - Minimum values is `100` to `bot` or `512` for `site` */ async ram(appID: string, quantity: number) { - validateStringType(appID); + validateNonEmptyString(appID); validateNumberType(quantity); const data = await this.discloudApp.rest.put(Routes.appRam(appID), { @@ -159,7 +159,7 @@ export default class AppManager extends CachedManager { * @param options - Options to update your app. */ async update(appID: string, options: UpdateAppOptions) { - validateStringType(appID); + validateNonEmptyString(appID); options.file = await resolveFile(options.file); @@ -178,7 +178,7 @@ export default class AppManager extends CachedManager { async delete(appID: string): Promise async delete(appID: "all"): Promise async delete(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.delete< | RESTDeleteApiAppDeleteResult @@ -205,7 +205,7 @@ export default class AppManager extends CachedManager { * @param options - Options to update your app. */ async profile(appID: string, options: ProfileOptions) { - validateStringType(appID); + validateNonEmptyString(appID); ProfileOptions.parse(options); const data = await this.discloudApp.rest.put(Routes.appProfile(appID), { @@ -226,7 +226,7 @@ export default class AppManager extends CachedManager { async restart(appID: string): Promise async restart(appID: "all"): Promise async restart(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.put< | RESTPutApiAppRestartResult @@ -258,7 +258,7 @@ export default class AppManager extends CachedManager { async start(appID: string): Promise async start(appID: "all"): Promise async start(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.put< | RESTPutApiAppStartResult @@ -290,7 +290,7 @@ export default class AppManager extends CachedManager { async stop(appID: string): Promise async stop(appID: "all"): Promise async stop(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.put< | RESTPutApiAppStopResult @@ -322,7 +322,7 @@ export default class AppManager extends CachedManager { async fetch(appID: string): Promise async fetch(appID: "all"): Promise> async fetch(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); if (appID === "all") return this.#fetchMany(); diff --git a/packages/discloud.app/src/managers/AppTeamManager.ts b/packages/discloud.app/src/managers/AppTeamManager.ts index fda74a553..9bef444a1 100644 --- a/packages/discloud.app/src/managers/AppTeamManager.ts +++ b/packages/discloud.app/src/managers/AppTeamManager.ts @@ -1,7 +1,7 @@ import { Routes, type ApiAppTeamManager, type RESTDeleteApiAppTeamResult, type RESTGetApiAppTeamResult, type RESTPostApiAppTeamResult, type RESTPutApiAppTeamResult } from "@discloudapp/api-types/v2"; import { ModPermissionsBF, type ModPermissionsResolvable } from "@discloudapp/util"; import type DiscloudApp from "../discloudApp/DiscloudApp"; -import { validateStringType } from "../util/assertions"; +import { validateNonEmptyString } from "../util/assertions"; import BaseManager from "./BaseManager"; /** @@ -20,8 +20,8 @@ export default class AppTeamManager extends BaseManager { * @param perms - The permissions for the mod. See {@link ModPermissionsResolvable} */ async create(appID: string, modID: string, perms: ModPermissionsResolvable): Promise { - validateStringType(appID); - validateStringType(modID); + validateNonEmptyString(appID); + validateNonEmptyString(modID); const data = await this.discloudApp.rest.post(Routes.appTeam(appID), { body: { @@ -41,8 +41,8 @@ export default class AppTeamManager extends BaseManager { * @param perms - The permissions for the mod. See {@link ModPermissionsResolvable} */ async edit(appID: string, modID: string, perms: ModPermissionsResolvable): Promise { - validateStringType(appID); - validateStringType(modID); + validateNonEmptyString(appID); + validateNonEmptyString(modID); const data = await this.discloudApp.rest.put(Routes.appTeam(appID), { body: { @@ -62,8 +62,8 @@ export default class AppTeamManager extends BaseManager { * @param modID - The mod id */ async delete(appID: string, modID: string): Promise { - validateStringType(appID); - validateStringType(modID); + validateNonEmptyString(appID); + validateNonEmptyString(modID); const data = await this.discloudApp.rest.delete< RESTDeleteApiAppTeamResult @@ -76,7 +76,7 @@ export default class AppTeamManager extends BaseManager { * Get mods information for your app on Discloud */ async fetch(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.get(Routes.appTeam(appID)); diff --git a/packages/discloud.app/src/managers/TeamAppManager.ts b/packages/discloud.app/src/managers/TeamAppManager.ts index 84d9eeb88..66b75188e 100644 --- a/packages/discloud.app/src/managers/TeamAppManager.ts +++ b/packages/discloud.app/src/managers/TeamAppManager.ts @@ -7,7 +7,7 @@ import type DiscloudApp from "../discloudApp/DiscloudApp"; import AppBackup from "../structures/AppBackup"; import TeamApp from "../structures/TeamApp"; import type TeamAppStatus from "../structures/TeamAppStatus"; -import { validateNumberType, validateStringType } from "../util/assertions"; +import { validateNumberType, validateNonEmptyString } from "../util/assertions"; import CachedManager from "./CachedManager"; /** @@ -25,7 +25,7 @@ export default class TeamAppManager extends CachedManager { */ async status(appID: string): Promise async status(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.get(Routes.teamStatus(appID)); @@ -40,7 +40,7 @@ export default class TeamAppManager extends CachedManager { async terminal(appID: string): Promise async terminal(appID: "all"): Promise> async terminal(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.get< | RESTGetApiAppLogResult @@ -67,7 +67,7 @@ export default class TeamAppManager extends CachedManager { async backup(appID: string): Promise async backup(appID: "all"): Promise> async backup(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.get< | RESTGetApiAppBackupResult @@ -94,7 +94,7 @@ export default class TeamAppManager extends CachedManager { * @param quantity - Minimum values is `100` to `bot` or `512` for `site` */ async ram(appID: string, quantity: number) { - validateStringType(appID); + validateNonEmptyString(appID); validateNumberType(quantity); const data = await this.discloudApp.rest.put(Routes.teamRam(appID), { @@ -119,7 +119,7 @@ export default class TeamAppManager extends CachedManager { * @param options - Options to update your app. */ async update(appID: string, options: UpdateAppOptions) { - validateStringType(appID); + validateNonEmptyString(appID); options.file = await resolveFile(options.file); @@ -140,7 +140,7 @@ export default class TeamAppManager extends CachedManager { async restart(appID: string): Promise async restart(appID: "all"): Promise async restart(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.put< | RESTPutApiAppRestartResult @@ -172,7 +172,7 @@ export default class TeamAppManager extends CachedManager { async start(appID: string): Promise async start(appID: "all"): Promise async start(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.put< | RESTPutApiAppStartResult @@ -204,7 +204,7 @@ export default class TeamAppManager extends CachedManager { async stop(appID: string): Promise async stop(appID: "all"): Promise async stop(appID: string) { - validateStringType(appID); + validateNonEmptyString(appID); const data = await this.discloudApp.rest.put< | RESTPutApiAppStopResult diff --git a/packages/discloud.app/src/util/assertions.ts b/packages/discloud.app/src/util/assertions.ts index c13e06652..225ae136b 100644 --- a/packages/discloud.app/src/util/assertions.ts +++ b/packages/discloud.app/src/util/assertions.ts @@ -3,11 +3,18 @@ import assert from "assert"; export function validateStringType(value: string): void export function validateStringType(value: unknown): void export function validateStringType(value: unknown) { - assert(typeof value === "string"); + assert(typeof value === "string", new TypeError(`Expected string but received ${typeof value}`)); +} + +export function validateNonEmptyString(value: string): void +export function validateNonEmptyString(value: unknown): void +export function validateNonEmptyString(value: any) { + validateStringType(value); + assert(value.length, new RangeError("The string cannot be empty")); } export function validateNumberType(value: number): void export function validateNumberType(value: unknown): void export function validateNumberType(value: unknown) { - assert(typeof value === "number"); + assert(typeof value === "number", new TypeError(`Expected number but received ${typeof value}`)); }