@sanity/personalization-plugin 3.0.0 → 3.0.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.
@@ -0,0 +1,568 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useClient, useWorkspace, useFormValue, defineDocumentFieldAction, set, unset, getPublishedId, useDocumentOperation, isReference, isImage, isDocumentSchemaType, definePlugin, isObjectInputProps, defineType, defineField } from "sanity";
3
+ import { c } from "react/compiler-runtime";
4
+ import { Button, Stack, Inline, Select as Select$1, Card, Text } from "@sanity/ui";
5
+ import { uuid } from "@sanity/uuid";
6
+ import { createContext, useContext, useState, useEffect } from "react";
7
+ import equal from "fast-deep-equal";
8
+ import { suspend } from "suspend-react";
9
+ import { CloseIcon } from "@sanity/icons/Close";
10
+ import { GiSoapExperiment } from "react-icons/gi";
11
+ const CONFIG_DEFAULT = {
12
+ fields: [],
13
+ apiVersion: "2024-11-07",
14
+ experimentNameOverride: "experiment",
15
+ variantNameOverride: "variant",
16
+ variantId: "variantId",
17
+ variantArrayName: "variants",
18
+ experimentId: "experimentId"
19
+ }, ExperimentContext = createContext({
20
+ ...CONFIG_DEFAULT,
21
+ experiments: []
22
+ });
23
+ function useExperimentContext() {
24
+ return useContext(ExperimentContext);
25
+ }
26
+ function ExperimentProvider(props) {
27
+ const $ = c(14), {
28
+ experimentFieldPluginConfig
29
+ } = props;
30
+ let t0;
31
+ $[0] !== experimentFieldPluginConfig.apiVersion ? (t0 = {
32
+ apiVersion: experimentFieldPluginConfig.apiVersion
33
+ }, $[0] = experimentFieldPluginConfig.apiVersion, $[1] = t0) : t0 = $[1];
34
+ const client = useClient(t0), workspace = useWorkspace();
35
+ let t1;
36
+ $[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], {
37
+ equal
38
+ }), $[2] = client, $[3] = experimentFieldPluginConfig, $[4] = workspace, $[5] = t1) : t1 = $[5];
39
+ const experiments = t1;
40
+ let t2;
41
+ $[6] !== experimentFieldPluginConfig || $[7] !== experiments ? (t2 = {
42
+ ...experimentFieldPluginConfig,
43
+ experiments
44
+ }, $[6] = experimentFieldPluginConfig, $[7] = experiments, $[8] = t2) : t2 = $[8];
45
+ const context = t2;
46
+ let t3;
47
+ $[9] !== props ? (t3 = props.renderDefault(props), $[9] = props, $[10] = t3) : t3 = $[10];
48
+ let t4;
49
+ return $[11] !== context || $[12] !== t3 ? (t4 = /* @__PURE__ */ jsx(ExperimentContext.Provider, { value: context, children: t3 }), $[11] = context, $[12] = t3, $[13] = t4) : t4 = $[13], t4;
50
+ }
51
+ const ArrayInput = (props) => {
52
+ const $ = c(35);
53
+ let experimentId, onItemAppend, t0, t1, variantId, variantName;
54
+ if ($[0] !== props) {
55
+ const fieldPath = props.path.slice(0, -1);
56
+ ({
57
+ onItemAppend,
58
+ variantName,
59
+ variantId,
60
+ experimentId
61
+ } = props), t0 = useFormValue, t1 = [...fieldPath, experimentId], $[0] = props, $[1] = experimentId, $[2] = onItemAppend, $[3] = t0, $[4] = t1, $[5] = variantId, $[6] = variantName;
62
+ } else
63
+ experimentId = $[1], onItemAppend = $[2], t0 = $[3], t1 = $[4], variantId = $[5], variantName = $[6];
64
+ const experimentValue = t0(t1), {
65
+ experiments
66
+ } = useExperimentContext();
67
+ let t2;
68
+ $[7] !== experimentId || $[8] !== experimentValue || $[9] !== onItemAppend || $[10] !== variantId || $[11] !== variantName ? (t2 = async (variant) => {
69
+ const item = {
70
+ _key: uuid(),
71
+ [variantId]: variant.id,
72
+ [experimentId]: experimentValue,
73
+ _type: variantName
74
+ };
75
+ onItemAppend(item);
76
+ }, $[7] = experimentId, $[8] = experimentValue, $[9] = onItemAppend, $[10] = variantId, $[11] = variantName, $[12] = t2) : t2 = $[12];
77
+ const handleClick = t2;
78
+ let T0, T1, t3, t4, t5, t6;
79
+ if ($[13] !== experimentValue || $[14] !== experiments || $[15] !== handleClick || $[16] !== props || $[17] !== variantId) {
80
+ const filteredVariants = experiments.find((option) => option.id === experimentValue)?.variants || [], usedVariants = (props.value || [])?.map((variant_0) => variant_0[variantId]);
81
+ T1 = Stack, t5 = 3, $[24] !== props ? (t6 = props.renderDefault({
82
+ ...props,
83
+ arrayFunctions: _temp$2
84
+ }), $[24] = props, $[25] = t6) : t6 = $[25], 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;
85
+ } else
86
+ T0 = $[18], T1 = $[19], t3 = $[20], t4 = $[21], t5 = $[22], t6 = $[23];
87
+ let t7;
88
+ $[26] !== T0 || $[27] !== t3 || $[28] !== t4 ? (t7 = /* @__PURE__ */ jsx(T0, { gap: t3, children: t4 }), $[26] = T0, $[27] = t3, $[28] = t4, $[29] = t7) : t7 = $[29];
89
+ let t8;
90
+ return $[30] !== T1 || $[31] !== t5 || $[32] !== t6 || $[33] !== t7 ? (t8 = /* @__PURE__ */ jsxs(T1, { gap: t5, children: [
91
+ t6,
92
+ t7
93
+ ] }), $[30] = T1, $[31] = t5, $[32] = t6, $[33] = t7, $[34] = t8) : t8 = $[34], t8;
94
+ };
95
+ function _temp$2() {
96
+ return null;
97
+ }
98
+ const useAddExperimentAction = (props) => {
99
+ const $ = c(6), {
100
+ onChange,
101
+ active,
102
+ experimentNameOverride
103
+ } = props;
104
+ let t0;
105
+ $[0] !== active || $[1] !== onChange ? (t0 = () => {
106
+ onChange([set(!active, ["active"])]);
107
+ }, $[0] = active, $[1] = onChange, $[2] = t0) : t0 = $[2];
108
+ const handleAddAction = t0, t1 = `Add ${experimentNameOverride}`;
109
+ let t2;
110
+ return $[3] !== handleAddAction || $[4] !== t1 ? (t2 = {
111
+ title: t1,
112
+ type: "action",
113
+ icon: GiSoapExperiment,
114
+ onAction: handleAddAction,
115
+ renderAsButton: !0
116
+ }, $[3] = handleAddAction, $[4] = t1, $[5] = t2) : t2 = $[5], t2;
117
+ }, useRemoveExperimentAction = (props) => {
118
+ const $ = c(8), {
119
+ onChange,
120
+ active,
121
+ experimentId,
122
+ experimentNameOverride,
123
+ variantNameOverride
124
+ } = props;
125
+ let t0;
126
+ $[0] !== active || $[1] !== experimentId || $[2] !== onChange || $[3] !== variantNameOverride ? (t0 = () => {
127
+ const activeId = ["active"], experiment = [experimentId], variants = [`${variantNameOverride}s`];
128
+ onChange([set(!active, activeId), unset(experiment), unset(variants)]);
129
+ }, $[0] = active, $[1] = experimentId, $[2] = onChange, $[3] = variantNameOverride, $[4] = t0) : t0 = $[4];
130
+ const handleClearAction = t0, t1 = `Remove ${experimentNameOverride}`;
131
+ let t2;
132
+ return $[5] !== handleClearAction || $[6] !== t1 ? (t2 = {
133
+ title: t1,
134
+ type: "action",
135
+ icon: CloseIcon,
136
+ onAction: handleClearAction,
137
+ renderAsButton: !0
138
+ }, $[5] = handleClearAction, $[6] = t1, $[7] = t2) : t2 = $[7], t2;
139
+ }, createActions = ({
140
+ onChange,
141
+ inputId,
142
+ active,
143
+ experimentNameOverride,
144
+ experimentId,
145
+ variantNameOverride
146
+ }) => {
147
+ const removeAction = defineDocumentFieldAction({
148
+ name: `Remove ${experimentNameOverride}`,
149
+ useAction: (props) => useRemoveExperimentAction({
150
+ ...props,
151
+ active: !0,
152
+ onChange,
153
+ experimentNameOverride,
154
+ experimentId,
155
+ variantNameOverride
156
+ })
157
+ }), addAction = defineDocumentFieldAction({
158
+ name: `Add ${experimentNameOverride}`,
159
+ useAction: (props) => useAddExperimentAction({
160
+ ...props,
161
+ active: !1,
162
+ onChange,
163
+ experimentNameOverride
164
+ })
165
+ });
166
+ return active ? removeAction : addAction;
167
+ }, ExperimentField = (props) => {
168
+ const $ = c(20), {
169
+ onChange
170
+ } = props.inputProps, {
171
+ inputId,
172
+ experimentNameOverride,
173
+ experimentId,
174
+ variantNameOverride
175
+ } = props, active = props.value?.active;
176
+ let t0;
177
+ $[0] !== active || $[1] !== experimentId || $[2] !== experimentNameOverride || $[3] !== inputId || $[4] !== onChange || $[5] !== variantNameOverride ? (t0 = {
178
+ onChange,
179
+ inputId,
180
+ active,
181
+ experimentNameOverride,
182
+ experimentId,
183
+ variantNameOverride
184
+ }, $[0] = active, $[1] = experimentId, $[2] = experimentNameOverride, $[3] = inputId, $[4] = onChange, $[5] = variantNameOverride, $[6] = t0) : t0 = $[6];
185
+ const actionProps = t0;
186
+ let t1;
187
+ $[7] !== props.actions ? (t1 = props.actions || [], $[7] = props.actions, $[8] = t1) : t1 = $[8];
188
+ const oldActions = t1;
189
+ let t2;
190
+ $[9] !== actionProps ? (t2 = createActions(actionProps), $[9] = actionProps, $[10] = t2) : t2 = $[10];
191
+ let t3;
192
+ $[11] !== oldActions || $[12] !== t2 ? (t3 = [t2, ...oldActions], $[11] = oldActions, $[12] = t2, $[13] = t3) : t3 = $[13];
193
+ const memoizedActions = t3;
194
+ let t4;
195
+ $[14] !== memoizedActions || $[15] !== props ? (t4 = {
196
+ ...props,
197
+ actions: memoizedActions
198
+ }, $[14] = memoizedActions, $[15] = props, $[16] = t4) : t4 = $[16];
199
+ const withActionProps = t4;
200
+ let t5;
201
+ return $[17] !== props.renderDefault || $[18] !== withActionProps ? (t5 = props.renderDefault(withActionProps), $[17] = props.renderDefault, $[18] = withActionProps, $[19] = t5) : t5 = $[19], t5;
202
+ }, Select = (props) => {
203
+ const $ = c(12), {
204
+ value,
205
+ onChange,
206
+ elementProps,
207
+ listOptions,
208
+ handleChange
209
+ } = props;
210
+ let t0;
211
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = [3, 3, 4], $[0] = t0) : t0 = $[0];
212
+ const t1 = value || "";
213
+ let t2;
214
+ $[1] !== handleChange || $[2] !== onChange ? (t2 = (event) => handleChange(event, onChange), $[1] = handleChange, $[2] = onChange, $[3] = t2) : t2 = $[3];
215
+ let t3;
216
+ $[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = /* @__PURE__ */ jsx("option", { value: "", children: "Select an option..." }), $[4] = t3) : t3 = $[4];
217
+ let t4;
218
+ $[5] !== listOptions ? (t4 = listOptions.map(_temp$1), $[5] = listOptions, $[6] = t4) : t4 = $[6];
219
+ let t5;
220
+ return $[7] !== elementProps || $[8] !== t1 || $[9] !== t2 || $[10] !== t4 ? (t5 = /* @__PURE__ */ jsxs(Select$1, { ...elementProps, fontSize: 2, padding: 3, gap: t0, value: t1, onChange: t2, children: [
221
+ t3,
222
+ t4
223
+ ] }), $[7] = elementProps, $[8] = t1, $[9] = t2, $[10] = t4, $[11] = t5) : t5 = $[11], t5;
224
+ };
225
+ function _temp$1(t0) {
226
+ const {
227
+ value: optionValue,
228
+ title
229
+ } = t0;
230
+ return /* @__PURE__ */ jsx("option", { value: optionValue, children: title }, optionValue);
231
+ }
232
+ const formatlistOptions = (experiments) => experiments.map((experiment) => ({
233
+ title: experiment.label,
234
+ value: experiment.id
235
+ })), ExperimentInput = (props) => {
236
+ const $ = c(20), {
237
+ experiments
238
+ } = useExperimentContext();
239
+ let t0;
240
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = ["_id"], $[0] = t0) : t0 = $[0];
241
+ const id = useFormValue(t0);
242
+ let t1;
243
+ $[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];
244
+ const additionalChangePath = t1, subValues = useFormValue(additionalChangePath);
245
+ let t2;
246
+ $[4] !== id ? (t2 = getPublishedId(id), $[4] = id, $[5] = t2) : t2 = $[5];
247
+ const {
248
+ patch
249
+ } = useDocumentOperation(t2, props.schemaType.name);
250
+ let t3;
251
+ $[6] !== additionalChangePath || $[7] !== patch || $[8] !== subValues ? (t3 = (event, onChange) => {
252
+ const inputValue = event.currentTarget.value;
253
+ if (onChange(inputValue ? set(inputValue) : unset()), subValues) {
254
+ const patchEvent = {
255
+ unset: [additionalChangePath.join(".")]
256
+ };
257
+ patch.execute([patchEvent]);
258
+ }
259
+ }, $[6] = additionalChangePath, $[7] = patch, $[8] = subValues, $[9] = t3) : t3 = $[9];
260
+ const handleChange = t3;
261
+ if (!experiments.length) {
262
+ let t42;
263
+ $[10] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t42 = [3, 3, 4], $[10] = t42) : t42 = $[10];
264
+ let t52;
265
+ $[11] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t52 = [2, 2, 3], $[11] = t52) : t52 = $[11];
266
+ let t6;
267
+ return $[12] !== props.experimentNameOverride ? (t6 = /* @__PURE__ */ jsx(Card, { padding: t42, radius: 2, shadow: 1, tone: "caution", children: /* @__PURE__ */ jsxs(Text, { align: "center", size: t52, children: [
268
+ "There are no defined ",
269
+ props.experimentNameOverride,
270
+ "s"
271
+ ] }) }), $[12] = props.experimentNameOverride, $[13] = t6) : t6 = $[13], t6;
272
+ }
273
+ let t4;
274
+ $[14] !== experiments ? (t4 = formatlistOptions(experiments), $[14] = experiments, $[15] = t4) : t4 = $[15];
275
+ let t5;
276
+ return $[16] !== handleChange || $[17] !== props || $[18] !== t4 ? (t5 = /* @__PURE__ */ jsx(Select, { ...props, listOptions: t4, handleChange }), $[16] = handleChange, $[17] = props, $[18] = t4, $[19] = t5) : t5 = $[19], t5;
277
+ }, ExperimentItem = (props) => {
278
+ const {
279
+ active
280
+ } = props.value;
281
+ return active || props.inputProps.onChange(set(!0, ["active"])), props.renderDefault(props);
282
+ }, VariantInput = (props) => {
283
+ const $ = c(13);
284
+ let t0, t1;
285
+ if ($[0] !== props.path) {
286
+ const experimentPath = props.path.slice(0, -2);
287
+ t0 = useFormValue, t1 = [...experimentPath, "default"], $[0] = props.path, $[1] = t0, $[2] = t1;
288
+ } else
289
+ t0 = $[1], t1 = $[2];
290
+ const defaultValue = t0(t1);
291
+ let t2;
292
+ $[3] !== defaultValue || $[4] !== props ? (t2 = () => {
293
+ props.onChange(set(defaultValue, ["value"]));
294
+ }, $[3] = defaultValue, $[4] = props, $[5] = t2) : t2 = $[5];
295
+ const handleClick = t2;
296
+ let t3;
297
+ $[6] !== props ? (t3 = props.renderDefault(props), $[6] = props, $[7] = t3) : t3 = $[7];
298
+ let t4;
299
+ $[8] !== handleClick ? (t4 = /* @__PURE__ */ jsx(Inline, { gap: 1, children: /* @__PURE__ */ jsx(Button, { text: "Copy default", mode: "ghost", onClick: () => handleClick() }) }), $[8] = handleClick, $[9] = t4) : t4 = $[9];
300
+ let t5;
301
+ return $[10] !== t3 || $[11] !== t4 ? (t5 = /* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
302
+ t3,
303
+ t4
304
+ ] }), $[10] = t3, $[11] = t4, $[12] = t5) : t5 = $[12], t5;
305
+ }, VariantPreview = (props) => {
306
+ const $ = c(25), [subtitle, setSubtitle] = useState(void 0), [title, setTitle] = useState(void 0), [media, setMedia] = useState(void 0);
307
+ let t0;
308
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = {
309
+ apiVersion: "2025-01-01"
310
+ }, $[0] = t0) : t0 = $[0];
311
+ const client = useClient(t0), {
312
+ experiments
313
+ } = useExperimentContext(), {
314
+ experiment,
315
+ variant,
316
+ value
317
+ } = props;
318
+ let selectedExperiment, t1;
319
+ if ($[1] !== experiment || $[2] !== experiments || $[3] !== variant) {
320
+ let t22;
321
+ $[6] !== experiment ? (t22 = (experimentItem) => experimentItem.id === experiment, $[6] = experiment, $[7] = t22) : t22 = $[7], selectedExperiment = experiments.find(t22), t1 = selectedExperiment?.variants.find((variantItem) => variantItem.id === variant), $[1] = experiment, $[2] = experiments, $[3] = variant, $[4] = selectedExperiment, $[5] = t1;
322
+ } else
323
+ selectedExperiment = $[4], t1 = $[5];
324
+ const selectedVariant = t1;
325
+ let t2;
326
+ $[8] !== client || $[9] !== props.schemaType || $[10] !== selectedExperiment?.label || $[11] !== selectedVariant?.label || $[12] !== value ? (t2 = () => {
327
+ (async () => {
328
+ if (setTitle(`${selectedExperiment?.label} - ${selectedVariant?.label}`), typeof value == "string")
329
+ return setSubtitle(value);
330
+ if (isReference(value)) {
331
+ const 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 || {};
332
+ Object.keys(previewFields).forEach((key) => {
333
+ const valueKey = referenceType?.preview?.select?.[key];
334
+ selectFields[key] = valueKey && doc ? valueKey?.split(".").reduce(_temp2, doc) : void 0;
335
+ });
336
+ const previewContent = referenceType?.preview?.prepare?.(selectFields);
337
+ return setMedia(previewContent?.media || selectFields.media), setSubtitle(previewContent?.title || selectFields.title);
338
+ }
339
+ return isImage(value) && setMedia(value), "";
340
+ })();
341
+ }, $[8] = client, $[9] = props.schemaType, $[10] = selectedExperiment?.label, $[11] = selectedVariant?.label, $[12] = value, $[13] = t2) : t2 = $[13];
342
+ const t3 = selectedExperiment?.label, t4 = selectedVariant?.label;
343
+ let t5;
344
+ $[14] !== client || $[15] !== props.schemaType || $[16] !== t3 || $[17] !== t4 || $[18] !== value ? (t5 = [value, client, t3, t4, props.schemaType], $[14] = client, $[15] = props.schemaType, $[16] = t3, $[17] = t4, $[18] = value, $[19] = t5) : t5 = $[19], useEffect(t2, t5);
345
+ let t6;
346
+ if ($[20] !== media || $[21] !== props || $[22] !== subtitle || $[23] !== title) {
347
+ const previewProps = {
348
+ ...props,
349
+ title,
350
+ subtitle,
351
+ media
352
+ };
353
+ t6 = props.renderDefault(previewProps), $[20] = media, $[21] = props, $[22] = subtitle, $[23] = title, $[24] = t6;
354
+ } else
355
+ t6 = $[24];
356
+ return t6;
357
+ };
358
+ function _temp(field) {
359
+ return field.name === "value";
360
+ }
361
+ function _temp2(acc, index) {
362
+ return acc[index];
363
+ }
364
+ function flattenSchemaType(schemaType) {
365
+ return isDocumentSchemaType(schemaType) ? extractInnerFields(schemaType.fields, [], 5) : (console.error("Schema type is not a document"), []);
366
+ }
367
+ function extractInnerFields(fields, path, maxDepth) {
368
+ if (path.length >= maxDepth)
369
+ return [];
370
+ const result = [];
371
+ for (const field of fields)
372
+ if (result.push({
373
+ path: [...path, field.name],
374
+ ...field
375
+ }), field.type.jsonType === "object")
376
+ result.push(...extractInnerFields(field.type.fields, [...path, field.name], maxDepth));
377
+ else if (field.type.jsonType === "array") {
378
+ const arrayTypes = field.type.of || [];
379
+ for (const arrayType of arrayTypes)
380
+ "fields" in arrayType && result.push(...extractInnerFields(arrayType.fields, [...path, field.name], maxDepth));
381
+ }
382
+ return result;
383
+ }
384
+ const createExperimentType = ({
385
+ field,
386
+ experimentNameOverride,
387
+ variantNameOverride,
388
+ variantId,
389
+ variantArrayName,
390
+ experimentId
391
+ }) => {
392
+ const typeName = typeof field == "string" ? field : field.name, usedName = String(typeName[0]).toUpperCase() + typeName.slice(1), variantName = `${variantNameOverride}${usedName}`;
393
+ return defineType({
394
+ name: `${experimentNameOverride}${usedName}`,
395
+ type: "object",
396
+ components: {
397
+ field: (props) => /* @__PURE__ */ jsx(ExperimentField, { ...props, experimentId, experimentNameOverride, variantNameOverride }),
398
+ item: ExperimentItem
399
+ },
400
+ fields: [typeof field == "string" ? (
401
+ // Define a simple field if all we have is the name as a string
402
+ defineField({
403
+ name: "default",
404
+ type: field
405
+ })
406
+ ) : (
407
+ // Pass in the configured options, but overwrite the name
408
+ {
409
+ ...field,
410
+ name: "default"
411
+ }
412
+ ), defineField({
413
+ name: "active",
414
+ type: "boolean",
415
+ hidden: !0,
416
+ initialValue: !1
417
+ }), defineField({
418
+ name: experimentId,
419
+ type: "string",
420
+ components: {
421
+ input: (props) => /* @__PURE__ */ jsx(ExperimentInput, { ...props, experimentNameOverride, variantNameOverride })
422
+ },
423
+ hidden: ({
424
+ parent
425
+ }) => !parent?.active
426
+ }), defineField({
427
+ name: variantArrayName,
428
+ type: "array",
429
+ hidden: ({
430
+ parent
431
+ }) => !parent?.[experimentId],
432
+ components: {
433
+ input: (props) => /* @__PURE__ */ jsx(ArrayInput, { ...props, variantName, variantId, experimentId })
434
+ },
435
+ of: [defineField({
436
+ name: variantName,
437
+ type: variantName
438
+ })]
439
+ })],
440
+ preview: {
441
+ select: {
442
+ base: "default",
443
+ experiment: experimentId
444
+ },
445
+ prepare: ({
446
+ base,
447
+ experiment
448
+ }) => {
449
+ const title = base?.title || base?.name || typeof base == "string" ? base : "", experimentTitle = experiment ? `Experiment: ${experiment}` : "", media = base?.image || base?.photo || base?.media || "";
450
+ return {
451
+ title: title || experimentTitle,
452
+ subtitle: title ? experimentTitle : "",
453
+ media
454
+ };
455
+ }
456
+ }
457
+ });
458
+ }, createVariantType = ({
459
+ field,
460
+ variantNameOverride,
461
+ variantId,
462
+ experimentId
463
+ }) => {
464
+ const typeName = typeof field == "string" ? field : field.name, usedName = String(typeName[0]).toUpperCase() + typeName.slice(1);
465
+ return defineType({
466
+ name: `${variantNameOverride}${usedName}`,
467
+ title: `${variantNameOverride} array ${usedName}`,
468
+ type: "object",
469
+ components: {
470
+ preview: VariantPreview,
471
+ input: VariantInput
472
+ },
473
+ fields: [{
474
+ type: "string",
475
+ name: variantId,
476
+ readOnly: !0
477
+ }, {
478
+ type: "string",
479
+ name: experimentId,
480
+ hidden: !0
481
+ }, typeof field == "string" ? (
482
+ // Define a simple field if all we have is the name as a string
483
+ defineField({
484
+ name: "value",
485
+ type: field
486
+ // hidden: ({parent}) => !parent?.[`${objectNameOverride}Id`],
487
+ })
488
+ ) : (
489
+ // Pass in the configured options, but overwrite the name
490
+ {
491
+ ...field,
492
+ name: "value"
493
+ // hidden: ({parent}) => !parent?.[`${objectNameOverride}Id`],
494
+ }
495
+ )],
496
+ preview: {
497
+ select: {
498
+ variant: variantId,
499
+ experiment: experimentId,
500
+ value: "value"
501
+ }
502
+ }
503
+ });
504
+ }, fieldSchema = ({
505
+ fields,
506
+ experimentNameOverride,
507
+ variantNameOverride,
508
+ variantId,
509
+ variantArrayName,
510
+ experimentId
511
+ }) => [...fields.map((field) => createVariantType({
512
+ field,
513
+ variantNameOverride,
514
+ variantId,
515
+ experimentId
516
+ })), ...fields.map((field) => createExperimentType({
517
+ field,
518
+ experimentNameOverride,
519
+ variantNameOverride,
520
+ variantId,
521
+ variantArrayName,
522
+ experimentId
523
+ }))], fieldLevelExperiments = definePlugin((config) => {
524
+ const pluginConfig = {
525
+ ...CONFIG_DEFAULT,
526
+ ...config
527
+ }, {
528
+ fields,
529
+ experimentNameOverride,
530
+ variantNameOverride
531
+ } = pluginConfig, experimentId = `${experimentNameOverride}Id`, variantArrayName = `${variantNameOverride}s`, variantId = `${variantNameOverride}Id`;
532
+ return {
533
+ name: "sanity-personalistaion-plugin-field-level-experiments",
534
+ schema: {
535
+ types: fieldSchema({
536
+ fields,
537
+ experimentNameOverride,
538
+ variantNameOverride,
539
+ variantId,
540
+ variantArrayName,
541
+ experimentId
542
+ })
543
+ },
544
+ form: {
545
+ components: {
546
+ input: (props) => {
547
+ if (!(props.id === "root" && isObjectInputProps(props)) || !flattenSchemaType(props.schemaType).some((field) => field.type.name.startsWith(experimentNameOverride) || field.name.startsWith(experimentNameOverride)))
548
+ return props.renderDefault(props);
549
+ const providerProps = {
550
+ ...props,
551
+ experimentFieldPluginConfig: {
552
+ ...pluginConfig,
553
+ variantId,
554
+ variantArrayName,
555
+ experimentId
556
+ }
557
+ };
558
+ return ExperimentProvider(providerProps);
559
+ }
560
+ }
561
+ }
562
+ };
563
+ });
564
+ export {
565
+ fieldLevelExperiments,
566
+ flattenSchemaType
567
+ };
568
+ //# sourceMappingURL=fieldExperiments.js.map