@sanity/personalization-plugin 3.1.0 → 3.1.2
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-D9NPbCCN.js → fieldExperiments-CPrY-K44.js} +14 -10
- package/dist/{fieldExperiments-D9NPbCCN.js.map → fieldExperiments-CPrY-K44.js.map} +1 -1
- package/dist/growthbook/index.d.ts +1 -0
- package/dist/growthbook/index.d.ts.map +1 -1
- package/dist/growthbook/index.js +2 -1
- package/dist/growthbook/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -9
- package/dist/index.js.map +1 -1
- package/dist/launchDarkly/index.d.ts +1 -0
- package/dist/launchDarkly/index.d.ts.map +1 -1
- package/dist/launchDarkly/index.js +2 -1
- package/dist/launchDarkly/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -534,17 +534,21 @@ const createExperimentType = ({ field, experimentNameOverride, variantNameOverri
|
|
|
534
534
|
variantArrayName,
|
|
535
535
|
experimentId
|
|
536
536
|
}) },
|
|
537
|
-
form: { components: { input: (props) =>
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
...
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
537
|
+
form: { components: { input: (props) => {
|
|
538
|
+
if (!(props.id === "root" && isObjectInputProps(props)) || !flattenSchemaType(props.schemaType).some((field) => field.type.name.startsWith(experimentNameOverride) || field.name.startsWith(experimentNameOverride))) return props.renderDefault(props);
|
|
539
|
+
let providerProps = {
|
|
540
|
+
...props,
|
|
541
|
+
experimentFieldPluginConfig: {
|
|
542
|
+
...pluginConfig,
|
|
543
|
+
variantId,
|
|
544
|
+
variantArrayName,
|
|
545
|
+
experimentId
|
|
546
|
+
}
|
|
547
|
+
};
|
|
548
|
+
return /* @__PURE__ */ jsx(ExperimentProvider, { ...providerProps });
|
|
549
|
+
} } }
|
|
546
550
|
};
|
|
547
551
|
});
|
|
548
552
|
export { ArrayItem as i, flattenSchemaType as n, clearChildrenGroups as r, fieldLevelExperiments as t };
|
|
549
553
|
|
|
550
|
-
//# sourceMappingURL=fieldExperiments-
|
|
554
|
+
//# sourceMappingURL=fieldExperiments-CPrY-K44.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldExperiments-D9NPbCCN.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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"}
|
|
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":";;;;;;;;;;AAGA,MAAaI,aAAYC,UAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GACvB,EAAAC,WAAiBH,MAAKI,OACtB,EAAAC,aAAmBL,MAAKM,YAAWC,IAAAC;CAEnCb,AAFmCM,EAAA,OAAAE,UAAAF,EAAA,OAAAI,YAEzBE,WAAA;EACR,AAAKJ,UACHE,SAASP,IAAI,IAAM,CAAC,QAAQ,CAAC,CAAC;CAC/B,GACAU,KAAA,CAACL,QAAQE,QAAQ,GAACJ,EAAA,KAAAE,QAAAF,EAAA,KAAAI,UAAAJ,EAAA,KAAAM,IAAAN,EAAA,KAAAO,OAAAD,KAAAN,EAAA,IAAAO,KAAAP,EAAA,KAJrBN,UAAUY,IAIPC,EAAkB;CAAC,IAAAC;CAEW,OAFXR,EAAA,OAAAD,QAEWS,KAAAR,EAAA,MAA1BQ,KAAAT,MAAKU,cAAeV,KAAK,GAACC,EAAA,KAAAD,OAAAC,EAAA,KAAAQ,KAA1BA;AAA0B,GCHtBY,iBAAiB;CAC5BC,QAAQ,CAAA;CACRC,YAAY;CACZC,wBAAwB;CACxBC,qBAAqB;CACrBC,WAAW;CACXC,kBAAkB;CAClBC,cAAc;AAChB,GAEMC,oBAAoBjB,cAAsC;CAC9D,GAAGS;CACHS,aAAa,CAAA;AACf,CAAC;AAED,SAAOC,uBAAA;CAAA,OACElB,WAAWgB,iBAAiB;AAAC;AAOtC,SAAOM,mBAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,EAAAL,gCAAsCG,OAAKG;CAAA,AAAAF,EAAA,OAAAJ,4BAAAV,aAEkCgB,KAAAF,EAAA,MAApDE,KAAA,EAAAhB,YAAaU,4BAA2BV,WAAW,GAACc,EAAA,KAAAJ,4BAAAV,YAAAc,EAAA,KAAAE;CAA7E,IAAAC,SAAexB,UAAUuB,EAAoD,GAC7EE,YAAkBxB,aAAa,GAACyB;CAAA,AAAAL,EAAA,OAAAG,UAAAH,EAAA,OAAAJ,+BAAAI,EAAA,OAAAI,aAGZC,KAAAC,MAAKC,QAASX,4BAA2BH,WAWzD,IAVAG,4BAA2BH,cAC3BZ,QACE,YACM,OAAOe,4BAA2BH,eAAiB,aAC9CG,4BAA2BH,YAAaU,MAAM,IAEhDP,4BAA2BH,aAEpC,CAACW,WAAW,yBAAyB,GACrC,EAAA9B,MAAM,CACR,GAAC0B,EAAA,KAAAG,QAAAH,EAAA,KAAAJ,6BAAAI,EAAA,KAAAI,WAAAJ,EAAA,KAAAK,MAAAA,KAAAL,EAAA;CAXL,IAAAP,cAAoBY,IAWfG;CAAA,AAAAR,EAAA,OAAAJ,+BAAAI,EAAA,OAAAP,eAGIe,KAAA;EAAA,GAAIZ;EAA2BH;CAAa,GAACO,EAAA,KAAAJ,6BAAAI,EAAA,KAAAP,aAAAO,EAAA,KAAAQ,MAAAA,KAAAR,EAAA;CADtD,IAAAS,UACSD,IAERE;CAAA,AAAAV,EAAA,OAAAD,QAI8BW,KAAAV,EAAA,OAA1BU,KAAAX,MAAKY,cAAeZ,KAAK,GAACC,EAAA,KAAAD,OAAAC,EAAA,MAAAU;CAAA,IAAAE;CACA,OADAZ,EAAA,QAAAS,WAAAT,EAAA,QAAAU,MAD7BE,KAAA,oBAAA,kBAAA,UAAA;EAAmCH,OAAAA;EAChCC,UAAAA;CACH,CAAA,GAA6BV,EAAA,MAAAS,SAAAT,EAAA,MAAAU,IAAAV,EAAA,MAAAY,MAAAA,KAAAZ,EAAA,KAF7BY;AAE6B;ACrDjC,MAAaU,cAAaC,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAAC,cAAAC,cAAAC,IAAAC,IAAAC,WAAAC;CAAA,IAAAP,EAAA,OAAAD,OAAA;EACxB,IAAAS,YAAkBT,MAAKU,KAAKC,MAAO,GAAG,EAAE;EAEyBV,CADjE,CAAAG,cAAAI,aAAAD,WAAAJ,gBAA6DH,QACrCL,KAAAA,cAAaW,KAAA,CAAA,GAAIG,WAAWN,YAAY,GAACF,EAAA,KAAAD,OAAAC,EAAA,KAAAE,cAAAF,EAAA,KAAAG,cAAAH,EAAA,KAAAI,IAAAJ,EAAA,KAAAK,IAAAL,EAAA,KAAAM,WAAAN,EAAA,KAAAO;CAAA,OAAAA,AAAAL,eAAAF,EAAA,IAAAG,eAAAH,EAAA,IAAAI,KAAAJ,EAAA,IAAAK,KAAAL,EAAA,IAAAM,YAAAN,EAAA,IAAAO,cAAAP,EAAA;CAAjE,IAAAW,kBAAwBjB,GAAaW,EAA4B,GAEjE,EAAAO,gBAAsBf,qBAAqB,GAACgB;CAAA,AAAAb,EAAA,OAAAE,gBAAAF,EAAA,OAAAW,mBAAAX,EAAA,OAAAG,gBAAAH,EAAA,QAAAM,aAAAN,EAAA,QAAAO,eAG1CM,KAAA,OAAAC,YAAA;EACE,IAAAC,OAAa;GAAAC,MACLxB,KAAK;IACVc,YAAYQ,QAAOG;IACnBf,eAAeS;GAAeO,OACxBX;EACT;EAGAJ,aAAaY,IAAI;CAAC,GACnBf,EAAA,KAAAE,cAAAF,EAAA,KAAAW,iBAAAX,EAAA,KAAAG,cAAAH,EAAA,MAAAM,WAAAN,EAAA,MAAAO,aAAAP,EAAA,MAAAa,MAAAA,KAAAb,EAAA;CAXH,IAAAmB,cAAoBN,IAanBO,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC;CAAA,IAAAzB,EAAA,QAAAW,mBAAAX,EAAA,QAAAY,eAAAZ,EAAA,QAAAmB,eAAAnB,EAAA,QAAAD,SAAAC,EAAA,QAAAM,WAAA;EAED,IAAAoB,mBACEd,YAAWe,MAAMC,WACRA,OAAMX,OAAQN,eACZ,CAAC,EAAAkB,YAFZ,CAAA,GAeFI,gBAFgBlC,MAAKgC,SAAN,CAAA,EAAA,EAEYG,KAAMC,cAAarB,UAAQR,UAAU;EAiBxDN,AAdLqB,KAAA9B,OAAWiC,KAAA,GAACxB,EAAA,QAAAD,QACiD0B,KAAAzB,EAAA,OAA3DyB,KAAA1B,MAAKqC,cAAe;GAAA,GAAIrC;GAAKsC,gBAAkBC;EAAU,CAAC,GAACtC,EAAA,MAAAD,OAAAC,EAAA,MAAAyB,KAE3DL,KAAA9B,QAAYgC,KAAA,GACVC,KAAAG,iBAAgBQ,KAAKK,cAElB,oBAAC,QAAD;GAEQ,MAAA,OAAOzB,UAAO0B;GACf,MAAA;GACK,UAAAP,cAAYQ,SAAW3B,UAAOG,EAAG;GAClC,eAAME,YAAYL,SAAO;EAAC,GAJ9B,GAAGH,gBAAe,GAAIG,UAAOG,IAIC,CAGxC,GAACjB,EAAA,MAAAW,iBAAAX,EAAA,MAAAY,aAAAZ,EAAA,MAAAmB,aAAAnB,EAAA,MAAAD,OAAAC,EAAA,MAAAM,WAAAN,EAAA,MAAAoB,IAAApB,EAAA,MAAAqB,IAAArB,EAAA,MAAAsB,IAAAtB,EAAA,MAAAuB,IAAAvB,EAAA,MAAAwB,IAAAxB,EAAA,MAAAyB;CAAA,OAAAA,AAAAL,KAAApB,EAAA,KAAAqB,KAAArB,EAAA,KAAAsB,KAAAtB,EAAA,KAAAuB,KAAAvB,EAAA,KAAAwB,KAAAxB,EAAA,KAAAyB,KAAAzB,EAAA;CAAA,IAAA0C;CAAA,AAAA1C,EAAA,QAAAoB,MAAApB,EAAA,QAAAsB,MAAAtB,EAAA,QAAAuB,MAXJmB,KAAA,oBAAC,IAAD;EAAa,KAAApB;EACVC,UAAAA;CADI,CAAA,GAYEvB,EAAA,MAAAoB,IAAApB,EAAA,MAAAsB,IAAAtB,EAAA,MAAAuB,IAAAvB,EAAA,MAAA0C,MAAAA,KAAA1C,EAAA;CAAA,IAAA2C;CACH,OADG3C,EAAA,QAAAqB,MAAArB,EAAA,QAAAwB,MAAAxB,EAAA,QAAAyB,MAAAzB,EAAA,QAAA0C,MAfXC,KAAA,qBAAC,IAAD;EAAY,KAAAnB;EAAZ,UAAA,CACGC,IAEDiB,EAHI;KAgBE1C,EAAA,MAAAqB,IAAArB,EAAA,MAAAwB,IAAAxB,EAAA,MAAAyB,IAAAzB,EAAA,MAAA0C,IAAA1C,EAAA,MAAA2C,MAAAA,KAAA3C,EAAA,KAhBR2C;AAgBQ;AAzDc,SAAAL,UAAA;CAAA,OA0CkC;AAAI;;;;;AC5ChE,MAAaO,uBAAuBC,UAA8C;CAGhF,IAAMC,WAAWD,MAAMC;CAEvB,IAAI,CAACA,YAAY,OAAOA,YAAa,YAAY,CAACA,SAASD,OACzD,OAAOA;CAGT,IAAME,aAAaD,SAASD,MAAMC;CAUlC,OARE,CAACC,cACD,OAAOA,cAAe,YACtBC,MAAMC,QAAQF,UAAU,KACxB,EAAE,WAAWA,cAENF,QAGF;EACL,GAAGA;EACHC,UAAU;GACR,GAAGA;GACHD,OAAO;IACL,GAAGC,SAASD;IACZC,UAAU;KACR,GAAGC;KACHF,OAAO;MACL,GAAGE,WAAWF;MACdK,QAAQ,CAAA;KACV;IACF;GACF;EACF;CACF;AACF,GCvBMkB,0BAAyBC,UAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAI7B,EAAAN,UAAAO,QAAAC,2BAAmDJ,OAAKK;CAAA,AAAAJ,EAAA,OAAAE,UAAAF,EAAA,OAAAL,YAEpBS,WAAA;EAClCT,SAAS,CAACJ,IAAI,CAACW,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;CAAC,GACrCF,EAAA,KAAAE,QAAAF,EAAA,KAAAL,UAAAK,EAAA,KAAAI,MAAAA,KAAAJ,EAAA;CAFD,IAAAK,kBAAwBD,IAKfE,KAAA,OAAOH,0BAAwBI;CAKvC,OALuCP,EAAA,OAAAK,mBAAAL,EAAA,OAAAM,MADjCC,KAAA;EAAAC,OACEF;EAA+BG,MAChC;EAAQC,MACR1B;EAAgB2B,UACZN;EAAeO,gBACT;CAClB,GAACZ,EAAA,KAAAK,iBAAAL,EAAA,KAAAM,IAAAN,EAAA,KAAAO,MAAAA,KAAAP,EAAA,IANMO;AAMN,GAGGM,6BAA4Bd,UAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAShC,EAAAN,UAAAO,QAAAY,cAAAX,wBAAAY,wBAAsFhB,OAAKK;CAAA,AAAAJ,EAAA,OAAAE,UAAAF,EAAA,OAAAc,gBAAAd,EAAA,OAAAL,YAAAK,EAAA,OAAAe,uBACrDX,WAAA;EACpC,IAAAY,WAAiB,CAAC,QAAQ,GAC1BC,aAAmB,CAACH,YAAY,GAChCI,WAAiB,CAAC,GAAGH,oBAAmB,EAAG;EAC3CpB,SAAS;GAACJ,IAAI,CAACW,QAAQc,QAAQ;GAAGxB,MAAMyB,UAAU;GAAGzB,MAAM0B,QAAQ;EAAC,CAAC;CAAC,GACvElB,EAAA,KAAAE,QAAAF,EAAA,KAAAc,cAAAd,EAAA,KAAAL,UAAAK,EAAA,KAAAe,qBAAAf,EAAA,KAAAI,MAAAA,KAAAJ,EAAA;CALD,IAAAmB,oBAA0Bf,IAQjBE,KAAA,UAAUH,0BAAwBI;CAK1C,OAL0CP,EAAA,OAAAmB,qBAAAnB,EAAA,OAAAM,MADpCC,KAAA;EAAAC,OACEF;EAAkCG,MACnC;EAAQC,MACR7B;EAAS8B,UACLQ;EAAiBP,gBACX;CAClB,GAACZ,EAAA,KAAAmB,mBAAAnB,EAAA,KAAAM,IAAAN,EAAA,KAAAO,MAAAA,KAAAP,EAAA,IANMO;AAMN,GAGGa,iBAAiB,EACrBzB,UACAE,SACAK,QACAC,wBACAW,cACAC,0BAMI;CACJ,IAAMM,eAAepC,0BAA0B;EAC7CqC,MAAM,UAAUnB;EAChBoB,YAAYxB,UACVc,0BAA0B;GACxB,GAAGd;GACHG,QAAQ;GACRP;GACAE;GACAM;GACAW;GACAC;EACF,CAAC;CACL,CAAC,GACKS,YAAYvC,0BAA0B;EAC1CqC,MAAM,OAAOnB;EACboB,YAAYxB,UACVD,uBAAuB;GACrB,GAAGC;GACHG,QAAQ;GACRP;GACAE;GACAM;GACAW;EACF,CAAC;CACL,CAAC;CACD,OAAOZ,SAASmB,eAAeG;AACjC,GAEaC,SAAQ1B,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAOnB,EAAAN,aAAmBI,MAAK2B,YACxB,EAAA7B,SAAAM,wBAAAW,cAAAC,wBAA6EhB,OAC7EG,SAAeH,MAAK4B,OAAkBzB,QAAuBE;CAAA,AAAAJ,EAAA,OAAAE,UAAAF,EAAA,OAAAc,gBAAAd,EAAA,OAAAG,0BAAAH,EAAA,OAAAH,WAAAG,EAAA,OAAAL,YAAAK,EAAA,OAAAe,uBAGpDX,KAAA;EAAAT;EAAAE;EAAAK;EAAAC;EAAAW;EAAAC;CAOP,GAACf,EAAA,KAAAE,QAAAF,EAAA,KAAAc,cAAAd,EAAA,KAAAG,wBAAAH,EAAA,KAAAH,SAAAG,EAAA,KAAAL,UAAAK,EAAA,KAAAe,qBAAAf,EAAA,KAAAI,MAAAA,KAAAJ,EAAA;CARH,IAAA4B,cACSxB,IASRE;CAAA,AAAAN,EAAA,OAAAD,MAAA8B,UAGuCvB,KAAAN,EAAA,MAAnBM,KAAAP,MAAK8B,WAAL,CAAA,GAAmB7B,EAAA,KAAAD,MAAA8B,SAAA7B,EAAA,KAAAM;CAAtC,IAAAwB,aAAmBxB,IAAmBC;CAAA,AAAAP,EAAA,OAAA4B,cACJrB,KAAAP,EAAA,OAA1BO,KAAAa,cAAcQ,WAAW,GAAC5B,EAAA,KAAA4B,aAAA5B,EAAA,MAAAO;CAAA,IAAAwB;CAAA,AAAA/B,EAAA,QAAA8B,cAAA9B,EAAA,QAAAO,MAA3BwB,KAAA,CAACxB,IAA0B,GAAKuB,UAAU,GAAC9B,EAAA,MAAA8B,YAAA9B,EAAA,MAAAO,IAAAP,EAAA,MAAA+B,MAAAA,KAAA/B,EAAA;CAFpD,IAAAgC,kBAEED,IAC8BE;CAAA,AAAAjC,EAAA,QAAAD,QAG2BkC,KAAAjC,EAAA,OAA1BiC,KAAAxC,oBAAoBM,KAAK,GAACC,EAAA,MAAAD,OAAAC,EAAA,MAAAiC;CAAzD,IAAAC,yBAA+BD,IAA0BE;CAAA,AAAAnC,EAAA,QAAAgC,mBAAAhC,EAAA,QAAAkC,0BAClDC,KAAA;EAAA,GACFD;EAAsBL,SAChBG;CACX,GAAChC,EAAA,MAAAgC,iBAAAhC,EAAA,MAAAkC,wBAAAlC,EAAA,MAAAmC,MAAAA,KAAAnC,EAAA;CALH,IAAAoC,gBAEED,IAI0BE;CAEa,OAFbrC,EAAA,QAAAoC,iBAAApC,EAAA,QAAAD,MAAAuC,iBAErBD,KAAAtC,MAAKuC,cAAeF,aAAa,GAACpC,EAAA,MAAAoC,eAAApC,EAAA,MAAAD,MAAAuC,eAAAtC,EAAA,MAAAqC,MAAAA,KAAArC,EAAA,KAAlCqC;AAAkC,GCtI9BE,YAASO,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GASpB,EAAAC,OAAAC,UAAAC,cAAAC,aAAAC,iBAMIP,OAAKQ;CAAA,AAAAP,EAAA,OAAAQ,OAAAC,IAAA,2BAAA,KAOAF,KAAA;EAAC;EAAG;EAAG;CAAC,GAACP,EAAA,KAAAO,MAAAA,KAAAP,EAAA;CACP,IAAAU,KAAAR,SAAA,IAAWS;CAAA,AAAAX,EAAA,OAAAM,gBAAAN,EAAA,OAAAG,YACRQ,MAAAC,UAAWN,aAAaM,OAAOT,QAAQ,GAACH,EAAA,KAAAM,cAAAN,EAAA,KAAAG,UAAAH,EAAA,KAAAW,MAAAA,KAAAX,EAAA;CAAA,IAAAa;CAAA,AAAAb,EAAA,OAAAQ,OAAAC,IAAA,2BAAA,KAElDI,KAAA,oBAAA,UAAA;EAAe,OAAA;EAAK,UAAA;CAA+B,CAAA,GAAAb,EAAA,KAAAa,MAAAA,KAAAb,EAAA;CAAA,IAAAc;CAAA,AAAAd,EAAA,OAAAK,cAKjDS,KAAAd,EAAA,MAJDc,KAAAT,YAAWU,IAAKC,OAIhB,GAAChB,EAAA,KAAAK,aAAAL,EAAA,KAAAc;CAAA,IAAAG;CACW,OADXjB,EAAA,OAAAI,gBAAAJ,EAAA,OAAAU,MAAAV,EAAA,OAAAW,MAAAX,EAAA,QAAAc,MAbJG,KAAA,qBAAC,QAAD;EAAa,GACPb;EACM,UAAA;EACD,SAAA;EACJ,KAAAG;EACE,OAAAG;EACG,UAAAC;EANZ,UAAA,CAQEE,IACCC,EATU;KAcEd,EAAA,KAAAI,cAAAJ,EAAA,KAAAU,IAAAV,EAAA,KAAAW,IAAAX,EAAA,MAAAc,IAAAd,EAAA,MAAAiB,MAAAA,KAAAjB,EAAA,KAdfiB;AAce;AAhCG,SAAAD,QAAAT,IAAA;CA2BE,IAAA,EAAAL,OAAAgB,aAAAC,UAAAZ;CAA2B,OAC3C,oBAAA,UAAA;EAAiCW,OAAAA;EAC9BC,UAAAA;CACM,GAFID,WAEJ;AAAA;AClBjB,MAAMqB,qBAAqBC,gBACzBA,YAAYC,KAAKC,gBAAgB;CAC/BL,OAAOK,WAAWC;CAClBL,OAAOI,WAAWE;AACpB,EAAE,GAESC,SAAQC,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAGnB,EAAAR,gBAAsBL,qBAAqB,GAACc;CAAA,AAAAF,EAAA,OAAAG,OAAAC,IAAA,2BAAA,KAEpBF,KAAA,CAAC,KAAK,GAACF,EAAA,KAAAE,MAAAA,KAAAF,EAAA;CAA/B,IAAAH,KAAWZ,aAAaiB,EAAO,GAAWG;CAAA,AAAAL,EAAA,OAAAD,MAAAO,QAAAN,EAAA,OAAAD,MAAAQ,uBAElCF,KAAA,CAAA,GAAIN,MAAKO,KAAKE,MAAO,GAAG,EAAE,GAAG,GAAGT,MAAKQ,oBAAoB,EAAG,GAACP,EAAA,KAAAD,MAAAO,MAAAN,EAAA,KAAAD,MAAAQ,qBAAAP,EAAA,KAAAK,MAAAA,KAAAL,EAAA;CADrE,IAAAS,uBACQJ,IAGRK,YAAkBzB,aAAawB,oBAAoB,GAACE;CAAA,AAAAX,EAAA,OAAAH,KAEGc,KAAAX,EAAA,MAAlBW,KAAAhC,eAAekB,EAAE,GAACG,EAAA,KAAAH,IAAAG,EAAA,KAAAW;CAAvD,IAAA,EAAAC,UAAgB5B,qBAAqB2B,IAAoBZ,MAAKc,WAAWC,IAAK,GAACC;CAAA,AAAAf,EAAA,OAAAS,wBAAAT,EAAA,OAAAY,SAAAZ,EAAA,OAAAU,aAG7EK,MAAAC,OAAAC,aAAA;EAIE,IAAAC,aAAmBF,MAAKG,cAAc5B;EAQtC,IALE0B,SADEC,aACOrC,IAAIqC,UAAU,IAEdnC,MAAM,CAAC,GAGd2B,WAAS;GACX,IAAAU,aAAmB,EAAArC,OACV,CAAC0B,qBAAoBY,KAAM,GAAG,CAAC,EACxC;GACAT,MAAKU,QAAS,CAACF,UAAU,CAAC;EAAC;CAC5B,GACFpB,EAAA,KAAAS,sBAAAT,EAAA,KAAAY,OAAAZ,EAAA,KAAAU,WAAAV,EAAA,KAAAe,MAAAA,KAAAf,EAAA;CAnBH,IAAAuB,eAAqBR;CAuBrB,IAAI,CAACtB,YAAW+B,QAAO;EAAA,IAAAC;EAAA,AAAAzB,EAAA,QAAAG,OAAAC,IAAA,2BAAA,KAEJqB,KAAA;GAAC;GAAG;GAAG;EAAC,GAACzB,EAAA,MAAAyB,MAAAA,KAAAzB,EAAA;EAAA,IAAA0B;EAAA,AAAA1B,EAAA,QAAAG,OAAAC,IAAA,2BAAA,KACKsB,KAAA;GAAC;GAAG;GAAG;EAAC,GAAC1B,EAAA,MAAA0B,MAAAA,KAAA1B,EAAA;EAAA,IAAA2B;EAG/B,OAH+B3B,EAAA,QAAAD,MAAA6B,yBAG/BD,KAAA3B,EAAA,OAJP2B,KAAA,oBAAC,MAAD;GAAe,SAAAF;GAAmB,QAAA;GAAW,QAAA;GAAQ,MAAA;GACnD,UAAA,qBAAC,MAAD;IAAY,OAAA;IAAe,MAAAC;IAA3B,UAAA;KAAsC;KACd3B,MAAK6B;KAAwB;IADhD;;EADF,CAAA,GAIE5B,EAAA,MAAAD,MAAA6B,wBAAA5B,EAAA,MAAA2B,KAJPA;CAIO;CACR,IAAAF;CAAA,AAAAzB,EAAA,QAAAP,cAG6DgC,KAAAzB,EAAA,OAA9ByB,KAAAjC,kBAAkBC,WAAW,GAACO,EAAA,MAAAP,aAAAO,EAAA,MAAAyB;CAAA,IAAAC;CAAgC,OAAhC1B,EAAA,QAAAuB,gBAAAvB,EAAA,QAAAD,SAAAC,EAAA,QAAAyB,MAA9DC,KAAA,oBAAC,UAAD;EAAO,GAAK3B;EAAoB,aAAA0B;EAA8CF;CAAY,CAAA,GAAIvB,EAAA,MAAAuB,cAAAvB,EAAA,MAAAD,OAAAC,EAAA,MAAAyB,IAAAzB,EAAA,MAAA0B,MAAAA,KAAA1B,EAAA,KAA9F0B;AAA8F,GCpErFS,gBAAeC,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAAC,IAAAC;CAAA,IAAAH,EAAA,OAAAD,MAAAK,MAAA;EAC1B,IAAAC,iBAAuBN,MAAKK,KAAKE,MAAO,GAAG,EAAE;EACmBN,AAA3CH,KAAAA,cAAaM,KAAA,CAAA,GAAIE,gBAAgB,SAAS,GAACL,EAAA,KAAAD,MAAAK,MAAAJ,EAAA,KAAAE,IAAAF,EAAA,KAAAG;CAAA,OAAAA,AAAAD,KAAAF,EAAA,IAAAG,KAAAH,EAAA;CAAhE,IAAAO,eAAqBV,GAAaM,EAA8B,GAACK;CAAA,AAAAR,EAAA,OAAAO,gBAAAP,EAAA,OAAAD,SAC7CS,WAAA;EAClBT,MAAKU,SAAUb,IAAIW,cAAc,CAAC,OAAO,CAAC,CAAC;CAAC,GAC7CP,EAAA,KAAAO,cAAAP,EAAA,KAAAD,OAAAC,EAAA,KAAAQ,MAAAA,KAAAR,EAAA;CAFD,IAAAU,cAAoBF,IAEnBG;CAAA,AAAAX,EAAA,OAAAD,QAG8BY,KAAAX,EAAA,MAA1BW,KAAAZ,MAAKa,cAAeb,KAAK,GAACC,EAAA,KAAAD,OAAAC,EAAA,KAAAW;CAAA,IAAAE;CAAA,AAAAb,EAAA,OAAAU,cAIlBG,KAAAb,EAAA,MAFTa,KAAA,oBAAC,QAAD;EAAa,KAAA;EACX,UAAA,oBAAC,QAAD;GAAa,MAAA;GAAoB,MAAA;GAAiB,eAAMH,YAAY;EAAC,CAAA;CADhE,CAAA,GAEEV,EAAA,KAAAU,aAAAV,EAAA,KAAAa;CAAA,IAAAC;CACH,OADGd,EAAA,QAAAW,MAAAX,EAAA,QAAAa,MALXC,KAAA,qBAAC,OAAD;EAAY,KAAA;EAAZ,UAAA,CACGH,IAEDE,EAHI;KAMEb,EAAA,MAAAW,IAAAX,EAAA,MAAAa,IAAAb,EAAA,MAAAc,MAAAA,KAAAd,EAAA,KANRc;AAMQ,GCHCW,kBAAiBC,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAC5B,CAAAC,UAAAC,eAAgCd,SAA6Be,KAAAA,CAAS,GACtE,CAAAC,OAAAC,YAA0BjB,SAA6Be,KAAAA,CAAS,GAChE,CAAAG,OAAAC,YAA0BnB,SAAce,KAAAA,CAAS,GACjD,EAAAK,aAAAC,eAAkCb,qBAAqB,GAACc;CAAA,AAAAX,EAAA,OAAAU,aACnBC,KAAAX,EAAA,MAAZW,KAAA,EAAAD,WAAW,GAACV,EAAA,KAAAU,YAAAV,EAAA,KAAAW;CAArC,IAAAC,SAAejB,UAAUgB,EAAY,GAErC,EAAAE,YAAAC,SAAAC,UAAqChB,OAA4BiB,oBAAAC;CAAA,IAAAjB,EAAA,OAAAa,cAAAb,EAAA,OAAAS,eAAAT,EAAA,OAAAc,SAAA;EAAA,IAAAI;EAQ/DlB,AAR+DA,EAAA,OAAAa,aAIhEK,KAAAlB,EAAA,MAF2CkB,MAAAC,mBACnCA,eAAcC,OAAQP,YAC9Bb,EAAA,KAAAa,YAAAb,EAAA,KAAAkB,KAFDF,qBAA2BP,YAAWY,KAAMH,EAE3C,GAEuBD,KAAAD,oBAAkBM,SAAeD,MAACE,gBACjDA,YAAWH,OAAQN,OAC3B,GAACd,EAAA,KAAAa,YAAAb,EAAA,KAAAS,aAAAT,EAAA,KAAAc,SAAAd,EAAA,KAAAgB,oBAAAhB,EAAA,KAAAiB;CAAA,OAAAA,AAAAD,qBAAAhB,EAAA,IAAAiB,KAAAjB,EAAA;CAFF,IAAAwB,kBAAwBP,IAEtBC;CAAA,AAAAlB,EAAA,OAAAY,UAAAZ,EAAA,QAAAD,MAAA0B,cAAAzB,EAAA,QAAAgB,sBAAAhB,EAAA,QAAAwB,mBAAAxB,EAAA,QAAAe,SAEQG,WAAA;EACR,IAAAQ,cAAoB,YAAA;GAMlB,IALApB,SACEU,oBAAkBW,SAAWH,iBAAeG,QAA5C,GACOX,mBAAkBW,MAAM,KAAMH,gBAAeG,UAChDX,oBAAkBW,SAAWH,iBAAeG,KAClD,GACI,OAAOZ,SAAU,UAAQ,OACpBZ,YAAYY,KAAK;GAE1B,IAAIxB,YAAYwB,KAAK,GAAC;IACpB,IAAAa,MAAY,MAAMhB,OAAMiB,YAAad,MAAKe,IAAK,GAI/CM,iBAHarC,MAAK0B,WACKQ,OAAOZ,KAAMa,KACbF,CAAU,EAAAD,KAAAA,CACGM,GAAGhB,MAAMiB,YAAWC,QAAKR,MAAWS,SAAKZ,KAAGa,KAAO,GAEvFC,eAAqB,CAAC,GACtBE,gBAAsBR,eAAaS,SAAiBC,UAA9B,CAAmC;IACzDC,OAAMC,KAAMJ,aAAa,CAAC,CAAAK,SAASC,QAAA;KACjC,IAAAC,WAAiBf,eAAaS,SAAiBC,SAAGI;KAClDR,aAAaQ,OACXC,YAAAvB,MACIuB,SAAQC,MAAO,GAAG,CAAC,CAAAC,OAAQC,QAAmC1B,GACtD,IAFZxB,KAAAA;IADe,CAIlB;IAED,IAAAmD,iBAAuBnB,eAAaS,SAAkBW,UAAGd,YAAY;IACb,OAAxDlC,SAAS+C,gBAAchD,SAAWmC,aAAYnC,KAAS,GAChDJ,YAAYoD,gBAAclD,SAAYqC,aAAYrC,KAAoB;GAAC;GAI/E,OAFGf,QAAQyB,KAAK,KACfP,SAASO,KAAK,GAET;EAAE;EAENW,YAAY;CAAC,GACnB1B,EAAA,KAAAY,QAAAZ,EAAA,MAAAD,MAAA0B,YAAAzB,EAAA,MAAAgB,oBAAAhB,EAAA,MAAAwB,iBAAAxB,EAAA,MAAAe,OAAAf,EAAA,MAAAkB,MAAAA,KAAAlB,EAAA;CAAkB,IAAAyD,KAAAzC,oBAAkBW,OAAS+B,KAAAlC,iBAAeG,OAAOgC;CArCpEvE,AAqCoEY,EAAA,QAAAY,UAAAZ,EAAA,QAAAD,MAAA0B,cAAAzB,EAAA,QAAAyD,MAAAzD,EAAA,QAAA0D,MAAA1D,EAAA,QAAAe,SAAjE4C,KAAA;EAAC5C;EAAOH;EAAQ6C;EAA2BC;EAAwB3D,MAAK0B;CAAW,GAACzB,EAAA,MAAAY,QAAAZ,EAAA,MAAAD,MAAA0B,YAAAzB,EAAA,MAAAyD,IAAAzD,EAAA,MAAA0D,IAAA1D,EAAA,MAAAe,OAAAf,EAAA,MAAA2D,MAAAA,KAAA3D,EAAA,KArCvFZ,UAAU8B,IAqCPyC,EAAoF;CAAC,IAAAC;CAAA,IAAA5D,EAAA,QAAAO,SAAAP,EAAA,QAAAD,SAAAC,EAAA,QAAAE,YAAAF,EAAA,QAAAK,OAAA;EAExF,IAAAwD,eAAqB;GAAA,GAChB9D;GAAKM;GAAAH;GAAAK;EAIV;EAEwCP,AAAjC4D,KAAA7D,MAAK+D,cAAeD,YAAY,GAAC7D,EAAA,MAAAO,OAAAP,EAAA,MAAAD,OAAAC,EAAA,MAAAE,UAAAF,EAAA,MAAAK,OAAAL,EAAA,MAAA4D;CAAA,OAAAA,KAAA5D,EAAA;CAAA,OAAjC4D;AAAiC;AA/DZ,SAAA1B,MAAAK,OAAA;CAAA,OA8ByBA,MAAKC,SAAU;AAAO;AA9B/C,SAAAc,OAAAS,KAAAC,OAAA;CAAA,OAwCkCD,MAAMC;AAAM;;;;AC9C5E,SAAgBM,kBAAkBC,YAA+C;CAM/E,OALKN,qBAAqBM,UAAU,IAK7BG,mBAAmBH,WAAWI,QAAQ,CAAA,GAAI,CAAC,KAJhDH,QAAQC,MAAM,+BAA+B,GACtC,CAAA;AAIX;AAEA,SAASC,mBACPC,QACAC,MACAC,UACuB;CACvB,IAAID,KAAKE,UAAUD,UACjB,OAAO,CAAA;CAGT,IAAME,SAAgC,CAAA;CAEtC,KAAK,IAAMC,SAASL,QAGlB,IAFAI,OAAOE,KAAK;EAACL,MAAM,CAAC,GAAGA,MAAMI,MAAME,IAAI;EAAG,GAAGF;CAAK,CAAC,GAE/CA,MAAMG,KAAKC,aAAa,UAC1BL,OAAOE,KAAK,GAAGP,mBAAmBM,MAAMG,KAAKR,QAAQ,CAAC,GAAGC,MAAMI,MAAME,IAAI,GAAGL,QAAQ,CAAC;MAChF,IAAIG,MAAMG,KAAKC,aAAa,SAAS;EAE1C,IAAMC,aAAaL,MAAMG,KAAKG,MAAM,CAAA;EACpC,KAAK,IAAMC,aAAaF,YACtB,AAAI,YAAYE,aACdR,OAAOE,KAAK,GAAGP,mBAAmBa,UAAUZ,QAAQ,CAAC,GAAGC,MAAMI,MAAME,IAAI,GAAGL,QAAQ,CAAC;CAG1F;CAGF,OAAOE;AACT;ACtBA,MAAMyB,wBAAwB,EAC5BC,OACAC,wBACAC,qBACAC,WACAC,kBACAC,mBAQI;CACJ,IAAMC,WAAW,OAAON,SAAU,WAAWA,QAAQA,MAAMO,MACrDC,WAAWC,OAAOH,SAAS,EAAE,CAAC,CAACI,YAAY,IAAIJ,SAASK,MAAM,CAAC,GAC/DC,cAAc,GAAGV,sBAAsBM;CAE7C,OAAOtB,WAAW;EAChBqB,MAAM,GAAGN,yBAAyBO;EAClCK,MAAM;EACNC,QAAQ;GACN;IACEP,MAAM;IACNQ,OAAO;IACPC,SAAS,EAACC,aACD,CAACC,MAAMC,QAAQF,MAAM;GAEhC;GACA;IACEV,MAAM;IACNQ,OAAO;IACPC,SAAS,EAACC,aACD,CAACC,MAAMC,QAAQF,MAAM;GAEhC;GACA;IACEV,MAAM;IACNQ,OAAO;IACPC,SAAS,EAACC,aACDC,MAAMC,QAAQF,MAAM;GAE/B;EAAC;EAEHG,YAAY;GACVpB,QAAQqB,UACN,oBAAC,OAAD;IACE,GAAIA;IACUhB;IACUJ;IACHC;GAAoB,CAAA;GAG7CoB,MAAMjC;EACR;EACAkC,QAAQ;GACN,OAAOvB,SAAU,WAEbhB,YAAY;IACVuB,MAAM;IACNM,MAAMb;IACNwB,OAAO;GACT,CAAC,IAED;IACE,GAAGxB;IACHO,MAAM;IACNiB,OAAO;GACT;GACJxC,YAAY;IACVuB,MAAM;IACNM,MAAM;IACNG,QAAQ;IACRS,cAAc;GAChB,CAAC;GACDzC,YAAY;IACVuB,MAAMF;IACNQ,MAAM;IACNW,OAAO;IACPJ,YAAY,EACVM,QAAQL,UACN,oBAAC,OAAD;KACE,GAAIA;KACoBpB;KACHC;IAAoB,CAAA,EAG/C;IACAc,SAAS,EAACC,aACD,CAACA,QAAQU;GAEpB,CAAC;GACD3C,YAAY;IACVuB,MAAMH;IACNS,MAAM;IACNW,OAAO;IACPR,SAAS,EAACC,aACD,CAACA,SAASZ;IAEnBe,YAAY,EACVM,QAAQL,UACN,oBAAC,YAAD;KACE,GAAIA;KACST;KACFT;KACGE;IAAa,CAAA,EAGjC;IACAuB,IAAI,CACF5C,YAAY;KACVuB,MAAMK;KACNC,MAAMD;IACR,CAAC,CAAC;GAEN,CAAC;EAAC;EAEJiB,SAAS;GACPC,QAAQ;IACNC,MAAM;IACNC,YAAY3B;GACd;GACA4B,UAAU,EAACF,MAAMC,iBAAgB;IAC/B,IAAMjB,QACJ,OAAOgB,QAAS,WACZA,OACAA,QAAQ,OAAOA,QAAS,aACtBA,KAAKhB,SAASgB,KAAKxB,SACnB,IACF2B,kBAAkBF,aAAa,eAAeA,eAAe,IAC7DG,QACJJ,QAAQ,OAAOA,QAAS,aAAWA,KAAKK,SAASL,KAAKM,SAASN,KAAKI,UAAc;IACpF,OAAO;KACLpB,OAAOA,SAASmB;KAChBI,UAAUvB,QAAQmB,kBAAkB;KACpCC;IACF;GACF;EACF;CACF,CAAC;AACH,GAEMI,qBAAqB,EACzBvC,OACAE,qBACAC,WACAE,mBAMI;CACJ,IAAMC,WAAW,OAAON,SAAU,WAAWA,QAAQA,MAAMO,MACrDC,WAAWC,OAAOH,SAAS,EAAE,CAAC,CAACI,YAAY,IAAIJ,SAASK,MAAM,CAAC;CACrE,OAAOzB,WAAW;EAChBqB,MAAM,GAAGL,sBAAsBM;EAC/BO,OAAO,GAAGb,oBAAmB,SAAUM;EACvCK,MAAM;EACNO,YAAY;GACVS,SAASjC;GACT8B,OAAO/B;EACT;EACA4B,QAAQ;GACN;IACEV,MAAM;IACNN,MAAMJ;IACNqC,UAAU;GACZ;GACA;IACE3B,MAAM;IACNN,MAAMF;IACNW,QAAQ;GACV;GACA,OAAOhB,SAAU,WAEbhB,YAAY;IACVuB,MAAM;IACNM,MAAMb;GAER,CAAC,IAED;IACE,GAAGA;IACHO,MAAM;GAER;EAAC;EAEPsB,SAAS,EACPC,QAAQ;GACNW,SAAStC;GACT6B,YAAY3B;GACZqC,OAAO;EACT,EACF;CACF,CAAC;AACH,GAEMC,eAAe,EACnBpB,QACAtB,wBACAC,qBACAC,WACAC,kBACAC,mBAEO,CACL,GAAGkB,OAAOuB,KAAK9C,UACbuC,kBAAkB;CAACvC;CAAOE;CAAqBC;CAAWE;AAAY,CAAC,CACzE,GACA,GAAGkB,OAAOuB,KAAK9C,UACbD,qBAAqB;CACnBC;CACAC;CACAC;CACAC;CACAC;CACAC;AACF,CAAC,CACH,CAAC,GAIQ0C,wBAAwB9D,cAA2C+D,WAAW;CACzF,IAAMC,eAAe;EAAC,GAAG1D;EAAgB,GAAGyD;CAAM,GAC5C,EAACzB,QAAQtB,wBAAwBC,wBAAuB+C,cAExD5C,eAAe,GAAGJ,uBAAsB,KACxCG,mBAAmB,GAAGF,oBAAmB,IACzCC,YAAY,GAAGD,oBAAmB;CAUxC,OAAO;EACLK,MAAM;EACN4C,QAAQ,EACNC,OAXsBT,YAAY;GACpCpB;GACAtB;GACAC;GACAC;GACAC;GACAC;EACF,CAIW6C,EACT;EACAG,MAAM,EACJjC,YAAY,EACVM,QAAQL,UAAU;GAchB,IAXI,EAFgBA,MAAMkC,OAAO,UAAUnE,mBAAmBiC,KAAK,MAa/D,CAPevB,kBAAkBuB,MAAMqC,UACrBD,CAAU,CAACG,MAC9B5D,UACCA,MAAMa,KAAKN,KAAKsD,WAAW5D,sBAAsB,KACjDD,MAAMO,KAAKsD,WAAW5D,sBAAsB,CAG3C0D,GACH,OAAOtC,MAAMmC,cAAcnC,KAAK;GAGlC,IAAMyC,gBAAgB;IACpB,GAAGzC;IACH0C,6BAA6B;KAC3B,GAAGd;KACH9C;KACAC;KACAC;IACF;GACF;GACA,OAAO,oBAAC,oBAAD,EAAoB,GAAIyD,cAAc,CAAA;EAC/C,EACF,EACF;CACF;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/growthbook/types.ts","../../src/growthbook/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/growthbook/types.ts","../../src/growthbook/index.ts"],"mappings":";;KAEY;EACV,kBAAkB;EAClB;EACA;EACA;EACA;EACA;;cCCW,wCAAqB,OAAA"}
|
package/dist/growthbook/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-
|
|
1
|
+
import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-CPrY-K44.js";
|
|
2
|
+
import "@sanity/ui/styles.css";
|
|
2
3
|
import { definePlugin, isObjectInputProps } from "sanity";
|
|
3
4
|
import { c } from "react/compiler-runtime";
|
|
4
5
|
import { createContext, useContext, useEffect, useState } from "react";
|
|
@@ -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/react-compiler\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 {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":";;;;;;AAMA,MAAaM,YAAY,cACZC,aAAa,UAEpBC,mBAAmB,CACvB;CACEC,KAAKF;CACLG,OAAO;AACT,CAAC,GAGUC,WAAUC,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACrB,EAAAC,SAAAC,YAA2Bf,WAAWK,SAAS,GAC/C,EAAAY,cAAoBb,qBAAqB,GACzC,CAAAc,cAAAC,mBAAwCjB,SAAkB,EAAK,GAACkB,IAAAC;CAahE,IAbgET,EAAA,OAAAG,WAAAH,EAAA,OAAAE,WAAAF,EAAA,OAAAK,aAEtDG,WAAA;EACJL,cAMqB,OALrB,CAACD,WAAD,CAAaC,WACfE,UAAUK,KAAAA,CAAS,GAEZH,gBAAgB,EAAI,MAE7BF,UAAUH,QAAOE,MAAO,GACjBG,gBAAgB,EAAK;CAAC,GAC5BE,KAAA;EAACP;EAASC;EAASE;CAAS,GAACL,EAAA,KAAAG,SAAAH,EAAA,KAAAE,SAAAF,EAAA,KAAAK,WAAAL,EAAA,KAAAQ,IAAAR,EAAA,KAAAS,OAAAD,KAAAR,EAAA,IAAAS,KAAAT,EAAA,KAThCX,UAAUmB,IASPC,EAA6B,GAE5B,CAACH,cAAY;EAAA,IAAAK;EACkB,OADlBX,EAAA,OAAAD,QACkBY,KAAAX,EAAA,MAA1BW,KAAAZ,MAAKa,cAAeb,KAAK,GAACC,EAAA,KAAAD,OAAAC,EAAA,KAAAW,KAA1BA;CAA0B;CAClC,IAAAA;CAAA,AAAAX,EAAA,OAAAa,OAAAC,IAAA,2BAAA,KAGGH,KAAA,oBAAC,cAAD;EACS,OAAA;EACIlB;EACLE,MAAAA;EACG,eAAA;GACPY,gBAAgB,EAAK;EAAC;CACvB,CAAA,GACDP,EAAA,KAAAW,MAAAA,KAAAX,EAAA;CAAA,IAAAe;CAAA,AAAAf,EAAA,OAAAD,QACyBgB,KAAAf,EAAA,MAA1Be,KAAAhB,MAAKa,cAAeb,KAAK,GAACC,EAAA,KAAAD,OAAAC,EAAA,KAAAe;CAAA,IAAAC;CAC1B,OAD0BhB,EAAA,QAAAe,KAC1BC,KAAAhB,EAAA,OAVHgB,KAAA,qBAAA,UAAA,EAAA,UAAA,CACEL,IAQCI,EAA0B,EAAA,CAAA,GAC1Bf,EAAA,MAAAe,IAAAf,EAAA,MAAAgB,KAVHA;AAUG,GCxCMS,4BAA4B,EACvCC,SAAS,mCACX,GAEMC,oBAAoBV,cAAsC;CAC9DW,iBAAiBC,KAAAA;CACjBC,QAAQD,KAAAA;AACV,CAAC;AAED,SAAOE,uBAAA;CAAA,OACEb,WAAWS,iBAAiB;AAAC;AAOtC,SAAOO,mBAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GACL,EAAAJ,gCAAsCE,OACtC,CAAAL,QAAAF,aAA4BR,SAA6B,GAACkB;CAAA,AAAAF,EAAA,OAAAH,+BAAAG,EAAA,OAAAN,UAGjDQ,KAAA;EAAA,GAAIL;EAA2BH;EAAAF;CAAmB,GAACQ,EAAA,KAAAH,6BAAAG,EAAA,KAAAN,QAAAM,EAAA,KAAAE,MAAAA,KAAAF,EAAA;CAD5D,IAAAG,UACSD,IAERE;CAAA,AAAAJ,EAAA,OAAAD,QAIyBK,KAAAJ,EAAA,MAAtBI,KAAA,oBAAC,SAAD,EAAQ,GAAKL,MAAK,CAAA,GAAIC,EAAA,KAAAD,OAAAC,EAAA,KAAAI;CAAA,IAAAC;CACK,OADLL,EAAA,OAAAG,WAAAH,EAAA,OAAAI,MADxBC,KAAA,oBAAA,kBAAA,UAAA;EAAmCF,OAAAA;EACjCC,UAAAA;CACF,CAAA,GAA6BJ,EAAA,KAAAG,SAAAH,EAAA,KAAAI,IAAAJ,EAAA,KAAAK,MAAAA,KAAAL,EAAA,IAF7BK;AAE6B;AC7BjC,MAAMQ,wBAAwBC,UAExBA,UAAU,SACL,YACEA,UAAU,UACZ,YAEFA,OAGIC,iBAAiB,OAAO,EACnCC,QACAC,aACAC,SACAC,SACAC,iBACAC,WAI+B;CAC/B,IAAMG,QAAQ,qBAAqBb,UAAS,gBAAiBD,cAEvDe,SAAS,MAAMT,OAAOU,MAAMF,KAAK;CACvC,IAAI,CAACC,QAAQ,OAAO,CAAA;CAEpB,IAAME,qBAAuC,CAAA,GACzCC,UAAU,IACVC,SAAS,GACPC,MAAM,IAAIC,IAAI,GAAGb,QAAO,UAAW;CAKzC,KAJIC,WACFW,IAAIE,aAAaC,IAAI,aAAad,OAAO,GAGpCS,UAAS;EACdE,IAAIE,aAAaC,IAAI,UAAUJ,OAAOK,SAAS,CAAC;EAOhD,IAAM,EAACI,UAAUV,SAASW,iBAAiBC,eAAc,OAAML,MANxCT,MAAMI,KAAK,EAChCM,SAAS,EACPC,eAAe,UAAUZ,SAC3B,EACF,CAAC,EAAA,CAEuEgB,KAAK;EAE7Eb,UAAUW,iBACVV,SAASW,YACJF,YAELA,SAASI,SAASC,YAA+B;GAI/C,IAHIA,QAAQC,YAGRvB,QAAQsB,QAAQtB,QAAQ,CAACsB,QAAQtB,KAAKyB,MAAMC,QAAQ1B,KAAK2B,SAASD,GAAG,CAAC,GACxE;GAGF,IAAME,cAAcN,QAAQO,aAAajC,YAAY,EAAEkC,MAAMC,QAC1DC,eAAeA,WAAWC,SAAS,oBAAoBD,WAAWC,SAAS,YAC9E;GAEA,IAAI,CAACL,aACH;GAGF,IAAMM,aAA4B,CAAA,GAC5BC,+BAAe,IAAIC,IAAY;GAErCR,YAAYP,SAASW,eAAe;IAClCA,YAAYE,WAAWb,SAASgB,YAAY;KAC1C,IAAM5C,QAAQM,kBAAkBP,qBAAqB6C,QAAQ5C,KAAK,IAAI4C,QAAQ5C;KAC9E,AAAK0C,aAAaG,IAAI7C,KAAK,MACzB0C,aAAaI,IAAI9C,KAAK,GACtByC,WAAWM,KAAK;MACdC,IAAIhD;MACJiD,OAAOjD;KACT,CAAC;IAEL,CAAC;GACH,CAAC;GACD,IAAMA,QAAQ;IAACgD,IAAInB,QAAQmB;IAAIC,OAAOpB,QAAQmB;IAAIE,UAAUT;GAAU;GAEtE5B,mBAAmBkC,KAAK/C,KAAK;EAE/B,CAAC;CACH;CAEA,OADiCa,mBAAmBuC,MAAMC,GAAGC,MAAMD,EAAEL,GAAGO,cAAcD,EAAEN,EAAE,CACnFG;AACT,GCrFaO,wBAAwBF,cAClCS,WAAW;CACV,IAAMC,eAAe;EAAC,GAAGL;EAA2B,GAAGI;CAAM,GACvD,EAACE,QAAQC,aAAaC,SAASC,iBAAiBC,SAASC,SAAQN;CACvE,OAAO;EACLO,MAAM;EACNC,SAAS,CACPf,wBAA0B;GACxBQ;GACAQ,cAAcC,WACZZ,eAAe;IAACY;IAAQR;IAAaG;IAASF;IAASC;IAAiBE;GAAI,CAAC;EACjF,CAAC,CAAC;EAGJK,MAAM,EACJC,YAAY,EACVC,QAAQC,UAGF,EAFgBA,MAAME,OAAO,UAAUzB,mBAAmBuB,KAAK,MAY/D,CANuBpB,kBAAkBoB,MAAMK,UAAU,CAAC,CAACC,KAC5DC,UAAUA,MAAMC,KAAKf,IAGFW,CAAkB,CAACM,MAAMjB,SAASA,KAAKkB,WAAW,YAAY,CAE/EF,IACIT,MAAMG,cAAcH,KAAK,IAS3BlB,mBAAmB8B;GALxB,GAAGZ;GACHa,6BAA6B,EAC3B,GAAG3B,aACL;EAEwB0B,CAAa,EAE3C,EACF;CACF;AACF,CACF"}
|
|
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/react-compiler\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.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/fieldExperiments.tsx","../src/fieldPersonalization.tsx","../src/utils/flattenSchemaType.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/fieldExperiments.tsx","../src/fieldPersonalization.tsx","../src/utils/flattenSchemaType.ts"],"mappings":";;KASY;EACV;EACA;;KAEU;EACV;EACA;EACA,UAAU;;KAGA;EACV,kBAAkB;EAClB,aAAa,qBAAqB,QAAQ,iBAAiB,QAAQ;EACnE;EACA;EACA;EACA;EACA;EACA;;;KAIU,oBAAoB;KAEpB;EACV,kBAAkB;EAClB,UAAU,kBAAkB,QAAQ,iBAAiB,QAAQ;EAC7D;EACA;EACA;EACA;EACA;;KAGU,sBAAsB,KAAK;GACpC;EACD;;KAGU,yBAAyB,SAAS;EAC5C,aAAa;;KAGH,8BAA8B,SAAS;EACjD,UAAU;;KAGA,kBAAkB;EAC5B;EACA;EACA;;KAGU,iCAAiC;EAC3C;EACA;;KAGU,sBAAsB;EAAe,MAAM;;KAE3C,eAAe;GACxB,uBAAuB;EACxB;EACA,QAAQ;;KAGE,kBAAkB;EAC5B;EACA,UAAU;EACV;GACC,cACG;IAEI;MACE,eAAe,eAGrB;;KAIM;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IAEI;IACA;IACA;IACA;IACA;;EAGJ;IAEI;IACA;IACA;IACA;IACA;IACA;IACA;MAEI;MACA;;IAGJ;MACE;MACA;;IAEF;IACA;MAEI;MACA;;;EAKR;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;MAEI;MACA;QACE;QACA;QACA;QACA;QACA;;;IAIN;MAEI;MACA;QACE;QACA;QACA;QACA;QACA;;;IAIN;MAEI;MACA;QACE;QACA;QACA;QACA;QACA;;;IAIN;MACE;MACA;QACE;QACA;QACA;QACA;QACA;;;;EAIN;IACE;IACA;IACA;IACA;IACA;;;KAIQ;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;KACG;MACC;MACA;MACA;QACE;QACA;QACA;UAAsB;UAAmB;;QACzC;QACA;QACA;QACA;QACA;UAAa;UAAe;;;MAE9B;MACA;QACE;QACA;QACA;UACE;UACA;UACA;YAAsB;YAAmB;;UACzC;UACA;UACA;UACA;UACA;YAAa;YAAe;;;QAE9B;;;;EAIN;IACE;IACA;;EAEF;IACE;IACA;IACA;IACA;;;cChBS,wCAAqB,OAAA;cC3CrB,4CAAyB,OAAA;;;;iBCpMtB,kBAAkB,YAAY,aAAa"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
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-CPrY-K44.js";
|
|
2
|
+
import "@sanity/ui/styles.css";
|
|
2
3
|
import { defineDocumentFieldAction, defineField, definePlugin, defineType, isImage, isObjectInputProps, isReference, set, unset, useClient, useFormValue, useWorkspace } from "sanity";
|
|
3
4
|
import { c } from "react/compiler-runtime";
|
|
4
5
|
import { createContext, useContext, useEffect, useState } from "react";
|
|
@@ -347,14 +348,18 @@ const createPersonalizationType = ({ field, personalizationNameOverride, segment
|
|
|
347
348
|
segmentId,
|
|
348
349
|
segmentArrayName
|
|
349
350
|
}) },
|
|
350
|
-
form: { components: { input: (props) =>
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
...
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
351
|
+
form: { components: { input: (props) => {
|
|
352
|
+
if (!(props.id === "root" && isObjectInputProps(props)) || !flattenSchemaType(props.schemaType).some((field) => field.type.name.startsWith(personalizationNameOverride) || field.name.startsWith(personalizationNameOverride))) return props.renderDefault(props);
|
|
353
|
+
let providerProps = {
|
|
354
|
+
...props,
|
|
355
|
+
personalizationFieldPluginConfig: {
|
|
356
|
+
...pluginConfig,
|
|
357
|
+
segmentId,
|
|
358
|
+
segmentArrayName
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
return /* @__PURE__ */ jsx(PersonalizationProvider, { ...providerProps });
|
|
362
|
+
} } }
|
|
358
363
|
};
|
|
359
364
|
});
|
|
360
365
|
export { fieldLevelExperiments, fieldLevelPersonalization, flattenSchemaType };
|
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":";;;;;;;;;;;AAUA,MAAaU,iBAAiB;CAC5BC,QAAQ,CAAA;CACRC,YAAY;CACZC,6BAA6B;CAC7BC,qBAAqB;CACrBC,WAAW;CACXC,kBAAkB;AACpB,GAEMC,yBAAyBhB,cAA2C;CACxE,GAAGS;CACHQ,UAAU,CAAA;AACZ,CAAC;AAED,SAAOC,4BAAA;CAAA,OACEjB,WAAWe,sBAAsB;AAAC;AAO3C,SAAOM,wBAAAC,OAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACL,EAAAL,qCAA2CG,OAAKG;CAAA,AAAAF,EAAA,OAAAJ,iCAAAT,aAEkCe,KAAAF,EAAA,MAAzDE,KAAA,EAAAf,YAAaS,iCAAgCT,WAAW,GAACa,EAAA,KAAAJ,iCAAAT,YAAAa,EAAA,KAAAE;CAAlF,IAAAC,SAAevB,UAAUsB,EAAyD,GAClFE,YAAkBvB,aAAa,GAACwB;CAAA,AAAAL,EAAA,OAAAG,UAAAH,EAAA,OAAAJ,oCAAAI,EAAA,OAAAI,aAGfC,KAAAC,MAAKC,QAASX,iCAAgCH,QAW3D,IAVAG,iCAAgCH,WAChCX,QACE,YACM,OAAOc,iCAAgCH,YAAc,aAChDG,iCAAgCH,SAAUU,MAAM,IAElDP,iCAAgCH,UAEzC,CAACW,WAAW,6BAA6B,GACzC,EAAA7B,MAAM,CACR,GAACyB,EAAA,KAAAG,QAAAH,EAAA,KAAAJ,kCAAAI,EAAA,KAAAI,WAAAJ,EAAA,KAAAK,MAAAA,KAAAL,EAAA;CAXL,IAAAP,WAAiBY,IAWZG;CAAA,AAAAR,EAAA,OAAAJ,oCAAAI,EAAA,OAAAP,YAGIe,KAAA;EAAA,GAAIZ;EAAgCH;CAAU,GAACO,EAAA,KAAAJ,kCAAAI,EAAA,KAAAP,UAAAO,EAAA,KAAAQ,MAAAA,KAAAR,EAAA;CADxD,IAAAS,UACSD,IAERE;CAAA,AAAAV,EAAA,OAAAD,QAI8BW,KAAAV,EAAA,OAA1BU,KAAAX,MAAKY,cAAeZ,KAAK,GAACC,EAAA,KAAAD,OAAAC,EAAA,MAAAU;CAAA,IAAAE;CACK,OADLZ,EAAA,QAAAS,WAAAT,EAAA,QAAAU,MAD7BE,KAAA,oBAAA,uBAAA,UAAA;EAAwCH,OAAAA;EACrCC,UAAAA;CACH,CAAA,GAAkCV,EAAA,MAAAS,SAAAT,EAAA,MAAAU,IAAAV,EAAA,MAAAY,MAAAA,KAAAZ,EAAA,KAFlCY;AAEkC;ACrDtC,MAAaS,cAAaC,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GACxB,EAAAC,cAAAC,aAAAC,cAA+CL,OAE/C,EAAAM,aAAmBR,0BAA0B,GAACS;CAAA,AAAAN,EAAA,OAAAE,gBAAAF,EAAA,OAAAI,aAAAJ,EAAA,OAAAG,eAG5CG,KAAA,OAAAC,YAAA;EACE,IAAAC,OAAa;GAAAC,MACLhB,KAAK;IACVW,YAAYG,QAAOG;GAAGC,OAChBR;EACT;EAGAD,aAAaM,IAAI;CAAC,GACnBR,EAAA,KAAAE,cAAAF,EAAA,KAAAI,WAAAJ,EAAA,KAAAG,aAAAH,EAAA,KAAAM,MAAAA,KAAAN,EAAA;CAVH,IAAAY,cAAoBN,IAYnBO,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC;CAAA,IAAAlB,EAAA,OAAAY,eAAAZ,EAAA,OAAAD,SAAAC,EAAA,OAAAI,aAAAJ,EAAA,OAAAK,UAAA;EAYD,IAAAiB,gBAFgBvB,MAAKqB,SAAN,CAAA,EAAA,EAEYG,KAAMC,cAAajB,UAAQH,UAAU;EAiBxDJ,AAdLc,KAAAtB,OAAWyB,KAAA,GAACjB,EAAA,QAAAD,QACiDmB,KAAAlB,EAAA,OAA3DkB,KAAAnB,MAAK0B,cAAe;GAAA,GAAI1B;GAAK2B,gBAAkBC;EAAU,CAAC,GAAC3B,EAAA,MAAAD,OAAAC,EAAA,MAAAkB,KAE3DL,KAAAtB,QAAYwB,KAAA,GACVC,KAAAX,SAAQkB,KAAKK,cAEV,oBAAC,QAAD;GAEQ,MAAA,OAAOrB,UAAOsB;GACf,MAAA;GACK,UAAAP,cAAYQ,SAAWvB,UAAOG,EAAG;GAClC,eAAME,YAAYL,SAAO;EAAC,GAJ9BA,UAAOG,EAIuB,CAGxC,GAACV,EAAA,KAAAY,aAAAZ,EAAA,KAAAD,OAAAC,EAAA,KAAAI,WAAAJ,EAAA,KAAAK,UAAAL,EAAA,KAAAa,IAAAb,EAAA,KAAAc,IAAAd,EAAA,MAAAe,IAAAf,EAAA,MAAAgB,IAAAhB,EAAA,MAAAiB,IAAAjB,EAAA,MAAAkB;CAAA,OAAAA,AAAAL,KAAAb,EAAA,IAAAc,KAAAd,EAAA,IAAAe,KAAAf,EAAA,KAAAgB,KAAAhB,EAAA,KAAAiB,KAAAjB,EAAA,KAAAkB,KAAAlB,EAAA;CAAA,IAAA+B;CAAA,AAAA/B,EAAA,QAAAa,MAAAb,EAAA,QAAAe,MAAAf,EAAA,QAAAgB,MAXJe,KAAA,oBAAC,IAAD;EAAa,KAAAhB;EACVC,UAAAA;CADI,CAAA,GAYEhB,EAAA,MAAAa,IAAAb,EAAA,MAAAe,IAAAf,EAAA,MAAAgB,IAAAhB,EAAA,MAAA+B,MAAAA,KAAA/B,EAAA;CAAA,IAAAgC;CACH,OADGhC,EAAA,QAAAc,MAAAd,EAAA,QAAAiB,MAAAjB,EAAA,QAAAkB,MAAAlB,EAAA,QAAA+B,MAfXC,KAAA,qBAAC,IAAD;EAAY,KAAAf;EAAZ,UAAA,CACGC,IAEDa,EAHI;KAgBE/B,EAAA,MAAAc,IAAAd,EAAA,MAAAiB,IAAAjB,EAAA,MAAAkB,IAAAlB,EAAA,MAAA+B,IAAA/B,EAAA,MAAAgC,MAAAA,KAAAhC,EAAA,KAhBRgC;AAgBQ;AAhDc,SAAAL,UAAA;CAAA,OAiCkC;AAAI;ACtBhE,MAAMuB,+BAA8BC,UAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAIlC,EAAAN,UAAAO,QAAAC,gCAAwDJ,OAAKK;CAAA,AAAAJ,EAAA,OAAAE,UAAAF,EAAA,OAAAL,YAEzBS,WAAA;EAClCT,SAAS,CAACJ,IAAI,CAACW,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;CAAC,GACrCF,EAAA,KAAAE,QAAAF,EAAA,KAAAL,UAAAK,EAAA,KAAAI,MAAAA,KAAAJ,EAAA;CAFD,IAAAK,kBAAwBD,IAKfE,KAAA,OAAOH,+BAA6BI;CAK5C,OAL4CP,EAAA,OAAAK,mBAAAL,EAAA,OAAAM,MADtCC,KAAA;EAAAC,OACEF;EAAoCG,MACrC;EAAQC,MACR1B;EAAU2B,UACNN;EAAeO,gBACT;CAClB,GAACZ,EAAA,KAAAK,iBAAAL,EAAA,KAAAM,IAAAN,EAAA,KAAAO,MAAAA,KAAAP,EAAA,IANMO;AAMN,GAGGM,kCAAiCd,UAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAQrC,EAAAN,UAAAO,QAAAC,6BAAAW,wBAA6Ef,OAAKK;CAAA,AAAAJ,EAAA,OAAAE,UAAAF,EAAA,OAAAL,YAAAK,EAAA,OAAAc,uBAC5CV,WAAA;EACpC,IAAAW,WAAiB,CAAC,QAAQ,GAC1BC,WAAiB,CAAC,GAAGF,oBAAmB,EAAG;EAC3CnB,SAAS,CAACJ,IAAI,CAACW,QAAQa,QAAQ,GAAGvB,MAAMwB,QAAQ,CAAC,CAAC;CAAC,GACpDhB,EAAA,KAAAE,QAAAF,EAAA,KAAAL,UAAAK,EAAA,KAAAc,qBAAAd,EAAA,KAAAI,MAAAA,KAAAJ,EAAA;CAJD,IAAAiB,oBAA0Bb,IAOjBE,KAAA,UAAUH,+BAA6BI;CAK/C,OAL+CP,EAAA,OAAAiB,qBAAAjB,EAAA,OAAAM,MADzCC,KAAA;EAAAC,OACEF;EAAuCG,MACxC;EAAQC,MACR7B;EAAS8B,UACLM;EAAiBL,gBACX;CAClB,GAACZ,EAAA,KAAAiB,mBAAAjB,EAAA,KAAAM,IAAAN,EAAA,KAAAO,MAAAA,KAAAP,EAAA,IANMO;AAMN,GAGGW,iBAAiB,EACrBvB,UACAE,SACAK,QACAC,6BACAW,0BAKI;CACJ,IAAMK,eAAelC,0BAA0B;EAC7CmC,MAAM,UAAUjB;EAChBkB,YAAYtB,UACVc,+BAA+B;GAC7B,GAAGd;GACHG,QAAQ;GACRP;GACAE;GACAM;GACAW;EACF,CAAC;CACL,CAAC,GACKQ,YAAYrC,0BAA0B;EAC1CmC,MAAM,OAAOjB;EACbkB,YAAYtB,UACVD,4BAA4B;GAC1B,GAAGC;GACHG,QAAQ;GACRP;GACAE;GACAM;EACF,CAAC;CACL,CAAC;CACD,OAAOD,SAASiB,eAAeG;AACjC,GAEaC,SAAQxB,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAMnB,EAAAN,aAAmBI,MAAKyB,YACxB,EAAA3B,SAAAM,6BAAAW,wBAAoEf,OACpEG,SAAeH,MAAK0B,OAAkBvB,QAAuBE;CAAA,AAAAJ,EAAA,OAAAE,UAAAF,EAAA,OAAAH,WAAAG,EAAA,OAAAL,YAAAK,EAAA,OAAAG,+BAAAH,EAAA,OAAAc,uBAGpDV,KAAA;EAAAT;EAAAE;EAAAK;EAAAC;EAAAW;CAMP,GAACd,EAAA,KAAAE,QAAAF,EAAA,KAAAH,SAAAG,EAAA,KAAAL,UAAAK,EAAA,KAAAG,6BAAAH,EAAA,KAAAc,qBAAAd,EAAA,KAAAI,MAAAA,KAAAJ,EAAA;CAPH,IAAA0B,cACStB,IAQRE;CAAA,AAAAN,EAAA,OAAAD,MAAA4B,UAGuCrB,KAAAN,EAAA,MAAnBM,KAAAP,MAAK4B,WAAL,CAAA,GAAmB3B,EAAA,KAAAD,MAAA4B,SAAA3B,EAAA,KAAAM;CAAtC,IAAAsB,aAAmBtB,IAAmBC;CAAA,AAAAP,EAAA,OAAA0B,cACJnB,KAAAP,EAAA,MAA1BO,KAAAW,cAAcQ,WAAW,GAAC1B,EAAA,KAAA0B,aAAA1B,EAAA,KAAAO;CAAA,IAAAsB;CAAA,AAAA7B,EAAA,QAAA4B,cAAA5B,EAAA,QAAAO,MAA3BsB,KAAA,CAACtB,IAA0B,GAAKqB,UAAU,GAAC5B,EAAA,MAAA4B,YAAA5B,EAAA,MAAAO,IAAAP,EAAA,MAAA6B,MAAAA,KAAA7B,EAAA;CAFpD,IAAA8B,kBAEED,IAC8BE;CAAA,AAAA/B,EAAA,QAAAD,QAG2BgC,KAAA/B,EAAA,OAA1B+B,KAAAtC,oBAAoBM,KAAK,GAACC,EAAA,MAAAD,OAAAC,EAAA,MAAA+B;CAAzD,IAAAC,yBAA+BD,IAA0BE;CAAA,AAAAjC,EAAA,QAAA8B,mBAAA9B,EAAA,QAAAgC,0BAClDC,KAAA;EAAA,GACFD;EAAsBL,SAChBG;CACX,GAAC9B,EAAA,MAAA8B,iBAAA9B,EAAA,MAAAgC,wBAAAhC,EAAA,MAAAiC,MAAAA,KAAAjC,EAAA;CALH,IAAAkC,gBAEED,IAI0BE;CAEa,OAFbnC,EAAA,QAAAkC,iBAAAlC,EAAA,QAAAD,MAAAqC,iBAErBD,KAAApC,MAAKqC,cAAeF,aAAa,GAAClC,EAAA,MAAAkC,eAAAlC,EAAA,MAAAD,MAAAqC,eAAApC,EAAA,MAAAmC,MAAAA,KAAAnC,EAAA,KAAlCmC;AAAkC,GCjI9BQ,gBAAeC,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAAAC,IAAAC;CAAA,IAAAH,EAAA,OAAAD,MAAAK,MAAA;EAC1B,IAAAC,sBAA4BN,MAAKK,KAAKE,MAAO,GAAG,EAAE;EACmBN,AAAhDH,KAAAA,cAAaM,KAAA,CAAA,GAAIE,qBAAqB,SAAS,GAACL,EAAA,KAAAD,MAAAK,MAAAJ,EAAA,KAAAE,IAAAF,EAAA,KAAAG;CAAA,OAAAA,AAAAD,KAAAF,EAAA,IAAAG,KAAAH,EAAA;CAArE,IAAAO,eAAqBV,GAAaM,EAAmC,GAACK;CAAA,AAAAR,EAAA,OAAAO,gBAAAP,EAAA,OAAAD,SAClDS,WAAA;EAClBT,MAAKU,SAAUb,IAAIW,cAAc,CAAC,OAAO,CAAC,CAAC;CAAC,GAC7CP,EAAA,KAAAO,cAAAP,EAAA,KAAAD,OAAAC,EAAA,KAAAQ,MAAAA,KAAAR,EAAA;CAFD,IAAAU,cAAoBF,IAEnBG;CAAA,AAAAX,EAAA,OAAAD,QAG8BY,KAAAX,EAAA,MAA1BW,KAAAZ,MAAKa,cAAeb,KAAK,GAACC,EAAA,KAAAD,OAAAC,EAAA,KAAAW;CAAA,IAAAE;CAAA,AAAAb,EAAA,OAAAU,cAIlBG,KAAAb,EAAA,MAFTa,KAAA,oBAAC,QAAD;EAAa,KAAA;EACX,UAAA,oBAAC,QAAD;GAAa,MAAA;GAAoB,MAAA;GAAiB,eAAMH,YAAY;EAAC,CAAA;CADhE,CAAA,GAEEV,EAAA,KAAAU,aAAAV,EAAA,KAAAa;CAAA,IAAAC;CACH,OADGd,EAAA,QAAAW,MAAAX,EAAA,QAAAa,MALXC,KAAA,qBAAC,OAAD;EAAY,KAAA;EAAZ,UAAA,CACGH,IAEDE,EAHI;KAMEb,EAAA,MAAAW,IAAAX,EAAA,MAAAa,IAAAb,EAAA,MAAAc,MAAAA,KAAAd,EAAA,KANRc;AAMQ,GCHCW,kBAAiBC,UAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAC5B,CAAAC,UAAAC,eAAgCd,SAA6Be,KAAAA,CAAS,GACtE,CAAAC,OAAAC,YAA0BjB,SAA6Be,KAAAA,CAAS,GAChE,CAAAG,OAAAC,YAA0BnB,SAAce,KAAAA,CAAS,GACjD,EAAAK,UAAAC,eAA+Bb,0BAA0B,GAACc;CAAA,AAAAX,EAAA,OAAAU,aACrBC,KAAAX,EAAA,MAAZW,KAAA,EAAAD,WAAW,GAACV,EAAA,KAAAU,YAAAV,EAAA,KAAAW;CAArC,IAAAC,SAAejB,UAAUgB,EAAY,GAErC,EAAAE,SAAAC,UAAyBf,OAA4BgB;CAAA,IAAAf,EAAA,OAAAa,WAAAb,EAAA,OAAAS,UAAA;EAAA,IAAAO;EAInDhB,AAJmDA,EAAA,OAAAa,UAIpDG,KAAAhB,EAAA,MAFqCgB,MAAAC,gBAC7BA,YAAWC,OAAQL,SAC3Bb,EAAA,KAAAa,SAAAb,EAAA,KAAAgB,KAFuBD,KAAAN,SAAQU,KAAMH,EAErC,GAAChB,EAAA,KAAAa,SAAAb,EAAA,KAAAS,UAAAT,EAAA,KAAAe;CAAA,OAAAA,KAAAf,EAAA;CAFF,IAAAoB,kBAAwBL,IAEtBC;CAAA,AAAAhB,EAAA,OAAAY,UAAAZ,EAAA,OAAAD,MAAAsB,cAAArB,EAAA,OAAAoB,iBAAAE,SAAAtB,EAAA,QAAAc,SAEQE,WAAA;EACR,IAAAO,cAAoB,YAAA;GAElB,IADAjB,SAASc,iBAAeE,KAAO,GAC3B,OAAOR,SAAU,UAAQ,OACpBX,YAAYW,KAAK;GAE1B,IAAIvB,YAAYuB,KAAK,GAAC;IACpB,IAAAU,MAAY,MAAMZ,OAAMa,YAAaX,MAAKY,IAAK,GAI/CM,iBAHajC,MAAKsB,WACKQ,OAAOV,KAAMW,KACbF,CAAU,EAAAD,KAAAA,CACGM,GAAGd,MAAMe,YAAWC,QAAKR,MAAWS,SAAKZ,KAAGa,KAAO,GAEvFC,eAAqB,CAAC,GACtBE,gBAAsBR,eAAaS,SAAiBC,UAA9B,CAAmC;IACzDC,OAAMC,KAAMJ,aAAa,CAAC,CAAAK,SAASC,QAAA;KACjC,IAAAC,WAAiBf,eAAaS,SAAiBC,SAAGI;KAClDR,aAAaQ,OACXC,YAAAvB,MACIuB,SAAQC,MAAO,GAAG,CAAC,CAAAC,OAAQC,QAAmC1B,GACtD,IAFZpB,KAAAA;IADe,CAIlB;IAED,IAAA+C,iBAAuBnB,eAAaS,SAAkBW,UAAGd,YAAY;IACb,OAAxD9B,SAAS2C,gBAAc5C,SAAW+B,aAAY/B,KAAS,GAChDJ,YAAYgD,gBAAc9C,SAAYiC,aAAYjC,KAAoB;GAAC;GAI/E,OAFGf,QAAQwB,KAAK,KACfN,SAASM,KAAK,GAET;EAAE;EAENS,YAAY;CAAC,GACnBvB,EAAA,KAAAY,QAAAZ,EAAA,KAAAD,MAAAsB,YAAArB,EAAA,KAAAoB,iBAAAE,OAAAtB,EAAA,MAAAc,OAAAd,EAAA,MAAAgB,MAAAA,KAAAhB,EAAA;CAAkB,IAAAqD,KAAAjC,iBAAeE,OAAOgC;CAjCzClE,AAiCyCY,EAAA,QAAAY,UAAAZ,EAAA,QAAAD,MAAAsB,cAAArB,EAAA,QAAAqD,MAAArD,EAAA,QAAAc,SAAtCwC,KAAA;EAACxC;EAAOF;EAAQyC;EAAwBtD,MAAKsB;CAAW,GAACrB,EAAA,MAAAY,QAAAZ,EAAA,MAAAD,MAAAsB,YAAArB,EAAA,MAAAqD,IAAArD,EAAA,MAAAc,OAAAd,EAAA,MAAAsD,MAAAA,KAAAtD,EAAA,KAjC5DZ,UAAU4B,IAiCPsC,EAAyD;CAAC,IAAAC;CAAA,IAAAvD,EAAA,QAAAO,SAAAP,EAAA,QAAAD,SAAAC,EAAA,QAAAE,YAAAF,EAAA,QAAAK,OAAA;EAE7D,IAAAmD,eAAqB;GAAA,GAChBzD;GAAKM;GAAAH;GAAAK;EAIV;EAEwCP,AAAjCuD,KAAAxD,MAAK0D,cAAeD,YAAY,GAACxD,EAAA,MAAAO,OAAAP,EAAA,MAAAD,OAAAC,EAAA,MAAAE,UAAAF,EAAA,MAAAK,OAAAL,EAAA,MAAAuD;CAAA,OAAAA,KAAAvD,EAAA;CAAA,OAAjCuD;AAAiC;AAvDZ,SAAAzB,MAAAK,OAAA;CAAA,OAsByBA,MAAKC,SAAU;AAAO;AAtB/C,SAAAc,OAAAQ,KAAAC,OAAA;CAAA,OAgCkCD,MAAMC;AAAM;ACxB5E,MAAMgB,6BAA6B,EACjCC,OACAC,6BACAC,qBACAC,WACAC,uBAOI;CACJ,IAAMC,WAAW,OAAOL,SAAU,WAAWA,QAAQA,MAAMM,MACrDC,WAAWC,OAAOH,SAAS,EAAE,CAAC,CAACI,YAAY,IAAIJ,SAASK,MAAM,CAAC,GAC/DC,cAAc,GAAGT,sBAAsBK;CAE7C,OAAOpB,WAAW;EAChBmB,MAAM,GAAGL,8BAA8BM;EACvCK,MAAM;EACNC,QAAQ;GACN;IACEP,MAAM;IACNQ,OAAO;IACPC,SAAS,EAACC,aACD,CAACC,MAAMC,QAAQF,MAAM;GAEhC;GACA;IACEV,MAAM;IACNQ,OAAO;IACPC,SAAS,EAACC,aACD,CAACC,MAAMC,QAAQF,MAAM;GAEhC;GACA;IACEV,MAAM;IACNQ,OAAO;IACPC,SAAS,EAACC,aACDC,MAAMC,QAAQF,MAAM;GAE/B;EAAC;EAEHG,YAAY;GACVnB,QAAQoB,UACN,oBAAC,OAAD;IACE,GAAIA;IACyBnB;IACRC;GAAoB,CAAA;GAG7CmB,MAAM/B;EACR;EACAgC,QAAQ;GACN,OAAOtB,SAAU,WAEbf,YAAY;IACVqB,MAAM;IACNM,MAAMZ;IACNuB,OAAO;GACT,CAAC,IAED;IACE,GAAGvB;IACHM,MAAM;IACNiB,OAAO;GACT;GACJtC,YAAY;IACVqB,MAAM;IACNM,MAAM;IACNG,QAAQ;IACRS,cAAc;GAChB,CAAC;GACDvC,YAAY;IACVqB,MAAMF;IACNQ,MAAM;IACNG,SAAS,EAACC,aACD,CAACA,QAAQS;IAElBF,OAAO;IACPJ,YAAY,EACVO,QAAQN,UACN,oBAAC,YAAD;KAAY,GAAIA;KAAoBT;KAAwBR;IAAU,CAAA,EAE1E;IACAwB,IAAI,CACF1C,YAAY;KACVqB,MAAMK;KACNC,MAAMD;IACR,CAAC,CAAC;GAEN,CAAC;EAAC;EAEJiB,SAAS;GACPC,QAAQ,EACNC,MAAM,UACR;GACAC,UAAU,EAACD,YASF;IACLhB,OARA,OAAOgB,QAAS,WACZA,OACAA,QAAQ,OAAOA,QAAS,aACtBA,KAAKhB,SAASgB,KAAKxB,SACnB;IAKN0B,OAHAF,QAAQ,OAAOA,QAAS,aAAWA,KAAKG,SAASH,KAAKI,SAASJ,KAAKE,UAAc;GAIpF;EAEJ;CACF,CAAC;AACH,GAEMG,qBAAqB,EACzBnC,OACAE,qBACAC,gBAKI;CACJ,IAAME,WAAW,OAAOL,SAAU,WAAWA,QAAQA,MAAMM,MACrDC,WAAWC,OAAOH,SAAS,EAAE,CAAC,CAACI,YAAY,IAAIJ,SAASK,MAAM,CAAC;CACrE,OAAOvB,WAAW;EAChBmB,MAAM,GAAGJ,sBAAsBK;EAC/BO,OAAO,GAAGZ,oBAAmB,SAAUK;EACvCK,MAAM;EACNO,YAAY;GACVS,SAAShC;GACT8B,OAAO/B;EACT;EACA2B,QAAQ,CACN;GACEV,MAAM;GACNN,MAAMH;GACNiC,UAAU;EACZ,GACA,OAAOpC,SAAU,WAEbf,YAAY;GACVqB,MAAM;GACNM,MAAMZ;EACR,CAAC,IAED;GACE,GAAGA;GACHM,MAAM;EACR,CAAC;EAEPsB,SAAS,EACPC,QAAQ;GACNQ,SAASlC;GACTmC,OAAO;EACT,EACF;CACF,CAAC;AACH,GAEMC,eAAe,EACnBjB,QACArB,6BACAC,qBACAC,WACAC,uBAEO,CACL,GAAGkB,OAAOoB,KAAK1C,UAAUmC,kBAAkB;CAACnC;CAAOE;CAAqBC;AAAS,CAAC,CAAC,GACnF,GAAGmB,OAAOoB,KAAK1C,UACbD,0BAA0B;CACxBC;CACAC;CACAC;CACAC;CACAC;AACF,CAAC,CACH,CAAC,GAIQuC,4BAA4BzD,cACtC0D,WAAW;CACV,IAAMC,eAAe;EAAC,GAAGrD;EAAgB,GAAGoD;CAAM,GAC5C,EAACtB,QAAQrB,6BAA6BC,wBAAuB2C,cAE7DzC,mBAAmB,GAAGF,oBAAmB,IACzCC,YAAY,GAAGD,oBAAmB;CASxC,OAAO;EACLI,MAAM;EACNyC,QAAQ,EACNC,OAVsBT,YAAY;GACpCjB;GACArB;GACAC;GACAC;GACAC;EACF,CAIW0C,EACT;EACAG,MAAM,EACJ9B,YAAY,EACVO,QAAQN,UAGF,EAFgBA,MAAM+B,OAAO,UAAU9D,mBAAmB+B,KAAK,MAa/D,CAPetB,kBAAkBsB,MAAMkC,UAChBD,CAAU,CAACG,MACnCxD,UACCA,MAAMY,KAAKN,KAAKmD,WAAWxD,2BAA2B,KACtDD,MAAMM,KAAKmD,WAAWxD,2BAA2B,CAGhDsD,IACInC,MAAMgC,cAAchC,KAAK,IAW3B,oBAAC,yBAAD;GAPL,GAAGA;GACHuC,kCAAkC;IAChC,GAAGd;IACH1C;IACAC;GACF;EAEgD,CAAA,EAEtD,EACF;CACF;AACF,CACF"}
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/launchDarkly/types.ts","../../src/launchDarkly/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/launchDarkly/types.ts","../../src/launchDarkly/index.ts"],"mappings":";;KAEY;EACV,kBAAkB;EAClB;EACA;;cCIW,wCAAqB,OAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-
|
|
1
|
+
import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-CPrY-K44.js";
|
|
2
|
+
import "@sanity/ui/styles.css";
|
|
2
3
|
import { definePlugin, isObjectInputProps } from "sanity";
|
|
3
4
|
import { c } from "react/compiler-runtime";
|
|
4
5
|
import { createContext, useContext, useEffect, useState } from "react";
|
|
@@ -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/react-compiler\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 {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":["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/react-compiler\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.2",
|
|
4
4
|
"description": "Plugin to help with personalization, a/b testing when using Sanity",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -30,22 +30,22 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@sanity/icons": "^5.2.1",
|
|
33
|
-
"@sanity/ui": "^
|
|
33
|
+
"@sanity/ui": "^4.0.1",
|
|
34
34
|
"@sanity/uuid": "^3.0.3",
|
|
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.17"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@sanity/tsconfig": "^2.2.1",
|
|
42
|
-
"@sanity/tsdown-config": "^0.
|
|
42
|
+
"@sanity/tsdown-config": "^0.24.0",
|
|
43
43
|
"@types/react": "^19.2.18",
|
|
44
44
|
"@types/react-dom": "^19.2.4",
|
|
45
45
|
"babel-plugin-react-compiler": "^1.0.0",
|
|
46
46
|
"react": "^19.2.8",
|
|
47
47
|
"react-dom": "^19.2.8",
|
|
48
|
-
"sanity": "^6.
|
|
48
|
+
"sanity": "^6.9.1",
|
|
49
49
|
"tsdown": "^0.22.14"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|