diff --git a/packages/builders/package.json b/packages/builders/package.json index 369bc24660b7..4f1023aeebea 100644 --- a/packages/builders/package.json +++ b/packages/builders/package.json @@ -67,7 +67,7 @@ "dependencies": { "@discordjs/formatters": "workspace:^", "@discordjs/util": "workspace:^", - "@sapphire/shapeshift": "^3.9.7", + "@sapphire/shapeshift": "^4.0.0", "discord-api-types": "0.37.94", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.4", diff --git a/packages/builders/src/components/Assertions.ts b/packages/builders/src/components/Assertions.ts index 793e6b5bca44..926159eedc08 100644 --- a/packages/builders/src/components/Assertions.ts +++ b/packages/builders/src/components/Assertions.ts @@ -3,35 +3,42 @@ import { ButtonStyle, ChannelType, type APIMessageComponentEmoji } from 'discord import { isValidationEnabled } from '../util/validation.js'; import { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js'; -export const customIdValidator = s.string +export const customIdValidator = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(100) .setValidationEnabled(isValidationEnabled); export const emojiValidator = s .object({ - id: s.string, - name: s.string, - animated: s.boolean, + id: s.string(), + name: s.string(), + 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) .lengthLessThanOrEqual(80) .setValidationEnabled(isValidationEnabled); export const buttonStyleValidator = s.nativeEnum(ButtonStyle); -export const placeholderValidator = s.string.lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled); -export const minMaxValidator = s.number.int +export const placeholderValidator = s.string().lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled); +export const minMaxValidator = s + .number() + .int() .greaterThanOrEqual(0) .lessThanOrEqual(25) .setValidationEnabled(isValidationEnabled); -export const labelValueDescriptionValidator = s.string +export const labelValueDescriptionValidator = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(100) .setValidationEnabled(isValidationEnabled); @@ -40,18 +47,21 @@ export const jsonOptionValidator = s .object({ label: labelValueDescriptionValidator, value: labelValueDescriptionValidator, - description: labelValueDescriptionValidator.optional, - emoji: emojiValidator.optional, - default: s.boolean.optional, + description: labelValueDescriptionValidator.optional(), + emoji: emojiValidator.optional(), + default: s.boolean().optional(), }) .setValidationEnabled(isValidationEnabled); export const optionValidator = s.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled); -export const optionsValidator = optionValidator.array +export const optionsValidator = optionValidator + .array() .lengthGreaterThanOrEqual(0) .setValidationEnabled(isValidationEnabled); -export const optionsLengthValidator = s.number.int +export const optionsLengthValidator = s + .number() + .int() .greaterThanOrEqual(0) .lessThanOrEqual(25) .setValidationEnabled(isValidationEnabled); @@ -61,16 +71,17 @@ export function validateRequiredSelectMenuParameters(options: StringSelectMenuOp optionsValidator.parse(options); } -export const defaultValidator = s.boolean; +export const defaultValidator = s.boolean(); export function validateRequiredSelectMenuOptionParameters(label?: string, value?: string) { labelValueDescriptionValidator.parse(label); 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({ allowedProtocols: ['http:', 'https:', 'discord:'], }) diff --git a/packages/builders/src/components/textInput/Assertions.ts b/packages/builders/src/components/textInput/Assertions.ts index f0cfc4a3f802..084a01c6aa8e 100644 --- a/packages/builders/src/components/textInput/Assertions.ts +++ b/packages/builders/src/components/textInput/Assertions.ts @@ -4,18 +4,23 @@ import { isValidationEnabled } from '../../util/validation.js'; import { customIdValidator } from '../Assertions.js'; export const textInputStyleValidator = s.nativeEnum(TextInputStyle); -export const minLengthValidator = s.number.int +export const minLengthValidator = s + .number() + .int() .greaterThanOrEqual(0) .lessThanOrEqual(4_000) .setValidationEnabled(isValidationEnabled); -export const maxLengthValidator = s.number.int +export const maxLengthValidator = s + .number() + .int() .greaterThanOrEqual(1) .lessThanOrEqual(4_000) .setValidationEnabled(isValidationEnabled); -export const requiredValidator = s.boolean; -export const valueValidator = s.string.lengthLessThanOrEqual(4_000).setValidationEnabled(isValidationEnabled); -export const placeholderValidator = s.string.lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); -export const labelValidator = s.string +export const requiredValidator = s.boolean(); +export const valueValidator = s.string().lengthLessThanOrEqual(4_000).setValidationEnabled(isValidationEnabled); +export const placeholderValidator = s.string().lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); +export const labelValidator = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(45) .setValidationEnabled(isValidationEnabled); diff --git a/packages/builders/src/interactions/contextMenuCommands/Assertions.ts b/packages/builders/src/interactions/contextMenuCommands/Assertions.ts index ac76a25d7c8f..72d6c50f05cf 100644 --- a/packages/builders/src/interactions/contextMenuCommands/Assertions.ts +++ b/packages/builders/src/interactions/contextMenuCommands/Assertions.ts @@ -3,16 +3,17 @@ import { ApplicationCommandType, ApplicationIntegrationType, InteractionContextT import { isValidationEnabled } from '../../util/validation.js'; import type { ContextMenuCommandType } from './ContextMenuCommandBuilder.js'; -const namePredicate = s.string +const namePredicate = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(32) // eslint-disable-next-line prefer-named-capture-group .regex(/^( *[\p{P}\p{L}\p{N}\p{sc=Devanagari}\p{sc=Thai}]+ *)+$/u) .setValidationEnabled(isValidationEnabled); const typePredicate = s - .union(s.literal(ApplicationCommandType.User), s.literal(ApplicationCommandType.Message)) + .union([s.literal(ApplicationCommandType.User), s.literal(ApplicationCommandType.Message)]) .setValidationEnabled(isValidationEnabled); -const booleanPredicate = s.boolean; +const booleanPredicate = s.boolean(); export function validateDefaultPermission(value: unknown): asserts value is boolean { booleanPredicate.parse(value); @@ -34,17 +35,22 @@ export function validateRequiredParameters(name: string, type: number) { validateType(type); } -const dmPermissionPredicate = s.boolean.nullish; +const dmPermissionPredicate = s.boolean().nullish(); export function validateDMPermission(value: unknown): asserts value is boolean | null | undefined { dmPermissionPredicate.parse(value); } -const memberPermissionPredicate = s.union( - s.bigint.transform((value) => value.toString()), - s.number.safeInt.transform((value) => value.toString()), - s.string.regex(/^\d+$/), -).nullish; +const memberPermissionPredicate = s + .union([ + s.bigint().transform((value) => value.toString()), + s + .number() + .safeInt() + .transform((value) => value.toString()), + s.string().regex(/^\d+$/), + ]) + .nullish(); export function validateDefaultMemberPermissions(permissions: unknown) { return memberPermissionPredicate.parse(permissions); diff --git a/packages/builders/src/interactions/modals/Assertions.ts b/packages/builders/src/interactions/modals/Assertions.ts index a59bb24cfe62..79597ff47076 100644 --- a/packages/builders/src/interactions/modals/Assertions.ts +++ b/packages/builders/src/interactions/modals/Assertions.ts @@ -3,13 +3,15 @@ import { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../com import { customIdValidator } from '../../components/Assertions.js'; import { isValidationEnabled } from '../../util/validation.js'; -export const titleValidator = s.string +export const titleValidator = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(45) .setValidationEnabled(isValidationEnabled); export const componentsValidator = s .instance(ActionRowBuilder) - .array.lengthGreaterThanOrEqual(1) + .array() + .lengthGreaterThanOrEqual(1) .setValidationEnabled(isValidationEnabled); export function validateRequiredParameters( diff --git a/packages/builders/src/interactions/slashCommands/Assertions.ts b/packages/builders/src/interactions/slashCommands/Assertions.ts index 1d9868e5bc52..cc12e4dfef9a 100644 --- a/packages/builders/src/interactions/slashCommands/Assertions.ts +++ b/packages/builders/src/interactions/slashCommands/Assertions.ts @@ -11,7 +11,8 @@ import type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js'; import type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js'; import type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js'; -const namePredicate = s.string +const namePredicate = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(32) .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); } -const descriptionPredicate = s.string +const descriptionPredicate = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(100) .setValidationEnabled(isValidationEnabled); @@ -31,7 +33,7 @@ export function validateDescription(description: unknown): asserts description i 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) { return localePredicate.parse(locale); } @@ -55,7 +57,7 @@ export function validateRequiredParameters( validateMaxOptionsLength(options); } -const booleanPredicate = s.boolean; +const booleanPredicate = s.boolean(); export function validateDefaultPermission(value: unknown): asserts value is boolean { booleanPredicate.parse(value); @@ -65,7 +67,7 @@ export function validateRequired(required: unknown): asserts required is boolean 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 { choicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding); @@ -78,24 +80,31 @@ export function assertReturnOfBuilder< } export const localizationMapPredicate = s - .object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s.string.nullish]))) - .strict.nullish.setValidationEnabled(isValidationEnabled); + .object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s.string().nullish()]))) + .strict() + .nullish() + .setValidationEnabled(isValidationEnabled); export function validateLocalizationMap(value: unknown): asserts value is LocalizationMap { localizationMapPredicate.parse(value); } -const dmPermissionPredicate = s.boolean.nullish; +const dmPermissionPredicate = s.boolean().nullish(); export function validateDMPermission(value: unknown): asserts value is boolean | null | undefined { dmPermissionPredicate.parse(value); } -const memberPermissionPredicate = s.union( - s.bigint.transform((value) => value.toString()), - s.number.safeInt.transform((value) => value.toString()), - s.string.regex(/^\d+$/), -).nullish; +const memberPermissionPredicate = s + .union([ + s.bigint().transform((value) => value.toString()), + s + .number() + .safeInt() + .transform((value) => value.toString()), + s.string().regex(/^\d+$/), + ]) + .nullish(); export function validateDefaultMemberPermissions(permissions: unknown) { return memberPermissionPredicate.parse(permissions); diff --git a/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts b/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts index 83cb16b2b12c..98f3242bcd49 100644 --- a/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts +++ b/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts @@ -26,7 +26,7 @@ const allowedChannelTypes = [ */ 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. diff --git a/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionWithAutocompleteMixin.ts b/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionWithAutocompleteMixin.ts index 550768f3b8d7..6f2ceee10966 100644 --- a/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionWithAutocompleteMixin.ts +++ b/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionWithAutocompleteMixin.ts @@ -1,7 +1,7 @@ import { s } from '@sapphire/shapeshift'; 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. diff --git a/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.ts b/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.ts index 6bc75d24a44e..68359b4b2130 100644 --- a/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.ts +++ b/packages/builders/src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.ts @@ -3,13 +3,15 @@ import { ApplicationCommandOptionType, type APIApplicationCommandOptionChoice } import { normalizeArray, type RestOrArray } from '../../../util/normalizeArray.js'; import { localizationMapPredicate, validateChoicesLength } from '../Assertions.js'; -const stringPredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100); -const numberPredicate = s.number.greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY); -const choicesPredicate = s.object({ - name: stringPredicate, - name_localizations: localizationMapPredicate, - value: s.union(stringPredicate, numberPredicate), -}).array; +const stringPredicate = s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100); +const numberPredicate = s.number().greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY); +const choicesPredicate = s + .object({ + name: stringPredicate, + name_localizations: localizationMapPredicate, + value: s.union([stringPredicate, numberPredicate]), + }) + .array(); /** * This mixin holds choices and autocomplete symbols used for options. diff --git a/packages/builders/src/interactions/slashCommands/options/integer.ts b/packages/builders/src/interactions/slashCommands/options/integer.ts index ed2c0291da52..4346595878a9 100644 --- a/packages/builders/src/interactions/slashCommands/options/integer.ts +++ b/packages/builders/src/interactions/slashCommands/options/integer.ts @@ -6,7 +6,7 @@ import { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOption import { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js'; import { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js'; -const numberValidator = s.number.int; +const numberValidator = s.number().int(); /** * A slash command integer option. diff --git a/packages/builders/src/interactions/slashCommands/options/number.ts b/packages/builders/src/interactions/slashCommands/options/number.ts index 59e1505d1029..b53bb21b5973 100644 --- a/packages/builders/src/interactions/slashCommands/options/number.ts +++ b/packages/builders/src/interactions/slashCommands/options/number.ts @@ -6,7 +6,7 @@ import { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOption import { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js'; import { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js'; -const numberValidator = s.number; +const numberValidator = s.number(); /** * A slash command number option. diff --git a/packages/builders/src/interactions/slashCommands/options/string.ts b/packages/builders/src/interactions/slashCommands/options/string.ts index 71c3c682fd9a..ebe2bd8e2c2c 100644 --- a/packages/builders/src/interactions/slashCommands/options/string.ts +++ b/packages/builders/src/interactions/slashCommands/options/string.ts @@ -5,8 +5,8 @@ import { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOption import { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js'; import { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js'; -const minLengthValidator = s.number.greaterThanOrEqual(0).lessThanOrEqual(6_000); -const maxLengthValidator = s.number.greaterThanOrEqual(1).lessThanOrEqual(6_000); +const minLengthValidator = s.number().greaterThanOrEqual(0).lessThanOrEqual(6_000); +const maxLengthValidator = s.number().greaterThanOrEqual(1).lessThanOrEqual(6_000); /** * A slash command string option. diff --git a/packages/builders/src/messages/embed/Assertions.ts b/packages/builders/src/messages/embed/Assertions.ts index fe2bcb308274..8bf9b3eeff09 100644 --- a/packages/builders/src/messages/embed/Assertions.ts +++ b/packages/builders/src/messages/embed/Assertions.ts @@ -2,17 +2,19 @@ import { s } from '@sapphire/shapeshift'; import type { APIEmbedField } from 'discord-api-types/v10'; import { isValidationEnabled } from '../../util/validation.js'; -export const fieldNamePredicate = s.string +export const fieldNamePredicate = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(256) .setValidationEnabled(isValidationEnabled); -export const fieldValuePredicate = s.string +export const fieldValuePredicate = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(1_024) .setValidationEnabled(isValidationEnabled); -export const fieldInlinePredicate = s.boolean.optional; +export const fieldInlinePredicate = s.boolean().optional(); export const embedFieldPredicate = s .object({ @@ -22,27 +24,31 @@ export const embedFieldPredicate = s }) .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 { 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({ allowedProtocols: ['http:', 'https:', 'attachment:'], }) - .nullish.setValidationEnabled(isValidationEnabled); + .nullish() + .setValidationEnabled(isValidationEnabled); -export const urlPredicate = s.string +export const urlPredicate = s + .string() .url({ allowedProtocols: ['http:', 'https:'], }) - .nullish.setValidationEnabled(isValidationEnabled); + .nullish() + .setValidationEnabled(isValidationEnabled); export const embedAuthorPredicate = s .object({ @@ -52,25 +58,34 @@ export const embedAuthorPredicate = s }) .setValidationEnabled(isValidationEnabled); -export const RGBPredicate = s.number.int +export const RGBPredicate = s + .number() + .int() .greaterThanOrEqual(0) .lessThanOrEqual(255) .setValidationEnabled(isValidationEnabled); -export const colorPredicate = s.number.int +export const colorPredicate = s + .number() + .int() .greaterThanOrEqual(0) .lessThanOrEqual(0xffffff) .or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate])) - .nullable.setValidationEnabled(isValidationEnabled); + .nullable() + .setValidationEnabled(isValidationEnabled); -export const descriptionPredicate = s.string +export const descriptionPredicate = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(4_096) - .nullable.setValidationEnabled(isValidationEnabled); + .nullable() + .setValidationEnabled(isValidationEnabled); -export const footerTextPredicate = s.string +export const footerTextPredicate = s + .string() .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(2_048) - .nullable.setValidationEnabled(isValidationEnabled); + .nullable() + .setValidationEnabled(isValidationEnabled); export const embedFooterPredicate = s .object({ @@ -79,6 +94,6 @@ export const embedFooterPredicate = s }) .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); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67dc7282b36b..13c0440d52f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -677,8 +677,8 @@ importers: specifier: workspace:^ version: link:../util '@sapphire/shapeshift': - specifier: ^3.9.7 - version: 3.9.7 + specifier: ^4.0.0 + version: 4.0.0 discord-api-types: specifier: 0.37.94 version: 0.37.94 @@ -5112,8 +5112,8 @@ packages: resolution: {integrity: sha512-QCjj7X/QlY0QUCeAaZQmnrsMH/b2BMQYee3F1Y5iF17JagUQqO3KZlG7vfXWQU3SRAJX5OgZZynBjixUH+nNGg==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@sapphire/shapeshift@3.9.7': - resolution: {integrity: sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==} + '@sapphire/shapeshift@4.0.0': + resolution: {integrity: sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==} engines: {node: '>=v16'} '@sapphire/snowflake@3.5.3': @@ -18335,7 +18335,7 @@ snapshots: '@sapphire/result@2.6.6': {} - '@sapphire/shapeshift@3.9.7': + '@sapphire/shapeshift@4.0.0': dependencies: fast-deep-equal: 3.1.3 lodash: 4.17.21