@sanity/personalization-plugin
3.1.03.1.1
dist/fieldExperiments-CPrY-K44.js+
dist/fieldExperiments-CPrY-K44.jsNew file+554
Index: package/dist/fieldExperiments-CPrY-K44.js
===================================================================
--- package/dist/fieldExperiments-CPrY-K44.js
+++ package/dist/fieldExperiments-CPrY-K44.js
@@ -0,0 +1,554 @@
+import { defineDocumentFieldAction, defineField, definePlugin, defineType, getPublishedId, isDocumentSchemaType, isImage, isObjectInputProps, isReference, set, unset, useClient, useDocumentOperation, useFormValue, useWorkspace } from "sanity";
+import { c } from "react/compiler-runtime";
+import { createContext, useContext, useEffect, useState } from "react";
+import { Button, Card, Inline, Select, Stack, Text } from "@sanity/ui";
+import { uuid } from "@sanity/uuid";
+import equal from "fast-deep-equal";
+import { suspend } from "suspend-react";
+import { jsx, jsxs } from "react/jsx-runtime";
+import { CloseIcon } from "@sanity/icons/Close";
+import { GiSoapExperiment } from "react-icons/gi";
+const ArrayItem = (props) => {
+ let $ = c(6), { active } = props.value, { onChange } = props.inputProps, t0, t1;
+ $[0] !== active || $[1] !== onChange ? (t0 = () => {
+ active || onChange(set(!0, ["active"]));
+ }, t1 = [active, onChange], $[0] = active, $[1] = onChange, $[2] = t0, $[3] = t1) : (t0 = $[2], t1 = $[3]), useEffect(t0, t1);
+ let t2;
+ return $[4] === props ? t2 = $[5] : (t2 = props.renderDefault(props), $[4] = props, $[5] = t2), t2;
+}, CONFIG_DEFAULT = {
+ fields: [],
+ apiVersion: "2024-11-07",
+ experimentNameOverride: "experiment",
+ variantNameOverride: "variant",
+ variantId: "variantId",
+ variantArrayName: "variants",
+ experimentId: "experimentId"
+}, ExperimentContext = createContext({
+ ...CONFIG_DEFAULT,
+ experiments: []
+});
+function useExperimentContext() {
+ return useContext(ExperimentContext);
+}
+function ExperimentProvider(props) {
+ let $ = c(14), { experimentFieldPluginConfig } = props, t0;
+ $[0] === experimentFieldPluginConfig.apiVersion ? t0 = $[1] : (t0 = { apiVersion: experimentFieldPluginConfig.apiVersion }, $[0] = experimentFieldPluginConfig.apiVersion, $[1] = t0);
+ let client = useClient(t0), workspace = useWorkspace(), t1;
+ $[2] !== client || $[3] !== experimentFieldPluginConfig || $[4] !== workspace ? (t1 = Array.isArray(experimentFieldPluginConfig.experiments) ? experimentFieldPluginConfig.experiments : suspend(async () => typeof experimentFieldPluginConfig.experiments == "function" ? experimentFieldPluginConfig.experiments(client) : experimentFieldPluginConfig.experiments, [workspace, "field-level-experiments"], { equal }), $[2] = client, $[3] = experimentFieldPluginConfig, $[4] = workspace, $[5] = t1) : t1 = $[5];
+ let experiments = t1, t2;
+ $[6] !== experimentFieldPluginConfig || $[7] !== experiments ? (t2 = {
+ ...experimentFieldPluginConfig,
+ experiments
+ }, $[6] = experimentFieldPluginConfig, $[7] = experiments, $[8] = t2) : t2 = $[8];
+ let context = t2, t3;
+ $[9] === props ? t3 = $[10] : (t3 = props.renderDefault(props), $[9] = props, $[10] = t3);
+ let t4;
+ return $[11] !== context || $[12] !== t3 ? (t4 = /* @__PURE__ */ jsx(ExperimentContext.Provider, {
+ value: context,
+ children: t3
+ }), $[11] = context, $[12] = t3, $[13] = t4) : t4 = $[13], t4;
+}
+const ArrayInput = (props) => {
+ let $ = c(35), experimentId, onItemAppend, t0, t1, variantId, variantName;
+ if ($[0] !== props) {
+ let fieldPath = props.path.slice(0, -1);
+ ({onItemAppend, variantName, variantId, experimentId} = props), t0 = useFormValue, t1 = [...fieldPath, experimentId], $[0] = props, $[1] = experimentId, $[2] = onItemAppend, $[3] = t0, $[4] = t1, $[5] = variantId, $[6] = variantName;
+ } else experimentId = $[1], onItemAppend = $[2], t0 = $[3], t1 = $[4], variantId = $[5], variantName = $[6];
+ let experimentValue = t0(t1), { experiments } = useExperimentContext(), t2;
+ $[7] !== experimentId || $[8] !== experimentValue || $[9] !== onItemAppend || $[10] !== variantId || $[11] !== variantName ? (t2 = async (variant) => {
+ let item = {
+ _key: uuid(),
+ [variantId]: variant.id,
+ [experimentId]: experimentValue,
+ _type: variantName
+ };
+ onItemAppend(item);
+ }, $[7] = experimentId, $[8] = experimentValue, $[9] = onItemAppend, $[10] = variantId, $[11] = variantName, $[12] = t2) : t2 = $[12];
+ let handleClick = t2, T0, T1, t3, t4, t5, t6;
+ if ($[13] !== experimentValue || $[14] !== experiments || $[15] !== handleClick || $[16] !== props || $[17] !== variantId) {
+ let filteredVariants = experiments.find((option) => option.id === experimentValue)?.variants || [], usedVariants = (props.value || [])?.map((variant_0) => variant_0[variantId]);
+ T1 = Stack, t5 = 3, $[24] === props ? t6 = $[25] : (t6 = props.renderDefault({
+ ...props,
+ arrayFunctions: _temp$2
+ }), $[24] = props, $[25] = t6), T0 = Inline, t3 = 1, t4 = filteredVariants.map((variant_1) => /* @__PURE__ */ jsx(Button, {
+ text: `Add ${variant_1.label}`,
+ mode: "ghost",
+ disabled: usedVariants?.includes(variant_1.id),
+ onClick: () => handleClick(variant_1)
+ }, `${experimentValue}-${variant_1.id}`)), $[13] = experimentValue, $[14] = experiments, $[15] = handleClick, $[16] = props, $[17] = variantId, $[18] = T0, $[19] = T1, $[20] = t3, $[21] = t4, $[22] = t5, $[23] = t6;
+ } else T0 = $[18], T1 = $[19], t3 = $[20], t4 = $[21], t5 = $[22], t6 = $[23];
+ let t7;
+ $[26] !== T0 || $[27] !== t3 || $[28] !== t4 ? (t7 = /* @__PURE__ */ jsx(T0, {
+ gap: t3,
+ children: t4
+ }), $[26] = T0, $[27] = t3, $[28] = t4, $[29] = t7) : t7 = $[29];
+ let t8;
+ return $[30] !== T1 || $[31] !== t5 || $[32] !== t6 || $[33] !== t7 ? (t8 = /* @__PURE__ */ jsxs(T1, {
+ gap: t5,
+ children: [t6, t7]
+ }), $[30] = T1, $[31] = t5, $[32] = t6, $[33] = t7, $[34] = t8) : t8 = $[34], t8;
+};
+function _temp$2() {
+ return null;
+}
+/**
+* Safely updates deeply nested children props to clear groups array
+* This prevents field grouping UI conflicts in personalization mode
+*/
+const clearChildrenGroups = (props) => {
+ let children = props.children;
+ if (!children || typeof children != "object" || !children.props) return props;
+ let innerChild = children.props.children;
+ return !innerChild || typeof innerChild != "object" || Array.isArray(innerChild) || !("props" in innerChild) ? props : {
+ ...props,
+ children: {
+ ...children,
+ props: {
+ ...children.props,
+ children: {
+ ...innerChild,
+ props: {
+ ...innerChild.props,
+ groups: []
+ }
+ }
+ }
+ }
+ };
+}, useAddExperimentAction = (props) => {
+ let $ = c(6), { onChange, active, experimentNameOverride } = props, t0;
+ $[0] !== active || $[1] !== onChange ? (t0 = () => {
+ onChange([set(!active, ["active"])]);
+ }, $[0] = active, $[1] = onChange, $[2] = t0) : t0 = $[2];
+ let handleAddAction = t0, t1 = `Add ${experimentNameOverride}`, t2;
+ return $[3] !== handleAddAction || $[4] !== t1 ? (t2 = {
+ title: t1,
+ type: "action",
+ icon: GiSoapExperiment,
+ onAction: handleAddAction,
+ renderAsButton: !0
+ }, $[3] = handleAddAction, $[4] = t1, $[5] = t2) : t2 = $[5], t2;
+}, useRemoveExperimentAction = (props) => {
+ let $ = c(8), { onChange, active, experimentId, experimentNameOverride, variantNameOverride } = props, t0;
+ $[0] !== active || $[1] !== experimentId || $[2] !== onChange || $[3] !== variantNameOverride ? (t0 = () => {
+ let activeId = ["active"], experiment = [experimentId], variants = [`${variantNameOverride}s`];
+ onChange([
+ set(!active, activeId),
+ unset(experiment),
+ unset(variants)
+ ]);
+ }, $[0] = active, $[1] = experimentId, $[2] = onChange, $[3] = variantNameOverride, $[4] = t0) : t0 = $[4];
+ let handleClearAction = t0, t1 = `Remove ${experimentNameOverride}`, t2;
+ return $[5] !== handleClearAction || $[6] !== t1 ? (t2 = {
+ title: t1,
+ type: "action",
+ icon: CloseIcon,
+ onAction: handleClearAction,
+ renderAsButton: !0
+ }, $[5] = handleClearAction, $[6] = t1, $[7] = t2) : t2 = $[7], t2;
+}, createActions = ({ onChange, inputId, active, experimentNameOverride, experimentId, variantNameOverride }) => {
+ let removeAction = defineDocumentFieldAction({
+ name: `Remove ${experimentNameOverride}`,
+ useAction: (props) => useRemoveExperimentAction({
+ ...props,
+ active: !0,
+ onChange,
+ inputId,
+ experimentNameOverride,
+ experimentId,
+ variantNameOverride
+ })
+ }), addAction = defineDocumentFieldAction({
+ name: `Add ${experimentNameOverride}`,
+ useAction: (props) => useAddExperimentAction({
+ ...props,
+ active: !1,
+ onChange,
+ inputId,
+ experimentNameOverride,
+ experimentId
+ })
+ });
+ return active ? removeAction : addAction;
+}, Field = (props) => {
+ let $ = c(22), { onChange } = props.inputProps, { inputId, experimentNameOverride, experimentId, variantNameOverride } = props, active = props.value?.active, t0;
+ $[0] !== active || $[1] !== experimentId || $[2] !== experimentNameOverride || $[3] !== inputId || $[4] !== onChange || $[5] !== variantNameOverride ? (t0 = {
+ onChange,
+ inputId,
+ active,
+ experimentNameOverride,
+ experimentId,
+ variantNameOverride
+ }, $[0] = active, $[1] = experimentId, $[2] = experimentNameOverride, $[3] = inputId, $[4] = onChange, $[5] = variantNameOverride, $[6] = t0) : t0 = $[6];
+ let actionProps = t0, t1;
+ $[7] === props.actions ? t1 = $[8] : (t1 = props.actions || [], $[7] = props.actions, $[8] = t1);
+ let oldActions = t1, t2;
+ $[9] === actionProps ? t2 = $[10] : (t2 = createActions(actionProps), $[9] = actionProps, $[10] = t2);
+ let t3;
+ $[11] !== oldActions || $[12] !== t2 ? (t3 = [t2, ...oldActions], $[11] = oldActions, $[12] = t2, $[13] = t3) : t3 = $[13];
+ let memoizedActions = t3, t4;
+ $[14] === props ? t4 = $[15] : (t4 = clearChildrenGroups(props), $[14] = props, $[15] = t4);
+ let propsWithClearedGroups = t4, t5;
+ $[16] !== memoizedActions || $[17] !== propsWithClearedGroups ? (t5 = {
+ ...propsWithClearedGroups,
+ actions: memoizedActions
+ }, $[16] = memoizedActions, $[17] = propsWithClearedGroups, $[18] = t5) : t5 = $[18];
+ let enhancedProps = t5, t6;
+ return $[19] !== enhancedProps || $[20] !== props.renderDefault ? (t6 = props.renderDefault(enhancedProps), $[19] = enhancedProps, $[20] = props.renderDefault, $[21] = t6) : t6 = $[21], t6;
+}, Select$1 = (props) => {
+ let $ = c(12), { value, onChange, elementProps, listOptions, handleChange } = props, t0;
+ $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = [
+ 3,
+ 3,
+ 4
+ ], $[0] = t0) : t0 = $[0];
+ let t1 = value || "", t2;
+ $[1] !== handleChange || $[2] !== onChange ? (t2 = (event) => handleChange(event, onChange), $[1] = handleChange, $[2] = onChange, $[3] = t2) : t2 = $[3];
+ let t3;
+ $[4] === Symbol.for("react.memo_cache_sentinel") ? (t3 = /* @__PURE__ */ jsx("option", {
+ value: "",
+ children: "Select an option..."
+ }), $[4] = t3) : t3 = $[4];
+ let t4;
+ $[5] === listOptions ? t4 = $[6] : (t4 = listOptions.map(_temp$1), $[5] = listOptions, $[6] = t4);
+ let t5;
+ return $[7] !== elementProps || $[8] !== t1 || $[9] !== t2 || $[10] !== t4 ? (t5 = /* @__PURE__ */ jsxs(Select, {
+ ...elementProps,
+ fontSize: 2,
+ padding: 3,
+ gap: t0,
+ value: t1,
+ onChange: t2,
+ children: [t3, t4]
+ }), $[7] = elementProps, $[8] = t1, $[9] = t2, $[10] = t4, $[11] = t5) : t5 = $[11], t5;
+};
+function _temp$1(t0) {
+ let { value: optionValue, title } = t0;
+ return /* @__PURE__ */ jsx("option", {
+ value: optionValue,
+ children: title
+ }, optionValue);
+}
+const formatlistOptions = (experiments) => experiments.map((experiment) => ({
+ title: experiment.label,
+ value: experiment.id
+})), Input = (props) => {
+ let $ = c(20), { experiments } = useExperimentContext(), t0;
+ $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = ["_id"], $[0] = t0) : t0 = $[0];
+ let id = useFormValue(t0), t1;
+ $[1] !== props.path || $[2] !== props.variantNameOverride ? (t1 = [...props.path.slice(0, -1), `${props.variantNameOverride}s`], $[1] = props.path, $[2] = props.variantNameOverride, $[3] = t1) : t1 = $[3];
+ let additionalChangePath = t1, subValues = useFormValue(additionalChangePath), t2;
+ $[4] === id ? t2 = $[5] : (t2 = getPublishedId(id), $[4] = id, $[5] = t2);
+ let { patch } = useDocumentOperation(t2, props.schemaType.name), t3;
+ $[6] !== additionalChangePath || $[7] !== patch || $[8] !== subValues ? (t3 = (event, onChange) => {
+ let inputValue = event.currentTarget.value;
+ if (onChange(inputValue ? set(inputValue) : unset()), subValues) {
+ let patchEvent = { unset: [additionalChangePath.join(".")] };
+ patch.execute([patchEvent]);
+ }
+ }, $[6] = additionalChangePath, $[7] = patch, $[8] = subValues, $[9] = t3) : t3 = $[9];
+ let handleChange = t3;
+ if (!experiments.length) {
+ let t4;
+ $[10] === Symbol.for("react.memo_cache_sentinel") ? (t4 = [
+ 3,
+ 3,
+ 4
+ ], $[10] = t4) : t4 = $[10];
+ let t5;
+ $[11] === Symbol.for("react.memo_cache_sentinel") ? (t5 = [
+ 2,
+ 2,
+ 3
+ ], $[11] = t5) : t5 = $[11];
+ let t6;
+ return $[12] === props.experimentNameOverride ? t6 = $[13] : (t6 = /* @__PURE__ */ jsx(Card, {
+ padding: t4,
+ radius: 2,
+ shadow: 1,
+ tone: "caution",
+ children: /* @__PURE__ */ jsxs(Text, {
+ align: "center",
+ size: t5,
+ children: [
+ "There are no defined ",
+ props.experimentNameOverride,
+ "s"
+ ]
+ })
+ }), $[12] = props.experimentNameOverride, $[13] = t6), t6;
+ }
+ let t4;
+ $[14] === experiments ? t4 = $[15] : (t4 = formatlistOptions(experiments), $[14] = experiments, $[15] = t4);
+ let t5;
+ return $[16] !== handleChange || $[17] !== props || $[18] !== t4 ? (t5 = /* @__PURE__ */ jsx(Select$1, {
+ ...props,
+ listOptions: t4,
+ handleChange
+ }), $[16] = handleChange, $[17] = props, $[18] = t4, $[19] = t5) : t5 = $[19], t5;
+}, VariantInput = (props) => {
+ let $ = c(13), t0, t1;
+ if ($[0] !== props.path) {
+ let experimentPath = props.path.slice(0, -2);
+ t0 = useFormValue, t1 = [...experimentPath, "default"], $[0] = props.path, $[1] = t0, $[2] = t1;
+ } else t0 = $[1], t1 = $[2];
+ let defaultValue = t0(t1), t2;
+ $[3] !== defaultValue || $[4] !== props ? (t2 = () => {
+ props.onChange(set(defaultValue, ["value"]));
+ }, $[3] = defaultValue, $[4] = props, $[5] = t2) : t2 = $[5];
+ let handleClick = t2, t3;
+ $[6] === props ? t3 = $[7] : (t3 = props.renderDefault(props), $[6] = props, $[7] = t3);
+ let t4;
+ $[8] === handleClick ? t4 = $[9] : (t4 = /* @__PURE__ */ jsx(Inline, {
+ gap: 1,
+ children: /* @__PURE__ */ jsx(Button, {
+ text: "Copy default",
+ mode: "ghost",
+ onClick: () => handleClick()
+ })
+ }), $[8] = handleClick, $[9] = t4);
+ let t5;
+ return $[10] !== t3 || $[11] !== t4 ? (t5 = /* @__PURE__ */ jsxs(Stack, {
+ gap: 3,
+ children: [t3, t4]
+ }), $[10] = t3, $[11] = t4, $[12] = t5) : t5 = $[12], t5;
+}, VariantPreview = (props) => {
+ let $ = c(26), [subtitle, setSubtitle] = useState(void 0), [title, setTitle] = useState(void 0), [media, setMedia] = useState(void 0), { experiments, apiVersion } = useExperimentContext(), t0;
+ $[0] === apiVersion ? t0 = $[1] : (t0 = { apiVersion }, $[0] = apiVersion, $[1] = t0);
+ let client = useClient(t0), { experiment, variant, value } = props, selectedExperiment, t1;
+ if ($[2] !== experiment || $[3] !== experiments || $[4] !== variant) {
+ let t2;
+ $[7] === experiment ? t2 = $[8] : (t2 = (experimentItem) => experimentItem.id === experiment, $[7] = experiment, $[8] = t2), selectedExperiment = experiments.find(t2), t1 = selectedExperiment?.variants.find((variantItem) => variantItem.id === variant), $[2] = experiment, $[3] = experiments, $[4] = variant, $[5] = selectedExperiment, $[6] = t1;
+ } else selectedExperiment = $[5], t1 = $[6];
+ let selectedVariant = t1, t2;
+ $[9] !== client || $[10] !== props.schemaType || $[11] !== selectedExperiment || $[12] !== selectedVariant || $[13] !== value ? (t2 = () => {
+ let getSubtitle = async () => {
+ if (setTitle(selectedExperiment?.label && selectedVariant?.label ? `${selectedExperiment.label} - ${selectedVariant.label}` : selectedExperiment?.label || selectedVariant?.label), typeof value == "string") return setSubtitle(value);
+ if (isReference(value)) {
+ let doc = await client.getDocument(value._ref), referenceType = (props.schemaType.fields.find(_temp)?.type).to.find((field_0) => field_0.type?.name === doc?._type), selectFields = {}, previewFields = referenceType?.preview?.select || {};
+ Object.keys(previewFields).forEach((key) => {
+ let valueKey = referenceType?.preview?.select?.[key];
+ selectFields[key] = valueKey && doc ? valueKey.split(".").reduce(_temp2, doc) : void 0;
+ });
+ let previewContent = referenceType?.preview?.prepare?.(selectFields);
+ return setMedia(previewContent?.media || selectFields.media), setSubtitle(previewContent?.title || selectFields.title);
+ }
+ return isImage(value) && setMedia(value), "";
+ };
+ getSubtitle();
+ }, $[9] = client, $[10] = props.schemaType, $[11] = selectedExperiment, $[12] = selectedVariant, $[13] = value, $[14] = t2) : t2 = $[14];
+ let t3 = selectedExperiment?.label, t4 = selectedVariant?.label, t5;
+ $[15] !== client || $[16] !== props.schemaType || $[17] !== t3 || $[18] !== t4 || $[19] !== value ? (t5 = [
+ value,
+ client,
+ t3,
+ t4,
+ props.schemaType
+ ], $[15] = client, $[16] = props.schemaType, $[17] = t3, $[18] = t4, $[19] = value, $[20] = t5) : t5 = $[20], useEffect(t2, t5);
+ let t6;
+ if ($[21] !== media || $[22] !== props || $[23] !== subtitle || $[24] !== title) {
+ let previewProps = {
+ ...props,
+ title,
+ subtitle,
+ media
+ };
+ t6 = props.renderDefault(previewProps), $[21] = media, $[22] = props, $[23] = subtitle, $[24] = title, $[25] = t6;
+ } else t6 = $[25];
+ return t6;
+};
+function _temp(field) {
+ return field.name === "value";
+}
+function _temp2(acc, index) {
+ return acc?.[index];
+}
+/**
+* Flattens a document's schema type into a flat array of fields and includes their path
+*/
+function flattenSchemaType(schemaType) {
+ return isDocumentSchemaType(schemaType) ? extractInnerFields(schemaType.fields, [], 5) : (console.error("Schema type is not a document"), []);
+}
+function extractInnerFields(fields, path, maxDepth) {
+ if (path.length >= maxDepth) return [];
+ let result = [];
+ for (let field of fields) if (result.push({
+ path: [...path, field.name],
+ ...field
+ }), field.type.jsonType === "object") result.push(...extractInnerFields(field.type.fields, [...path, field.name], maxDepth));
+ else if (field.type.jsonType === "array") {
+ let arrayTypes = field.type.of || [];
+ for (let arrayType of arrayTypes) "fields" in arrayType && result.push(...extractInnerFields(arrayType.fields, [...path, field.name], maxDepth));
+ }
+ return result;
+}
+const createExperimentType = ({ field, experimentNameOverride, variantNameOverride, variantId, variantArrayName, experimentId }) => {
+ let typeName = typeof field == "string" ? field : field.name, usedName = String(typeName[0]).toUpperCase() + typeName.slice(1), variantName = `${variantNameOverride}${usedName}`;
+ return defineType({
+ name: `${experimentNameOverride}${usedName}`,
+ type: "object",
+ groups: [
+ {
+ name: "default",
+ title: "Default",
+ hidden: ({ parent }) => !Array.isArray(parent)
+ },
+ {
+ name: "experiments",
+ title: "Experiments",
+ hidden: ({ parent }) => !Array.isArray(parent)
+ },
+ {
+ name: "all-fields",
+ title: "All fields",
+ hidden: ({ parent }) => Array.isArray(parent)
+ }
+ ],
+ components: {
+ field: (props) => /* @__PURE__ */ jsx(Field, {
+ ...props,
+ experimentId,
+ experimentNameOverride,
+ variantNameOverride
+ }),
+ item: ArrayItem
+ },
+ fields: [
+ typeof field == "string" ? defineField({
+ name: "default",
+ type: field,
+ group: "default"
+ }) : {
+ ...field,
+ name: "default",
+ group: "default"
+ },
+ defineField({
+ name: "active",
+ type: "boolean",
+ hidden: !0,
+ initialValue: !1
+ }),
+ defineField({
+ name: experimentId,
+ type: "string",
+ group: "experiments",
+ components: { input: (props) => /* @__PURE__ */ jsx(Input, {
+ ...props,
+ experimentNameOverride,
+ variantNameOverride
+ }) },
+ hidden: ({ parent }) => !parent?.active
+ }),
+ defineField({
+ name: variantArrayName,
+ type: "array",
+ group: "experiments",
+ hidden: ({ parent }) => !parent?.[experimentId],
+ components: { input: (props) => /* @__PURE__ */ jsx(ArrayInput, {
+ ...props,
+ variantName,
+ variantId,
+ experimentId
+ }) },
+ of: [defineField({
+ name: variantName,
+ type: variantName
+ })]
+ })
+ ],
+ preview: {
+ select: {
+ base: "default",
+ experiment: experimentId
+ },
+ prepare: ({ base, experiment }) => {
+ let title = typeof base == "string" ? base : base && typeof base == "object" && (base.title || base.name) || "", experimentTitle = experiment ? `Experiment: ${experiment}` : "", media = base && typeof base == "object" && (base.image || base.photo || base.media) || "";
+ return {
+ title: title || experimentTitle,
+ subtitle: title ? experimentTitle : "",
+ media
+ };
+ }
+ }
+ });
+}, createVariantType = ({ field, variantNameOverride, variantId, experimentId }) => {
+ let typeName = typeof field == "string" ? field : field.name, usedName = String(typeName[0]).toUpperCase() + typeName.slice(1);
+ return defineType({
+ name: `${variantNameOverride}${usedName}`,
+ title: `${variantNameOverride} array ${usedName}`,
+ type: "object",
+ components: {
+ preview: VariantPreview,
+ input: VariantInput
+ },
+ fields: [
+ {
+ type: "string",
+ name: variantId,
+ readOnly: !0
+ },
+ {
+ type: "string",
+ name: experimentId,
+ hidden: !0
+ },
+ typeof field == "string" ? defineField({
+ name: "value",
+ type: field
+ }) : {
+ ...field,
+ name: "value"
+ }
+ ],
+ preview: { select: {
+ variant: variantId,
+ experiment: experimentId,
+ value: "value"
+ } }
+ });
+}, fieldSchema = ({ fields, experimentNameOverride, variantNameOverride, variantId, variantArrayName, experimentId }) => [...fields.map((field) => createVariantType({
+ field,
+ variantNameOverride,
+ variantId,
+ experimentId
+})), ...fields.map((field) => createExperimentType({
+ field,
+ experimentNameOverride,
+ variantNameOverride,
+ variantId,
+ variantArrayName,
+ experimentId
+}))], fieldLevelExperiments = definePlugin((config) => {
+ let pluginConfig = {
+ ...CONFIG_DEFAULT,
+ ...config
+ }, { fields, experimentNameOverride, variantNameOverride } = pluginConfig, experimentId = `${experimentNameOverride}Id`, variantArrayName = `${variantNameOverride}s`, variantId = `${variantNameOverride}Id`;
+ return {
+ name: "sanity-personalization-plugin-field-level-experiments",
+ schema: { types: fieldSchema({
+ fields,
+ experimentNameOverride,
+ variantNameOverride,
+ variantId,
+ variantArrayName,
+ experimentId
+ }) },
+ form: { components: { input: (props) => {
+ if (!(props.id === "root" && isObjectInputProps(props)) || !flattenSchemaType(props.schemaType).some((field) => field.type.name.startsWith(experimentNameOverride) || field.name.startsWith(experimentNameOverride))) return props.renderDefault(props);
+ let providerProps = {
+ ...props,
+ experimentFieldPluginConfig: {
+ ...pluginConfig,
+ variantId,
+ variantArrayName,
+ experimentId
+ }
+ };
+ return /* @__PURE__ */ jsx(ExperimentProvider, { ...providerProps });
+ } } }
+ };
+});
+export { ArrayItem as i, flattenSchemaType as n, clearChildrenGroups as r, fieldLevelExperiments as t };
+
+//# sourceMappingURL=fieldExperiments-CPrY-K44.js.map
\ No newline at end of file