mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-09 16:13:31 +01:00
feat(builders): update to @sapphire/shapeshift v4 (#10291)
feat: update to @sapphire/shapeshift v4
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
@@ -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:'],
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
10
pnpm-lock.yaml
generated
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user