@sanity/media-library-types
Version:
Type definitions for common Sanity Media Library data structures
2,073 lines (1,898 loc) • 66.9 kB
text/typescript
import {Asset as Asset_3} from '@sanity/media-library-types'
import {AssetInstanceDocument as AssetInstanceDocument_2} from '@sanity/media-library-types'
import {ClientPerspective} from '@sanity/client'
import {ComponentType} from 'react'
import {ElementType} from 'react'
import {ReactNode} from 'react'
import {SanityClient} from '@sanity/client'
/**
* Types of array actions that can be performed
* @beta
*/
declare type ArrayActionName =
/**
* Add any item to the array at any position
*/
| 'add'
/**
* Add item after an existing item
*/
| 'addBefore'
/**
* Add item after an existing item
*/
| 'addAfter'
/**
* Remove any item
*/
| 'remove'
/**
* Duplicate item
*/
| 'duplicate'
/**
* Copy item
*/
| 'copy'
/** @public */
declare interface ArrayDefinition extends BaseSchemaDefinition {
type: 'array'
of: ArrayOfType[]
initialValue?: InitialValueProperty<any, unknown[]>
validation?: ValidationBuilder<ArrayRule<unknown[]>, unknown[]>
options?: ArrayOptions
}
/** @public */
declare type ArrayOfEntry<T> = Omit<T, 'name' | 'hidden'> & {
name?: string
}
/** @public */
declare type ArrayOfType<
TType extends IntrinsicTypeName = IntrinsicTypeName,
TAlias extends IntrinsicTypeName | undefined = undefined,
> = IntrinsicArrayOfDefinition[TType] | ArrayOfEntry<TypeAliasDefinition<string, TAlias>>
/** @public */
declare interface ArrayOptions<V = unknown> extends SearchConfiguration, BaseSchemaTypeOptions {
list?: TitledListValue<V>[] | V[]
layout?: 'list' | 'tags' | 'grid'
/** @deprecated This option does not have any effect anymore */
direction?: 'horizontal' | 'vertical'
sortable?: boolean
modal?: {
type?: 'dialog' | 'popover'
width?: number | 'auto'
}
/** @alpha This API may change */
insertMenu?: InsertMenuOptions
/**
* A boolean flag to enable or disable tree editing for the array.
* If there are any nested arrays, they will inherit this value.
* @deprecated tree editing beta feature has been disabled
*/
treeEditing?: boolean
/**
* A list of array actions to disable
* Possible options are defined by {@link ArrayActionName}
* @beta
*/
disableActions?: ArrayActionName[]
}
/** @public */
declare interface ArrayRule<Value> extends RuleDef<ArrayRule<Value>, Value> {
min: (length: number | FieldReference) => ArrayRule<Value>
max: (length: number | FieldReference) => ArrayRule<Value>
length: (length: number | FieldReference) => ArrayRule<Value>
unique: () => ArrayRule<Value>
}
/** @public */
declare interface ArraySchemaType<V = unknown> extends BaseSchemaType {
jsonType: 'array'
of: (Exclude<SchemaType, ArraySchemaType> | ReferenceSchemaType)[]
options?: ArrayOptions<V> & {
layout?: V extends string ? 'tag' : 'grid'
}
}
export declare interface Asset<
AssetInstance extends AssetInstanceDocument = AssetInstanceDocument,
> {
_id: string
_type: SanityAsset['_type']
title: string
assetType: AssetInstance['_type']
cdnAccessPolicy: SanityAsset['cdnAccessPolicy']
currentVersion: {
_ref: string
}
aspects?: unknown
versions: AssetVersion<AssetInstance>[]
collections: SanityAssetCollection[]
_createdAt: string
_updatedAt: string
_rev: string
}
/** @public */
declare interface Asset_2 extends SanityDocument {
url: string
path: string
assetId: string
extension: string
mimeType: string
sha1hash: string
size: number
originalFilename?: string
label?: string
title?: string
description?: string
creditLine?: string
source?: AssetSourceSpec
}
export declare interface AssetAspectDocument extends BaseDocument {
_type: 'sanity.asset.aspect'
/**
* The asset type this aspect definition applies to
* Undefined means that it applies to all asset types
*/
assetType?: Asset['assetType']
definition: FieldDefinition
}
/** @public */
declare type AssetFromSource = {
kind: 'assetDocumentId' | 'file' | 'base64' | 'url'
value: string | File_2
assetDocumentProps?: ImageAsset
mediaLibraryProps?: {
mediaLibraryId: string
assetId: string
assetInstanceId: string
}
}
export declare type AssetInstanceDocument = SanityImageAsset | SanityVideoAsset | SanityFileAsset
export declare interface AssetSelectionItem {
asset: Asset
assetInstanceId?: string | null
}
declare interface AssetSelectionItemWithLegacySupport extends AssetSelectionItem {
assetId: string
assetType: string
assetInstanceId: string
}
/** @public */
declare interface AssetSource {
name: string
/** @deprecated provide `i18nKey` instead */
title?: string
i18nKey?: string
component: ComponentType<AssetSourceComponentProps>
icon?: ComponentType<EmptyProps>
/** @beta */
Uploader?: AssetSourceUploaderClass
}
/** @public */
declare interface AssetSourceComponentProps {
action?: 'select' | 'upload'
assetSource: AssetSource
assetType?: 'file' | 'image' | 'sanity.video'
accept: string
selectionType: 'single'
dialogHeaderTitle?: React.ReactNode
selectedAssets: Asset_2[]
onClose: () => void
onSelect: (assetFromSource: AssetFromSource[]) => void
schemaType?: ImageSchemaType | FileSchemaType
/** @beta */
uploader?: AssetSourceUploader
}
/** @public */
declare interface AssetSourceSpec {
id: string
name: string
url?: string
}
/** @beta */
declare interface AssetSourceUploader {
upload(
files: globalThis.File[],
options?: {
/**
* The schema type of the field the asset is being uploaded to.
* May be of interest to the uploader to read file and image options.
*/
schemaType?: SchemaType
/**
* The uploader may send patches directly to the field
* Typed 'unknown' as we don't have patch definitions in sanity/types yet.
*/
onChange?: (patch: unknown) => void
},
): AssetSourceUploadFile[]
/**
* Abort the upload of a file
*/
abort(file?: AssetSourceUploadFile): void
/**
* Get the files that are currently being uploaded
*/
getFiles(): AssetSourceUploadFile[]
/**
* Subscribe to upload events from the uploader
*/
subscribe(subscriber: (event: AssetSourceUploadEvent) => void): () => void
/**
* Update the status of a file. Will be emitted to subscribers.
*/
updateFile(
fileId: string,
data: {
progress?: number
status?: string
error?: Error
},
): void
/**
* Reset the uploader (clear files). Should be called by the uploader when all files are done.
*/
reset(): void
}
/** @beta */
declare type AssetSourceUploaderClass = new (...args: any[]) => AssetSourceUploader
/** @beta */
declare type AssetSourceUploadEvent =
| AssetSourceUploadEventProgress
| AssetSourceUploadEventStatus
| AssetSourceUploadEventAllComplete
| AssetSourceUploadEventError
| AssetSourceUploadEventAbort
/**
* Emitted when all files are done, either successfully, aborted or with errors
* @beta */
declare type AssetSourceUploadEventAbort = {
type: 'abort'
/**
* Files aborted
*/
files: AssetSourceUploadFile[]
}
/**
* Emitted when all files are done, either successfully, aborted or with errors
* @beta */
declare type AssetSourceUploadEventAllComplete = {
type: 'all-complete'
files: AssetSourceUploadFile[]
}
/**
* Emitted when all files are done, either successfully, aborted or with errors
* @beta */
declare type AssetSourceUploadEventError = {
type: 'error'
/**
* Files errored
*/
files: AssetSourceUploadFile[]
}
/**
* Emitted when a file upload is progressing
* @beta */
declare type AssetSourceUploadEventProgress = {
type: 'progress'
file: AssetSourceUploadFile
progress: number
}
/**
* Emitted when a file upload is changing status
* @beta */
declare type AssetSourceUploadEventStatus = {
type: 'status'
file: AssetSourceUploadFile
status: AssetSourceUploadFile['status']
}
/** @beta */
declare interface AssetSourceUploadFile {
id: string
file: globalThis.File
progress: number
status: 'pending' | 'uploading' | 'complete' | 'error' | 'aborted' | 'alreadyExists'
error?: Error
result?: unknown
}
export declare interface AssetVersion<
AssetInstance extends AssetInstanceDocument = AssetInstanceDocument,
> {
_key: string
_type: SanityAssetVersion['_type']
title?: string
instance: AssetInstance
}
export declare type BaseDocument = {
_id: string
_type: string
_rev: string
_createdAt: string
_updatedAt: string
[key: string]: any
}
/** @public */
declare interface BaseSchemaDefinition {
name: string
title?: string
description?: string | React.JSX.Element
hidden?: ConditionalProperty
readOnly?: ConditionalProperty
icon?: ComponentType | ReactNode
validation?: unknown
initialValue?: unknown
deprecated?: DeprecatedProperty
}
/** @public */
declare interface BaseSchemaType extends Partial<DeprecationConfiguration> {
name: string
title?: string
description?: string
type?: SchemaType
liveEdit?: boolean
readOnly?: ConditionalProperty
hidden?: ConditionalProperty
icon?: ComponentType
initialValue?: InitialValueProperty<any, any>
validation?: SchemaValidationValue
preview?: PreviewConfig
/** @beta */
components?: {
block?: ComponentType<any>
inlineBlock?: ComponentType<any>
annotation?: ComponentType<any>
diff?: ComponentType<any>
field?: ComponentType<any>
input?: ComponentType<any>
item?: ComponentType<any>
preview?: ComponentType<any>
portableText?: {
plugins?: ComponentType<any>
}
}
/**
* @deprecated This will be removed.
*/
placeholder?: string
}
/**
* `BaseOptions` applies to all type options.
*
* It can be extended by interface declaration merging in plugins to provide generic options to all types and fields.
*
* @public
* */
declare interface BaseSchemaTypeOptions {
sanityCreate?: SanityCreateOptions
canvasApp?: CanvasAppOptions
}
/**
* Schema definition for text block decorators.
*
* @public
* @example The default set of decorators
* ```ts
* {
* name: 'blockContent',
* title: 'Content',
* type: 'array',
* of: [
* {
* type: 'block',
* marks: {
* decorators: [
* {title: 'Strong', value: 'strong'},
* {title: 'Emphasis', value: 'em'},
* {title: 'Underline', value: 'underline'},
* {title: 'Strike', value: 'strike-through'},
* {title: 'Code', value: 'code'},
* ]
* }
* }
* ]
* }
* ```
*/
declare interface BlockDecoratorDefinition {
title: string
i18nTitleKey?: string
value: string
icon?: ReactNode | ComponentType
}
/**
* Schema definition for text blocks.
*
* @public
* @example the default block definition
* ```ts
* {
* name: 'blockContent',
* title: 'Content',
* type: 'array',
* of: [
* {
* type: 'block',
* marks: {
* decorators: [
* {title: 'Strong', value: 'strong'},
* {title: 'Emphasis', value: 'em'},
* {title: 'Underline', value: 'underline'},
* {title: 'Strike', value: 'strike-through'},
* {title: 'Code', value: 'code'},
* ],
* annotations: [
* {
* type: 'object',
* name: 'link',
* fields: [
* {
* type: 'string',
* name: 'href',
* },
* ],
* },
* ]
* },
* styles: [
* {title: 'Normal', value: 'normal'},
* {title: 'H1', value: 'h1'},
* {title: 'H2', value: 'h2'},
* {title: 'H3', value: 'h3'},
* {title: 'H4', value: 'h4'},
* {title: 'H5', value: 'h5'},
* {title: 'H6', value: 'h6'},
* {title: 'Quote', value: 'blockquote'}
* ],
* lists: [
* {title: 'Bullet', value: 'bullet'},
* {title: 'Number', value: 'number'},
* ],
* },
* ]
* }
* ```
*/
declare interface BlockDefinition extends BaseSchemaDefinition {
type: 'block'
styles?: BlockStyleDefinition[]
lists?: BlockListDefinition[]
marks?: BlockMarksDefinition
of?: ArrayOfType<'object' | 'reference'>[]
initialValue?: InitialValueProperty<any, any[]>
options?: BlockOptions
validation?: ValidationBuilder<BlockRule, any[]>
}
/**
* Schema definition for a text block list style.
*
* @public
* @example The defaults lists
* ```ts
* {
* name: 'blockContent',
* title: 'Content',
* type: 'array',
* of: [
* {
* type: 'block',
* lists: [
* {title: 'Bullet', value: 'bullet'},
* {title: 'Number', value: 'number'},
* ]
* }
* ]
* }
* ```
*/
declare interface BlockListDefinition {
title: string
i18nTitleKey?: string
value: string
icon?: ReactNode | ComponentType
}
/**
* Schema definition for text block marks (decorators and annotations).
*
* @public */
declare interface BlockMarksDefinition {
decorators?: BlockDecoratorDefinition[]
annotations?: ArrayOfType<'object' | 'reference'>[]
}
/**
* Schema options for a Block schema definition
* @public */
declare interface BlockOptions extends BaseSchemaTypeOptions {
/**
* Turn on or off the builtin browser spellchecking. Default is on.
*/
spellCheck?: boolean
unstable_whitespaceOnPasteMode?: 'preserve' | 'normalize' | 'remove'
/**
* When enabled, the editor will restrict all line breaks and soft breaks,
* forcing content to remain on a single line. This will also update
* the styling of the editor to reflect the single-line constraint.
*
* Pasting content that is on multiple lines will be normalized to a single line, if possible.
*
* @defaultValue false
*/
oneLine?: boolean
}
/** @public */
declare interface BlockRule extends RuleDef<BlockRule, any[]> {}
/**
* Schema definition for a text block style.
* A text block may have a block style like 'header', 'normal', 'lead'
* attached to it, which is stored on the `.style` property for that block.
*
* @public
* @remarks The first defined style will become the default style.´´
* @example The default set of styles
* ```ts
* {
* name: 'blockContent',
* title: 'Content',
* type: 'array',
* of: [
* {
* type: 'block',
* styles: [
* {title: 'Normal', value: 'normal'},
* {title: 'H1', value: 'h1'},
* {title: 'H2', value: 'h2'},
* {title: 'H3', value: 'h3'},
* {title: 'H4', value: 'h4'},
* {title: 'H5', value: 'h5'},
* {title: 'H6', value: 'h6'},
* {title: 'Quote', value: 'blockquote'}
* ]
* }
* ]
* }
* ```
* @example Example of defining a block type with custom styles and render components.
* ```ts
* defineArrayMember({
* type: 'block',
* styles: [
* {
* title: 'Paragraph',
* value: 'paragraph',
* component: ParagraphStyle,
* },
* {
* title: 'Lead',
* value: 'lead',
* component: LeadStyle,
* },
* {
* title: 'Heading',
* value: 'heading',
* component: HeadingStyle,
* },
* ],
* })
* ```
*/
declare interface BlockStyleDefinition {
title: string
value: string
i18nTitleKey?: string
icon?: ReactNode | ComponentType
}
/** @public */
declare interface BooleanDefinition extends BaseSchemaDefinition {
type: 'boolean'
options?: BooleanOptions
initialValue?: InitialValueProperty<any, boolean>
validation?: ValidationBuilder<BooleanRule, boolean>
}
/** @public */
declare interface BooleanOptions extends BaseSchemaTypeOptions {
layout?: 'switch' | 'checkbox'
}
/** @public */
declare interface BooleanRule extends RuleDef<BooleanRule, boolean> {}
/** @public */
declare interface BooleanSchemaType extends BaseSchemaType {
jsonType: 'boolean'
options?: BooleanOptions
initialValue?: InitialValueProperty<any, boolean>
}
/**
* Options for configuring how Canvas app interfaces with the type or field.
*
* @public
*/
declare interface CanvasAppOptions {
/** Set to true to exclude a type or field from appearing in Canvas */
exclude?: boolean
/**
* A short description of what the type or field is used for.
* Purpose can be used to improve how and when content mapping uses the field.
* */
purpose?: string
}
/** @public */
declare interface CollapseOptions {
collapsed?: boolean
collapsible?: boolean
/**
* @deprecated Use `collapsible` instead
*/
collapsable?: boolean
}
/** @public */
declare type ConditionalProperty = boolean | ConditionalPropertyCallback | undefined
/** @public */
declare type ConditionalPropertyCallback = (context: ConditionalPropertyCallbackContext) => boolean
/** @public */
declare interface ConditionalPropertyCallbackContext {
document: SanityDocument | undefined
parent: any
value: any
currentUser: Omit<CurrentUser, 'role'> | null
}
/** @public */
declare interface CrossDatasetReferenceDefinition extends BaseSchemaDefinition {
type: 'crossDatasetReference'
weak?: boolean
to: {
type: string
title?: string
icon?: ComponentType
preview?: PreviewConfig
/**
* @deprecated Unused. Configuring search is no longer supported.
*/
__experimental_search?: {
path: string | string[]
weight?: number
mapWith?: string
}[]
}[]
dataset: string
studioUrl?: (document: {id: string; type?: string}) => string | null
tokenId?: string
options?: ReferenceOptions
/**
* @deprecated Cross-project references are no longer supported, only cross-dataset
*/
projectId?: string
}
/** @public */
declare interface CurrentUser {
id: string
name: string
email: string
profileImage?: string
provider?: string
/** @deprecated use `roles` instead */
role: string
roles: Role[]
}
/** @public */
declare interface CustomValidator<T = unknown> {
(value: T, context: ValidationContext): CustomValidatorResult | Promise<CustomValidatorResult>
bypassConcurrencyLimit?: boolean
}
/** @public */
declare type CustomValidatorResult =
| true
| string
| ValidationError
| ValidationError[]
| LocalizedValidationMessages
/** @public */
declare interface DateDefinition extends BaseSchemaDefinition {
type: 'date'
options?: DateOptions
placeholder?: string
validation?: ValidationBuilder<DateRule, string>
initialValue?: InitialValueProperty<any, string>
}
/** @public */
declare interface DateOptions extends BaseSchemaTypeOptions {
dateFormat?: string
}
/** @public */
declare interface DateRule extends RuleDef<DateRule, string> {
/**
* @param minDate - Minimum date (inclusive). minDate should be in ISO 8601 format.
*/
min: (minDate: string | FieldReference) => DateRule
/**
* @param maxDate - Maximum date (inclusive). maxDate should be in ISO 8601 format.
*/
max: (maxDate: string | FieldReference) => DateRule
}
/** @public */
declare interface DatetimeDefinition extends BaseSchemaDefinition {
type: 'datetime'
options?: DatetimeOptions
placeholder?: string
validation?: ValidationBuilder<DatetimeRule, string>
initialValue?: InitialValueProperty<any, string>
}
/** @public */
declare interface DatetimeOptions extends BaseSchemaTypeOptions {
dateFormat?: string
timeFormat?: string
timeStep?: number
displayTimeZone?: string
allowTimeZoneSwitch?: boolean
}
/** @public */
declare interface DatetimeRule extends RuleDef<DatetimeRule, string> {
/**
* @param minDate - Minimum date (inclusive). minDate should be in ISO 8601 format.
*/
min: (minDate: string | FieldReference) => DatetimeRule
/**
* @param maxDate - Maximum date (inclusive). maxDate should be in ISO 8601 format.
*/
max: (maxDate: string | FieldReference) => DatetimeRule
}
/** @public */
declare interface DeprecatedProperty {
reason: string
}
/**
* @public
*/
declare interface DeprecationConfiguration {
deprecated: DeprecatedProperty
}
/** @public */
declare interface DocumentDefinition extends Omit<ObjectDefinition, 'type'> {
type: 'document'
liveEdit?: boolean
/** @beta */
orderings?: SortOrdering[]
options?: DocumentOptions
validation?: ValidationBuilder<DocumentRule, SanityDocument>
initialValue?: InitialValueProperty<any, Record<string, unknown>>
/** @deprecated Unused. Use the new field-level search config. */
__experimental_search?: {
path: string
weight: number
mapWith?: string
}[]
/** @alpha */
__experimental_omnisearch_visibility?: boolean
/**
* Determines whether the large preview title is displayed in the document pane form
* @alpha
* */
__experimental_formPreviewTitle?: boolean
}
/**
* This exists only to allow for extensions using declaration-merging.
*
* @public
*/
declare interface DocumentOptions extends BaseSchemaTypeOptions {}
/** @public */
declare interface DocumentRule extends RuleDef<DocumentRule, SanityDocument> {}
/** @public */
declare interface EmailDefinition extends BaseSchemaDefinition {
type: 'email'
options?: EmailOptions
placeholder?: string
validation?: ValidationBuilder<EmailRule, string>
initialValue?: InitialValueProperty<any, string>
}
/** @public */
declare interface EmailOptions extends BaseSchemaTypeOptions {}
/** @public */
declare interface EmailRule extends RuleDef<EmailRule, string> {}
/** @public */
declare interface EmptyProps {}
/** @public */
declare interface EnumListProps<V = unknown> {
list?: Array<TitledListValue<V> | V>
layout?: 'radio' | 'dropdown'
direction?: 'horizontal' | 'vertical'
}
/**
* The shape of a field definition. Note, it's recommended to use the
* `defineField` function instead of using this type directly.
*
* Where `defineField` infers the exact field type,
* FieldDefinition is a compromise union of all types a field can have.
*
* A field definition can be a reference to another registered top-level type
* or a inline type definition.
*
* @public
*/
declare type FieldDefinition<
TType extends IntrinsicTypeName = IntrinsicTypeName,
TAlias extends IntrinsicTypeName | undefined = undefined,
> = (InlineFieldDefinition[TType] | TypeAliasDefinition<string, TAlias>) & FieldDefinitionBase
/** @public */
declare interface FieldDefinitionBase {
fieldset?: string
group?: string | string[]
}
/** @public */
declare interface FieldGroup {
name: string
icon?: ComponentType
title?: string
description?: string
i18n?: I18nTextRecord<'title'>
hidden?: ConditionalProperty
default?: boolean
fields?: ObjectField[]
}
/** @public */
declare type FieldGroupDefinition = {
name: string
title?: string
hidden?: ConditionalProperty
icon?: ComponentType
default?: boolean
i18n?: I18nTextRecord<'title'>
}
/**
* Holds a reference to a different field
* NOTE: Only use this through {@link Rule.valueOfField}
*
* @public
*/
declare interface FieldReference {
type: symbol
path: string | string[]
}
/** @public */
declare type FieldRules = {
[fieldKey: string]: SchemaValidationValue
}
/** @public */
declare type Fieldset = SingleFieldSet | MultiFieldSet
/** @public */
declare type FieldsetDefinition = {
name: string
title?: string
description?: string
group?: string
hidden?: ConditionalProperty
readOnly?: ConditionalProperty
options?: ObjectOptions
}
/** @public */
declare interface File_2 {
[key: string]: unknown
asset?: Reference
}
/** @public */
declare interface FileDefinition
extends Omit<ObjectDefinition, 'type' | 'fields' | 'options' | 'groups' | 'validation'> {
type: 'file'
fields?: ObjectDefinition['fields']
options?: FileOptions
validation?: ValidationBuilder<FileRule, FileValue>
initialValue?: InitialValueProperty<any, FileValue>
}
/** @public */
declare interface FileOptions extends ObjectOptions {
storeOriginalFilename?: boolean
accept?: string
sources?: AssetSource[]
mediaLibrary?: MediaLibraryOptions
}
/** @public */
declare interface FileRule extends RuleDef<FileRule, FileValue> {
/**
* Require a file field has an asset.
*
* @example
* ```ts
* defineField({
* name: 'file',
* title: 'File',
* type: 'file',
* validation: (Rule) => Rule.required().assetRequired(),
* })
* ```
*/
assetRequired(): FileRule
}
/** @public */
declare interface FileSchemaType extends Omit<ObjectSchemaType, 'options'> {
options?: FileOptions
}
export declare type FileStatus = 'pending' | 'uploading' | 'complete' | 'error' | 'alreadyExists'
/**
* Wrapper object for the file upload with progress and status
*/
export declare interface FileUpload {
id: string
file: File
status: FileStatus
progress: number
error?: Error
}
/** @public */
declare interface FileValue {
asset?: Reference
[index: string]: unknown
}
declare type Geopoint = {
_type: 'geopoint'
lat?: number
lng?: number
alt?: number
}
/** @public */
declare interface GeopointDefinition extends BaseSchemaDefinition {
type: 'geopoint'
options?: GeopointOptions
validation?: ValidationBuilder<GeopointRule, GeopointValue>
initialValue?: InitialValueProperty<any, Omit<GeopointValue, '_type'>>
}
/** @public */
declare interface GeopointOptions extends BaseSchemaTypeOptions {}
/** @public */
declare interface GeopointRule extends RuleDef<GeopointRule, GeopointValue> {}
/**
* Geographical point representing a pair of latitude and longitude coordinates,
* stored as degrees, in the World Geodetic System 1984 (WGS 84) format. Also
* includes an optional `alt` property representing the altitude in meters.
*
* @public
*/
declare interface GeopointValue {
/**
* Type of the object. Must be `geopoint`.
*/
_type: 'geopoint'
/**
* Latitude in degrees
*/
lat: number
/**
* Longitude in degrees
*/
lng: number
/**
* Altitude in meters
*/
alt?: number
}
/** @public */
declare interface GlobalDocumentReferenceDefinition extends BaseSchemaDefinition {
type: 'globalDocumentReference'
weak?: boolean
to: {
type: string
title?: string
icon?: ComponentType
preview?: PreviewConfig
}[]
resourceType: string
resourceId: string
options?: ReferenceOptions
studioUrl?: string | ((document: {id: string; type?: string}) => string | null)
}
/** @public */
declare interface HotspotOptions {
previews?: HotspotPreview[]
}
/** @public */
declare interface HotspotPreview {
title: string
aspectRatio: number
}
/** @public */
declare type I18nTextRecord<K extends string> = {
[P in K]?: {
key: string
ns: string
}
}
/** @public */
declare interface ImageAsset extends Asset_2 {
_type: 'sanity.imageAsset'
metadata: ImageMetadata
}
/** @public */
declare interface ImageCrop {
_type?: 'sanity.imageCrop'
left: number
bottom: number
right: number
top: number
}
/** @public */
declare interface ImageDefinition
extends Omit<ObjectDefinition, 'type' | 'fields' | 'options' | 'groups' | 'validation'> {
type: 'image'
fields?: FieldDefinition[]
options?: ImageOptions
validation?: ValidationBuilder<ImageRule, ImageValue>
initialValue?: InitialValueProperty<any, ImageValue>
}
/** @public */
declare interface ImageDimensions {
_type: 'sanity.imageDimensions'
height: number
width: number
aspectRatio: number
}
/** @public */
declare interface ImageHotspot {
_type?: 'sanity.imageHotspot'
width: number
height: number
x: number
y: number
}
/** @public */
declare interface ImageMetadata {
[key: string]: unknown
_type: 'sanity.imageMetadata'
dimensions: ImageDimensions
palette?: ImagePalette
lqip?: string
blurHash?: string
hasAlpha: boolean
isOpaque: boolean
}
/** @public */
declare type ImageMetadataType = 'blurhash' | 'lqip' | 'palette' | 'exif' | 'image' | 'location'
/** @public */
declare interface ImageOptions extends FileOptions {
metadata?: ImageMetadataType[]
hotspot?: boolean | HotspotOptions
}
/** @public */
declare interface ImagePalette {
_type: 'sanity.imagePalette'
darkMuted?: ImageSwatch
darkVibrant?: ImageSwatch
dominant?: ImageSwatch
lightMuted?: ImageSwatch
lightVibrant?: ImageSwatch
muted?: ImageSwatch
vibrant?: ImageSwatch
}
/** @public */
declare interface ImageRule extends RuleDef<ImageRule, ImageValue> {
/**
* Require an image field has an asset.
*
* @example
* ```ts
* defineField({
* name: 'image',
* title: 'Image',
* type: 'image',
* validation: (Rule) => Rule.required().assetRequired(),
* })
* ```
*/
assetRequired(): ImageRule
}
/** @public */
declare interface ImageSchemaType extends Omit<ObjectSchemaType, 'options'> {
options?: ImageOptions
}
/** @public */
declare interface ImageSwatch {
_type: 'sanity.imagePaletteSwatch'
background: string
foreground: string
population: number
title?: string
}
/** @public */
declare interface ImageValue extends FileValue {
crop?: ImageCrop
hotspot?: ImageHotspot
[index: string]: unknown
}
/** @public */
declare type IndexTuple = [number | '', number | '']
/** @public */
declare type InitialValueProperty<Params, Value> =
| Value
| InitialValueResolver<Params, Value>
| undefined
/** @public */
declare type InitialValueResolver<Params, Value> = (
params: Params | undefined,
context: InitialValueResolverContext,
) => Promise<Value> | Value
/** @public */
declare interface InitialValueResolverContext {
projectId: string
dataset: string
schema: Schema
currentUser: CurrentUser | null
getClient: (options: {apiVersion: string}) => SanityClient
}
/** @public */
declare type InlineFieldDefinition = {
[K in keyof IntrinsicDefinitions]: Omit<
IntrinsicDefinitions[K],
'initialValue' | 'validation'
> & {
validation?: SchemaValidationValue
initialValue?: InitialValueProperty<any, any>
}
}
/** @alpha This API may change */
declare interface InsertMenuOptions {
/**
* @defaultValue `'auto'`
* `filter: 'auto'` automatically turns on filtering if there are more than 5
* schema types added to the menu.
*/
filter?: 'auto' | boolean | undefined
groups?:
| Array<{
name: string
title?: string
of?: Array<string>
}>
| undefined
/** defaultValue `true` */
showIcons?: boolean | undefined
/** @defaultValue `[{name: 'list'}]` */
views?:
| Array<
| {
name: 'list'
}
| {
name: 'grid'
previewImageUrl?: (schemaTypeName: string) => string | undefined
}
>
| undefined
}
declare const internalGroqTypeReferenceTo: unique symbol
/** @public */
declare type IntrinsicArrayOfDefinition = {
[K in keyof IntrinsicDefinitions]: Omit<
ArrayOfEntry<IntrinsicDefinitions[K]>,
'validation' | 'initialValue'
> & {
validation?: SchemaValidationValue
initialValue?: InitialValueProperty<any, any>
}
}
/**
* `IntrinsicDefinitions` is a lookup map for "predefined" schema definitions.
* Schema types in `IntrinsicDefinitions` will have good type-completion and type-safety in {@link defineType},
* {@link defineField} and {@link defineArrayMember} once the `type` property is provided.
*
* By default, `IntrinsicDefinitions` contains all standard Sanity schema types (`array`, `string`, `number` ect),
* but it is an interface and as such, open for extension.
*
* This type can be extended using declaration merging; this way new entries can be added.
* See {@link defineType} for examples on how this can be accomplished.
*
* @see defineType
*
* @public
*/
declare interface IntrinsicDefinitions {
array: ArrayDefinition
block: BlockDefinition
boolean: BooleanDefinition
date: DateDefinition
datetime: DatetimeDefinition
document: DocumentDefinition
file: FileDefinition
geopoint: GeopointDefinition
image: ImageDefinition
number: NumberDefinition
object: ObjectDefinition
reference: ReferenceDefinition
crossDatasetReference: CrossDatasetReferenceDefinition
globalDocumentReference: GlobalDocumentReferenceDefinition
slug: SlugDefinition
string: StringDefinition
text: TextDefinition
url: UrlDefinition
email: EmailDefinition
}
/**
* A union of all intrinsic types allowed natively in the schema.
*
* @see IntrinsicDefinitions
*
* @public
*/
declare type IntrinsicTypeName = IntrinsicDefinitions[keyof IntrinsicDefinitions]['type']
/** @public */
declare type KeyedSegment = {
_key: string
}
/**
* Holds localized validation messages for a given field.
*
* @example Custom message for English (US) and Norwegian (Bokmål):
* ```
* {
* 'en-US': 'Needs to start with a capital letter',
* 'no-NB': 'Må starte med stor bokstav',
* }
* ```
* @public
*/
declare interface LocalizedValidationMessages {
[locale: string]: string
}
/** @public */
declare type MediaAssetTypes = AssetInstanceDocument_2['_type']
/** @public */
declare interface MediaLibraryFilter {
name: string
query: string
}
/** @public */
declare interface MediaLibraryOptions {
filters?: MediaLibraryFilter[]
}
/** @public */
declare interface MediaValidationValue<T extends MediaAssetTypes = MediaAssetTypes> {
/**
* Media information
*/
media: {
/**
* The Media Library Asset.
*/
asset: Asset_3 & {
currentVersion: Extract<
AssetInstanceDocument_2,
{
_type: T
}
>
}
}
/**
* The field value which the media is used in.
*/
value: unknown
}
/** @public */
declare interface MediaValidator<T extends MediaAssetTypes = MediaAssetTypes> {
(
value: MediaValidationValue<T>,
context: ValidationContext,
): CustomValidatorResult | Promise<CustomValidatorResult>
}
/** @public */
declare interface MultiFieldSet {
name: string
title?: string
description?: string
single?: false
group?: string | string[]
options?: CollapseOptions & {
columns?: number
}
fields: ObjectField[]
hidden?: ConditionalProperty
readOnly?: ConditionalProperty
}
/** @public */
declare interface NumberDefinition extends BaseSchemaDefinition {
type: 'number'
options?: NumberOptions
placeholder?: string
validation?: ValidationBuilder<NumberRule, number>
initialValue?: InitialValueProperty<any, number>
}
/** @public */
declare interface NumberOptions extends EnumListProps<number>, BaseSchemaTypeOptions {}
/** @public */
declare interface NumberRule extends RuleDef<NumberRule, number> {
min: (minNumber: number | FieldReference) => NumberRule
max: (maxNumber: number | FieldReference) => NumberRule
lessThan: (limit: number | FieldReference) => NumberRule
greaterThan: (limit: number | FieldReference) => NumberRule
integer: () => NumberRule
precision: (limit: number | FieldReference) => NumberRule
positive: () => NumberRule
negative: () => NumberRule
}
/** @public */
declare interface NumberSchemaType extends BaseSchemaType {
jsonType: 'number'
options?: NumberOptions
initialValue?: InitialValueProperty<any, number>
}
/** @public */
declare interface ObjectDefinition extends BaseSchemaDefinition {
type: 'object'
/**
* Object must have at least one field. This is validated at Studio startup.
*/
fields: FieldDefinition[]
groups?: FieldGroupDefinition[]
fieldsets?: FieldsetDefinition[]
preview?: PreviewConfig
options?: ObjectOptions
validation?: ValidationBuilder<ObjectRule, Record<string, unknown>>
initialValue?: InitialValueProperty<any, Record<string, unknown>>
}
/** @public */
declare interface ObjectField<T extends SchemaType = SchemaType> {
name: string
fieldset?: string
group?: string | string[]
type: ObjectFieldType<T>
}
/** @public */
declare type ObjectFieldType<T extends SchemaType = SchemaType> = T & {
hidden?: ConditionalProperty
readOnly?: ConditionalProperty
}
/** @public */
declare interface ObjectOptions extends BaseSchemaTypeOptions {
collapsible?: boolean
collapsed?: boolean
columns?: number
modal?: {
type?: 'dialog' | 'popover'
width?: number | number[] | 'auto'
}
}
/** @public */
declare interface ObjectRule extends RuleDef<ObjectRule, Record<string, unknown>> {}
/** @public */
declare interface ObjectSchemaType extends BaseSchemaType {
jsonType: 'object'
fields: ObjectField[]
groups?: FieldGroup[]
fieldsets?: Fieldset[]
initialValue?: InitialValueProperty<any, Record<string, unknown>>
weak?: boolean
/** @deprecated Unused. Use the new field-level search config. */
__experimental_search?: {
path: (string | number)[]
weight: number
mapWith?: string
}[]
/** @alpha */
__experimental_omnisearch_visibility?: boolean
/** @alpha */
__experimental_actions?: string[]
/** @alpha */
__experimental_formPreviewTitle?: boolean
/**
* @beta
*/
orderings?: SortOrdering[]
options?: any
}
/** @public */
declare type Path = PathSegment[]
/** @public */
declare type PathSegment = string | number | KeyedSegment | IndexTuple
export declare type PluginPostMessage =
| PluginPostMessageAbortUploadRequest
| PluginPostMessageAssetSelection
| PluginPostMessageDocumentUpdate
| PluginPostMessagePageLoaded
| PluginPostMessagePageUnloaded
| PluginPostMessageTokenRequest
| PluginPostMessageTokenResponse
| PluginPostMessageUploadFilesProgress
| PluginPostMessageUploadFilesRequest
| PluginPostMessageUploadFilesResponse
export declare type PluginPostMessageAbortUploadRequest = {
type: 'abortUploadRequest'
files?: {
id: string
}[]
}
export declare type PluginPostMessageAssetSelection = {
type: 'assetSelection'
selection: AssetSelectionItemWithLegacySupport[]
}
/**
* Message sent from the plugin that a document has been updated
*/
export declare type PluginPostMessageDocumentUpdate = {
type: 'documentUpdate'
document: {
_id: string
_type: string
_rev: string
}
}
/**
* Message sent from a plugin page to notify the host that the page is loaded and ready to be interacted with
*/
export declare type PluginPostMessagePageLoaded = {
type: 'pageLoaded'
page: string
}
/**
* Message sent from a plugin page that a page is unloaded by the user (for closing the dialog and similar)
*/
export declare type PluginPostMessagePageUnloaded = {
type: 'pageUnloaded'
page: string
}
export declare type PluginPostMessageTokenRequest = {
type: 'tokenRequest'
}
export declare type PluginPostMessageTokenResponse = {
type: 'tokenResponse'
token: string | null
}
/**
* Message sent from the plugin when files are uploading
*/
export declare type PluginPostMessageUploadFilesProgress = {
type: 'uploadProgress'
files: FileUpload[]
}
/**
* Message sent from the plugin that the user wants to upload files
*/
export declare type PluginPostMessageUploadFilesRequest = {
type: 'uploadRequest'
files: {
id: string
file: File
}[]
}
/**
* Message sent from the app that the pending uploads are uploaded
*/
export declare type PluginPostMessageUploadFilesResponse = {
type: 'uploadResponse'
assets: AssetSelectionItemWithLegacySupport[]
}
/** @public */
declare interface PrepareViewOptions {
/** @beta */
ordering?: SortOrdering
}
/** @public */
declare interface PreviewConfig<
Select extends Record<string, string> = Record<string, string>,
PrepareValue extends Record<keyof Select, any> = Record<keyof Select, any>,
> {
select?: Select
prepare?: (value: PrepareValue, viewOptions?: PrepareViewOptions) => PreviewValue
}
/** @public */
declare interface PreviewValue {
_id?: string
_createdAt?: string
_updatedAt?: string
title?: string
subtitle?: string
description?: string
media?: ReactNode | ElementType
imageUrl?: string
}
/** @public */
declare interface Reference {
_type: string
_ref: string
_key?: string
_weak?: boolean
_strengthenOnPublish?: {
type: string
weak?: boolean
template?: {
id: string
params: Record<string, string | number | boolean>
}
}
}
/** @public */
declare interface ReferenceBaseOptions extends BaseSchemaTypeOptions {
disableNew?: boolean
}
/** @public */
declare interface ReferenceDefinition extends BaseSchemaDefinition {
type: 'reference'
to: ReferenceTo
weak?: boolean
options?: ReferenceOptions
validation?: ValidationBuilder<ReferenceRule, ReferenceValue>
initialValue?: InitialValueProperty<any, Omit<ReferenceValue, '_type'>>
}
/** @public */
declare type ReferenceFilterOptions = ReferenceFilterResolverOptions | ReferenceFilterQueryOptions
/** @public */
declare interface ReferenceFilterQueryOptions {
filter: string
filterParams?: Record<string, unknown>
}
/** @public */
declare type ReferenceFilterResolver = (
context: ReferenceFilterResolverContext,
) => ReferenceFilterSearchOptions | Promise<ReferenceFilterSearchOptions>
/** @public */
declare interface ReferenceFilterResolverContext {
document: SanityDocument
parent?: Record<string, unknown> | Record<string, unknown>[]
parentPath: Path
getClient: (options: {apiVersion: string}) => SanityClient
}
/** @public */
declare interface ReferenceFilterResolverOptions {
filter?: ReferenceFilterResolver
filterParams?: never
}
/** @public */
declare type ReferenceFilterSearchOptions = {
filter?: string
params?: Record<string, unknown>
tag?: string
maxFieldDepth?: number
strategy?: SearchStrategy
perspective?: ClientPerspective
}
/**
* Types are closed for extension. To add properties via declaration merging to this type,
* redeclare and add the properties to the interfaces that make up ReferenceOptions type.
*
* @see ReferenceFilterOptions
* @see ReferenceFilterResolverOptions
* @see ReferenceBaseOptions
*
* @public
*/
declare type ReferenceOptions = ReferenceBaseOptions & ReferenceFilterOptions
/** @public */
declare interface ReferenceRule extends RuleDef<ReferenceRule, ReferenceValue> {}
/** @public */
declare interface ReferenceSchemaType extends Omit<ObjectSchemaType, 'options'> {
jsonType: 'object'
to: ObjectSchemaType[]
weak?: boolean
options?: ReferenceOptions
}
/** @public */
declare type ReferenceTo =
| SchemaTypeDefinition
| TypeReference
| Array<SchemaTypeDefinition | TypeReference>
/** @public */
declare type ReferenceValue = Reference
/** @public */
declare interface Role {
name: string
title: string
description?: string
}
/** @public */
declare interface Rule {
/**
* @internal
* @deprecated internal use only
*/
_type: RuleTypeConstraint | undefined
/**
* @internal
* @deprecated internal use only
*/
_level: 'error' | 'warning' | 'info' | undefined
/**
* @internal
* @deprecated internal use only
*/
_required: 'required' | 'optional' | undefined
/**
* @internal
* @deprecated internal use only
*/
_typeDef: SchemaType | undefined
/**
* @internal
* @deprecated internal use only
*/
_message: string | LocalizedValidationMessages | undefined
/**
* @internal
* @deprecated internal use only
*/
_rules: RuleSpec[]
/**
* @internal
* @deprecated internal use only
*/
_fieldRules: FieldRules | undefined
/**
* Takes in a path and returns an object with a symbol.
*
* When the validation lib sees this symbol, it will use the provided path to
* get a value from the current field's parent and use that value as the input
* to the Rule.
*
* The path that's given is forwarded to `lodash/get`
*
* ```js
* fields: [
* // ...
* {
* // ...
* name: 'highestTemperature',
* type: 'number',
* validation: (Rule) => Rule.positive().min(Rule.valueOfField('lowestTemperature')),
* // ...
* },
* ]
* ```
*/
valueOfField: (path: string | string[]) => FieldReference
error(message?: string | LocalizedValidationMessages): Rule
warning(message?: string | LocalizedValidationMessages): Rule
info(message?: string | LocalizedValidationMessages): Rule
reset(): this
isRequired(): boolean
clone(): Rule
cloneWithRules(rules: RuleSpec[]): Rule
merge(rule: Rule): Rule
type(targetType: RuleTypeConstraint | Lowercase<RuleTypeConstraint>): Rule
all(children: Rule[]): Rule
either(children: Rule[]): Rule
optional(): Rule
required(): Rule
custom<T = unknown>(
fn: CustomValidator<T>,
options?: {
bypassConcurrencyLimit?: boolean
},
): Rule
media<T extends MediaAssetTypes = MediaAssetTypes>(fn: MediaValidator<T>): Rule
min(len: number | string | FieldReference): Rule
max(len: number | string | FieldReference): Rule
length(len: number | FieldReference): Rule
valid(value: unknown | unknown[]): Rule
integer(): Rule
precision(limit: number | FieldReference): Rule
positive(): Rule
negative(): Rule
greaterThan(num: number | FieldReference): Rule
lessThan(num: number | FieldReference): Rule
uppercase(): Rule
lowercase(): Rule
regex(
pattern: RegExp,
name: string,
options: {
name?: string
invert?: boolean
},
): Rule
regex(
pattern: RegExp,
options: {
name?: string
invert?: boolean
},
): Rule
regex(pattern: RegExp, name: string): Rule
regex(pattern: RegExp): Rule
email(): Rule
uri(options?: UriValidationOptions): Rule
unique(): Rule
reference(): Rule
fields(rules: FieldRules): Rule
assetRequired(): Rule
validate(
value: unknown,
options: ValidationContext & {
/**
* @deprecated Internal use only
* @internal
*/
__internal?: {
customValidationConcurrencyLimiter?: {
ready: () => Promise<void>
release: () => void
}
}
},
): Promise<ValidationMarker[]>
}
/** @public */
declare type RuleBuilder<T extends RuleDef<T, FieldValue>, FieldValue = unknown> = T | T[]
/** @public */
declare interface RuleDef<T, FieldValue = unknown> {
required: () => T
custom: <LenientFieldValue extends FieldValue>(
fn: CustomValidator<LenientFieldValue | undefined>,
) => T
info: (message?: string | LocalizedValidationMessages) => T
error: (message?: string | LocalizedValidationMessages) => T
warning: (message?: string | LocalizedValidationMessages) => T
valueOfField: (path: string | string[]) => FieldReference
}
/** @public */
declare type RuleSpec =
| {
flag: 'integer'
}
| {
flag: 'email'
}
| {
flag: 'unique'
}
| {
flag: 'reference'
}
| {
flag: 'type'
constraint: RuleTypeConstraint
}
| {
flag: 'all'
constraint: Rule[]
}
| {
flag: 'either'
constraint: Rule[]
}
| {
flag: 'presence'
constraint: 'optional' | 'required'
}
| {
flag: 'custom'
constraint: CustomValidator
}
| {
flag: 'min'
constraint: number | string | FieldReference
}
| {
flag: 'max'
constraint: number | string | FieldReference
}
| {
flag: 'length'
constraint: number | FieldReference
}
| {
flag: 'valid'
constraint: unknown[]
}
| {
flag: 'precision'
constraint: number | FieldReference
}
| {
flag: 'lessThan'
constraint: number | FieldReference
}
| {
flag: 'greaterThan'
constraint: number | FieldReference
}
| {
flag: 'stringCasing'
constraint: 'uppercase' | 'lowercase'
}
| {
flag: 'assetRequired'
constraint: {
assetType: 'asset' | 'image' | 'file'
}
}
| {
flag: 'media'
constraint: MediaValidator<any>
}
| {
flag: 'regex'
constraint: {
pattern: RegExp
name?: string
invert: boolean
}
}
| {
flag: 'uri'
constraint: {
options: {
scheme: RegExp[]
allowRelative: boolean
relativeOnly: boolean
allowCredentials: boolean
}
}
}
/** @public */
declare type RuleTypeConstraint = 'Array' | 'Boolean' | 'Date' | 'Number' | 'Object' | 'String'
declare type SanityAsset = {
_id: string
_type: 'sanity.asset'
_createdAt: string
_updatedAt: string
_rev: string
title?: string
aspects?: Record<string, unknown>
currentVersion: {
_ref: string
_type: 'reference'
_weak?: boolean
[internalGroqTypeReferenceTo]?: 'sanity.asset.version'
}
versions: Array<
{
_key: string
} & SanityAssetVersion
>
assetType: 'sanity.imageAsset' | 'sanity.videoAsset' | 'sanity.fileAsset'
cdnAccessPolicy: 'public' | 'private'
}
declare type SanityAssetCollection = {
_id: string
_type: 'sanity.asset.collection'
_createdAt: string
_updatedAt: string
_rev: string
title: string
description?: string
assets?: Array<{
_ref: string
_type: 'reference'
_weak?: boolean
_key: string
[internalGroqTypeReferenceTo]?: 'sanity.asset'
}>
}
declare type SanityAssetVersion = {
_type: 'sanity.asset.version'
title?: string
instance:
| {
_ref: string
_type: 'reference'
_weak?: boolean
[internalGroqTypeReferenceTo]?: 'sanity.imageAsset'
}
| {
_ref: string
_type: 'reference'
_weak?: boolean
[internalGroqTypeReferenceTo]?: 'sanity.fileAsset'
}
| {
_ref: string
_type: 'reference'
_weak?: boolean
[internalGroqTypeReferenceTo]?: 'sanity.videoAsset'
}
}
/**
* Options for configuring how Sanity Create interfaces with the type or field.
*
* @public
*/
declare interface SanityCreateOptions {
/** Set to true to exclude a type or field from appearing in Sanity Create */
exclude?: boolean
/**
* A short description of what the type or field is used for.
* Purpose can be used to improve how and when content mapping uses the field.
* */
purpose?: string
}
/** @public */
declare interface SanityDocument {
_id: string
_type: string
_createdAt: string
_updatedAt: string
_rev: string
[key: string]: unknown
}
declare