feat(builders): update to @sapphire/shapeshift v4 (#10291)

feat: update to @sapphire/shapeshift v4
This commit is contained in:
Jeroen Claassens
2024-08-19 20:15:30 +02:00
committed by GitHub
parent bbef68d271
commit 2d5531f35c
14 changed files with 136 additions and 86 deletions

View File

@@ -67,7 +67,7 @@
"dependencies": { "dependencies": {
"@discordjs/formatters": "workspace:^", "@discordjs/formatters": "workspace:^",
"@discordjs/util": "workspace:^", "@discordjs/util": "workspace:^",
"@sapphire/shapeshift": "^3.9.7", "@sapphire/shapeshift": "^4.0.0",
"discord-api-types": "0.37.94", "discord-api-types": "0.37.94",
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
"ts-mixer": "^6.0.4", "ts-mixer": "^6.0.4",

View File

@@ -3,35 +3,42 @@ import { ButtonStyle, ChannelType, type APIMessageComponentEmoji } from 'discord
import { isValidationEnabled } from '../util/validation.js'; import { isValidationEnabled } from '../util/validation.js';
import { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js'; import { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js';
export const customIdValidator = s.string export const customIdValidator = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(100) .lengthLessThanOrEqual(100)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const emojiValidator = s export const emojiValidator = s
.object({ .object({
id: s.string, id: s.string(),
name: s.string, name: s.string(),
animated: s.boolean, animated: s.boolean(),
}) })
.partial.strict.setValidationEnabled(isValidationEnabled); .partial()
.strict()
.setValidationEnabled(isValidationEnabled);
export const disabledValidator = s.boolean; export const disabledValidator = s.boolean();
export const buttonLabelValidator = s.string export const buttonLabelValidator = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(80) .lengthLessThanOrEqual(80)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const buttonStyleValidator = s.nativeEnum(ButtonStyle); export const buttonStyleValidator = s.nativeEnum(ButtonStyle);
export const placeholderValidator = s.string.lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled); export const placeholderValidator = s.string().lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled);
export const minMaxValidator = s.number.int export const minMaxValidator = s
.number()
.int()
.greaterThanOrEqual(0) .greaterThanOrEqual(0)
.lessThanOrEqual(25) .lessThanOrEqual(25)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const labelValueDescriptionValidator = s.string export const labelValueDescriptionValidator = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(100) .lengthLessThanOrEqual(100)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
@@ -40,18 +47,21 @@ export const jsonOptionValidator = s
.object({ .object({
label: labelValueDescriptionValidator, label: labelValueDescriptionValidator,
value: labelValueDescriptionValidator, value: labelValueDescriptionValidator,
description: labelValueDescriptionValidator.optional, description: labelValueDescriptionValidator.optional(),
emoji: emojiValidator.optional, emoji: emojiValidator.optional(),
default: s.boolean.optional, default: s.boolean().optional(),
}) })
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const optionValidator = s.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled); export const optionValidator = s.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled);
export const optionsValidator = optionValidator.array export const optionsValidator = optionValidator
.array()
.lengthGreaterThanOrEqual(0) .lengthGreaterThanOrEqual(0)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const optionsLengthValidator = s.number.int export const optionsLengthValidator = s
.number()
.int()
.greaterThanOrEqual(0) .greaterThanOrEqual(0)
.lessThanOrEqual(25) .lessThanOrEqual(25)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
@@ -61,16 +71,17 @@ export function validateRequiredSelectMenuParameters(options: StringSelectMenuOp
optionsValidator.parse(options); optionsValidator.parse(options);
} }
export const defaultValidator = s.boolean; export const defaultValidator = s.boolean();
export function validateRequiredSelectMenuOptionParameters(label?: string, value?: string) { export function validateRequiredSelectMenuOptionParameters(label?: string, value?: string) {
labelValueDescriptionValidator.parse(label); labelValueDescriptionValidator.parse(label);
labelValueDescriptionValidator.parse(value); labelValueDescriptionValidator.parse(value);
} }
export const channelTypesValidator = s.nativeEnum(ChannelType).array.setValidationEnabled(isValidationEnabled); export const channelTypesValidator = s.nativeEnum(ChannelType).array().setValidationEnabled(isValidationEnabled);
export const urlValidator = s.string export const urlValidator = s
.string()
.url({ .url({
allowedProtocols: ['http:', 'https:', 'discord:'], allowedProtocols: ['http:', 'https:', 'discord:'],
}) })

