@sanity/personalization-plugin
3.1.33.1.4
dist/fieldExperiments-p8tDVY-S.js.map+
dist/fieldExperiments-p8tDVY-S.js.mapNew file+1
Index: package/dist/fieldExperiments-p8tDVY-S.js.map
===================================================================
--- package/dist/fieldExperiments-p8tDVY-S.js.map
+++ package/dist/fieldExperiments-p8tDVY-S.js.map
@@ -0,0 +1,1 @@
+{"version":3,"file":"fieldExperiments-p8tDVY-S.js","names":["() => {\n if (!active) {\n onChange(set(true, ['active']))\n }\n }","[active, onChange]","props.renderDefault(props)","props.renderDefault","{apiVersion: experimentFieldPluginConfig.apiVersion}","apiVersion","Array.isArray(experimentFieldPluginConfig.experiments)\n ? experimentFieldPluginConfig.experiments\n : suspend(\n async () => {\n if (typeof experimentFieldPluginConfig.experiments === 'function') {\n return experimentFieldPluginConfig.experiments(client)\n }\n return experimentFieldPluginConfig.experiments\n },\n [workspace, 'field-level-experiments'],\n {equal},\n )","experimentFieldPluginConfig.experiments","{...experimentFieldPluginConfig, experiments}","useMemo(\n () => ({...experimentFieldPluginConfig, experiments}),\n [experimentFieldPluginConfig, experiments],\n )","props.renderDefault(props)","props.renderDefault","<ExperimentContext.Provider value={context}>\n {props.renderDefault(props)}\n </ExperimentContext.Provider>","ExperimentContext.Provider","useFormValue","[...fieldPath, experimentId]","props.path","async (variant: VariantType) => {\n const item = {\n _key: uuid(),\n [variantId]: variant.id,\n [experimentId]: experimentValue,\n _type: variantName,\n }\n\n // Patch the document\n onItemAppend(item)\n }","useCallback(\n async (variant: VariantType) => {\n const item = {\n _key: uuid(),\n [variantId]: variant.id,\n [experimentId]: experimentValue,\n _type: variantName,\n }\n\n // Patch the document\n onItemAppend(item)\n },\n [variantId, experimentId, experimentValue, variantName, onItemAppend],\n )","Inline","Stack","1","filteredVariants.map((variant) => {\n return (\n <Button\n key={`${experimentValue}-${variant.id}`}\n text={`Add ${variant.label}`}\n mode=\"ghost\"\n disabled={usedVariants?.includes(variant.id)}\n onClick={() => handleClick(variant)}\n />\n )\n })","3","props.renderDefault({...props, arrayFunctions: () => null})","props.value","(props.value as Value[]) || []","value","variant","() => null","<Inline gap={1}>\n {filteredVariants.map((variant) => {\n return (\n <Button\n key={`${experimentValue}-${variant.id}`}\n text={`Add ${variant.label}`}\n mode=\"ghost\"\n disabled={usedVariants?.includes(variant.id)}\n onClick={() => handleClick(variant)}\n />\n )\n })}\n </Inline>","<Stack gap={3}>\n {props.renderDefault({...props, arrayFunctions: () => null})}\n\n <Inline gap={1}>\n {filteredVariants.map((variant) => {\n return (\n <Button\n key={`${experimentValue}-${variant.id}`}\n text={`Add ${variant.label}`}\n mode=\"ghost\"\n disabled={usedVariants?.includes(variant.id)}\n onClick={() => handleClick(variant)}\n />\n )\n })}\n </Inline>\n </Stack>","() => {\n onChange([set(!active, ['active'])])\n }","useCallback(() => {\n onChange([set(!active, ['active'])])\n }, [onChange, active])","{\n title: `Add ${experimentNameOverride}`,\n type: 'action',\n icon: GiSoapExperiment,\n onAction: handleAddAction,\n renderAsButton: true,\n }","`Add ${experimentNameOverride}`","() => {\n const activeId = ['active']\n const experiment = [experimentId]\n const variants = [`${variantNameOverride}s`]\n onChange([set(!active, activeId), unset(experiment), unset(variants)])\n }","useCallback(() => {\n const activeId = ['active']\n const experiment = [experimentId]\n const variants = [`${variantNameOverride}s`]\n onChange([set(!active, activeId), unset(experiment), unset(variants)])\n }, [onChange, active, experimentId, variantNameOverride])","{\n title: `Remove ${experimentNameOverride}`,\n type: 'action',\n icon: CloseIcon,\n onAction: handleClearAction,\n renderAsButton: true,\n }","`Remove ${experimentNameOverride}`","'active'","{\n onChange,\n inputId,\n active,\n experimentNameOverride,\n experimentId,\n variantNameOverride,\n }","useMemo(\n () => ({\n onChange,\n inputId,\n active,\n experimentNameOverride,\n experimentId,\n variantNameOverride,\n }),\n [onChange, inputId, active, experimentNameOverride, experimentId, variantNameOverride],\n )","props.actions || []","actions","createActions(actionProps)","[createActions(actionProps), ...oldActions]","useMemo(() => {\n const oldActions = props.actions || []\n return [createActions(actionProps), ...oldActions]\n }, [actionProps, props.actions])","clearChildrenGroups(props)","{\n ...propsWithClearedGroups,\n actions: memoizedActions,\n }","useMemo(() => {\n const propsWithClearedGroups = clearChildrenGroups(props)\n return {\n ...propsWithClearedGroups,\n actions: memoizedActions,\n }\n }, [props, memoizedActions])","props.renderDefault(enhancedProps)","renderDefault","[3, 3, 4]","(event) => handleChange(event, onChange)","<option value={''}>{'Select an option...'}</option>","listOptions.map(({value: optionValue, title}) => (\n <option key={optionValue} value={optionValue}>\n {title}\n </option>\n ))","({value: optionValue, title}) => (\n <option key={optionValue} value={optionValue}>\n {title}\n </option>\n )","<SanitySelect\n {...elementProps}\n fontSize={2}\n padding={3}\n gap={[3, 3, 4]}\n value={value || ''} // Current field value\n onChange={(event) => handleChange(event, onChange)} // A function to call when the input value changes\n >\n <option value={''}>{'Select an option...'}</option>\n {listOptions.map(({value: optionValue, title}) => (\n <option key={optionValue} value={optionValue}>\n {title}\n </option>\n ))}\n </SanitySelect>","value || ''","{value: optionValue, title}","['_id']","[...props.path.slice(0, -1), `${props.variantNameOverride}s`]","path","variantNameOverride","useMemo(\n () => [...props.path.slice(0, -1), `${props.variantNameOverride}s`],\n [props.variantNameOverride, props.path],\n )","getPublishedId(id)","(\n event: ChangeEvent<HTMLSelectElement>,\n onChange: (patchchange: FormPatch | FormPatch[] | PatchEvent) => void,\n ) => {\n const inputValue = event.currentTarget.value\n\n if (inputValue) {\n onChange(set(inputValue))\n } else {\n onChange(unset())\n }\n\n if (subValues) {\n const patchEvent = {\n unset: [additionalChangePath.join('.')],\n }\n patch.execute([patchEvent])\n }\n }","useCallback(\n (\n event: ChangeEvent<HTMLSelectElement>,\n onChange: (patchchange: FormPatch | FormPatch[] | PatchEvent) => void,\n ) => {\n const inputValue = event.currentTarget.value\n\n if (inputValue) {\n onChange(set(inputValue))\n } else {\n onChange(unset())\n }\n\n if (subValues) {\n const patchEvent = {\n unset: [additionalChangePath.join('.')],\n }\n patch.execute([patchEvent])\n }\n },\n [patch, subValues, additionalChangePath],\n )","[3, 3, 4]","[2, 2, 3]","<Card padding={[3, 3, 4]} radius={2} shadow={1} tone=\"caution\">\n <Text align=\"center\" size={[2, 2, 3]}>\n There are no defined {props.experimentNameOverride}s\n </Text>\n </Card>","experimentNameOverride","formatlistOptions(experiments)","<Select {...props} listOptions={formatlistOptions(experiments)} handleChange={handleChange} />","useFormValue","[...experimentPath, 'default']","path","() => {\n props.onChange(set(defaultValue, ['value']))\n }","props.renderDefault(props)","props.renderDefault","<Inline gap={1}>\n <Button text=\"Copy default\" mode=\"ghost\" onClick={() => handleClick()} />\n </Inline>","<Stack gap={3}>\n {props.renderDefault(props)}\n\n <Inline gap={1}>\n <Button text=\"Copy default\" mode=\"ghost\" onClick={() => handleClick()} />\n </Inline>\n </Stack>","{apiVersion}","selectedExperiment?.variants.find((variantItem) => {\n return variantItem.id === variant\n })","(experimentItem) => {\n return experimentItem.id === experiment\n }","() => {\n const getSubtitle = async () => {\n setTitle(\n selectedExperiment?.label && selectedVariant?.label\n ? `${selectedExperiment.label} - ${selectedVariant.label}`\n : selectedExperiment?.label || selectedVariant?.label,\n )\n if (typeof value === 'string') {\n return setSubtitle(value)\n }\n if (isReference(value)) {\n const doc = await client.getDocument(value._ref)\n const type = props.schemaType as ObjectSchemaType\n const valueField = type.fields.find((field) => field.name === 'value') as ObjectSchemaType\n const referenceField = valueField?.type as ReferenceSchemaType\n const referenceType = referenceField.to.find((field) => field.type?.name === doc?._type)\n\n const selectFields = {} as Record<string, unknown>\n const previewFields = referenceType?.preview?.select || {}\n Object.keys(previewFields).forEach((key) => {\n const valueKey = referenceType?.preview?.select?.[key]\n selectFields[key] =\n valueKey && doc\n ? valueKey.split('.').reduce((acc: any, index) => acc?.[index], doc)\n : undefined\n })\n\n const previewContent = referenceType?.preview?.prepare?.(selectFields)\n setMedia(previewContent?.media || selectFields['media'])\n return setSubtitle(previewContent?.title || (selectFields['title'] as string))\n }\n if (isImage(value)) {\n setMedia(value)\n }\n return ''\n }\n void getSubtitle()\n }","schemaType","selectedExperiment?.label","selectedVariant?.label","(field) => field.name === 'value'","field","(acc: any, index) => acc?.[index]","'media'","'title'","[value, client, selectedExperiment?.label, selectedVariant?.label, props.schemaType]","props.renderDefault(previewProps)"],"sources":["../src/components/ArrayItem.tsx","../src/components/experiment/Context.tsx","../src/components/experiment/Array.tsx","../src/utils/clearChildGroups.ts","../src/components/experiment/Field.tsx","../src/components/Select.tsx","../src/components/experiment/Input.tsx","../src/components/experiment/VariantInput.tsx","../src/components/experiment/VariantPreview.tsx","../src/utils/flattenSchemaType.ts","../src/fieldExperiments.tsx"],"sourcesContent":["import {useEffect} from 'react'\nimport {type ObjectItem, type ObjectItemProps, set} from 'sanity'\n\nexport const ArrayItem = (props: ObjectItemProps) => {\n const {active} = props.value as ObjectItem & {active: boolean}\n const {onChange} = props.inputProps\n\n useEffect(() => {\n if (!active) {\n onChange(set(true, ['active']))\n }\n }, [active, onChange])\n\n return props.renderDefault(props)\n}\n","import equal from 'fast-deep-equal'\nimport {createContext, useContext, useMemo} from 'react'\nimport {type ObjectInputProps, useClient, useWorkspace} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport type {ExperimentContextProps, ExperimentFieldPluginConfig} from '../../types'\n\n// This provider makes the plugin config available to all components in the document form\n// But with experiments resolved\n\nexport const CONFIG_DEFAULT = {\n fields: [],\n apiVersion: '2024-11-07',\n experimentNameOverride: 'experiment',\n variantNameOverride: 'variant',\n variantId: 'variantId',\n variantArrayName: 'variants',\n experimentId: 'experimentId',\n}\n\nconst ExperimentContext = createContext<ExperimentContextProps>({\n ...CONFIG_DEFAULT,\n experiments: [],\n})\n\nexport function useExperimentContext() {\n return useContext(ExperimentContext)\n}\n\ntype ExperimentProps = ObjectInputProps & {\n experimentFieldPluginConfig: Required<ExperimentFieldPluginConfig>\n}\n\nexport function ExperimentProvider(props: ExperimentProps) {\n const {experimentFieldPluginConfig} = props\n\n const client = useClient({apiVersion: experimentFieldPluginConfig.apiVersion})\n const workspace = useWorkspace()\n\n // Fetch or return experiments\n const experiments = Array.isArray(experimentFieldPluginConfig.experiments)\n ? experimentFieldPluginConfig.experiments\n : suspend(\n async () => {\n if (typeof experimentFieldPluginConfig.experiments === 'function') {\n return experimentFieldPluginConfig.experiments(client)\n }\n return experimentFieldPluginConfig.experiments\n },\n [workspace, 'field-level-experiments'],\n {equal},\n )\n\n const context = useMemo(\n () => ({...experimentFieldPluginConfig, experiments}),\n [experimentFieldPluginConfig, experiments],\n )\n\n return (\n <ExperimentContext.Provider value={context}>\n {props.renderDefault(props)}\n </ExperimentContext.Provider>\n )\n}\n","import {Button, Inline, Stack} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {useCallback} from 'react'\nimport {useFormValue} from 'sanity'\n\nimport type {ArrayInputProps, VariantType} from '../../types'\nimport {useExperimentContext} from './Context'\n\nexport const ArrayInput = (props: ArrayInputProps) => {\n const fieldPath = props.path.slice(0, -1)\n const {onItemAppend, variantName, variantId, experimentId} = props\n const experimentValue = useFormValue([...fieldPath, experimentId])\n\n const {experiments} = useExperimentContext()\n\n const handleClick = useCallback(\n async (variant: VariantType) => {\n const item = {\n _key: uuid(),\n [variantId]: variant.id,\n [experimentId]: experimentValue,\n _type: variantName,\n }\n\n // Patch the document\n onItemAppend(item)\n },\n [variantId, experimentId, experimentValue, variantName, onItemAppend],\n )\n\n const filteredVariants =\n experiments.find((option) => {\n return option.id === experimentValue\n })?.variants || []\n\n type Value = {\n value?: unknown\n [key: string]: unknown\n variantId: string\n _key: string\n _type: string\n }\n\n // there is probably some better was of getting the type of this?\n const values = (props.value as Value[]) || []\n\n const usedVariants = values?.map((variant) => variant[variantId])\n\n return (\n <Stack gap={3}>\n {props.renderDefault({...props, arrayFunctions: () => null})}\n\n <Inline gap={1}>\n {filteredVariants.map((variant) => {\n return (\n <Button\n key={`${experimentValue}-${variant.id}`}\n text={`Add ${variant.label}`}\n mode=\"ghost\"\n disabled={usedVariants?.includes(variant.id)}\n onClick={() => handleClick(variant)}\n />\n )\n })}\n </Inline>\n </Stack>\n )\n}\n","import type {ObjectFieldProps} from 'sanity'\n\n/**\n * Safely updates deeply nested children props to clear groups array\n * This prevents field grouping UI conflicts in personalization mode\n */\nexport const clearChildrenGroups = (props: ObjectFieldProps): ObjectFieldProps => {\n // Type assertion is needed here because Sanity's ObjectFieldProps children\n // typing doesn't account for the nested structure we need to manipulate\n const children = props.children as any\n\n if (!children || typeof children !== 'object' || !children.props) {\n return props\n }\n\n const innerChild = children.props.children\n if (\n !innerChild ||\n typeof innerChild !== 'object' ||\n Array.isArray(innerChild) ||\n !('props' in innerChild)\n ) {\n return props\n }\n\n return {\n ...props,\n children: {\n ...children,\n props: {\n ...children.props,\n children: {\n ...innerChild,\n props: {\n ...innerChild.props,\n groups: [],\n },\n },\n },\n },\n }\n}\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {useCallback, useMemo} from 'react'\nimport {GiSoapExperiment} from 'react-icons/gi'\nimport {\n defineDocumentFieldAction,\n type DocumentFieldActionItem,\n type DocumentFieldActionProps,\n type FormPatch,\n type ObjectFieldProps,\n type PatchEvent,\n set,\n unset,\n} from 'sanity'\n\nimport {clearChildrenGroups} from '../../utils/clearChildGroups'\n\ntype PatchStuff = {onChange: (patch: FormPatch | FormPatch[] | PatchEvent) => void; inputId: string}\n\nconst useAddExperimentAction = (\n props: DocumentFieldActionProps &\n PatchStuff & {experimentNameOverride: string; experimentId: string; active: boolean},\n): DocumentFieldActionItem => {\n const {onChange, active, experimentNameOverride} = props\n\n const handleAddAction = useCallback(() => {\n onChange([set(!active, ['active'])])\n }, [onChange, active])\n\n return {\n title: `Add ${experimentNameOverride}`,\n type: 'action',\n icon: GiSoapExperiment,\n onAction: handleAddAction,\n renderAsButton: true,\n }\n}\n\nconst useRemoveExperimentAction = (\n props: DocumentFieldActionProps &\n PatchStuff & {\n experimentNameOverride: string\n experimentId: string\n active: boolean\n variantNameOverride: string\n },\n): DocumentFieldActionItem => {\n const {onChange, active, experimentId, experimentNameOverride, variantNameOverride} = props\n const handleClearAction = useCallback(() => {\n const activeId = ['active']\n const experiment = [experimentId]\n const variants = [`${variantNameOverride}s`]\n onChange([set(!active, activeId), unset(experiment), unset(variants)])\n }, [onChange, active, experimentId, variantNameOverride])\n\n return {\n title: `Remove ${experimentNameOverride}`,\n type: 'action',\n icon: CloseIcon,\n onAction: handleClearAction,\n renderAsButton: true,\n }\n}\n\nconst createActions = ({\n onChange,\n inputId,\n active,\n experimentNameOverride,\n experimentId,\n variantNameOverride,\n}: PatchStuff & {\n active?: boolean\n experimentNameOverride: string\n experimentId: string\n variantNameOverride: string\n}) => {\n const removeAction = defineDocumentFieldAction({\n name: `Remove ${experimentNameOverride}`,\n useAction: (props) =>\n useRemoveExperimentAction({\n ...props,\n active: true,\n onChange,\n inputId,\n experimentNameOverride,\n experimentId,\n variantNameOverride,\n }),\n })\n const addAction = defineDocumentFieldAction({\n name: `Add ${experimentNameOverride}`,\n useAction: (props) =>\n useAddExperimentAction({\n ...props,\n active: false,\n onChange,\n inputId,\n experimentNameOverride,\n experimentId,\n }),\n })\n return active ? removeAction : addAction\n}\n\nexport const Field = (\n props: ObjectFieldProps & {\n experimentNameOverride: string\n experimentId: string\n variantNameOverride: string\n },\n) => {\n const {onChange} = props.inputProps\n const {inputId, experimentNameOverride, experimentId, variantNameOverride} = props\n const active = props.value?.['active'] as boolean | undefined\n\n const actionProps = useMemo(\n () => ({\n onChange,\n inputId,\n active,\n experimentNameOverride,\n experimentId,\n variantNameOverride,\n }),\n [onChange, inputId, active, experimentNameOverride, experimentId, variantNameOverride],\n )\n\n const memoizedActions = useMemo(() => {\n const oldActions = props.actions || []\n return [createActions(actionProps), ...oldActions]\n }, [actionProps, props.actions])\n\n const enhancedProps = useMemo(() => {\n const propsWithClearedGroups = clearChildrenGroups(props)\n return {\n ...propsWithClearedGroups,\n actions: memoizedActions,\n }\n }, [props, memoizedActions])\n\n return props.renderDefault(enhancedProps)\n}\n","import {Select as SanitySelect} from '@sanity/ui'\nimport type {ChangeEvent} from 'react'\nimport type {FormPatch, PatchEvent, StringInputProps} from 'sanity'\n\nimport type {SelectOption} from './experiment/Input'\n\nexport const Select = (\n props: StringInputProps & {\n listOptions: SelectOption[]\n handleChange: (\n event: ChangeEvent<HTMLSelectElement>,\n onChange: (patch: FormPatch | FormPatch[] | PatchEvent) => void,\n ) => void\n },\n) => {\n const {\n value, // Current field value\n onChange, // Method to handle patch events,\n elementProps,\n listOptions,\n handleChange,\n } = props\n\n return (\n <SanitySelect\n {...elementProps}\n fontSize={2}\n padding={3}\n gap={[3, 3, 4]}\n value={value || ''} // Current field value\n onChange={(event) => handleChange(event, onChange)} // A function to call when the input value changes\n >\n <option value={''}>{'Select an option...'}</option>\n {listOptions.map(({value: optionValue, title}) => (\n <option key={optionValue} value={optionValue}>\n {title}\n </option>\n ))}\n </SanitySelect>\n )\n}\n","import {Card, Text} from '@sanity/ui'\nimport {type ChangeEvent, useCallback, useMemo} from 'react'\nimport {\n type FormPatch,\n getPublishedId,\n type PatchEvent,\n set,\n type StringInputProps,\n unset,\n useDocumentOperation,\n useFormValue,\n} from 'sanity'\n\nimport type {ExperimentType} from '../..'\nimport {Select} from '../Select'\nimport {useExperimentContext} from './Context'\n\nexport type SelectOption = {title: string; value: string}\nconst formatlistOptions = (experiments: ExperimentType[]): SelectOption[] =>\n experiments.map((experiment) => ({\n title: experiment.label,\n value: experiment.id,\n }))\n\nexport const Input = (\n props: StringInputProps & {variantNameOverride: string; experimentNameOverride: string},\n) => {\n const {experiments} = useExperimentContext()\n\n const id = useFormValue(['_id']) as string\n const additionalChangePath = useMemo(\n () => [...props.path.slice(0, -1), `${props.variantNameOverride}s`],\n [props.variantNameOverride, props.path],\n )\n const subValues = useFormValue(additionalChangePath)\n\n const {patch} = useDocumentOperation(getPublishedId(id), props.schemaType.name)\n\n const handleChange = useCallback(\n (\n event: ChangeEvent<HTMLSelectElement>,\n onChange: (patchchange: FormPatch | FormPatch[] | PatchEvent) => void,\n ) => {\n const inputValue = event.currentTarget.value\n\n if (inputValue) {\n onChange(set(inputValue))\n } else {\n onChange(unset())\n }\n\n if (subValues) {\n const patchEvent = {\n unset: [additionalChangePath.join('.')],\n }\n patch.execute([patchEvent])\n }\n },\n [patch, subValues, additionalChangePath],\n )\n\n if (!experiments.length)\n return (\n <Card padding={[3, 3, 4]} radius={2} shadow={1} tone=\"caution\">\n <Text align=\"center\" size={[2, 2, 3]}>\n There are no defined {props.experimentNameOverride}s\n </Text>\n </Card>\n )\n\n return (\n <Select {...props} listOptions={formatlistOptions(experiments)} handleChange={handleChange} />\n )\n}\n","import {Button, Inline, Stack} from '@sanity/ui'\nimport {type ObjectInputProps, set, useFormValue} from 'sanity'\n\nexport const VariantInput = (props: ObjectInputProps) => {\n const experimentPath = props.path.slice(0, -2)\n const defaultValue = useFormValue([...experimentPath, 'default'])\n const handleClick = () => {\n props.onChange(set(defaultValue, ['value']))\n }\n return (\n <Stack gap={3}>\n {props.renderDefault(props)}\n\n <Inline gap={1}>\n <Button text=\"Copy default\" mode=\"ghost\" onClick={() => handleClick()} />\n </Inline>\n </Stack>\n )\n}\n","import {useEffect, useState} from 'react'\nimport {\n isImage,\n isReference,\n type ObjectSchemaType,\n type PreviewProps,\n type ReferenceSchemaType,\n useClient,\n} from 'sanity'\n\nimport type {VariantPreviewProps} from '../../types'\nimport {useExperimentContext} from './Context'\n\nexport const VariantPreview = (props: PreviewProps) => {\n const [subtitle, setSubtitle] = useState<string | undefined>(undefined)\n const [title, setTitle] = useState<string | undefined>(undefined)\n const [media, setMedia] = useState<any>(undefined)\n const {experiments, apiVersion} = useExperimentContext()\n const client = useClient({apiVersion})\n\n const {experiment, variant, value} = props as VariantPreviewProps\n\n const selectedExperiment = experiments.find((experimentItem) => {\n return experimentItem.id === experiment\n })\n\n const selectedVariant = selectedExperiment?.variants.find((variantItem) => {\n return variantItem.id === variant\n })\n\n useEffect(() => {\n const getSubtitle = async () => {\n setTitle(\n selectedExperiment?.label && selectedVariant?.label\n ? `${selectedExperiment.label} - ${selectedVariant.label}`\n : selectedExperiment?.label || selectedVariant?.label,\n )\n if (typeof value === 'string') {\n return setSubtitle(value)\n }\n if (isReference(value)) {\n const doc = await client.getDocument(value._ref)\n const type = props.schemaType as ObjectSchemaType\n const valueField = type.fields.find((field) => field.name === 'value') as ObjectSchemaType\n const referenceField = valueField?.type as ReferenceSchemaType\n const referenceType = referenceField.to.find((field) => field.type?.name === doc?._type)\n\n const selectFields = {} as Record<string, unknown>\n const previewFields = referenceType?.preview?.select || {}\n Object.keys(previewFields).forEach((key) => {\n const valueKey = referenceType?.preview?.select?.[key]\n selectFields[key] =\n valueKey && doc\n ? valueKey.split('.').reduce((acc: any, index) => acc?.[index], doc)\n : undefined\n })\n\n const previewContent = referenceType?.preview?.prepare?.(selectFields)\n setMedia(previewContent?.media || selectFields['media'])\n return setSubtitle(previewContent?.title || (selectFields['title'] as string))\n }\n if (isImage(value)) {\n setMedia(value)\n }\n return ''\n }\n void getSubtitle()\n }, [value, client, selectedExperiment?.label, selectedVariant?.label, props.schemaType])\n\n const previewProps = {\n ...props,\n title: title,\n subtitle: subtitle,\n media: media,\n }\n\n return props.renderDefault(previewProps)\n}\n","import {isDocumentSchemaType, type ObjectField, type Path, type SchemaType} from 'sanity'\n\nimport type {ObjectFieldWithPath} from '../types'\n\n/**\n * Flattens a document's schema type into a flat array of fields and includes their path\n */\nexport function flattenSchemaType(schemaType: SchemaType): ObjectFieldWithPath[] {\n if (!isDocumentSchemaType(schemaType)) {\n console.error(`Schema type is not a document`)\n return []\n }\n\n return extractInnerFields(schemaType.fields, [], 5)\n}\n\nfunction extractInnerFields(\n fields: ObjectField[],\n path: Path,\n maxDepth: number,\n): ObjectFieldWithPath[] {\n if (path.length >= maxDepth) {\n return []\n }\n\n const result: ObjectFieldWithPath[] = []\n\n for (const field of fields) {\n result.push({path: [...path, field.name], ...field})\n\n if (field.type.jsonType === 'object') {\n result.push(...extractInnerFields(field.type.fields, [...path, field.name], maxDepth))\n } else if (field.type.jsonType === 'array') {\n // Handle array types by checking each possible type in the array\n const arrayTypes = field.type.of || []\n for (const arrayType of arrayTypes) {\n if ('fields' in arrayType) {\n result.push(...extractInnerFields(arrayType.fields, [...path, field.name], maxDepth))\n }\n }\n }\n }\n\n return result\n}\n","import {\n type ArrayOfObjectsInputProps,\n defineField,\n definePlugin,\n defineType,\n type FieldDefinition,\n isObjectInputProps,\n} from 'sanity'\n\nimport {ArrayItem} from './components/ArrayItem'\nimport {\n ArrayInput,\n CONFIG_DEFAULT,\n ExperimentProvider,\n Field,\n Input,\n VariantInput,\n VariantPreview,\n} from './components/experiment'\nimport type {ExperimentFieldPluginConfig} from './types'\nimport {flattenSchemaType} from './utils/flattenSchemaType'\n\nconst createExperimentType = ({\n field,\n experimentNameOverride,\n variantNameOverride,\n variantId,\n variantArrayName,\n experimentId,\n}: {\n field: string | FieldDefinition\n experimentNameOverride: string\n variantNameOverride: string\n variantId: string\n variantArrayName: string\n experimentId: string\n}) => {\n const typeName = typeof field === `string` ? field : field.name\n const usedName = String(typeName[0]).toUpperCase() + typeName.slice(1)\n const variantName = `${variantNameOverride}${usedName}`\n\n return defineType({\n name: `${experimentNameOverride}${usedName}`,\n type: 'object',\n groups: [\n {\n name: 'default',\n title: 'Default',\n hidden: ({parent}) => {\n return !Array.isArray(parent)\n },\n },\n {\n name: 'experiments',\n title: 'Experiments',\n hidden: ({parent}) => {\n return !Array.isArray(parent)\n },\n },\n {\n name: 'all-fields',\n title: 'All fields',\n hidden: ({parent}) => {\n return Array.isArray(parent)\n },\n },\n ],\n components: {\n field: (props) => (\n <Field\n {...props}\n experimentId={experimentId}\n experimentNameOverride={experimentNameOverride}\n variantNameOverride={variantNameOverride}\n />\n ),\n item: ArrayItem,\n },\n fields: [\n typeof field === `string`\n ? // Define a simple field if all we have is the name as a string\n defineField({\n name: 'default',\n type: field,\n group: 'default',\n })\n : // Pass in the configured options, but overwrite the name\n {\n ...field,\n name: 'default',\n group: 'default',\n },\n defineField({\n name: 'active',\n type: 'boolean',\n hidden: true,\n initialValue: false,\n }),\n defineField({\n name: experimentId,\n type: 'string',\n group: 'experiments',\n components: {\n input: (props) => (\n <Input\n {...props}\n experimentNameOverride={experimentNameOverride}\n variantNameOverride={variantNameOverride}\n />\n ),\n },\n hidden: ({parent}) => {\n return !parent?.active\n },\n }),\n defineField({\n name: variantArrayName,\n type: 'array',\n group: 'experiments',\n hidden: ({parent}) => {\n return !parent?.[experimentId]\n },\n components: {\n input: (props: ArrayOfObjectsInputProps) => (\n <ArrayInput\n {...props}\n variantName={variantName}\n variantId={variantId}\n experimentId={experimentId}\n />\n ),\n },\n of: [\n defineField({\n name: variantName,\n type: variantName,\n }),\n ],\n }),\n ],\n preview: {\n select: {\n base: 'default',\n experiment: experimentId,\n },\n prepare: ({base, experiment}) => {\n const title =\n typeof base === 'string'\n ? base\n : base && typeof base === 'object'\n ? base.title || base.name || ''\n : ''\n const experimentTitle = experiment ? `Experiment: ${experiment}` : ''\n const media =\n base && typeof base === 'object' ? base.image || base.photo || base.media || '' : ''\n return {\n title: title || experimentTitle,\n subtitle: title ? experimentTitle : '',\n media,\n }\n },\n },\n })\n}\n\nconst createVariantType = ({\n field,\n variantNameOverride,\n variantId,\n experimentId,\n}: {\n field: string | FieldDefinition\n variantNameOverride: string\n variantId: string\n experimentId: string\n}) => {\n const typeName = typeof field === `string` ? field : field.name\n const usedName = String(typeName[0]).toUpperCase() + typeName.slice(1)\n return defineType({\n name: `${variantNameOverride}${usedName}`,\n title: `${variantNameOverride} array ${usedName}`,\n type: 'object',\n components: {\n preview: VariantPreview,\n input: VariantInput,\n },\n fields: [\n {\n type: 'string',\n name: variantId,\n readOnly: true,\n },\n {\n type: 'string',\n name: experimentId,\n hidden: true,\n },\n typeof field === `string`\n ? // Define a simple field if all we have is the name as a string\n defineField({\n name: 'value',\n type: field,\n // hidden: ({parent}) => !parent?.[`${objectNameOverride}Id`],\n })\n : // Pass in the configured options, but overwrite the name\n {\n ...field,\n name: 'value',\n // hidden: ({parent}) => !parent?.[`${objectNameOverride}Id`],\n },\n ],\n preview: {\n select: {\n variant: variantId,\n experiment: experimentId,\n value: 'value',\n },\n },\n })\n}\n\nconst fieldSchema = ({\n fields,\n experimentNameOverride,\n variantNameOverride,\n variantId,\n variantArrayName,\n experimentId,\n}: Required<Omit<ExperimentFieldPluginConfig, 'apiVersion' | 'experiments'>>) => {\n return [\n ...fields.map((field) =>\n createVariantType({field, variantNameOverride, variantId, experimentId}),\n ),\n ...fields.map((field) =>\n createExperimentType({\n field,\n experimentNameOverride,\n variantNameOverride,\n variantId,\n variantArrayName,\n experimentId,\n }),\n ),\n ]\n}\n\nexport const fieldLevelExperiments = definePlugin<ExperimentFieldPluginConfig>((config) => {\n const pluginConfig = {...CONFIG_DEFAULT, ...config}\n const {fields, experimentNameOverride, variantNameOverride} = pluginConfig\n\n const experimentId = `${experimentNameOverride}Id`\n const variantArrayName = `${variantNameOverride}s`\n const variantId = `${variantNameOverride}Id`\n\n const fieldSchemaConfig = fieldSchema({\n fields,\n experimentNameOverride,\n variantNameOverride,\n variantId,\n variantArrayName,\n experimentId,\n })\n return {\n name: 'sanity-personalization-plugin-field-level-experiments',\n schema: {\n types: fieldSchemaConfig,\n },\n form: {\n components: {\n input: (props) => {\n const isRootInput = props.id === 'root' && isObjectInputProps(props)\n\n if (!isRootInput) {\n return props.renderDefault(props)\n }\n\n const flatFields = flattenSchemaType(props.schemaType)\n const hasExperiment = flatFields.some(\n (field) =>\n field.type.name.startsWith(experimentNameOverride) ||\n field.name.startsWith(experimentNameOverride),\n )\n\n if (!hasExperiment) {\n return props.renderDefault(props)\n }\n\n const providerProps = {\n ...props,\n experimentFieldPluginConfig: {\n ...pluginConfig,\n variantId,\n variantArrayName,\n experimentId,\n },\n }\n return <ExperimentProvider {...providerProps} />\n },\n },\n },\n }\n})\n"],"mappings":"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"}
\ No newline at end of file