@sanity/personalization-plugin 3.1.3 → 3.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{fieldExperiments-CPrY-K44.js → fieldExperiments-p8tDVY-S.js} +11 -9
- package/dist/fieldExperiments-p8tDVY-S.js.map +1 -0
- package/dist/growthbook/index.js +1 -1
- package/dist/growthbook/index.js.map +1 -1
- package/dist/index.js +20 -18
- package/dist/index.js.map +1 -1
- package/dist/launchDarkly/index.js +1 -1
- package/dist/launchDarkly/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/fieldExperiments-CPrY-K44.js.map +0 -1
|
@@ -49,7 +49,7 @@ function ExperimentProvider(props) {
|
|
|
49
49
|
}), $[11] = context, $[12] = t3, $[13] = t4) : t4 = $[13], t4;
|
|
50
50
|
}
|
|
51
51
|
const ArrayInput = (props) => {
|
|
52
|
-
let $ = c(
|
|
52
|
+
let $ = c(37), experimentId, onItemAppend, t0, t1, variantId, variantName;
|
|
53
53
|
if ($[0] !== props) {
|
|
54
54
|
let fieldPath = props.path.slice(0, -1);
|
|
55
55
|
({onItemAppend, variantName, variantId, experimentId} = props), t0 = useFormValue, t1 = [...fieldPath, experimentId], $[0] = props, $[1] = experimentId, $[2] = onItemAppend, $[3] = t0, $[4] = t1, $[5] = variantId, $[6] = variantName;
|
|
@@ -66,11 +66,13 @@ const ArrayInput = (props) => {
|
|
|
66
66
|
}, $[7] = experimentId, $[8] = experimentValue, $[9] = onItemAppend, $[10] = variantId, $[11] = variantName, $[12] = t2) : t2 = $[12];
|
|
67
67
|
let handleClick = t2, T0, T1, t3, t4, t5, t6;
|
|
68
68
|
if ($[13] !== experimentValue || $[14] !== experiments || $[15] !== handleClick || $[16] !== props || $[17] !== variantId) {
|
|
69
|
-
let filteredVariants = experiments.find((option) => option.id === experimentValue)?.variants || [],
|
|
70
|
-
|
|
69
|
+
let filteredVariants = experiments.find((option) => option.id === experimentValue)?.variants || [], t7;
|
|
70
|
+
$[24] === props.value ? t7 = $[25] : (t7 = props.value || [], $[24] = props.value, $[25] = t7);
|
|
71
|
+
let usedVariants = t7?.map((variant_0) => variant_0[variantId]);
|
|
72
|
+
T1 = Stack, t5 = 3, $[26] === props ? t6 = $[27] : (t6 = props.renderDefault({
|
|
71
73
|
...props,
|
|
72
74
|
arrayFunctions: _temp$2
|
|
73
|
-
}), $[
|
|
75
|
+
}), $[26] = props, $[27] = t6), T0 = Inline, t3 = 1, t4 = filteredVariants.map((variant_1) => /* @__PURE__ */ jsx(Button, {
|
|
74
76
|
text: `Add ${variant_1.label}`,
|
|
75
77
|
mode: "ghost",
|
|
76
78
|
disabled: usedVariants?.includes(variant_1.id),
|
|
@@ -78,15 +80,15 @@ const ArrayInput = (props) => {
|
|
|
78
80
|
}, `${experimentValue}-${variant_1.id}`)), $[13] = experimentValue, $[14] = experiments, $[15] = handleClick, $[16] = props, $[17] = variantId, $[18] = T0, $[19] = T1, $[20] = t3, $[21] = t4, $[22] = t5, $[23] = t6;
|
|
79
81
|
} else T0 = $[18], T1 = $[19], t3 = $[20], t4 = $[21], t5 = $[22], t6 = $[23];
|
|
80
82
|
let t7;
|
|
81
|
-
$[
|
|
83
|
+
$[28] !== T0 || $[29] !== t3 || $[30] !== t4 ? (t7 = /* @__PURE__ */ jsx(T0, {
|
|
82
84
|
gap: t3,
|
|
83
85
|
children: t4
|
|
84
|
-
}), $[
|
|
86
|
+
}), $[28] = T0, $[29] = t3, $[30] = t4, $[31] = t7) : t7 = $[31];
|
|
85
87
|
let t8;
|
|
86
|
-
return $[
|
|
88
|
+
return $[32] !== T1 || $[33] !== t5 || $[34] !== t6 || $[35] !== t7 ? (t8 = /* @__PURE__ */ jsxs(T1, {
|
|
87
89
|
gap: t5,
|
|
88
90
|
children: [t6, t7]
|
|
89
|
-
}), $[
|
|
91
|
+
}), $[32] = T1, $[33] = t5, $[34] = t6, $[35] = t7, $[36] = t8) : t8 = $[36], t8;
|
|
90
92
|
};
|
|
91
93
|
function _temp$2() {
|
|
92
94
|
return null;
|
|
@@ -551,4 +553,4 @@ const createExperimentType = ({ field, experimentNameOverride, variantNameOverri
|
|
|
551
553
|
});
|
|
552
554
|
export { ArrayItem as i, flattenSchemaType as n, clearChildrenGroups as r, fieldLevelExperiments as t };
|
|
553
555
|
|
|
554
|
-
//# sourceMappingURL=fieldExperiments-
|
|
556
|
+
//# sourceMappingURL=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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"}
|
package/dist/growthbook/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-
|
|
1
|
+
import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-p8tDVY-S.js";
|
|
2
2
|
import "@sanity/ui/styles.css";
|
|
3
3
|
import { definePlugin, isObjectInputProps } from "sanity";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["SettingsView","useSecrets","useEffect","useState","ObjectInputProps","useGrowthbookContext","namespace","apiKeyName","pluginConfigKeys","key","title","Secrets","props","$","_c","secrets","loading","apiKey","setSecret","showSettings","setShowSettings","t0","t1","undefined","t2","renderDefault","Symbol","for","t3","t4","createContext","useContext","useMemo","useState","ObjectInputProps","GrowthbookContextProps","GrowthbookExperimentFieldPluginConfig","Secrets","GROWTHBOOK_CONFIG_DEFAULT","baseUrl","GrowthbookContext","setSecret","undefined","secret","useGrowthbookContext","GrowthbookProps","growthbookFieldPluginConfig","GrowthbookProvider","props","$","_c","t0","context","t1","t2","SanityClient","ExperimentType","GrowthbookFeature","VariantType","apiKeyName","namespace","GrowthbookExperimentFieldPluginConfig","getBooleanConversion","value","getExperiments","client","environment","baseUrl","project","convertBooleans","tags","Omit","Promise","query","secret","fetch","featureExperiments","hasMore","offset","url","URL","searchParams","set","toString","response","headers","Authorization","features","responseHasMore","nextOffset","json","forEach","feature","archived","undefined","some","tag","includes","experiments","environments","rules","filter","experiment","type","variations","uniqueValues","Set","variant","has","add","push","id","label","variants","sortedFeatureExperiments","sort","a","b","localeCompare","definePlugin","isObjectInputProps","fieldLevelExperiments","baseFieldLevelExperiments","flattenSchemaType","GROWTHBOOK_CONFIG_DEFAULT","GrowthbookProvider","GrowthbookExperimentFieldPluginConfig","getExperiments","config","pluginConfig","fields","environment","project","convertBooleans","baseUrl","tags","name","plugins","experiments","client","form","components","input","props","isRootInput","id","renderDefault","flatFieldTypeNames","schemaType","map","field","type","hasExperiment","some","startsWith","providerProps","growthbookFieldPluginConfig"],"sources":["../../src/growthbook/Components/Secrets.tsx","../../src/growthbook/Components/GrowthbookContext.tsx","../../src/growthbook/utils.ts","../../src/growthbook/index.ts"],"sourcesContent":["import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {useEffect, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport {useGrowthbookContext} from './GrowthbookContext'\n\nexport const namespace = 'growthbook'\nexport const apiKeyName = 'apiKey'\n\nconst pluginConfigKeys = [\n {\n key: apiKeyName,\n title: 'Your secret API key',\n },\n]\n\nexport const Secrets = (props: ObjectInputProps) => {\n const {secrets, loading} = useSecrets(namespace) as {secrets: {apiKey: string}; loading: boolean}\n const {setSecret} = useGrowthbookContext()\n const [showSettings, setShowSettings] = useState<boolean>(false)\n\n useEffect(() => {\n if (loading) return undefined\n if (!secrets && !loading) {\n setSecret(undefined)\n // oxlint-disable-next-line react/set-state-in-effect\n return setShowSettings(true)\n }\n setSecret(secrets.apiKey)\n return setShowSettings(false)\n }, [secrets, loading, setSecret])\n\n if (!showSettings) {\n return props.renderDefault(props)\n }\n return (\n <>\n <SettingsView\n title={'Growthbook secret'}\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setShowSettings(false)\n }}\n />\n {props.renderDefault(props)}\n </>\n )\n}\n","import {createContext, useContext, useMemo, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport type {GrowthbookContextProps, GrowthbookExperimentFieldPluginConfig} from '../types'\nimport {Secrets} from './Secrets'\n\nexport const GROWTHBOOK_CONFIG_DEFAULT = {\n baseUrl: 'https://api.growthbook.io/api/v1',\n}\n\nconst GrowthbookContext = createContext<GrowthbookContextProps>({\n setSecret: () => undefined,\n secret: undefined,\n})\n\nexport function useGrowthbookContext() {\n return useContext(GrowthbookContext)\n}\n\ntype GrowthbookProps = ObjectInputProps & {\n growthbookFieldPluginConfig: GrowthbookExperimentFieldPluginConfig\n}\n\nexport function GrowthbookProvider(props: GrowthbookProps) {\n const {growthbookFieldPluginConfig} = props\n const [secret, setSecret] = useState<string | undefined>()\n\n const context = useMemo(\n () => ({...growthbookFieldPluginConfig, secret, setSecret}),\n [growthbookFieldPluginConfig, secret, setSecret],\n )\n\n return (\n <GrowthbookContext.Provider value={context}>\n <Secrets {...props} />\n </GrowthbookContext.Provider>\n )\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {ExperimentType, GrowthbookFeature, VariantType} from '../types'\nimport {apiKeyName, namespace} from './Components/Secrets'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\n\nconst getBooleanConversion = (value: string) => {\n // control is false\n if (value === 'true') {\n return 'variant'\n } else if (value === 'false') {\n return 'control'\n }\n return value\n}\n\nexport const getExperiments = async ({\n client,\n environment,\n baseUrl,\n project,\n convertBooleans,\n tags,\n}: Omit<GrowthbookExperimentFieldPluginConfig, 'fields' | 'baseUrl'> & {\n client: SanityClient\n baseUrl: string\n}): Promise<ExperimentType[]> => {\n const query = `*[_id == 'secrets.${namespace}'][0].secrets.${apiKeyName}`\n\n const secret = await client.fetch(query) // secret is stored in the content lake using @sanity/studio-secrets\n if (!secret) return []\n\n const featureExperiments: ExperimentType[] = []\n let hasMore = true\n let offset = 0\n const url = new URL(`${baseUrl}/features`)\n if (project) {\n url.searchParams.set('projectId', project)\n }\n\n while (hasMore) {\n url.searchParams.set('offset', offset.toString())\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${secret}`,\n },\n })\n\n const {features, hasMore: responseHasMore, nextOffset} = await response.json()\n\n hasMore = responseHasMore\n offset = nextOffset\n if (!features) continue\n\n features.forEach((feature: GrowthbookFeature) => {\n if (feature.archived) {\n return undefined\n }\n if (tags && feature.tags && !feature.tags.some((tag) => tags.includes(tag))) {\n return undefined\n }\n\n const experiments = feature.environments[environment]?.rules.filter(\n (experiment) => experiment.type === 'experiment-ref' || experiment.type === 'experiment',\n )\n\n if (!experiments) {\n return undefined\n }\n\n const variations: VariantType[] = []\n const uniqueValues = new Set<string>()\n\n experiments.forEach((experiment) => {\n experiment?.variations.forEach((variant) => {\n const value = convertBooleans ? getBooleanConversion(variant.value) : variant.value\n if (!uniqueValues.has(value)) {\n uniqueValues.add(value)\n variations.push({\n id: value,\n label: value,\n })\n }\n })\n })\n const value = {id: feature.id, label: feature.id, variants: variations}\n\n featureExperiments.push(value)\n return undefined\n })\n }\n const sortedFeatureExperiments = featureExperiments.sort((a, b) => a.id.localeCompare(b.id))\n return sortedFeatureExperiments\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, isObjectInputProps} from 'sanity'\n\nimport {fieldLevelExperiments as baseFieldLevelExperiments} from '../fieldExperiments'\nimport {flattenSchemaType} from '../utils/flattenSchemaType'\nimport {GROWTHBOOK_CONFIG_DEFAULT, GrowthbookProvider} from './Components/GrowthbookContext'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\nimport {getExperiments} from './utils'\n\nexport const fieldLevelExperiments = definePlugin<GrowthbookExperimentFieldPluginConfig>(\n (config) => {\n const pluginConfig = {...GROWTHBOOK_CONFIG_DEFAULT, ...config}\n const {fields, environment, project, convertBooleans, baseUrl, tags} = pluginConfig\n return {\n name: 'sanity-growthbook-personalization-plugin-field-level-experiments',\n plugins: [\n baseFieldLevelExperiments({\n fields,\n experiments: (client) =>\n getExperiments({client, environment, baseUrl, project, convertBooleans, tags}),\n }),\n ],\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 flatFieldTypeNames = flattenSchemaType(props.schemaType).map(\n (field) => field.type.name,\n )\n\n const hasExperiment = flatFieldTypeNames.some((name) => name.startsWith('experiment'))\n\n if (!hasExperiment) {\n return props.renderDefault(props)\n }\n\n const providerProps = {\n ...props,\n growthbookFieldPluginConfig: {\n ...pluginConfig,\n },\n }\n return GrowthbookProvider(providerProps)\n },\n },\n },\n }\n },\n)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["() => {\n if (loading) return undefined\n if (!secrets && !loading) {\n setSecret(undefined)\n // oxlint-disable-next-line react/set-state-in-effect\n return setShowSettings(true)\n }\n setSecret(secrets.apiKey)\n return setShowSettings(false)\n }","[secrets, loading, setSecret]","props.renderDefault(props)","props.renderDefault","<SettingsView\n title={'Growthbook secret'}\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setShowSettings(false)\n }}\n />","<>\n <SettingsView\n title={'Growthbook secret'}\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setShowSettings(false)\n }}\n />\n {props.renderDefault(props)}\n </>","{...growthbookFieldPluginConfig, secret, setSecret}","useMemo(\n () => ({...growthbookFieldPluginConfig, secret, setSecret}),\n [growthbookFieldPluginConfig, secret, setSecret],\n )","<Secrets {...props} />","<GrowthbookContext.Provider value={context}>\n <Secrets {...props} />\n </GrowthbookContext.Provider>","GrowthbookContext.Provider"],"sources":["../../src/growthbook/Components/Secrets.tsx","../../src/growthbook/Components/GrowthbookContext.tsx","../../src/growthbook/utils.ts","../../src/growthbook/index.ts"],"sourcesContent":["import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {useEffect, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport {useGrowthbookContext} from './GrowthbookContext'\n\nexport const namespace = 'growthbook'\nexport const apiKeyName = 'apiKey'\n\nconst pluginConfigKeys = [\n {\n key: apiKeyName,\n title: 'Your secret API key',\n },\n]\n\nexport const Secrets = (props: ObjectInputProps) => {\n const {secrets, loading} = useSecrets(namespace) as {secrets: {apiKey: string}; loading: boolean}\n const {setSecret} = useGrowthbookContext()\n const [showSettings, setShowSettings] = useState<boolean>(false)\n\n useEffect(() => {\n if (loading) return undefined\n if (!secrets && !loading) {\n setSecret(undefined)\n // oxlint-disable-next-line react/set-state-in-effect\n return setShowSettings(true)\n }\n setSecret(secrets.apiKey)\n return setShowSettings(false)\n }, [secrets, loading, setSecret])\n\n if (!showSettings) {\n return props.renderDefault(props)\n }\n return (\n <>\n <SettingsView\n title={'Growthbook secret'}\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setShowSettings(false)\n }}\n />\n {props.renderDefault(props)}\n </>\n )\n}\n","import {createContext, useContext, useMemo, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport type {GrowthbookContextProps, GrowthbookExperimentFieldPluginConfig} from '../types'\nimport {Secrets} from './Secrets'\n\nexport const GROWTHBOOK_CONFIG_DEFAULT = {\n baseUrl: 'https://api.growthbook.io/api/v1',\n}\n\nconst GrowthbookContext = createContext<GrowthbookContextProps>({\n setSecret: () => undefined,\n secret: undefined,\n})\n\nexport function useGrowthbookContext() {\n return useContext(GrowthbookContext)\n}\n\ntype GrowthbookProps = ObjectInputProps & {\n growthbookFieldPluginConfig: GrowthbookExperimentFieldPluginConfig\n}\n\nexport function GrowthbookProvider(props: GrowthbookProps) {\n const {growthbookFieldPluginConfig} = props\n const [secret, setSecret] = useState<string | undefined>()\n\n const context = useMemo(\n () => ({...growthbookFieldPluginConfig, secret, setSecret}),\n [growthbookFieldPluginConfig, secret, setSecret],\n )\n\n return (\n <GrowthbookContext.Provider value={context}>\n <Secrets {...props} />\n </GrowthbookContext.Provider>\n )\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {ExperimentType, GrowthbookFeature, VariantType} from '../types'\nimport {apiKeyName, namespace} from './Components/Secrets'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\n\nconst getBooleanConversion = (value: string) => {\n // control is false\n if (value === 'true') {\n return 'variant'\n } else if (value === 'false') {\n return 'control'\n }\n return value\n}\n\nexport const getExperiments = async ({\n client,\n environment,\n baseUrl,\n project,\n convertBooleans,\n tags,\n}: Omit<GrowthbookExperimentFieldPluginConfig, 'fields' | 'baseUrl'> & {\n client: SanityClient\n baseUrl: string\n}): Promise<ExperimentType[]> => {\n const query = `*[_id == 'secrets.${namespace}'][0].secrets.${apiKeyName}`\n\n const secret = await client.fetch(query) // secret is stored in the content lake using @sanity/studio-secrets\n if (!secret) return []\n\n const featureExperiments: ExperimentType[] = []\n let hasMore = true\n let offset = 0\n const url = new URL(`${baseUrl}/features`)\n if (project) {\n url.searchParams.set('projectId', project)\n }\n\n while (hasMore) {\n url.searchParams.set('offset', offset.toString())\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${secret}`,\n },\n })\n\n const {features, hasMore: responseHasMore, nextOffset} = await response.json()\n\n hasMore = responseHasMore\n offset = nextOffset\n if (!features) continue\n\n features.forEach((feature: GrowthbookFeature) => {\n if (feature.archived) {\n return undefined\n }\n if (tags && feature.tags && !feature.tags.some((tag) => tags.includes(tag))) {\n return undefined\n }\n\n const experiments = feature.environments[environment]?.rules.filter(\n (experiment) => experiment.type === 'experiment-ref' || experiment.type === 'experiment',\n )\n\n if (!experiments) {\n return undefined\n }\n\n const variations: VariantType[] = []\n const uniqueValues = new Set<string>()\n\n experiments.forEach((experiment) => {\n experiment?.variations.forEach((variant) => {\n const value = convertBooleans ? getBooleanConversion(variant.value) : variant.value\n if (!uniqueValues.has(value)) {\n uniqueValues.add(value)\n variations.push({\n id: value,\n label: value,\n })\n }\n })\n })\n const value = {id: feature.id, label: feature.id, variants: variations}\n\n featureExperiments.push(value)\n return undefined\n })\n }\n const sortedFeatureExperiments = featureExperiments.sort((a, b) => a.id.localeCompare(b.id))\n return sortedFeatureExperiments\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, isObjectInputProps} from 'sanity'\n\nimport {fieldLevelExperiments as baseFieldLevelExperiments} from '../fieldExperiments'\nimport {flattenSchemaType} from '../utils/flattenSchemaType'\nimport {GROWTHBOOK_CONFIG_DEFAULT, GrowthbookProvider} from './Components/GrowthbookContext'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\nimport {getExperiments} from './utils'\n\nexport const fieldLevelExperiments = definePlugin<GrowthbookExperimentFieldPluginConfig>(\n (config) => {\n const pluginConfig = {...GROWTHBOOK_CONFIG_DEFAULT, ...config}\n const {fields, environment, project, convertBooleans, baseUrl, tags} = pluginConfig\n return {\n name: 'sanity-growthbook-personalization-plugin-field-level-experiments',\n plugins: [\n baseFieldLevelExperiments({\n fields,\n experiments: (client) =>\n getExperiments({client, environment, baseUrl, project, convertBooleans, tags}),\n }),\n ],\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 flatFieldTypeNames = flattenSchemaType(props.schemaType).map(\n (field) => field.type.name,\n )\n\n const hasExperiment = flatFieldTypeNames.some((name) => name.startsWith('experiment'))\n\n if (!hasExperiment) {\n return props.renderDefault(props)\n }\n\n const providerProps = {\n ...props,\n growthbookFieldPluginConfig: {\n ...pluginConfig,\n },\n }\n return GrowthbookProvider(providerProps)\n },\n },\n },\n }\n },\n)\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as ArrayItem, n as flattenSchemaType, r as clearChildrenGroups, t as fieldLevelExperiments } from "./fieldExperiments-
|
|
1
|
+
import { i as ArrayItem, n as flattenSchemaType, r as clearChildrenGroups, t as fieldLevelExperiments } from "./fieldExperiments-p8tDVY-S.js";
|
|
2
2
|
import "@sanity/ui/styles.css";
|
|
3
3
|
import { defineDocumentFieldAction, defineField, definePlugin, defineType, isImage, isObjectInputProps, isReference, set, unset, useClient, useFormValue, useWorkspace } from "sanity";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
@@ -43,7 +43,7 @@ function PersonalizationProvider(props) {
|
|
|
43
43
|
}), $[11] = context, $[12] = t3, $[13] = t4) : t4 = $[13], t4;
|
|
44
44
|
}
|
|
45
45
|
const ArrayInput = (props) => {
|
|
46
|
-
let $ = c(
|
|
46
|
+
let $ = c(28), { onItemAppend, segmentName, segmentId } = props, { segments } = usePersonalizationContext(), t0;
|
|
47
47
|
$[0] !== onItemAppend || $[1] !== segmentId || $[2] !== segmentName ? (t0 = async (segment) => {
|
|
48
48
|
let item = {
|
|
49
49
|
_key: uuid(),
|
|
@@ -52,29 +52,31 @@ const ArrayInput = (props) => {
|
|
|
52
52
|
};
|
|
53
53
|
onItemAppend(item);
|
|
54
54
|
}, $[0] = onItemAppend, $[1] = segmentId, $[2] = segmentName, $[3] = t0) : t0 = $[3];
|
|
55
|
-
let handleClick = t0,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
let handleClick = t0, t1;
|
|
56
|
+
$[4] === props.value ? t1 = $[5] : (t1 = props.value || [], $[4] = props.value, $[5] = t1);
|
|
57
|
+
let values = t1, T0, T1, t2, t3, t4, t5;
|
|
58
|
+
if ($[6] !== handleClick || $[7] !== props || $[8] !== segmentId || $[9] !== segments || $[10] !== values) {
|
|
59
|
+
let usedSegments = values?.map((segment_0) => segment_0[segmentId]);
|
|
60
|
+
T1 = Stack, t4 = 3, $[17] === props ? t5 = $[18] : (t5 = props.renderDefault({
|
|
59
61
|
...props,
|
|
60
62
|
arrayFunctions: _temp$1
|
|
61
|
-
}), $[
|
|
63
|
+
}), $[17] = props, $[18] = t5), T0 = Inline, t2 = 1, t3 = segments.map((segment_1) => /* @__PURE__ */ jsx(Button, {
|
|
62
64
|
text: `Add ${segment_1.label}`,
|
|
63
65
|
mode: "ghost",
|
|
64
66
|
disabled: usedSegments?.includes(segment_1.id),
|
|
65
67
|
onClick: () => handleClick(segment_1)
|
|
66
|
-
}, segment_1.id)), $[
|
|
67
|
-
} else T0 = $[
|
|
68
|
-
let t5;
|
|
69
|
-
$[16] !== T0 || $[17] !== t1 || $[18] !== t2 ? (t5 = /* @__PURE__ */ jsx(T0, {
|
|
70
|
-
gap: t1,
|
|
71
|
-
children: t2
|
|
72
|
-
}), $[16] = T0, $[17] = t1, $[18] = t2, $[19] = t5) : t5 = $[19];
|
|
68
|
+
}, segment_1.id)), $[6] = handleClick, $[7] = props, $[8] = segmentId, $[9] = segments, $[10] = values, $[11] = T0, $[12] = T1, $[13] = t2, $[14] = t3, $[15] = t4, $[16] = t5;
|
|
69
|
+
} else T0 = $[11], T1 = $[12], t2 = $[13], t3 = $[14], t4 = $[15], t5 = $[16];
|
|
73
70
|
let t6;
|
|
74
|
-
|
|
75
|
-
gap:
|
|
76
|
-
children:
|
|
77
|
-
}), $[
|
|
71
|
+
$[19] !== T0 || $[20] !== t2 || $[21] !== t3 ? (t6 = /* @__PURE__ */ jsx(T0, {
|
|
72
|
+
gap: t2,
|
|
73
|
+
children: t3
|
|
74
|
+
}), $[19] = T0, $[20] = t2, $[21] = t3, $[22] = t6) : t6 = $[22];
|
|
75
|
+
let t7;
|
|
76
|
+
return $[23] !== T1 || $[24] !== t4 || $[25] !== t5 || $[26] !== t6 ? (t7 = /* @__PURE__ */ jsxs(T1, {
|
|
77
|
+
gap: t4,
|
|
78
|
+
children: [t5, t6]
|
|
79
|
+
}), $[23] = T1, $[24] = t4, $[25] = t5, $[26] = t6, $[27] = t7) : t7 = $[27], t7;
|
|
78
80
|
};
|
|
79
81
|
function _temp$1() {
|
|
80
82
|
return null;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["equal","createContext","useContext","useMemo","ObjectInputProps","useClient","useWorkspace","suspend","PersonalizationContextProps","PersonalizationFieldPluginConfig","CONFIG_DEFAULT","fields","apiVersion","personalizationNameOverride","segmentNameOverride","segmentId","segmentArrayName","PersonalizationContext","segments","usePersonalizationContext","PersonalizationProps","personalizationFieldPluginConfig","Required","PersonalizationProvider","props","$","_c","t0","client","workspace","t1","Array","isArray","t2","context","t3","renderDefault","t4","Button","Inline","Stack","uuid","useCallback","PersonalizationArrayInputProps","VariantType","usePersonalizationContext","ArrayInput","props","$","_c","onItemAppend","segmentName","segmentId","segments","t0","segment","item","_key","id","_type","handleClick","T0","T1","t1","t2","t3","t4","values","value","Value","usedSegments","map","segment_0","renderDefault","arrayFunctions","_temp","segment_1","label","includes","t5","t6","CloseIcon","useCallback","useMemo","IoMdPeople","defineDocumentFieldAction","DocumentFieldActionItem","DocumentFieldActionProps","FormPatch","ObjectFieldProps","PatchEvent","set","unset","clearChildrenGroups","PatchStuff","onChange","patch","inputId","useAddPersonalizationAction","props","$","_c","active","personalizationNameOverride","t0","handleAddAction","t1","t2","title","type","icon","onAction","renderAsButton","useRemovePersonalizationAction","segmentNameOverride","activeId","segments","handleClearAction","createActions","removeAction","name","useAction","addAction","Field","inputProps","value","actionProps","actions","oldActions","t3","memoizedActions","t4","propsWithClearedGroups","t5","enhancedProps","t6","renderDefault","Button","Inline","Stack","ObjectInputProps","set","useFormValue","SegmentInput","props","$","_c","t0","t1","path","personalizationPath","slice","defaultValue","t2","onChange","handleClick","t3","renderDefault","t4","t5","useEffect","useState","isImage","isReference","ObjectSchemaType","PreviewProps","ReferenceSchemaType","useClient","VariantPreviewProps","usePersonalizationContext","SegmentPreview","props","$","_c","subtitle","setSubtitle","undefined","title","setTitle","media","setMedia","segments","apiVersion","t0","client","segment","value","t1","t2","segmentItem","id","find","selectedSegment","schemaType","label","getSubtitle","doc","getDocument","_ref","type","valueField","fields","_temp","referenceField","referenceType","to","field_0","field","name","_type","selectFields","Record","previewFields","preview","select","Object","keys","forEach","key","valueKey","split","reduce","_temp2","previewContent","prepare","t3","t4","t5","previewProps","renderDefault","acc","index","ArrayOfObjectsInputProps","defineField","definePlugin","defineType","FieldDefinition","isObjectInputProps","ArrayItem","ArrayInput","CONFIG_DEFAULT","Field","PersonalizationProvider","SegmentInput","SegmentPreview","PersonalizationFieldPluginConfig","flattenSchemaType","createPersonalizationType","field","personalizationNameOverride","segmentNameOverride","segmentId","segmentArrayName","typeName","name","usedName","String","toUpperCase","slice","segmentName","type","groups","title","hidden","parent","Array","isArray","components","props","item","fields","group","initialValue","active","input","of","preview","select","base","prepare","media","image","photo","createSegmentType","readOnly","segment","value","fieldSchema","Required","Omit","map","fieldLevelPersonalization","config","pluginConfig","fieldSchemaConfig","schema","types","form","isRootInput","id","renderDefault","flatFields","schemaType","hasPersonalization","some","startsWith","providerProps","personalizationFieldPluginConfig"],"sources":["../src/components/personalization/Context.tsx","../src/components/personalization/Array.tsx","../src/components/personalization/Field.tsx","../src/components/personalization/SegmentInput.tsx","../src/components/personalization/SegmentPreview.tsx","../src/fieldPersonalization.tsx"],"sourcesContent":["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 {PersonalizationContextProps, PersonalizationFieldPluginConfig} from '../../types'\n\n// This provider makes the plugin config available to all components in the document form\n// But with segments resolved\n\nexport const CONFIG_DEFAULT = {\n fields: [],\n apiVersion: '2024-11-07',\n personalizationNameOverride: 'personalization',\n segmentNameOverride: 'segment',\n segmentId: 'segmentId',\n segmentArrayName: 'segments',\n}\n\nconst PersonalizationContext = createContext<PersonalizationContextProps>({\n ...CONFIG_DEFAULT,\n segments: [],\n})\n\nexport function usePersonalizationContext() {\n return useContext(PersonalizationContext)\n}\n\ntype PersonalizationProps = ObjectInputProps & {\n personalizationFieldPluginConfig: Required<PersonalizationFieldPluginConfig>\n}\n\nexport function PersonalizationProvider(props: PersonalizationProps) {\n const {personalizationFieldPluginConfig} = props\n\n const client = useClient({apiVersion: personalizationFieldPluginConfig.apiVersion})\n const workspace = useWorkspace()\n\n // Fetch or return segments\n const segments = Array.isArray(personalizationFieldPluginConfig.segments)\n ? personalizationFieldPluginConfig.segments\n : suspend(\n async () => {\n if (typeof personalizationFieldPluginConfig.segments === 'function') {\n return personalizationFieldPluginConfig.segments(client)\n }\n return personalizationFieldPluginConfig.segments\n },\n [workspace, 'field-level-personalization'],\n {equal},\n )\n\n const context = useMemo(\n () => ({...personalizationFieldPluginConfig, segments}),\n [personalizationFieldPluginConfig, segments],\n )\n\n return (\n <PersonalizationContext.Provider value={context}>\n {props.renderDefault(props)}\n </PersonalizationContext.Provider>\n )\n}\n","import {Button, Inline, Stack} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {useCallback} from 'react'\n\nimport type {PersonalizationArrayInputProps, VariantType} from '../../types'\nimport {usePersonalizationContext} from './Context'\n\nexport const ArrayInput = (props: PersonalizationArrayInputProps) => {\n const {onItemAppend, segmentName, segmentId} = props\n\n const {segments} = usePersonalizationContext()\n\n const handleClick = useCallback(\n async (segment: VariantType) => {\n const item = {\n _key: uuid(),\n [segmentId]: segment.id,\n _type: segmentName,\n }\n\n // Patch the document\n onItemAppend(item)\n },\n [segmentId, segmentName, onItemAppend],\n )\n\n type Value = {\n value?: unknown\n [key: string]: unknown\n segmentId: string\n _key: string\n _type: string\n }\n\n const values = (props.value as Value[]) || []\n\n const usedSegments = values?.map((segment) => segment[segmentId])\n\n return (\n <Stack gap={3}>\n {props.renderDefault({...props, arrayFunctions: () => null})}\n\n <Inline gap={1}>\n {segments.map((segment) => {\n return (\n <Button\n key={segment.id}\n text={`Add ${segment.label}`}\n mode=\"ghost\"\n disabled={usedSegments?.includes(segment.id)}\n onClick={() => handleClick(segment)}\n />\n )\n })}\n </Inline>\n </Stack>\n )\n}\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {useCallback, useMemo} from 'react'\nimport {IoMdPeople} from 'react-icons/io'\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 useAddPersonalizationAction = (\n props: DocumentFieldActionProps &\n PatchStuff & {personalizationNameOverride: string; active: boolean},\n): DocumentFieldActionItem => {\n const {onChange, active, personalizationNameOverride} = props\n\n const handleAddAction = useCallback(() => {\n onChange([set(!active, ['active'])])\n }, [onChange, active])\n\n return {\n title: `Add ${personalizationNameOverride}`,\n type: 'action',\n icon: IoMdPeople,\n onAction: handleAddAction,\n renderAsButton: true,\n }\n}\n\nconst useRemovePersonalizationAction = (\n props: DocumentFieldActionProps &\n PatchStuff & {\n personalizationNameOverride: string\n active: boolean\n segmentNameOverride: string\n },\n): DocumentFieldActionItem => {\n const {onChange, active, personalizationNameOverride, segmentNameOverride} = props\n const handleClearAction = useCallback(() => {\n const activeId = ['active']\n const segments = [`${segmentNameOverride}s`]\n onChange([set(!active, activeId), unset(segments)])\n }, [onChange, active, segmentNameOverride])\n\n return {\n title: `Remove ${personalizationNameOverride}`,\n type: 'action',\n icon: CloseIcon,\n onAction: handleClearAction,\n renderAsButton: true,\n }\n}\n\nconst createActions = ({\n onChange,\n inputId,\n active,\n personalizationNameOverride,\n segmentNameOverride,\n}: PatchStuff & {\n active?: boolean\n personalizationNameOverride: string\n segmentNameOverride: string\n}) => {\n const removeAction = defineDocumentFieldAction({\n name: `Remove ${personalizationNameOverride}`,\n useAction: (props) =>\n useRemovePersonalizationAction({\n ...props,\n active: true,\n onChange,\n inputId,\n personalizationNameOverride,\n segmentNameOverride,\n }),\n })\n const addAction = defineDocumentFieldAction({\n name: `Add ${personalizationNameOverride}`,\n useAction: (props) =>\n useAddPersonalizationAction({\n ...props,\n active: false,\n onChange,\n inputId,\n personalizationNameOverride,\n }),\n })\n return active ? removeAction : addAction\n}\n\nexport const Field = (\n props: ObjectFieldProps & {\n personalizationNameOverride: string\n segmentNameOverride: string\n },\n) => {\n const {onChange} = props.inputProps\n const {inputId, personalizationNameOverride, segmentNameOverride} = props\n const active = props.value?.['active'] as boolean | undefined\n\n const actionProps = useMemo(\n () => ({\n onChange,\n inputId,\n active,\n personalizationNameOverride,\n segmentNameOverride,\n }),\n [onChange, inputId, active, personalizationNameOverride, segmentNameOverride],\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 {Button, Inline, Stack} from '@sanity/ui'\nimport {type ObjectInputProps, set, useFormValue} from 'sanity'\n\nexport const SegmentInput = (props: ObjectInputProps) => {\n const personalizationPath = props.path.slice(0, -2)\n const defaultValue = useFormValue([...personalizationPath, '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 {usePersonalizationContext} from './Context'\n\nexport const SegmentPreview = (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 {segments, apiVersion} = usePersonalizationContext()\n const client = useClient({apiVersion})\n\n const {segment, value} = props as VariantPreviewProps\n\n const selectedSegment = segments.find((segmentItem) => {\n return segmentItem.id === segment\n })\n\n useEffect(() => {\n const getSubtitle = async () => {\n setTitle(selectedSegment?.label)\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, selectedSegment?.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 {\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 Field,\n PersonalizationProvider,\n SegmentInput,\n SegmentPreview,\n} from './components/personalization'\nimport type {PersonalizationFieldPluginConfig} from './types'\nimport {flattenSchemaType} from './utils/flattenSchemaType'\n\nconst createPersonalizationType = ({\n field,\n personalizationNameOverride,\n segmentNameOverride,\n segmentId,\n segmentArrayName,\n}: {\n field: string | FieldDefinition\n personalizationNameOverride: string\n segmentNameOverride: string\n segmentId: string\n segmentArrayName: string\n}) => {\n const typeName = typeof field === `string` ? field : field.name\n const usedName = String(typeName[0]).toUpperCase() + typeName.slice(1)\n const segmentName = `${segmentNameOverride}${usedName}`\n\n return defineType({\n name: `${personalizationNameOverride}${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: 'personalization',\n title: 'Personalization options',\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 personalizationNameOverride={personalizationNameOverride}\n segmentNameOverride={segmentNameOverride}\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: segmentArrayName,\n type: 'array',\n hidden: ({parent}) => {\n return !parent?.active\n },\n group: 'personalization',\n components: {\n input: (props: ArrayOfObjectsInputProps) => (\n <ArrayInput {...props} segmentName={segmentName} segmentId={segmentId} />\n ),\n },\n of: [\n defineField({\n name: segmentName,\n type: segmentName,\n }),\n ],\n }),\n ],\n preview: {\n select: {\n base: 'default',\n },\n prepare: ({base}) => {\n const title =\n typeof base === 'string'\n ? base\n : base && typeof base === 'object'\n ? base.title || base.name || ''\n : ''\n const media =\n base && typeof base === 'object' ? base.image || base.photo || base.media || '' : ''\n return {\n title,\n media,\n }\n },\n },\n })\n}\n\nconst createSegmentType = ({\n field,\n segmentNameOverride,\n segmentId,\n}: {\n field: string | FieldDefinition\n segmentNameOverride: string\n segmentId: 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: `${segmentNameOverride}${usedName}`,\n title: `${segmentNameOverride} array ${usedName}`,\n type: 'object',\n components: {\n preview: SegmentPreview,\n input: SegmentInput,\n },\n fields: [\n {\n type: 'string',\n name: segmentId,\n readOnly: 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 })\n : // Pass in the configured options, but overwrite the name\n {\n ...field,\n name: 'value',\n },\n ],\n preview: {\n select: {\n segment: segmentId,\n value: 'value',\n },\n },\n })\n}\n\nconst fieldSchema = ({\n fields,\n personalizationNameOverride,\n segmentNameOverride,\n segmentId,\n segmentArrayName,\n}: Required<Omit<PersonalizationFieldPluginConfig, 'apiVersion' | 'segments'>>) => {\n return [\n ...fields.map((field) => createSegmentType({field, segmentNameOverride, segmentId})),\n ...fields.map((field) =>\n createPersonalizationType({\n field,\n personalizationNameOverride,\n segmentNameOverride,\n segmentId,\n segmentArrayName,\n }),\n ),\n ]\n}\n\nexport const fieldLevelPersonalization = definePlugin<PersonalizationFieldPluginConfig>(\n (config) => {\n const pluginConfig = {...CONFIG_DEFAULT, ...config}\n const {fields, personalizationNameOverride, segmentNameOverride} = pluginConfig\n\n const segmentArrayName = `${segmentNameOverride}s`\n const segmentId = `${segmentNameOverride}Id`\n\n const fieldSchemaConfig = fieldSchema({\n fields,\n personalizationNameOverride,\n segmentNameOverride,\n segmentId,\n segmentArrayName,\n })\n return {\n name: 'sanity-personalization-plugin-field-level-personalization',\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 hasPersonalization = flatFields.some(\n (field) =>\n field.type.name.startsWith(personalizationNameOverride) ||\n field.name.startsWith(personalizationNameOverride),\n )\n\n if (!hasPersonalization) {\n return props.renderDefault(props)\n }\n\n const providerProps = {\n ...props,\n personalizationFieldPluginConfig: {\n ...pluginConfig,\n segmentId,\n segmentArrayName,\n },\n }\n return <PersonalizationProvider {...providerProps} />\n },\n },\n },\n }\n },\n)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["{apiVersion: personalizationFieldPluginConfig.apiVersion}","apiVersion","Array.isArray(personalizationFieldPluginConfig.segments)\n ? personalizationFieldPluginConfig.segments\n : suspend(\n async () => {\n if (typeof personalizationFieldPluginConfig.segments === 'function') {\n return personalizationFieldPluginConfig.segments(client)\n }\n return personalizationFieldPluginConfig.segments\n },\n [workspace, 'field-level-personalization'],\n {equal},\n )","personalizationFieldPluginConfig.segments","{...personalizationFieldPluginConfig, segments}","useMemo(\n () => ({...personalizationFieldPluginConfig, segments}),\n [personalizationFieldPluginConfig, segments],\n )","props.renderDefault(props)","props.renderDefault","<PersonalizationContext.Provider value={context}>\n {props.renderDefault(props)}\n </PersonalizationContext.Provider>","PersonalizationContext.Provider","async (segment: VariantType) => {\n const item = {\n _key: uuid(),\n [segmentId]: segment.id,\n _type: segmentName,\n }\n\n // Patch the document\n onItemAppend(item)\n }","useCallback(\n async (segment: VariantType) => {\n const item = {\n _key: uuid(),\n [segmentId]: segment.id,\n _type: segmentName,\n }\n\n // Patch the document\n onItemAppend(item)\n },\n [segmentId, segmentName, onItemAppend],\n )","(props.value as Value[]) || []","value","Inline","Stack","1","segments.map((segment) => {\n return (\n <Button\n key={segment.id}\n text={`Add ${segment.label}`}\n mode=\"ghost\"\n disabled={usedSegments?.includes(segment.id)}\n onClick={() => handleClick(segment)}\n />\n )\n })","3","props.renderDefault({...props, arrayFunctions: () => null})","values?.map","segment","() => null","<Inline gap={1}>\n {segments.map((segment) => {\n return (\n <Button\n key={segment.id}\n text={`Add ${segment.label}`}\n mode=\"ghost\"\n disabled={usedSegments?.includes(segment.id)}\n onClick={() => handleClick(segment)}\n />\n )\n })}\n </Inline>","<Stack gap={3}>\n {props.renderDefault({...props, arrayFunctions: () => null})}\n\n <Inline gap={1}>\n {segments.map((segment) => {\n return (\n <Button\n key={segment.id}\n text={`Add ${segment.label}`}\n mode=\"ghost\"\n disabled={usedSegments?.includes(segment.id)}\n onClick={() => handleClick(segment)}\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 ${personalizationNameOverride}`,\n type: 'action',\n icon: IoMdPeople,\n onAction: handleAddAction,\n renderAsButton: true,\n }","`Add ${personalizationNameOverride}`","() => {\n const activeId = ['active']\n const segments = [`${segmentNameOverride}s`]\n onChange([set(!active, activeId), unset(segments)])\n }","useCallback(() => {\n const activeId = ['active']\n const segments = [`${segmentNameOverride}s`]\n onChange([set(!active, activeId), unset(segments)])\n }, [onChange, active, segmentNameOverride])","{\n title: `Remove ${personalizationNameOverride}`,\n type: 'action',\n icon: CloseIcon,\n onAction: handleClearAction,\n renderAsButton: true,\n }","`Remove ${personalizationNameOverride}`","'active'","{\n onChange,\n inputId,\n active,\n personalizationNameOverride,\n segmentNameOverride,\n }","useMemo(\n () => ({\n onChange,\n inputId,\n active,\n personalizationNameOverride,\n segmentNameOverride,\n }),\n [onChange, inputId, active, personalizationNameOverride, segmentNameOverride],\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","useFormValue","[...personalizationPath, '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}","segments.find((segmentItem) => {\n return segmentItem.id === segment\n })","(segmentItem) => {\n return segmentItem.id === segment\n }","() => {\n const getSubtitle = async () => {\n setTitle(selectedSegment?.label)\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","label","(field) => field.name === 'value'","field","(acc: any, index) => acc?.[index]","'media'","'title'","[value, client, selectedSegment?.label, props.schemaType]","selectedSegment?.label","props.renderDefault(previewProps)"],"sources":["../src/components/personalization/Context.tsx","../src/components/personalization/Array.tsx","../src/components/personalization/Field.tsx","../src/components/personalization/SegmentInput.tsx","../src/components/personalization/SegmentPreview.tsx","../src/fieldPersonalization.tsx"],"sourcesContent":["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 {PersonalizationContextProps, PersonalizationFieldPluginConfig} from '../../types'\n\n// This provider makes the plugin config available to all components in the document form\n// But with segments resolved\n\nexport const CONFIG_DEFAULT = {\n fields: [],\n apiVersion: '2024-11-07',\n personalizationNameOverride: 'personalization',\n segmentNameOverride: 'segment',\n segmentId: 'segmentId',\n segmentArrayName: 'segments',\n}\n\nconst PersonalizationContext = createContext<PersonalizationContextProps>({\n ...CONFIG_DEFAULT,\n segments: [],\n})\n\nexport function usePersonalizationContext() {\n return useContext(PersonalizationContext)\n}\n\ntype PersonalizationProps = ObjectInputProps & {\n personalizationFieldPluginConfig: Required<PersonalizationFieldPluginConfig>\n}\n\nexport function PersonalizationProvider(props: PersonalizationProps) {\n const {personalizationFieldPluginConfig} = props\n\n const client = useClient({apiVersion: personalizationFieldPluginConfig.apiVersion})\n const workspace = useWorkspace()\n\n // Fetch or return segments\n const segments = Array.isArray(personalizationFieldPluginConfig.segments)\n ? personalizationFieldPluginConfig.segments\n : suspend(\n async () => {\n if (typeof personalizationFieldPluginConfig.segments === 'function') {\n return personalizationFieldPluginConfig.segments(client)\n }\n return personalizationFieldPluginConfig.segments\n },\n [workspace, 'field-level-personalization'],\n {equal},\n )\n\n const context = useMemo(\n () => ({...personalizationFieldPluginConfig, segments}),\n [personalizationFieldPluginConfig, segments],\n )\n\n return (\n <PersonalizationContext.Provider value={context}>\n {props.renderDefault(props)}\n </PersonalizationContext.Provider>\n )\n}\n","import {Button, Inline, Stack} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {useCallback} from 'react'\n\nimport type {PersonalizationArrayInputProps, VariantType} from '../../types'\nimport {usePersonalizationContext} from './Context'\n\nexport const ArrayInput = (props: PersonalizationArrayInputProps) => {\n const {onItemAppend, segmentName, segmentId} = props\n\n const {segments} = usePersonalizationContext()\n\n const handleClick = useCallback(\n async (segment: VariantType) => {\n const item = {\n _key: uuid(),\n [segmentId]: segment.id,\n _type: segmentName,\n }\n\n // Patch the document\n onItemAppend(item)\n },\n [segmentId, segmentName, onItemAppend],\n )\n\n type Value = {\n value?: unknown\n [key: string]: unknown\n segmentId: string\n _key: string\n _type: string\n }\n\n const values = (props.value as Value[]) || []\n\n const usedSegments = values?.map((segment) => segment[segmentId])\n\n return (\n <Stack gap={3}>\n {props.renderDefault({...props, arrayFunctions: () => null})}\n\n <Inline gap={1}>\n {segments.map((segment) => {\n return (\n <Button\n key={segment.id}\n text={`Add ${segment.label}`}\n mode=\"ghost\"\n disabled={usedSegments?.includes(segment.id)}\n onClick={() => handleClick(segment)}\n />\n )\n })}\n </Inline>\n </Stack>\n )\n}\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {useCallback, useMemo} from 'react'\nimport {IoMdPeople} from 'react-icons/io'\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 useAddPersonalizationAction = (\n props: DocumentFieldActionProps &\n PatchStuff & {personalizationNameOverride: string; active: boolean},\n): DocumentFieldActionItem => {\n const {onChange, active, personalizationNameOverride} = props\n\n const handleAddAction = useCallback(() => {\n onChange([set(!active, ['active'])])\n }, [onChange, active])\n\n return {\n title: `Add ${personalizationNameOverride}`,\n type: 'action',\n icon: IoMdPeople,\n onAction: handleAddAction,\n renderAsButton: true,\n }\n}\n\nconst useRemovePersonalizationAction = (\n props: DocumentFieldActionProps &\n PatchStuff & {\n personalizationNameOverride: string\n active: boolean\n segmentNameOverride: string\n },\n): DocumentFieldActionItem => {\n const {onChange, active, personalizationNameOverride, segmentNameOverride} = props\n const handleClearAction = useCallback(() => {\n const activeId = ['active']\n const segments = [`${segmentNameOverride}s`]\n onChange([set(!active, activeId), unset(segments)])\n }, [onChange, active, segmentNameOverride])\n\n return {\n title: `Remove ${personalizationNameOverride}`,\n type: 'action',\n icon: CloseIcon,\n onAction: handleClearAction,\n renderAsButton: true,\n }\n}\n\nconst createActions = ({\n onChange,\n inputId,\n active,\n personalizationNameOverride,\n segmentNameOverride,\n}: PatchStuff & {\n active?: boolean\n personalizationNameOverride: string\n segmentNameOverride: string\n}) => {\n const removeAction = defineDocumentFieldAction({\n name: `Remove ${personalizationNameOverride}`,\n useAction: (props) =>\n useRemovePersonalizationAction({\n ...props,\n active: true,\n onChange,\n inputId,\n personalizationNameOverride,\n segmentNameOverride,\n }),\n })\n const addAction = defineDocumentFieldAction({\n name: `Add ${personalizationNameOverride}`,\n useAction: (props) =>\n useAddPersonalizationAction({\n ...props,\n active: false,\n onChange,\n inputId,\n personalizationNameOverride,\n }),\n })\n return active ? removeAction : addAction\n}\n\nexport const Field = (\n props: ObjectFieldProps & {\n personalizationNameOverride: string\n segmentNameOverride: string\n },\n) => {\n const {onChange} = props.inputProps\n const {inputId, personalizationNameOverride, segmentNameOverride} = props\n const active = props.value?.['active'] as boolean | undefined\n\n const actionProps = useMemo(\n () => ({\n onChange,\n inputId,\n active,\n personalizationNameOverride,\n segmentNameOverride,\n }),\n [onChange, inputId, active, personalizationNameOverride, segmentNameOverride],\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 {Button, Inline, Stack} from '@sanity/ui'\nimport {type ObjectInputProps, set, useFormValue} from 'sanity'\n\nexport const SegmentInput = (props: ObjectInputProps) => {\n const personalizationPath = props.path.slice(0, -2)\n const defaultValue = useFormValue([...personalizationPath, '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 {usePersonalizationContext} from './Context'\n\nexport const SegmentPreview = (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 {segments, apiVersion} = usePersonalizationContext()\n const client = useClient({apiVersion})\n\n const {segment, value} = props as VariantPreviewProps\n\n const selectedSegment = segments.find((segmentItem) => {\n return segmentItem.id === segment\n })\n\n useEffect(() => {\n const getSubtitle = async () => {\n setTitle(selectedSegment?.label)\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, selectedSegment?.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 {\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 Field,\n PersonalizationProvider,\n SegmentInput,\n SegmentPreview,\n} from './components/personalization'\nimport type {PersonalizationFieldPluginConfig} from './types'\nimport {flattenSchemaType} from './utils/flattenSchemaType'\n\nconst createPersonalizationType = ({\n field,\n personalizationNameOverride,\n segmentNameOverride,\n segmentId,\n segmentArrayName,\n}: {\n field: string | FieldDefinition\n personalizationNameOverride: string\n segmentNameOverride: string\n segmentId: string\n segmentArrayName: string\n}) => {\n const typeName = typeof field === `string` ? field : field.name\n const usedName = String(typeName[0]).toUpperCase() + typeName.slice(1)\n const segmentName = `${segmentNameOverride}${usedName}`\n\n return defineType({\n name: `${personalizationNameOverride}${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: 'personalization',\n title: 'Personalization options',\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 personalizationNameOverride={personalizationNameOverride}\n segmentNameOverride={segmentNameOverride}\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: segmentArrayName,\n type: 'array',\n hidden: ({parent}) => {\n return !parent?.active\n },\n group: 'personalization',\n components: {\n input: (props: ArrayOfObjectsInputProps) => (\n <ArrayInput {...props} segmentName={segmentName} segmentId={segmentId} />\n ),\n },\n of: [\n defineField({\n name: segmentName,\n type: segmentName,\n }),\n ],\n }),\n ],\n preview: {\n select: {\n base: 'default',\n },\n prepare: ({base}) => {\n const title =\n typeof base === 'string'\n ? base\n : base && typeof base === 'object'\n ? base.title || base.name || ''\n : ''\n const media =\n base && typeof base === 'object' ? base.image || base.photo || base.media || '' : ''\n return {\n title,\n media,\n }\n },\n },\n })\n}\n\nconst createSegmentType = ({\n field,\n segmentNameOverride,\n segmentId,\n}: {\n field: string | FieldDefinition\n segmentNameOverride: string\n segmentId: 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: `${segmentNameOverride}${usedName}`,\n title: `${segmentNameOverride} array ${usedName}`,\n type: 'object',\n components: {\n preview: SegmentPreview,\n input: SegmentInput,\n },\n fields: [\n {\n type: 'string',\n name: segmentId,\n readOnly: 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 })\n : // Pass in the configured options, but overwrite the name\n {\n ...field,\n name: 'value',\n },\n ],\n preview: {\n select: {\n segment: segmentId,\n value: 'value',\n },\n },\n })\n}\n\nconst fieldSchema = ({\n fields,\n personalizationNameOverride,\n segmentNameOverride,\n segmentId,\n segmentArrayName,\n}: Required<Omit<PersonalizationFieldPluginConfig, 'apiVersion' | 'segments'>>) => {\n return [\n ...fields.map((field) => createSegmentType({field, segmentNameOverride, segmentId})),\n ...fields.map((field) =>\n createPersonalizationType({\n field,\n personalizationNameOverride,\n segmentNameOverride,\n segmentId,\n segmentArrayName,\n }),\n ),\n ]\n}\n\nexport const fieldLevelPersonalization = definePlugin<PersonalizationFieldPluginConfig>(\n (config) => {\n const pluginConfig = {...CONFIG_DEFAULT, ...config}\n const {fields, personalizationNameOverride, segmentNameOverride} = pluginConfig\n\n const segmentArrayName = `${segmentNameOverride}s`\n const segmentId = `${segmentNameOverride}Id`\n\n const fieldSchemaConfig = fieldSchema({\n fields,\n personalizationNameOverride,\n segmentNameOverride,\n segmentId,\n segmentArrayName,\n })\n return {\n name: 'sanity-personalization-plugin-field-level-personalization',\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 hasPersonalization = flatFields.some(\n (field) =>\n field.type.name.startsWith(personalizationNameOverride) ||\n field.name.startsWith(personalizationNameOverride),\n )\n\n if (!hasPersonalization) {\n return props.renderDefault(props)\n }\n\n const providerProps = {\n ...props,\n personalizationFieldPluginConfig: {\n ...pluginConfig,\n segmentId,\n segmentArrayName,\n },\n }\n return <PersonalizationProvider {...providerProps} />\n },\n },\n },\n }\n },\n)\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-
|
|
1
|
+
import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-p8tDVY-S.js";
|
|
2
2
|
import "@sanity/ui/styles.css";
|
|
3
3
|
import { definePlugin, isObjectInputProps } from "sanity";
|
|
4
4
|
import { c } from "react/compiler-runtime";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["SettingsView","useSecrets","useEffect","useState","ObjectInputProps","useLaunchDarklyContext","namespace","pluginConfigKeys","key","title","Secrets","props","$","_c","secrets","loading","apiKey","setSecret","showSettings","setShowSettings","t0","t1","undefined","t2","renderDefault","Symbol","for","t3","t4","createContext","useContext","useMemo","useState","ObjectInputProps","LaunchDarklyContextProps","LaunchDarklyFieldLevelConfig","Secrets","LAUNCHDARKLY_CONFIG_DEFAULT","LaunchDarklyContext","setSecret","undefined","secret","useLaunchDarklyContext","LaunchDarklyProps","launchDarklyFieldPluginConfig","LaunchDarklyProvider","props","$","_c","t0","context","t1","t2","SanityClient","ExperimentType","LaunchDarklyFieldLevelConfig","LaunchDarklyFlagItem","getExperiments","client","projectKey","tags","Omit","Promise","query","secret","fetch","url","URL","searchParams","set","join","featureExperiments","hasMore","offset","limit","toString","responseFlags","headers","Authorization","items","json","experiments","map","flag","id","key","label","name","variants","variations","variation","value","push","length","definePlugin","isObjectInputProps","fieldLevelExperiments","baseFieldLevelExperiments","flattenSchemaType","LAUNCHDARKLY_CONFIG_DEFAULT","LaunchDarklyProvider","LaunchDarklyFieldLevelConfig","getExperiments","config","pluginConfig","fields","projectKey","tags","name","plugins","experiments","client","experimentNameOverride","form","components","input","props","isRootInput","id","renderDefault","flatFieldTypeNames","schemaType","map","field","type","hasExperiment","some","startsWith","providerProps","launchDarklyFieldPluginConfig"],"sources":["../../src/launchDarkly/components/Secrets.tsx","../../src/launchDarkly/components/LaunchDarklyContext.tsx","../../src/launchDarkly/utils.ts","../../src/launchDarkly/index.ts"],"sourcesContent":["import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {useEffect, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport {useLaunchDarklyContext} from './LaunchDarklyContext'\n\nconst namespace = 'launchdarkly'\nconst pluginConfigKeys = [\n {\n key: 'apiKey',\n title: 'Your secret API key',\n },\n]\n\nexport const Secrets = (props: ObjectInputProps) => {\n const {secrets, loading} = useSecrets(namespace) as {secrets: {apiKey: string}; loading: boolean}\n const {setSecret} = useLaunchDarklyContext()\n const [showSettings, setShowSettings] = useState<boolean>(false)\n\n useEffect(() => {\n if (loading) return undefined\n if (!secrets && !loading) {\n setSecret(undefined)\n // oxlint-disable-next-line react/set-state-in-effect\n return setShowSettings(true)\n }\n setSecret(secrets.apiKey)\n return setShowSettings(false)\n }, [secrets, loading, setSecret])\n\n if (!showSettings) {\n return props.renderDefault(props)\n }\n return (\n <>\n <SettingsView\n title={`${namespace} api key`}\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setShowSettings(false)\n }}\n />\n {props.renderDefault(props)}\n </>\n )\n}\n","import {createContext, useContext, useMemo, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport type {LaunchDarklyContextProps, LaunchDarklyFieldLevelConfig} from '../types'\nimport {Secrets} from './Secrets'\n\nexport const LAUNCHDARKLY_CONFIG_DEFAULT = {}\n\nconst LaunchDarklyContext = createContext<LaunchDarklyContextProps>({\n setSecret: () => undefined,\n secret: undefined,\n})\n\nexport function useLaunchDarklyContext() {\n return useContext(LaunchDarklyContext)\n}\n\ntype LaunchDarklyProps = ObjectInputProps & {\n launchDarklyFieldPluginConfig: LaunchDarklyFieldLevelConfig\n}\n\nexport function LaunchDarklyProvider(props: LaunchDarklyProps) {\n const {launchDarklyFieldPluginConfig} = props\n const [secret, setSecret] = useState<string | undefined>()\n\n const context = useMemo(\n () => ({...launchDarklyFieldPluginConfig, secret, setSecret}),\n [launchDarklyFieldPluginConfig, secret, setSecret],\n )\n\n return (\n <LaunchDarklyContext.Provider value={context}>\n <Secrets {...props} />\n </LaunchDarklyContext.Provider>\n )\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {ExperimentType} from '../types'\nimport type {LaunchDarklyFieldLevelConfig, LaunchDarklyFlagItem} from './types'\n\nexport const getExperiments = async ({\n client,\n projectKey,\n tags,\n}: Omit<LaunchDarklyFieldLevelConfig, 'fields'> & {client: SanityClient}): Promise<\n ExperimentType[]\n> => {\n const query = `*[_id == 'secrets.launchdarkly'][0].secrets.apiKey`\n\n const secret = await client.fetch(query) // secret is stored in the content lake using @sanity/studio-secrets\n if (!secret) return []\n\n const url = new URL(`https://app.launchdarkly.com/api/v2/flags/${projectKey}`)\n\n if (tags) {\n url.searchParams.set('filter', `tags:${tags.join('+')}`)\n }\n\n const featureExperiments: ExperimentType[] = []\n let hasMore = true\n let offset = 0\n const limit = 10\n\n while (hasMore) {\n url.searchParams.set('offset', offset.toString())\n url.searchParams.set('limit', limit.toString())\n const responseFlags = await fetch(url, {\n headers: {\n Authorization: secret,\n },\n })\n\n const {items} = await responseFlags.json()\n const experiments = items.map((flag: LaunchDarklyFlagItem) => ({\n id: flag.key,\n label: flag.name,\n variants: flag.variations.map((variation) => ({\n id: variation.value.toString(),\n label: variation.name ?? variation.value.toString(),\n })),\n }))\n featureExperiments.push(...experiments)\n if (items.length === limit) {\n offset += limit\n } else {\n hasMore = false\n }\n }\n\n return featureExperiments\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, isObjectInputProps} from 'sanity'\n\nimport {fieldLevelExperiments as baseFieldLevelExperiments} from '../fieldExperiments'\nimport {flattenSchemaType} from '../utils/flattenSchemaType'\nimport {LAUNCHDARKLY_CONFIG_DEFAULT, LaunchDarklyProvider} from './components/LaunchDarklyContext'\nimport type {LaunchDarklyFieldLevelConfig} from './types'\nimport {getExperiments} from './utils'\n\nexport const fieldLevelExperiments = definePlugin<LaunchDarklyFieldLevelConfig>((config) => {\n const pluginConfig = {...LAUNCHDARKLY_CONFIG_DEFAULT, ...config}\n const {fields, projectKey, tags} = pluginConfig\n return {\n name: 'sanity-launchdarkly-personalization-plugin-field-level-experiments',\n plugins: [\n baseFieldLevelExperiments({\n fields,\n experiments: (client) => getExperiments({client, projectKey, tags}),\n experimentNameOverride: 'flag',\n }),\n ],\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 flatFieldTypeNames = flattenSchemaType(props.schemaType).map(\n (field) => field.type.name,\n )\n\n const hasExperiment = flatFieldTypeNames.some((name) => name.startsWith('flag'))\n\n if (!hasExperiment) {\n return props.renderDefault(props)\n }\n\n const providerProps = {\n ...props,\n launchDarklyFieldPluginConfig: {\n ...pluginConfig,\n },\n }\n return LaunchDarklyProvider(providerProps)\n },\n },\n },\n }\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["() => {\n if (loading) return undefined\n if (!secrets && !loading) {\n setSecret(undefined)\n // oxlint-disable-next-line react/set-state-in-effect\n return setShowSettings(true)\n }\n setSecret(secrets.apiKey)\n return setShowSettings(false)\n }","[secrets, loading, setSecret]","props.renderDefault(props)","props.renderDefault","<SettingsView\n title={`${namespace} api key`}\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setShowSettings(false)\n }}\n />","<>\n <SettingsView\n title={`${namespace} api key`}\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setShowSettings(false)\n }}\n />\n {props.renderDefault(props)}\n </>","{...launchDarklyFieldPluginConfig, secret, setSecret}","useMemo(\n () => ({...launchDarklyFieldPluginConfig, secret, setSecret}),\n [launchDarklyFieldPluginConfig, secret, setSecret],\n )","<Secrets {...props} />","<LaunchDarklyContext.Provider value={context}>\n <Secrets {...props} />\n </LaunchDarklyContext.Provider>","LaunchDarklyContext.Provider"],"sources":["../../src/launchDarkly/components/Secrets.tsx","../../src/launchDarkly/components/LaunchDarklyContext.tsx","../../src/launchDarkly/utils.ts","../../src/launchDarkly/index.ts"],"sourcesContent":["import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {useEffect, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport {useLaunchDarklyContext} from './LaunchDarklyContext'\n\nconst namespace = 'launchdarkly'\nconst pluginConfigKeys = [\n {\n key: 'apiKey',\n title: 'Your secret API key',\n },\n]\n\nexport const Secrets = (props: ObjectInputProps) => {\n const {secrets, loading} = useSecrets(namespace) as {secrets: {apiKey: string}; loading: boolean}\n const {setSecret} = useLaunchDarklyContext()\n const [showSettings, setShowSettings] = useState<boolean>(false)\n\n useEffect(() => {\n if (loading) return undefined\n if (!secrets && !loading) {\n setSecret(undefined)\n // oxlint-disable-next-line react/set-state-in-effect\n return setShowSettings(true)\n }\n setSecret(secrets.apiKey)\n return setShowSettings(false)\n }, [secrets, loading, setSecret])\n\n if (!showSettings) {\n return props.renderDefault(props)\n }\n return (\n <>\n <SettingsView\n title={`${namespace} api key`}\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setShowSettings(false)\n }}\n />\n {props.renderDefault(props)}\n </>\n )\n}\n","import {createContext, useContext, useMemo, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport type {LaunchDarklyContextProps, LaunchDarklyFieldLevelConfig} from '../types'\nimport {Secrets} from './Secrets'\n\nexport const LAUNCHDARKLY_CONFIG_DEFAULT = {}\n\nconst LaunchDarklyContext = createContext<LaunchDarklyContextProps>({\n setSecret: () => undefined,\n secret: undefined,\n})\n\nexport function useLaunchDarklyContext() {\n return useContext(LaunchDarklyContext)\n}\n\ntype LaunchDarklyProps = ObjectInputProps & {\n launchDarklyFieldPluginConfig: LaunchDarklyFieldLevelConfig\n}\n\nexport function LaunchDarklyProvider(props: LaunchDarklyProps) {\n const {launchDarklyFieldPluginConfig} = props\n const [secret, setSecret] = useState<string | undefined>()\n\n const context = useMemo(\n () => ({...launchDarklyFieldPluginConfig, secret, setSecret}),\n [launchDarklyFieldPluginConfig, secret, setSecret],\n )\n\n return (\n <LaunchDarklyContext.Provider value={context}>\n <Secrets {...props} />\n </LaunchDarklyContext.Provider>\n )\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {ExperimentType} from '../types'\nimport type {LaunchDarklyFieldLevelConfig, LaunchDarklyFlagItem} from './types'\n\nexport const getExperiments = async ({\n client,\n projectKey,\n tags,\n}: Omit<LaunchDarklyFieldLevelConfig, 'fields'> & {client: SanityClient}): Promise<\n ExperimentType[]\n> => {\n const query = `*[_id == 'secrets.launchdarkly'][0].secrets.apiKey`\n\n const secret = await client.fetch(query) // secret is stored in the content lake using @sanity/studio-secrets\n if (!secret) return []\n\n const url = new URL(`https://app.launchdarkly.com/api/v2/flags/${projectKey}`)\n\n if (tags) {\n url.searchParams.set('filter', `tags:${tags.join('+')}`)\n }\n\n const featureExperiments: ExperimentType[] = []\n let hasMore = true\n let offset = 0\n const limit = 10\n\n while (hasMore) {\n url.searchParams.set('offset', offset.toString())\n url.searchParams.set('limit', limit.toString())\n const responseFlags = await fetch(url, {\n headers: {\n Authorization: secret,\n },\n })\n\n const {items} = await responseFlags.json()\n const experiments = items.map((flag: LaunchDarklyFlagItem) => ({\n id: flag.key,\n label: flag.name,\n variants: flag.variations.map((variation) => ({\n id: variation.value.toString(),\n label: variation.name ?? variation.value.toString(),\n })),\n }))\n featureExperiments.push(...experiments)\n if (items.length === limit) {\n offset += limit\n } else {\n hasMore = false\n }\n }\n\n return featureExperiments\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, isObjectInputProps} from 'sanity'\n\nimport {fieldLevelExperiments as baseFieldLevelExperiments} from '../fieldExperiments'\nimport {flattenSchemaType} from '../utils/flattenSchemaType'\nimport {LAUNCHDARKLY_CONFIG_DEFAULT, LaunchDarklyProvider} from './components/LaunchDarklyContext'\nimport type {LaunchDarklyFieldLevelConfig} from './types'\nimport {getExperiments} from './utils'\n\nexport const fieldLevelExperiments = definePlugin<LaunchDarklyFieldLevelConfig>((config) => {\n const pluginConfig = {...LAUNCHDARKLY_CONFIG_DEFAULT, ...config}\n const {fields, projectKey, tags} = pluginConfig\n return {\n name: 'sanity-launchdarkly-personalization-plugin-field-level-experiments',\n plugins: [\n baseFieldLevelExperiments({\n fields,\n experiments: (client) => getExperiments({client, projectKey, tags}),\n experimentNameOverride: 'flag',\n }),\n ],\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 flatFieldTypeNames = flattenSchemaType(props.schemaType).map(\n (field) => field.type.name,\n )\n\n const hasExperiment = flatFieldTypeNames.some((name) => name.startsWith('flag'))\n\n if (!hasExperiment) {\n return props.renderDefault(props)\n }\n\n const providerProps = {\n ...props,\n launchDarklyFieldPluginConfig: {\n ...pluginConfig,\n },\n }\n return LaunchDarklyProvider(providerProps)\n },\n },\n },\n }\n})\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/personalization-plugin",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.4",
|
|
4
4
|
"description": "Plugin to help with personalization, a/b testing when using Sanity",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -35,14 +35,14 @@
|
|
|
35
35
|
"fast-deep-equal": "^3.1.3",
|
|
36
36
|
"react-icons": "^5.7.0",
|
|
37
37
|
"suspend-react": "^0.1.3",
|
|
38
|
-
"@sanity/studio-secrets": "^4.0.
|
|
38
|
+
"@sanity/studio-secrets": "^4.0.19"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@sanity/tsconfig": "^2.2.1",
|
|
42
42
|
"@sanity/tsdown-config": "^0.26.0",
|
|
43
43
|
"@types/react": "^19.2.18",
|
|
44
44
|
"@types/react-dom": "^19.2.4",
|
|
45
|
-
"
|
|
45
|
+
"oxc-transform-react": "^0.145.0",
|
|
46
46
|
"react": "^19.2.8",
|
|
47
47
|
"react-dom": "^19.2.8",
|
|
48
48
|
"sanity": "^6.10.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fieldExperiments-CPrY-K44.js","names":["useEffect","ObjectItem","ObjectItemProps","set","ArrayItem","props","$","_c","active","value","onChange","inputProps","t0","t1","t2","renderDefault","equal","createContext","useContext","useMemo","ObjectInputProps","useClient","useWorkspace","suspend","ExperimentContextProps","ExperimentFieldPluginConfig","CONFIG_DEFAULT","fields","apiVersion","experimentNameOverride","variantNameOverride","variantId","variantArrayName","experimentId","ExperimentContext","experiments","useExperimentContext","ExperimentProps","experimentFieldPluginConfig","Required","ExperimentProvider","props","$","_c","t0","client","workspace","t1","Array","isArray","t2","context","t3","renderDefault","t4","Button","Inline","Stack","uuid","useCallback","useFormValue","ArrayInputProps","VariantType","useExperimentContext","ArrayInput","props","$","_c","experimentId","onItemAppend","t0","t1","variantId","variantName","fieldPath","path","slice","experimentValue","experiments","t2","variant","item","_key","id","_type","handleClick","T0","T1","t3","t4","t5","t6","filteredVariants","find","option","variants","values","value","Value","usedVariants","map","variant_0","renderDefault","arrayFunctions","_temp","variant_1","label","includes","t7","t8","ObjectFieldProps","clearChildrenGroups","props","children","innerChild","Array","isArray","groups","CloseIcon","useCallback","useMemo","GiSoapExperiment","defineDocumentFieldAction","DocumentFieldActionItem","DocumentFieldActionProps","FormPatch","ObjectFieldProps","PatchEvent","set","unset","clearChildrenGroups","PatchStuff","onChange","patch","inputId","useAddExperimentAction","props","$","_c","active","experimentNameOverride","t0","handleAddAction","t1","t2","title","type","icon","onAction","renderAsButton","useRemoveExperimentAction","experimentId","variantNameOverride","activeId","experiment","variants","handleClearAction","createActions","removeAction","name","useAction","addAction","Field","inputProps","value","actionProps","actions","oldActions","t3","memoizedActions","t4","propsWithClearedGroups","t5","enhancedProps","t6","renderDefault","Select","SanitySelect","ChangeEvent","FormPatch","PatchEvent","StringInputProps","SelectOption","props","$","_c","value","onChange","elementProps","listOptions","handleChange","t0","Symbol","for","t1","t2","event","t3","t4","map","_temp","t5","optionValue","title","Card","Text","ChangeEvent","useCallback","useMemo","FormPatch","getPublishedId","PatchEvent","set","StringInputProps","unset","useDocumentOperation","useFormValue","ExperimentType","Select","useExperimentContext","SelectOption","title","value","formatlistOptions","experiments","map","experiment","label","id","Input","props","$","_c","t0","Symbol","for","t1","path","variantNameOverride","slice","additionalChangePath","subValues","t2","patch","schemaType","name","t3","event","onChange","inputValue","currentTarget","patchEvent","join","execute","handleChange","length","t4","t5","t6","experimentNameOverride","Button","Inline","Stack","ObjectInputProps","set","useFormValue","VariantInput","props","$","_c","t0","t1","path","experimentPath","slice","defaultValue","t2","onChange","handleClick","t3","renderDefault","t4","t5","useEffect","useState","isImage","isReference","ObjectSchemaType","PreviewProps","ReferenceSchemaType","useClient","VariantPreviewProps","useExperimentContext","VariantPreview","props","$","_c","subtitle","setSubtitle","undefined","title","setTitle","media","setMedia","experiments","apiVersion","t0","client","experiment","variant","value","selectedExperiment","t1","t2","experimentItem","id","find","variants","variantItem","selectedVariant","schemaType","getSubtitle","label","doc","getDocument","_ref","type","valueField","fields","_temp","referenceField","referenceType","to","field_0","field","name","_type","selectFields","Record","previewFields","preview","select","Object","keys","forEach","key","valueKey","split","reduce","_temp2","previewContent","prepare","t3","t4","t5","t6","previewProps","renderDefault","acc","index","isDocumentSchemaType","ObjectField","Path","SchemaType","ObjectFieldWithPath","flattenSchemaType","schemaType","console","error","extractInnerFields","fields","path","maxDepth","length","result","field","push","name","type","jsonType","arrayTypes","of","arrayType","ArrayOfObjectsInputProps","defineField","definePlugin","defineType","FieldDefinition","isObjectInputProps","ArrayItem","ArrayInput","CONFIG_DEFAULT","ExperimentProvider","Field","Input","VariantInput","VariantPreview","ExperimentFieldPluginConfig","flattenSchemaType","createExperimentType","field","experimentNameOverride","variantNameOverride","variantId","variantArrayName","experimentId","typeName","name","usedName","String","toUpperCase","slice","variantName","type","groups","title","hidden","parent","Array","isArray","components","props","item","fields","group","initialValue","input","active","of","preview","select","base","experiment","prepare","experimentTitle","media","image","photo","subtitle","createVariantType","readOnly","variant","value","fieldSchema","Required","Omit","map","fieldLevelExperiments","config","pluginConfig","fieldSchemaConfig","schema","types","form","isRootInput","id","renderDefault","flatFields","schemaType","hasExperiment","some","startsWith","providerProps","experimentFieldPluginConfig"],"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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"}
|