View File

@@ -4,18 +4,23 @@ import { isValidationEnabled } from '../../util/validation.js';
import { customIdValidator } from '../Assertions.js'; import { customIdValidator } from '../Assertions.js';
export const textInputStyleValidator = s.nativeEnum(TextInputStyle); export const textInputStyleValidator = s.nativeEnum(TextInputStyle);
export const minLengthValidator = s.number.int export const minLengthValidator = s
.number()
.int()
.greaterThanOrEqual(0) .greaterThanOrEqual(0)
.lessThanOrEqual(4_000) .lessThanOrEqual(4_000)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const maxLengthValidator = s.number.int export const maxLengthValidator = s
.number()
.int()
.greaterThanOrEqual(1) .greaterThanOrEqual(1)
.lessThanOrEqual(4_000) .lessThanOrEqual(4_000)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const requiredValidator = s.boolean; export const requiredValidator = s.boolean();
export const valueValidator = s.string.lengthLessThanOrEqual(4_000).setValidationEnabled(isValidationEnabled); export const valueValidator = s.string().lengthLessThanOrEqual(4_000).setValidationEnabled(isValidationEnabled);
export const placeholderValidator = s.string.lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); export const placeholderValidator = s.string().lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
export const labelValidator = s.string export const labelValidator = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(45) .lengthLessThanOrEqual(45)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);

View File

