sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
50 lines (46 loc) • 1.56 kB
text/typescript
import {toPlainText} from '@portabletext/react'
import {isPortableTextBlock} from '@portabletext/toolkit'
import {type ClientPerspective, type QueryParams} from '@sanity/client'
import {type ApplySourceDocumentsUpdateFunction} from '@sanity/client/csm'
import {type FIXME} from 'sanity'
/**
* Used by `applySourceDocuments`
* @internal
*/
export const mapChangedValue: ApplySourceDocumentsUpdateFunction = (
changedValue: FIXME,
{previousValue},
) => {
if (typeof previousValue === 'string') {
if (typeof changedValue === 'number') {
// If the string() function was used in the query, we need to convert the source value to a string as well
return `${changedValue}`
}
// If it's an array in the source, but a string in the query response, it could be pt::text
if (Array.isArray(changedValue)) {
if (changedValue.length === 0) {
// If it's empty assume it's PT and return an empty string
return ''
}
// If the array contains any valid block type, assume the GROQ initially used pt::text on it and do the same conversion
if (changedValue.some((node) => typeof node === 'object' && isPortableTextBlock(node))) {
return toPlainText(changedValue)
}
}
}
return changedValue
}
/**
* @internal
*/
export type QueryCacheKey = `${string}:${string}:${string}`
/**
* @internal
*/
export function getQueryCacheKey(
perspective: ClientPerspective,
query: string,
params: QueryParams,
): QueryCacheKey {
return `${perspective}:${query}:${JSON.stringify(params)}`
}