import _ from 'lodash'; import { Preset } from '@stackbit/sdk'; import * as CSITypes from '@stackbit/types'; import { DocumentField, getLocalizedFieldForLocale, Logger, Model } from '@stackbit/types'; function getPresetData(presetId: string, field: DocumentField, logger?: Logger) { const dataField = getLocalizedFieldForLocale(field); let data; if (dataField?.type === 'json') { data = dataField.value; } else if (dataField?.type === 'string' || dataField?.type === 'text') { try { data = JSON.parse(dataField.value); } catch (err) { logger?.error(`Can't parse data field for preset ${presetId}`); } } return data; } function getPresetThumbnail(presetId: string, thumbnailField: DocumentField, csiAssetMap: Record, logger?: Logger) { let thumbnail; if (thumbnailField?.type === 'image') { const imageFields = getLocalizedFieldForLocale(thumbnailField)?.fields; if (imageFields) { const urlField = imageFields.url; if (urlField?.localized) { const vals = Object.values(urlField.locales); if (vals?.length) { thumbnail = vals[0]?.value; } } else { thumbnail = urlField.value; } } } else if (thumbnailField?.type === 'reference' && thumbnailField.refType === 'asset') { const refId = getLocalizedFieldForLocale(thumbnailField)?.refId; if (refId) { const fileField = csiAssetMap[refId]?.fields.file; if (fileField?.localized) { const vals = Object.values(fileField.locales); if (vals?.length) { thumbnail = vals[0]?.url; } } else { thumbnail = fileField?.url; } } else { logger?.warn(`No thumbnail reference found for preset ${presetId}`); } } return thumbnail; } export function getPresetFromDocument({ srcType, srcProjectId, csiDocument, csiAssetMap, logger }: { srcType: string; srcProjectId: string; csiDocument: CSITypes.Document; csiAssetMap: Record; logger?: Logger; }): Preset | null { const data = csiDocument.fields['data'] ? getPresetData(csiDocument.id, csiDocument.fields['data'], logger) : null; if (!data) { logger?.warn(`Error finding preset data for preset ${csiDocument.id}`); return null; } const thumbnail = csiDocument.fields['thumbnail'] ? getPresetThumbnail(csiDocument.id, csiDocument.fields['thumbnail'], csiAssetMap, logger) : null; return { srcType, srcProjectId, ...data, thumbnail }; } export function getDocumentObjectFromPreset(preset: Preset, model?: Model): Record { let presetData: Record | string = _.omit(preset, 'thumbnail'); if (model && model.fields) { const dataField = model.fields.find((field) => field.name === 'data'); if (dataField?.type === 'string' || dataField?.type === 'text') { presetData = JSON.stringify(presetData, null, 2); } } return { label: preset.label, data: presetData }; }