@@ -3,16 +3,17 @@ import { ApplicationCommandType, ApplicationIntegrationType, InteractionContextT
import { isValidationEnabled } from '../../util/validation.js'; import { isValidationEnabled } from '../../util/validation.js';
import type { ContextMenuCommandType } from './ContextMenuCommandBuilder.js'; import type { ContextMenuCommandType } from './ContextMenuCommandBuilder.js';
const namePredicate = s.string const namePredicate = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(32) .lengthLessThanOrEqual(32)
// eslint-disable-next-line prefer-named-capture-group // eslint-disable-next-line prefer-named-capture-group
.regex(/^( *[\p{P}\p{L}\p{N}\p{sc=Devanagari}\p{sc=Thai}]+ *)+$/u) .regex(/^( *[\p{P}\p{L}\p{N}\p{sc=Devanagari}\p{sc=Thai}]+ *)+$/u)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
const typePredicate = s const typePredicate = s
.union(s.literal(ApplicationCommandType.User), s.literal(ApplicationCommandType.Message)) .union([s.literal(ApplicationCommandType.User), s.literal(ApplicationCommandType.Message)])
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
const booleanPredicate = s.boolean; const booleanPredicate = s.boolean();
export function validateDefaultPermission(value: unknown): asserts value is boolean { export function validateDefaultPermission(value: unknown): asserts value is boolean {
booleanPredicate.parse(value); booleanPredicate.parse(value);
@@ -34,17 +35,22 @@ export function validateRequiredParameters(name: string, type: number) {
validateType(type); validateType(type);
} }
const dmPermissionPredicate = s.boolean.nullish; const dmPermissionPredicate = s.boolean().nullish();
export function validateDMPermission(value: unknown): asserts value is boolean | null | undefined { export function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {
dmPermissionPredicate.parse(value); dmPermissionPredicate.parse(value);
} }
const memberPermissionPredicate = s.union( const memberPermissionPredicate = s
s.bigint.transform((value) => value.toString()), .union([
s.number.safeInt.transform((value) => value.toString()), s.bigint().transform((value) => value.toString()),
s.string.regex(/^\d+$/), s
).nullish; .number()
.safeInt()
.transform((value) => value.toString()),
s.string().regex(/^\d+$/),
])
.nullish();
export function validateDefaultMemberPermissions(permissions: unknown) { export function validateDefaultMemberPermissions(permissions: unknown) {
return memberPermissionPredicate.parse(permissions); return memberPermissionPredicate.parse(permissions);

View File

@@ -3,13 +3,15 @@ import { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../com
import { customIdValidator } from '../../components/Assertions.js'; import { customIdValidator } from '../../components/Assertions.js';
import { isValidationEnabled } from '../../util/validation.js'; import { isValidationEnabled } from '../../util/validation.js';
export const titleValidator = s.string export const titleValidator = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(45) .lengthLessThanOrEqual(45)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const componentsValidator = s export const componentsValidator = s
.instance(ActionRowBuilder) .instance(ActionRowBuilder)
.array.lengthGreaterThanOrEqual(1) .array()
.lengthGreaterThanOrEqual(1)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export function validateRequiredParameters( export function validateRequiredParameters(

View File

@@ -11,7 +11,8 @@ import type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';
import type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js'; import type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js';
import type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js'; import type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';
const namePredicate = s.string const namePredicate = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(32) .lengthLessThanOrEqual(32)
.regex(/^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u) .regex(/^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u)
@@ -21,7 +22,8 @@ export function validateName(name: unknown): asserts name is string {
namePredicate.parse(name); namePredicate.parse(name);
} }
const descriptionPredicate = s.string const descriptionPredicate = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(100) .lengthLessThanOrEqual(100)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
@@ -31,7 +33,7 @@ export function validateDescription(description: unknown): asserts description i
descriptionPredicate.parse(description); descriptionPredicate.parse(description);
} }
const maxArrayLengthPredicate = s.unknown.array.lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled); const maxArrayLengthPredicate = s.unknown().array().lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
export function validateLocale(locale: unknown) { export function validateLocale(locale: unknown) {
return localePredicate.parse(locale); return localePredicate.parse(locale);
} }
@@ -55,7 +57,7 @@ export function validateRequiredParameters(
validateMaxOptionsLength(options); validateMaxOptionsLength(options);
} }
const booleanPredicate = s.boolean; const booleanPredicate = s.boolean();
export function validateDefaultPermission(value: unknown): asserts value is boolean { export function validateDefaultPermission(value: unknown): asserts value is boolean {
booleanPredicate.parse(value); booleanPredicate.parse(value);
@@ -65,7 +67,7 @@ export function validateRequired(required: unknown): asserts required is boolean
booleanPredicate.parse(required); booleanPredicate.parse(required);
} }
const choicesLengthPredicate = s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled); const choicesLengthPredicate = s.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
export function validateChoicesLength(amountAdding: number, choices?: APIApplicationCommandOptionChoice[]): void { export function validateChoicesLength(amountAdding: number, choices?: APIApplicationCommandOptionChoice[]): void {
choicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding); choicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);
@@ -78,24 +80,31 @@ export function assertReturnOfBuilder<
} }
export const localizationMapPredicate = s export const localizationMapPredicate = s
.object<LocalizationMap>(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s.string.nullish]))) .object<LocalizationMap>(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s.string().nullish()])))
.strict.nullish.setValidationEnabled(isValidationEnabled); .strict()
.nullish()
.setValidationEnabled(isValidationEnabled);
export function validateLocalizationMap(value: unknown): asserts value is LocalizationMap { export function validateLocalizationMap(value: unknown): asserts value is LocalizationMap {
localizationMapPredicate.parse(value); localizationMapPredicate.parse(value);
} }
const dmPermissionPredicate = s.boolean.nullish; const dmPermissionPredicate = s.boolean().nullish();
export function validateDMPermission(value: unknown): asserts value is boolean | null | undefined { export function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {
dmPermissionPredicate.parse(value); dmPermissionPredicate.parse(value);
} }
const memberPermissionPredicate = s.union( const memberPermissionPredicate = s
s.bigint.transform((value) => value.toString()), .union([
s.number.safeInt.transform((value) => value.toString()), s.bigint().transform((value) => value.toString()),
s.string.regex(/^\d+$/), s
).nullish; .number()
.safeInt()
.transform((value) => value.toString()),
s.string().regex(/^\d+$/),
])
.nullish();
export function validateDefaultMemberPermissions(permissions: unknown) { export function validateDefaultMemberPermissions(permissions: unknown) {
return memberPermissionPredicate.parse(permissions); return memberPermissionPredicate.parse(permissions);

View File

@@ -26,7 +26,7 @@ const allowedChannelTypes = [
*/ */
export type ApplicationCommandOptionAllowedChannelTypes = (typeof allowedChannelTypes)[number]; export type ApplicationCommandOptionAllowedChannelTypes = (typeof allowedChannelTypes)[number];
const channelTypesPredicate = s.array(s.union(...allowedChannelTypes.map((type) => s.literal(type)))); const channelTypesPredicate = s.array(s.union(allowedChannelTypes.map((type) => s.literal(type))));
/** /**
* This mixin holds channel type symbols used for options. * This mixin holds channel type symbols used for options.

View File

@@ -1,7 +1,7 @@
import { s } from '@sapphire/shapeshift'; import { s } from '@sapphire/shapeshift';
import type { ApplicationCommandOptionType } from 'discord-api-types/v10'; import type { ApplicationCommandOptionType } from 'discord-api-types/v10';
const booleanPredicate = s.boolean; const booleanPredicate = s.boolean();
/** /**
* This mixin holds choices and autocomplete symbols used for options. * This mixin holds choices and autocomplete symbols used for options.

View File

@@ -3,13 +3,15 @@ import { ApplicationCommandOptionType, type APIApplicationCommandOptionChoice }
import { normalizeArray, type RestOrArray } from '../../../util/normalizeArray.js'; import { normalizeArray, type RestOrArray } from '../../../util/normalizeArray.js';
import { localizationMapPredicate, validateChoicesLength } from '../Assertions.js'; import { localizationMapPredicate, validateChoicesLength } from '../Assertions.js';
const stringPredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100); const stringPredicate = s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);
const numberPredicate = s.number.greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY); const numberPredicate = s.number().greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);
const choicesPredicate = s.object({ const choicesPredicate = s
name: stringPredicate, .object({
name_localizations: localizationMapPredicate, name: stringPredicate,
value: s.union(stringPredicate, numberPredicate), name_localizations: localizationMapPredicate,
}).array; value: s.union([stringPredicate, numberPredicate]),
})
.array();
/** /**
* This mixin holds choices and autocomplete symbols used for options. * This mixin holds choices and autocomplete symbols used for options.

View File

@@ -6,7 +6,7 @@ import { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOption
import { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js'; import { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';
import { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js'; import { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';
const numberValidator = s.number.int; const numberValidator = s.number().int();
/** /**
* A slash command integer option. * A slash command integer option.

View File

@@ -6,7 +6,7 @@ import { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOption
import { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js'; import { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';
import { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js'; import { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';
const numberValidator = s.number; const numberValidator = s.number();
/** /**
* A slash command number option. * A slash command number option.

View File

@@ -5,8 +5,8 @@ import { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOption
import { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js'; import { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';
import { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js'; import { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';
const minLengthValidator = s.number.greaterThanOrEqual(0).lessThanOrEqual(6_000); const minLengthValidator = s.number().greaterThanOrEqual(0).lessThanOrEqual(6_000);
const maxLengthValidator = s.number.greaterThanOrEqual(1).lessThanOrEqual(6_000); const maxLengthValidator = s.number().greaterThanOrEqual(1).lessThanOrEqual(6_000);
/** /**
* A slash command string option. * A slash command string option.

View File

@@ -2,17 +2,19 @@ import { s } from '@sapphire/shapeshift';
import type { APIEmbedField } from 'discord-api-types/v10'; import type { APIEmbedField } from 'discord-api-types/v10';
import { isValidationEnabled } from '../../util/validation.js'; import { isValidationEnabled } from '../../util/validation.js';
export const fieldNamePredicate = s.string export const fieldNamePredicate = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(256) .lengthLessThanOrEqual(256)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const fieldValuePredicate = s.string export const fieldValuePredicate = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(1_024) .lengthLessThanOrEqual(1_024)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const fieldInlinePredicate = s.boolean.optional; export const fieldInlinePredicate = s.boolean().optional();
export const embedFieldPredicate = s export const embedFieldPredicate = s
.object({ .object({
@@ -22,27 +24,31 @@ export const embedFieldPredicate = s
}) })
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const embedFieldsArrayPredicate = embedFieldPredicate.array.setValidationEnabled(isValidationEnabled); export const embedFieldsArrayPredicate = embedFieldPredicate.array().setValidationEnabled(isValidationEnabled);
export const fieldLengthPredicate = s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled); export const fieldLengthPredicate = s.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
export function validateFieldLength(amountAdding: number, fields?: APIEmbedField[]): void { export function validateFieldLength(amountAdding: number, fields?: APIEmbedField[]): void {
fieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding); fieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding);
} }
export const authorNamePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled); export const authorNamePredicate = fieldNamePredicate.nullable().setValidationEnabled(isValidationEnabled);
export const imageURLPredicate = s.string export const imageURLPredicate = s
.string()
.url({ .url({
allowedProtocols: ['http:', 'https:', 'attachment:'], allowedProtocols: ['http:', 'https:', 'attachment:'],
}) })
.nullish.setValidationEnabled(isValidationEnabled); .nullish()
.setValidationEnabled(isValidationEnabled);
export const urlPredicate = s.string export const urlPredicate = s
.string()
.url({ .url({
allowedProtocols: ['http:', 'https:'], allowedProtocols: ['http:', 'https:'],
}) })
.nullish.setValidationEnabled(isValidationEnabled); .nullish()
.setValidationEnabled(isValidationEnabled);
export const embedAuthorPredicate = s export const embedAuthorPredicate = s
.object({ .object({
@@ -52,25 +58,34 @@ export const embedAuthorPredicate = s
}) })
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const RGBPredicate = s.number.int export const RGBPredicate = s
.number()
.int()
.greaterThanOrEqual(0) .greaterThanOrEqual(0)
.lessThanOrEqual(255) .lessThanOrEqual(255)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const colorPredicate = s.number.int export const colorPredicate = s
.number()
.int()
.greaterThanOrEqual(0) .greaterThanOrEqual(0)
.lessThanOrEqual(0xffffff) .lessThanOrEqual(0xffffff)
.or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate])) .or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate]))
.nullable.setValidationEnabled(isValidationEnabled); .nullable()
.setValidationEnabled(isValidationEnabled);
export const descriptionPredicate = s.string export const descriptionPredicate = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(4_096) .lengthLessThanOrEqual(4_096)
.nullable.setValidationEnabled(isValidationEnabled); .nullable()
.setValidationEnabled(isValidationEnabled);
export const footerTextPredicate = s.string export const footerTextPredicate = s
.string()
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(2_048) .lengthLessThanOrEqual(2_048)
.nullable.setValidationEnabled(isValidationEnabled); .nullable()
.setValidationEnabled(isValidationEnabled);
export const embedFooterPredicate = s export const embedFooterPredicate = s
.object({ .object({
@@ -79,6 +94,6 @@ export const embedFooterPredicate = s
}) })
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const timestampPredicate = s.union(s.number, s.date).nullable.setValidationEnabled(isValidationEnabled); export const timestampPredicate = s.union([s.number(), s.date()]).nullable().setValidationEnabled(isValidationEnabled);
export const titlePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled); export const titlePredicate = fieldNamePredicate.nullable().setValidationEnabled(isValidationEnabled);

10
pnpm-lock.yaml generated
View File

@@ -677,8 +677,8 @@ importers:
specifier: workspace:^ specifier: workspace:^
version: link:../util version: link:../util
'@sapphire/shapeshift': '@sapphire/shapeshift':
specifier: ^3.9.7 specifier: ^4.0.0
version: 3.9.7 version: 4.0.0
discord-api-types: discord-api-types:
specifier: 0.37.94 specifier: 0.37.94
version: 0.37.94 version: 0.37.94
@@ -5112,8 +5112,8 @@ packages:
resolution: {integrity: sha512-QCjj7X/QlY0QUCeAaZQmnrsMH/b2BMQYee3F1Y5iF17JagUQqO3KZlG7vfXWQU3SRAJX5OgZZynBjixUH+nNGg==} resolution: {integrity: sha512-QCjj7X/QlY0QUCeAaZQmnrsMH/b2BMQYee3F1Y5iF17JagUQqO3KZlG7vfXWQU3SRAJX5OgZZynBjixUH+nNGg==}
engines: {node: '>=v14.0.0', npm: '>=7.0.0'} engines: {node: '>=v14.0.0', npm: '>=7.0.0'}
'@sapphire/shapeshift@3.9.7': '@sapphire/shapeshift@4.0.0':
resolution: {integrity: sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==} resolution: {integrity: sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==}
engines: {node: '>=v16'} engines: {node: '>=v16'}
'@sapphire/snowflake@3.5.3': '@sapphire/snowflake@3.5.3':
@@ -18335,7 +18335,7 @@ snapshots:
'@sapphire/result@2.6.6': {} '@sapphire/result@2.6.6': {}
'@sapphire/shapeshift@3.9.7': '@sapphire/shapeshift@4.0.0':
dependencies: dependencies:
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
lodash: 4.17.21 lodash: 4.17.21