UNPKG

@metamask/snaps-sdk

Version:

A library containing the core functionality for building MetaMask Snaps

860 lines 34.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TooltipStruct = exports.TooltipContentStruct = exports.TooltipChildStruct = exports.ValueStruct = exports.TextStruct = exports.SkeletonStruct = exports.LinkStruct = exports.HeadingStruct = exports.DividerStruct = exports.CopyableStruct = exports.FooterStruct = exports.FooterChildStruct = exports.CollapsibleSectionStruct = exports.SectionStruct = exports.FormStruct = exports.FormChildStruct = exports.BoxStruct = exports.BoxChildrenStruct = exports.AvatarStruct = exports.FormattingStruct = exports.ItalicStruct = exports.BoldStruct = exports.FieldStruct = exports.FieldChildUnionStruct = exports.FileInputStruct = exports.RadioGroupStruct = exports.RadioStruct = exports.AssetSelectorStruct = exports.SelectorStruct = exports.SelectorOptionStruct = exports.CardStruct = exports.AccountSelectorStruct = exports.AddressStruct = exports.DateTimePickerStruct = exports.DropdownStruct = exports.OptionStruct = exports.AddressInputStruct = exports.InputStruct = exports.NumberInputPropsStruct = exports.PasswordInputPropsStruct = exports.TextInputPropsStruct = exports.GenericInputPropsStruct = exports.CheckboxStruct = exports.ButtonStruct = exports.IconStruct = exports.ImageStruct = exports.BorderRadiusStruct = exports.ElementStruct = exports.StringElementStruct = exports.KeyStruct = void 0; exports.assertJSXElement = exports.isJSXElementUnsafe = exports.isJSXElement = exports.JSXElementStruct = exports.RootJSXElementStruct = exports.ContainerStruct = exports.BoxChildStruct = exports.SpinnerStruct = exports.RowStruct = exports.BannerStruct = void 0; const superstruct_1 = require("@metamask/superstruct"); const utils_1 = require("@metamask/utils"); const components_1 = require("./components/index.cjs"); const internals_1 = require("../internals/index.cjs"); const types_1 = require("../types/index.cjs"); /** * A struct for the {@link Key} type. */ exports.KeyStruct = (0, internals_1.nullUnion)([(0, superstruct_1.string)(), (0, superstruct_1.number)()]); /** * A struct for the {@link StringElement} type. */ exports.StringElementStruct = children([ (0, superstruct_1.string)(), ]); /** * A struct for the {@link GenericSnapElement} type. */ exports.ElementStruct = (0, superstruct_1.object)({ type: (0, superstruct_1.string)(), props: (0, superstruct_1.record)((0, superstruct_1.string)(), utils_1.JsonStruct), key: (0, superstruct_1.nullable)(exports.KeyStruct), }); /** * A helper function for creating a struct for a {@link Nestable} type. * * @param struct - The struct for the type to test. * @returns The struct for the nestable type. */ function nestable(struct) { const nestableStruct = (0, internals_1.selectiveUnion)((value) => { if (Array.isArray(value)) { return (0, superstruct_1.array)((0, superstruct_1.lazy)(() => nestableStruct)); } return struct; }); return nestableStruct; } /** * A helper function for creating a struct which allows children of a specific * type, as well as `null` and `boolean`. * * @param structs - The structs to allow as children. * @returns The struct for the children. */ function children(structs) { const potentialUnion = structs.length === 1 ? structs[0] : (0, internals_1.nullUnion)(structs); return nestable((0, superstruct_1.nullable)((0, internals_1.selectiveUnion)((value) => { if (typeof value === 'boolean') { return (0, superstruct_1.boolean)(); } return potentialUnion; }))); } /** * A helper function for creating a struct which allows a single child of a specific * type, as well as `null` and `boolean`. * * @param struct - The struct to allow as a single child. * @returns The struct for the children. */ function singleChild(struct) { return (0, superstruct_1.nullable)((0, internals_1.selectiveUnion)((value) => { if (typeof value === 'boolean') { return (0, superstruct_1.boolean)(); } return struct; })); } /** * A helper function for creating a struct for a JSX element. * * @param name - The name of the element. * @param props - The props of the element. * @returns The struct for the element. */ function element(name, props = {}) { return (0, superstruct_1.object)({ type: (0, internals_1.literal)(name), props: (0, superstruct_1.object)(props), key: (0, superstruct_1.nullable)(exports.KeyStruct), }); } /** * A helper function for creating a struct for a JSX element with selective props. * * @param name - The name of the element. * @param selector - The selector function choosing the struct to validate with. * @returns The struct for the element. */ function elementWithSelectiveProps(name, selector) { return (0, superstruct_1.object)({ type: (0, internals_1.literal)(name), props: (0, internals_1.selectiveUnion)(selector), key: (0, superstruct_1.nullable)(exports.KeyStruct), }); } /** * Shared struct used to validate border radius values used by various Snaps components. */ exports.BorderRadiusStruct = (0, internals_1.nullUnion)([ (0, internals_1.literal)('none'), (0, internals_1.literal)('medium'), (0, internals_1.literal)('full'), ]); /** * A struct for the {@link ImageElement} type. */ exports.ImageStruct = element('Image', { src: (0, internals_1.nullUnion)([(0, internals_1.svg)(), (0, internals_1.uri)({ protocol: (0, internals_1.literal)('https:') })]), alt: (0, superstruct_1.optional)((0, superstruct_1.string)()), borderRadius: (0, superstruct_1.optional)(exports.BorderRadiusStruct), width: (0, superstruct_1.optional)((0, superstruct_1.number)()), height: (0, superstruct_1.optional)((0, superstruct_1.number)()), }); const IconNameStruct = (0, internals_1.nullUnion)(Object.values(components_1.IconName).map((name) => (0, internals_1.literal)(name))); /** * A struct for the {@link IconElement} type. */ exports.IconStruct = element('Icon', { name: IconNameStruct, color: (0, superstruct_1.optional)((0, internals_1.nullUnion)([ (0, internals_1.literal)('default'), (0, internals_1.literal)('primary'), (0, internals_1.literal)('muted'), (0, internals_1.literal)('error'), (0, internals_1.literal)('success'), (0, internals_1.literal)('warning'), ])), size: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('md'), (0, internals_1.literal)('inherit')])), }); /** * A struct for the {@link ButtonElement} type. */ exports.ButtonStruct = element('Button', { children: children([exports.StringElementStruct, exports.ImageStruct, exports.IconStruct]), name: (0, superstruct_1.optional)((0, superstruct_1.string)()), type: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('button'), (0, internals_1.literal)('submit')])), variant: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('primary'), (0, internals_1.literal)('destructive')])), size: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('sm'), (0, internals_1.literal)('md')])), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), loading: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), form: (0, superstruct_1.optional)((0, superstruct_1.string)()), }); /** * A struct for the {@link CheckboxElement} type. */ exports.CheckboxStruct = element('Checkbox', { name: (0, superstruct_1.string)(), checked: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), label: (0, superstruct_1.optional)((0, superstruct_1.string)()), variant: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('default'), (0, internals_1.literal)('toggle')])), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the generic input element props. */ exports.GenericInputPropsStruct = (0, superstruct_1.object)({ name: (0, superstruct_1.string)(), value: (0, superstruct_1.optional)((0, superstruct_1.string)()), placeholder: (0, superstruct_1.optional)((0, superstruct_1.string)()), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the text type input props. */ exports.TextInputPropsStruct = (0, superstruct_1.assign)(exports.GenericInputPropsStruct, (0, superstruct_1.object)({ type: (0, internals_1.literal)('text'), })); /** * A struct for the password type input props. */ exports.PasswordInputPropsStruct = (0, superstruct_1.assign)(exports.GenericInputPropsStruct, (0, superstruct_1.object)({ type: (0, internals_1.literal)('password'), })); /** * A struct for the number type input props. */ exports.NumberInputPropsStruct = (0, superstruct_1.assign)(exports.GenericInputPropsStruct, (0, superstruct_1.object)({ type: (0, internals_1.literal)('number'), min: (0, superstruct_1.optional)((0, superstruct_1.number)()), max: (0, superstruct_1.optional)((0, superstruct_1.number)()), step: (0, superstruct_1.optional)((0, superstruct_1.number)()), })); /** * A struct for the {@link InputElement} type. */ exports.InputStruct = elementWithSelectiveProps('Input', (value) => { if ((0, utils_1.isPlainObject)(value) && (0, utils_1.hasProperty)(value, 'type')) { switch (value.type) { case 'text': return exports.TextInputPropsStruct; case 'password': return exports.PasswordInputPropsStruct; case 'number': return exports.NumberInputPropsStruct; default: return exports.GenericInputPropsStruct; } } return exports.GenericInputPropsStruct; }); /** * A struct for the {@link AddressInputElement} type. */ exports.AddressInputStruct = element('AddressInput', { name: (0, superstruct_1.string)(), chainId: utils_1.CaipChainIdStruct, value: (0, superstruct_1.optional)((0, superstruct_1.string)()), placeholder: (0, superstruct_1.optional)((0, superstruct_1.string)()), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), displayAvatar: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link OptionElement} type. */ exports.OptionStruct = element('Option', { value: (0, superstruct_1.string)(), children: (0, superstruct_1.string)(), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link DropdownElement} type. */ exports.DropdownStruct = element('Dropdown', { name: (0, superstruct_1.string)(), value: (0, superstruct_1.optional)((0, superstruct_1.string)()), children: children([exports.OptionStruct]), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link DateTimePickerElement} type. */ exports.DateTimePickerStruct = element('DateTimePicker', { name: (0, superstruct_1.string)(), type: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('date'), (0, internals_1.literal)('time'), (0, internals_1.literal)('datetime')])), placeholder: (0, superstruct_1.optional)((0, superstruct_1.string)()), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), disablePast: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), disableFuture: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), value: (0, superstruct_1.optional)(internals_1.ISO8601DateStruct), }); /** * A struct for the {@link AddressElement} type. */ exports.AddressStruct = element('Address', { address: (0, internals_1.selectiveUnion)((value) => { if (typeof value === 'string' && value.startsWith('0x')) { return utils_1.HexChecksumAddressStruct; } return utils_1.CaipAccountIdStruct; }), truncate: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), displayName: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), avatar: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link AccountSelectorElement} type. */ exports.AccountSelectorStruct = element('AccountSelector', { name: (0, superstruct_1.string)(), hideExternalAccounts: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), chainIds: (0, superstruct_1.optional)((0, superstruct_1.array)(utils_1.CaipChainIdStruct)), switchGlobalAccount: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), value: (0, superstruct_1.optional)(utils_1.CaipAccountIdStruct), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link CardElement} type. */ exports.CardStruct = element('Card', { image: (0, superstruct_1.optional)((0, superstruct_1.string)()), title: (0, internals_1.selectiveUnion)((value) => { if (typeof value === 'object') { return exports.AddressStruct; } return (0, superstruct_1.string)(); }), description: (0, superstruct_1.optional)((0, superstruct_1.string)()), value: (0, superstruct_1.string)(), extra: (0, superstruct_1.optional)((0, superstruct_1.string)()), }); /** * A struct for the {@link SelectorOptionElement} type. */ exports.SelectorOptionStruct = element('SelectorOption', { value: (0, superstruct_1.string)(), children: exports.CardStruct, disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link SelectorElement} type. */ exports.SelectorStruct = element('Selector', { name: (0, superstruct_1.string)(), title: (0, superstruct_1.string)(), value: (0, superstruct_1.optional)((0, superstruct_1.string)()), children: children([exports.SelectorOptionStruct]), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link AssetSelectorElement} type. */ exports.AssetSelectorStruct = element('AssetSelector', { name: (0, superstruct_1.string)(), addresses: types_1.NonEip155CaipAccountIdsMatchedByAddressAndNamespaceStruct, chainIds: (0, superstruct_1.optional)((0, superstruct_1.array)(types_1.NonEip155ChainIdStruct)), value: (0, superstruct_1.optional)(types_1.NonEip155AssetTypeStruct), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link RadioElement} type. */ exports.RadioStruct = element('Radio', { value: (0, superstruct_1.string)(), children: (0, superstruct_1.string)(), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link RadioGroupElement} type. */ exports.RadioGroupStruct = element('RadioGroup', { name: (0, superstruct_1.string)(), value: (0, superstruct_1.optional)((0, superstruct_1.string)()), children: children([exports.RadioStruct]), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link FileInputElement} type. */ exports.FileInputStruct = element('FileInput', { name: (0, superstruct_1.string)(), accept: (0, internals_1.nullUnion)([(0, superstruct_1.optional)((0, superstruct_1.array)((0, superstruct_1.string)()))]), compact: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), disabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A subset of JSX elements that represent the tuple Box + Input of the Field children. */ const BOX_INPUT_LEFT = [ // eslint-disable-next-line @typescript-eslint/no-use-before-define singleChild((0, superstruct_1.lazy)(() => exports.BoxChildStruct)), exports.InputStruct, ]; /** * A subset of JSX elements that represent the tuple Input + Box of the Field children. */ const BOX_INPUT_RIGHT = [ exports.InputStruct, // eslint-disable-next-line @typescript-eslint/no-use-before-define singleChild((0, superstruct_1.lazy)(() => exports.BoxChildStruct)), ]; /** * A subset of JSX elements that represent the tuple Box + Input + Box of the Field children. */ const BOX_INPUT_BOTH = [ // eslint-disable-next-line @typescript-eslint/no-use-before-define singleChild((0, superstruct_1.lazy)(() => exports.BoxChildStruct)), exports.InputStruct, // eslint-disable-next-line @typescript-eslint/no-use-before-define singleChild((0, superstruct_1.lazy)(() => exports.BoxChildStruct)), ]; /** * A subset of JSX elements that are allowed as single children of the Field component. */ const FIELD_CHILDREN_ARRAY = [ exports.AssetSelectorStruct, exports.AddressInputStruct, exports.AccountSelectorStruct, exports.InputStruct, exports.DropdownStruct, exports.RadioGroupStruct, exports.FileInputStruct, exports.CheckboxStruct, exports.SelectorStruct, exports.DateTimePickerStruct, ]; /** * A union of the allowed children of the Field component. * This is mainly used in the simulator for validation purposes. */ exports.FieldChildUnionStruct = (0, internals_1.nullUnion)([ ...FIELD_CHILDREN_ARRAY, ...BOX_INPUT_LEFT, ...BOX_INPUT_RIGHT, ...BOX_INPUT_BOTH, ]); /** * A subset of JSX elements that are allowed as children of the Field component. */ const FieldChildStruct = (0, internals_1.selectiveUnion)((value) => { const isArray = Array.isArray(value); if (isArray && value.length === 3) { return (0, superstruct_1.tuple)(BOX_INPUT_BOTH); } if (isArray && value.length === 2) { return value[0]?.type === 'Box' ? (0, superstruct_1.tuple)(BOX_INPUT_LEFT) : (0, superstruct_1.tuple)(BOX_INPUT_RIGHT); } return (0, internals_1.typedUnion)(FIELD_CHILDREN_ARRAY); }); /** * A struct for the {@link FieldElement} type. */ exports.FieldStruct = element('Field', { label: (0, superstruct_1.optional)((0, superstruct_1.string)()), error: (0, superstruct_1.optional)((0, superstruct_1.string)()), children: FieldChildStruct, }); /** * A struct for the {@link BoldElement} type. */ exports.BoldStruct = element('Bold', { children: children([ (0, internals_1.selectiveUnion)((value) => { if (typeof value === 'string') { return (0, superstruct_1.string)(); } // eslint-disable-next-line @typescript-eslint/no-use-before-define return exports.ItalicStruct; }), ]), }); /** * A struct for the {@link ItalicElement} type. */ exports.ItalicStruct = element('Italic', { children: children([ (0, internals_1.selectiveUnion)((value) => { if (typeof value === 'string') { return (0, superstruct_1.string)(); } return exports.BoldStruct; }), ]), }); exports.FormattingStruct = (0, internals_1.typedUnion)([exports.BoldStruct, exports.ItalicStruct]); /** * A struct for the {@link AvatarElement} type. */ exports.AvatarStruct = element('Avatar', { address: utils_1.CaipAccountIdStruct, size: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('sm'), (0, internals_1.literal)('md'), (0, internals_1.literal)('lg')])), }); exports.BoxChildrenStruct = children( // eslint-disable-next-line @typescript-eslint/no-use-before-define [(0, superstruct_1.lazy)(() => exports.BoxChildStruct)]); /** * A struct for the {@link BoxElement} type. */ exports.BoxStruct = element('Box', { children: exports.BoxChildrenStruct, direction: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('horizontal'), (0, internals_1.literal)('vertical')])), alignment: (0, superstruct_1.optional)((0, internals_1.nullUnion)([ (0, internals_1.literal)('start'), (0, internals_1.literal)('center'), (0, internals_1.literal)('end'), (0, internals_1.literal)('space-between'), (0, internals_1.literal)('space-around'), ])), crossAlignment: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('start'), (0, internals_1.literal)('center'), (0, internals_1.literal)('end')])), center: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A subset of JSX elements that are allowed as children of the Form component. */ exports.FormChildStruct = exports.BoxChildrenStruct; /** * A struct for the {@link FormElement} type. */ exports.FormStruct = element('Form', { children: exports.FormChildStruct, name: (0, superstruct_1.string)(), }); const FooterButtonStruct = (0, superstruct_1.refine)(exports.ButtonStruct, 'FooterButton', (value) => { if (typeof value.props.children === 'string' || typeof value.props.children === 'boolean' || value.props.children === null) { return true; } if (Array.isArray(value.props.children)) { const hasNonTextElements = value.props.children.some((child) => typeof child !== 'string' && typeof child !== 'boolean' && child !== null); if (!hasNonTextElements) { return true; } } return 'Footer buttons may only contain text.'; }); /** * A struct for the {@link SectionElement} type. */ exports.SectionStruct = element('Section', { children: exports.BoxChildrenStruct, direction: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('horizontal'), (0, internals_1.literal)('vertical')])), alignment: (0, superstruct_1.optional)((0, internals_1.nullUnion)([ (0, internals_1.literal)('start'), (0, internals_1.literal)('center'), (0, internals_1.literal)('end'), (0, internals_1.literal)('space-between'), (0, internals_1.literal)('space-around'), ])), }); /** * A struct for the {@link CollapsibleSectionElement} type. */ exports.CollapsibleSectionStruct = element('CollapsibleSection', { children: exports.BoxChildrenStruct, label: (0, superstruct_1.string)(), isLoading: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), isExpanded: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), direction: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('horizontal'), (0, internals_1.literal)('vertical')])), alignment: (0, superstruct_1.optional)((0, internals_1.nullUnion)([ (0, internals_1.literal)('start'), (0, internals_1.literal)('center'), (0, internals_1.literal)('end'), (0, internals_1.literal)('space-between'), (0, internals_1.literal)('space-around'), ])), }); /** * A subset of JSX elements that are allowed as children of the Footer component. * This set should include a single button or a tuple of two buttons. */ exports.FooterChildStruct = (0, internals_1.selectiveUnion)((value) => { if (Array.isArray(value)) { return (0, superstruct_1.tuple)([FooterButtonStruct, FooterButtonStruct]); } return FooterButtonStruct; }); /** * A struct for the {@link FooterElement} type. */ exports.FooterStruct = element('Footer', { children: exports.FooterChildStruct, }); /** * A struct for the {@link CopyableElement} type. */ exports.CopyableStruct = element('Copyable', { value: (0, superstruct_1.string)(), sensitive: (0, superstruct_1.optional)((0, superstruct_1.boolean)()), }); /** * A struct for the {@link DividerElement} type. */ exports.DividerStruct = element('Divider'); /** * A struct for the {@link HeadingElement} type. */ exports.HeadingStruct = element('Heading', { children: exports.StringElementStruct, size: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('sm'), (0, internals_1.literal)('md'), (0, internals_1.literal)('lg')])), }); /** * A struct for the {@link LinkElement} type. */ exports.LinkStruct = element('Link', { href: (0, superstruct_1.string)(), children: children([ (0, internals_1.selectiveUnion)((value) => { if (typeof value === 'string') { return (0, superstruct_1.string)(); } return (0, internals_1.typedUnion)([ exports.FormattingStruct, exports.IconStruct, exports.ImageStruct, exports.AddressStruct, ]); }), ]), }); /** * A struct for the {@link SkeletonElement} type. */ exports.SkeletonStruct = element('Skeleton', { width: (0, superstruct_1.optional)((0, superstruct_1.union)([(0, superstruct_1.number)(), (0, superstruct_1.string)()])), height: (0, superstruct_1.optional)((0, superstruct_1.union)([(0, superstruct_1.number)(), (0, superstruct_1.string)()])), borderRadius: (0, superstruct_1.optional)(exports.BorderRadiusStruct), }); /** * A struct for the {@link TextElement} type. */ exports.TextStruct = element('Text', { children: children([ (0, internals_1.selectiveUnion)((value) => { if (typeof value === 'string') { return (0, superstruct_1.string)(); } return (0, internals_1.typedUnion)([ exports.BoldStruct, exports.ItalicStruct, exports.LinkStruct, exports.IconStruct, exports.SkeletonStruct, ]); }), ]), alignment: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('start'), (0, internals_1.literal)('center'), (0, internals_1.literal)('end')])), color: (0, superstruct_1.optional)((0, internals_1.nullUnion)([ (0, internals_1.literal)('default'), (0, internals_1.literal)('alternative'), (0, internals_1.literal)('muted'), (0, internals_1.literal)('error'), (0, internals_1.literal)('success'), (0, internals_1.literal)('warning'), ])), size: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('sm'), (0, internals_1.literal)('md')])), fontWeight: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('regular'), (0, internals_1.literal)('medium'), (0, internals_1.literal)('bold')])), }); /** * A struct for the {@link ValueElement} type. */ exports.ValueStruct = element('Value', { value: (0, internals_1.selectiveUnion)((value) => { if (typeof value === 'string') { return (0, superstruct_1.string)(); } return exports.TextStruct; }), extra: (0, internals_1.selectiveUnion)((value) => { if (typeof value === 'string') { return (0, superstruct_1.string)(); } return exports.TextStruct; }), }); /** * A subset of JSX elements that are allowed as children of the Tooltip component. * This set should include all text components and the Image. */ exports.TooltipChildStruct = (0, internals_1.selectiveUnion)((value) => { if (typeof value === 'boolean') { return (0, superstruct_1.boolean)(); } return (0, internals_1.typedUnion)([ exports.TextStruct, exports.BoldStruct, exports.ItalicStruct, exports.LinkStruct, exports.ImageStruct, exports.IconStruct, ]); }); /** * A subset of JSX elements that are allowed as content of the Tooltip component. * This set should include all text components. */ exports.TooltipContentStruct = (0, internals_1.selectiveUnion)((value) => { if (typeof value === 'string') { return (0, superstruct_1.string)(); } return (0, internals_1.typedUnion)([ exports.TextStruct, exports.BoldStruct, exports.ItalicStruct, exports.LinkStruct, exports.IconStruct, ]); }); /** * A struct for the {@link TooltipElement} type. */ exports.TooltipStruct = element('Tooltip', { children: (0, superstruct_1.nullable)(exports.TooltipChildStruct), content: exports.TooltipContentStruct, }); /** * A struct for the {@link BannerElement} type. */ exports.BannerStruct = element('Banner', { children: children([ (0, internals_1.typedUnion)([ exports.TextStruct, exports.LinkStruct, exports.IconStruct, exports.ButtonStruct, exports.BoldStruct, exports.ItalicStruct, exports.SkeletonStruct, ]), ]), title: (0, superstruct_1.string)(), severity: (0, superstruct_1.union)([ (0, internals_1.literal)('danger'), (0, internals_1.literal)('info'), (0, internals_1.literal)('success'), (0, internals_1.literal)('warning'), ]), }); /** * A struct for the {@link RowElement} type. */ exports.RowStruct = element('Row', { label: (0, superstruct_1.string)(), children: (0, superstruct_1.lazy)(() => // eslint-disable-next-line @typescript-eslint/no-use-before-define (0, internals_1.typedUnion)([exports.ValueStruct, exports.BoxChildStruct])), variant: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('default'), (0, internals_1.literal)('warning'), (0, internals_1.literal)('critical')])), tooltip: (0, superstruct_1.optional)((0, superstruct_1.string)()), }); /** * A struct for the {@link SpinnerElement} type. */ exports.SpinnerStruct = element('Spinner'); /** * A subset of JSX elements that are allowed as children of the Box component. * This set includes all components, except components that need to be nested in * another component (e.g., Field must be contained in a Form). */ exports.BoxChildStruct = (0, internals_1.typedUnion)([ exports.AccountSelectorStruct, exports.AddressStruct, exports.AssetSelectorStruct, exports.AddressInputStruct, exports.BoldStruct, exports.BoxStruct, exports.ButtonStruct, exports.CopyableStruct, exports.DateTimePickerStruct, exports.DividerStruct, exports.DropdownStruct, exports.RadioGroupStruct, exports.FieldStruct, exports.FileInputStruct, exports.FormStruct, exports.HeadingStruct, exports.InputStruct, exports.ImageStruct, exports.ItalicStruct, exports.LinkStruct, exports.RowStruct, exports.SpinnerStruct, exports.TextStruct, exports.TooltipStruct, exports.CheckboxStruct, exports.CardStruct, exports.IconStruct, exports.SelectorStruct, exports.SectionStruct, exports.AvatarStruct, exports.BannerStruct, exports.SkeletonStruct, exports.CollapsibleSectionStruct, ]); /** * A struct for the {@link ContainerElement} type. */ exports.ContainerStruct = element('Container', { children: (0, internals_1.selectiveUnion)((value) => { if (Array.isArray(value)) { return (0, superstruct_1.tuple)([exports.BoxChildStruct, exports.FooterStruct]); } return exports.BoxChildStruct; }), backgroundColor: (0, superstruct_1.optional)((0, internals_1.nullUnion)([(0, internals_1.literal)('default'), (0, internals_1.literal)('alternative')])), }); /** * For now, the allowed JSX elements at the root are the same as the allowed * children of the Box component. */ exports.RootJSXElementStruct = (0, internals_1.typedUnion)([ exports.BoxChildStruct, exports.ContainerStruct, ]); /** * A struct for the {@link JSXElement} type. */ exports.JSXElementStruct = (0, internals_1.typedUnion)([ exports.AssetSelectorStruct, exports.AddressInputStruct, exports.AccountSelectorStruct, exports.ButtonStruct, exports.InputStruct, exports.FileInputStruct, exports.FieldStruct, exports.FormStruct, exports.BoldStruct, exports.ItalicStruct, exports.AddressStruct, exports.BoxStruct, exports.CopyableStruct, exports.DateTimePickerStruct, exports.DividerStruct, exports.HeadingStruct, exports.ImageStruct, exports.LinkStruct, exports.RowStruct, exports.SpinnerStruct, exports.TextStruct, exports.DropdownStruct, exports.OptionStruct, exports.RadioGroupStruct, exports.RadioStruct, exports.ValueStruct, exports.TooltipStruct, exports.CheckboxStruct, exports.FooterStruct, exports.ContainerStruct, exports.CardStruct, exports.IconStruct, exports.SelectorStruct, exports.SelectorOptionStruct, exports.SectionStruct, exports.AvatarStruct, exports.BannerStruct, exports.SkeletonStruct, exports.CollapsibleSectionStruct, ]); /** * Check if a value is a JSX element. * * @param value - The value to check. * @returns True if the value is a JSX element, false otherwise. */ function isJSXElement(value) { return (0, superstruct_1.is)(value, exports.JSXElementStruct); } exports.isJSXElement = isJSXElement; /** * Check if a value is a JSX element, without validating all of its contents. * This is useful when you want to validate the structure of a value, but not * all the children. * * This should only be used when you are sure that the value is safe to use, * i.e., after using {@link isJSXElement}. * * @param value - The value to check. * @returns True if the value is a JSX element, false otherwise. */ function isJSXElementUnsafe(value) { return ((0, utils_1.isPlainObject)(value) && (0, utils_1.hasProperty)(value, 'type') && (0, utils_1.hasProperty)(value, 'props') && (0, utils_1.hasProperty)(value, 'key')); } exports.isJSXElementUnsafe = isJSXElementUnsafe; /** * Assert that a value is a JSX element. * * @param value - The value to check. * @throws If the value is not a JSX element. */ function assertJSXElement(value) { // TODO: We should use the error parsing utils from `snaps-utils` to improve // the error messages. It currently includes colours and potentially other // formatting that we might not want to include in the SDK. if (!isJSXElement(value)) { throw new Error(`Expected a JSX element, but received ${JSON.stringify(value)}. Please refer to the documentation for the supported JSX elements and their props.`); } } exports.assertJSXElement = assertJSXElement; //# sourceMappingURL=validation.cjs.map