diff --git a/packages/discloud.app/src/managers/AppAptManager.ts b/packages/discloud.app/src/managers/AppAptManager.ts index d4a289556..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 z from "zod"; import type DiscloudApp from "../discloudApp/DiscloudApp"; +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 { - z.string().parse(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 { - z.string().parse(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 e95995065..21318c570 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 { validateNonEmptyString, validateNumberType } 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) { + validateNonEmptyString(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 { + validateNonEmptyString(appID); + validateNonEmptyString(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) { + validateNonEmptyString(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) { + validateNonEmptyString(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); + validateNonEmptyString(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); + validateNonEmptyString(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) { + validateNonEmptyString(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) { + validateNonEmptyString(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) { + validateNonEmptyString(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) { + validateNonEmptyString(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) { + validateNonEmptyString(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) { + validateNonEmptyString(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..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 z from "zod"; import type DiscloudApp from "../discloudApp/DiscloudApp"; +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 { - z.string().parse(appID); - z.string().parse(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 { - z.string().parse(appID); - z.string().parse(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 { - z.string().parse(appID); - z.string().parse(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) { - z.string().parse(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 e28df5cfd..66b75188e 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, validateNonEmptyString } 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) { + validateNonEmptyString(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) { + validateNonEmptyString(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) { + validateNonEmptyString(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); + validateNonEmptyString(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); + validateNonEmptyString(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) { + validateNonEmptyString(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) { + validateNonEmptyString(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) { + validateNonEmptyString(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..225ae136b --- /dev/null +++ b/packages/discloud.app/src/util/assertions.ts @@ -0,0 +1,20 @@ +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", 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", new TypeError(`Expected number but received ${typeof value}`)); +}