@bareblends/vsf-prismic
Version:
Prismic CMS integration with Vue Storefront
56 lines (46 loc) • 1.97 kB
text/typescript
import Prismic from '@prismicio/client'
import { PrismicQuery, PrismicQueryTypes } from '../types'
const transformQuery = (query: PrismicQuery | PrismicQuery[]): string | string[] => {
const predict = (method, args) => Prismic.Predicates[method](...args)
const queryContainer = Array.isArray(query) ? query : [query]
const queries = queryContainer.map(q => Object.keys(q).map<string>((key) => {
const current: PrismicQueryTypes = q[key]
if (!Prismic.Predicates[key]) {
return undefined
}
const {
fragment, after, before, day, documentId,
hour, latitude, longitude, maxResults, month,
radius, value, values, year
} = current
switch (true) {
case values !== undefined:
return predict(key, [fragment, values])
case value !== undefined:
return predict(key, [fragment, value])
case documentId !== undefined && maxResults !== undefined:
return predict(key, [documentId, maxResults])
case before !== undefined && after !== undefined:
return predict(key, [fragment, before, after])
case before !== undefined:
return predict(key, [fragment, before])
case after !== undefined:
return predict(key, [fragment, after])
case latitude !== undefined && longitude !== undefined && radius !== undefined:
return predict(key, [fragment, latitude, longitude, radius])
case year !== undefined:
return predict(key, [fragment, year])
case month !== undefined:
return predict(key, [fragment, month])
case day !== undefined:
return predict(key, [fragment, day])
case hour !== undefined:
return predict(key, [fragment, hour])
default:
return predict(key, [fragment])
}
}))
const flatArray = [].concat(...queries.filter(queryElement => queryElement !== undefined))
return flatArray.length === 1 ? flatArray[0] : flatArray
}
export default transformQuery