@sanity/personalization-plugin

3.1.33.1.4
~

Modified (7 files)

Index: package/dist/growthbook/index.js
===================================================================
--- package/dist/growthbook/index.js
+++ package/dist/growthbook/index.js
@@ -1,5 +1,5 @@
-import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-CPrY-K44.js";
+import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-p8tDVY-S.js";
 import "@sanity/ui/styles.css";
 import { definePlugin, isObjectInputProps } from "sanity";
 import { c } from "react/compiler-runtime";
 import { createContext, useContext, useEffect, useState } from "react";
Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -1,5 +1,5 @@
-import { i as ArrayItem, n as flattenSchemaType, r as clearChildrenGroups, t as fieldLevelExperiments } from "./fieldExperiments-CPrY-K44.js";
+import { i as ArrayItem, n as flattenSchemaType, r as clearChildrenGroups, t as fieldLevelExperiments } from "./fieldExperiments-p8tDVY-S.js";
 import "@sanity/ui/styles.css";
 import { defineDocumentFieldAction, defineField, definePlugin, defineType, isImage, isObjectInputProps, isReference, set, unset, useClient, useFormValue, useWorkspace } from "sanity";
 import { c } from "react/compiler-runtime";
 import { createContext, useContext, useEffect, useState } from "react";
@@ -42,40 +42,42 @@
 		children: t3
 	}), $[11] = context, $[12] = t3, $[13] = t4) : t4 = $[13], t4;
 }
 const ArrayInput = (props) => {
-	let $ = c(25), { onItemAppend, segmentName, segmentId } = props, { segments } = usePersonalizationContext(), t0;
+	let $ = c(28), { onItemAppend, segmentName, segmentId } = props, { segments } = usePersonalizationContext(), t0;
 	$[0] !== onItemAppend || $[1] !== segmentId || $[2] !== segmentName ? (t0 = async (segment) => {
 		let item = {
 			_key: uuid(),
 			[segmentId]: segment.id,
 			_type: segmentName
 		};
 		onItemAppend(item);
 	}, $[0] = onItemAppend, $[1] = segmentId, $[2] = segmentName, $[3] = t0) : t0 = $[3];
-	let handleClick = t0, T0, T1, t1, t2, t3, t4;
-	if ($[4] !== handleClick || $[5] !== props || $[6] !== segmentId || $[7] !== segments) {
-		let usedSegments = (props.value || [])?.map((segment_0) => segment_0[segmentId]);
-		T1 = Stack, t3 = 3, $[14] === props ? t4 = $[15] : (t4 = props.renderDefault({
+	let handleClick = t0, t1;
+	$[4] === props.value ? t1 = $[5] : (t1 = props.value || [], $[4] = props.value, $[5] = t1);
+	let values = t1, T0, T1, t2, t3, t4, t5;
+	if ($[6] !== handleClick || $[7] !== props || $[8] !== segmentId || $[9] !== segments || $[10] !== values) {
+		let usedSegments = values?.map((segment_0) => segment_0[segmentId]);
+		T1 = Stack, t4 = 3, $[17] === props ? t5 = $[18] : (t5 = props.renderDefault({
 			...props,
 			arrayFunctions: _temp$1
-		}), $[14] = props, $[15] = t4), T0 = Inline, t1 = 1, t2 = segments.map((segment_1) => /* @__PURE__ */ jsx(Button, {
+		}), $[17] = props, $[18] = t5), T0 = Inline, t2 = 1, t3 = segments.map((segment_1) => /* @__PURE__ */ jsx(Button, {
 			text: `Add ${segment_1.label}`,
 			mode: "ghost",
 			disabled: usedSegments?.includes(segment_1.id),
 			onClick: () => handleClick(segment_1)
-		}, segment_1.id)), $[4] = handleClick, $[5] = props, $[6] = segmentId, $[7] = segments, $[8] = T0, $[9] = T1, $[10] = t1, $[11] = t2, $[12] = t3, $[13] = t4;
-	} else T0 = $[8], T1 = $[9], t1 = $[10], t2 = $[11], t3 = $[12], t4 = $[13];
-	let t5;
-	$[16] !== T0 || $[17] !== t1 || $[18] !== t2 ? (t5 = /* @__PURE__ */ jsx(T0, {
-		gap: t1,
-		children: t2
-	}), $[16] = T0, $[17] = t1, $[18] = t2, $[19] = t5) : t5 = $[19];
+		}, segment_1.id)), $[6] = handleClick, $[7] = props, $[8] = segmentId, $[9] = segments, $[10] = values, $[11] = T0, $[12] = T1, $[13] = t2, $[14] = t3, $[15] = t4, $[16] = t5;
+	} else T0 = $[11], T1 = $[12], t2 = $[13], t3 = $[14], t4 = $[15], t5 = $[16];
 	let t6;
-	return $[20] !== T1 || $[21] !== t3 || $[22] !== t4 || $[23] !== t5 ? (t6 = /* @__PURE__ */ jsxs(T1, {
-		gap: t3,
-		children: [t4, t5]
-	}), $[20] = T1, $[21] = t3, $[22] = t4, $[23] = t5, $[24] = t6) : t6 = $[24], t6;
+	$[19] !== T0 || $[20] !== t2 || $[21] !== t3 ? (t6 = /* @__PURE__ */ jsx(T0, {
+		gap: t2,
+		children: t3
+	}), $[19] = T0, $[20] = t2, $[21] = t3, $[22] = t6) : t6 = $[22];
+	let t7;
+	return $[23] !== T1 || $[24] !== t4 || $[25] !== t5 || $[26] !== t6 ? (t7 = /* @__PURE__ */ jsxs(T1, {
+		gap: t4,
+		children: [t5, t6]
+	}), $[23] = T1, $[24] = t4, $[25] = t5, $[26] = t6, $[27] = t7) : t7 = $[27], t7;
 };
 function _temp$1() {
 	return null;
 }
Index: package/dist/launchDarkly/index.js
===================================================================
--- package/dist/launchDarkly/index.js
+++ package/dist/launchDarkly/index.js
@@ -1,5 +1,5 @@
-import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-CPrY-K44.js";
+import { n as flattenSchemaType, t as fieldLevelExperiments$1 } from "../fieldExperiments-p8tDVY-S.js";
 import "@sanity/ui/styles.css";
 import { definePlugin, isObjectInputProps } from "sanity";
 import { c } from "react/compiler-runtime";
 import { createContext, useContext, useEffect, useState } from "react";
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@sanity/personalization-plugin",
-  "version": "3.1.3",
+  "version": "3.1.4",
   "description": "Plugin to help with personalization, a/b testing when using Sanity",
   "keywords": [
     "sanity",
     "sanity-plugin"
@@ -34,16 +34,16 @@
     "@sanity/uuid": "^3.0.3",
     "fast-deep-equal": "^3.1.3",
     "react-icons": "^5.7.0",
     "suspend-react": "^0.1.3",
-    "@sanity/studio-secrets": "^4.0.18"
+    "@sanity/studio-secrets": "^4.0.19"
   },
   "devDependencies": {
     "@sanity/tsconfig": "^2.2.1",
     "@sanity/tsdown-config": "^0.26.0",
     "@types/react": "^19.2.18",
     "@types/react-dom": "^19.2.4",
-    "babel-plugin-react-compiler": "^1.0.0",
+    "oxc-transform-react": "^0.145.0",
     "react": "^19.2.8",
     "react-dom": "^19.2.8",
     "sanity": "^6.10.1",
     "tsdown": "^0.22.14"
Index: package/dist/growthbook/index.js.map
===================================================================
--- package/dist/growthbook/index.js.map
+++ package/dist/growthbook/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["SettingsView","useSecrets","useEffect","useState","ObjectInputProps","useGrowthbookContext","namespace","apiKeyName","pluginConfigKeys","key","title","Secrets","props","$","_c","secrets","loading","apiKey","setSecret","showSettings","setShowSettings","t0","t1","undefined","t2","renderDefault","Symbol","for","t3","t4","createContext","useContext","useMemo","useState","ObjectInputProps","GrowthbookContextProps","GrowthbookExperimentFieldPluginConfig","Secrets","GROWTHBOOK_CONFIG_DEFAULT","baseUrl","GrowthbookContext","setSecret","undefined","secret","useGrowthbookContext","GrowthbookProps","growthbookFieldPluginConfig","GrowthbookProvider","props","$","_c","t0","context","t1","t2","SanityClient","ExperimentType","GrowthbookFeature","VariantType","apiKeyName","namespace","GrowthbookExperimentFieldPluginConfig","getBooleanConversion","value","getExperiments","client","environment","baseUrl","project","convertBooleans","tags","Omit","Promise","query","secret","fetch","featureExperiments","hasMore","offset","url","URL","searchParams","set","toString","response","headers","Authorization","features","responseHasMore","nextOffset","json","forEach","feature","archived","undefined","some","tag","includes","experiments","environments","rules","filter","experiment","type","variations","uniqueValues","Set","variant","has","add","push","id","label","variants","sortedFeatureExperiments","sort","a","b","localeCompare","definePlugin","isObjectInputProps","fieldLevelExperiments","baseFieldLevelExperiments","flattenSchemaType","GROWTHBOOK_CONFIG_DEFAULT","GrowthbookProvider","GrowthbookExperimentFieldPluginConfig","getExperiments","config","pluginConfig","fields","environment","project","convertBooleans","baseUrl","tags","name","plugins","experiments","client","form","components","input","props","isRootInput","id","renderDefault","flatFieldTypeNames","schemaType","map","field","type","hasExperiment","some","startsWith","providerProps","growthbookFieldPluginConfig"],"sources":["../../src/growthbook/Components/Secrets.tsx","../../src/growthbook/Components/GrowthbookContext.tsx","../../src/growthbook/utils.ts","../../src/growthbook/index.ts"],"sourcesContent":["import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {useEffect, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport {useGrowthbookContext} from './GrowthbookContext'\n\nexport const namespace = 'growthbook'\nexport const apiKeyName = 'apiKey'\n\nconst pluginConfigKeys = [\n  {\n    key: apiKeyName,\n    title: 'Your secret API key',\n  },\n]\n\nexport const Secrets = (props: ObjectInputProps) => {\n  const {secrets, loading} = useSecrets(namespace) as {secrets: {apiKey: string}; loading: boolean}\n  const {setSecret} = useGrowthbookContext()\n  const [showSettings, setShowSettings] = useState<boolean>(false)\n\n  useEffect(() => {\n    if (loading) return undefined\n    if (!secrets && !loading) {\n      setSecret(undefined)\n      // oxlint-disable-next-line react/set-state-in-effect\n      return setShowSettings(true)\n    }\n    setSecret(secrets.apiKey)\n    return setShowSettings(false)\n  }, [secrets, loading, setSecret])\n\n  if (!showSettings) {\n    return props.renderDefault(props)\n  }\n  return (\n    <>\n      <SettingsView\n        title={'Growthbook secret'}\n        namespace={namespace}\n        keys={pluginConfigKeys}\n        onClose={() => {\n          setShowSettings(false)\n        }}\n      />\n      {props.renderDefault(props)}\n    </>\n  )\n}\n","import {createContext, useContext, useMemo, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport type {GrowthbookContextProps, GrowthbookExperimentFieldPluginConfig} from '../types'\nimport {Secrets} from './Secrets'\n\nexport const GROWTHBOOK_CONFIG_DEFAULT = {\n  baseUrl: 'https://api.growthbook.io/api/v1',\n}\n\nconst GrowthbookContext = createContext<GrowthbookContextProps>({\n  setSecret: () => undefined,\n  secret: undefined,\n})\n\nexport function useGrowthbookContext() {\n  return useContext(GrowthbookContext)\n}\n\ntype GrowthbookProps = ObjectInputProps & {\n  growthbookFieldPluginConfig: GrowthbookExperimentFieldPluginConfig\n}\n\nexport function GrowthbookProvider(props: GrowthbookProps) {\n  const {growthbookFieldPluginConfig} = props\n  const [secret, setSecret] = useState<string | undefined>()\n\n  const context = useMemo(\n    () => ({...growthbookFieldPluginConfig, secret, setSecret}),\n    [growthbookFieldPluginConfig, secret, setSecret],\n  )\n\n  return (\n    <GrowthbookContext.Provider value={context}>\n      <Secrets {...props} />\n    </GrowthbookContext.Provider>\n  )\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {ExperimentType, GrowthbookFeature, VariantType} from '../types'\nimport {apiKeyName, namespace} from './Components/Secrets'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\n\nconst getBooleanConversion = (value: string) => {\n  // control is false\n  if (value === 'true') {\n    return 'variant'\n  } else if (value === 'false') {\n    return 'control'\n  }\n  return value\n}\n\nexport const getExperiments = async ({\n  client,\n  environment,\n  baseUrl,\n  project,\n  convertBooleans,\n  tags,\n}: Omit<GrowthbookExperimentFieldPluginConfig, 'fields' | 'baseUrl'> & {\n  client: SanityClient\n  baseUrl: string\n}): Promise<ExperimentType[]> => {\n  const query = `*[_id == 'secrets.${namespace}'][0].secrets.${apiKeyName}`\n\n  const secret = await client.fetch(query) // secret is stored in the content lake using @sanity/studio-secrets\n  if (!secret) return []\n\n  const featureExperiments: ExperimentType[] = []\n  let hasMore = true\n  let offset = 0\n  const url = new URL(`${baseUrl}/features`)\n  if (project) {\n    url.searchParams.set('projectId', project)\n  }\n\n  while (hasMore) {\n    url.searchParams.set('offset', offset.toString())\n    const response = await fetch(url, {\n      headers: {\n        Authorization: `Bearer ${secret}`,\n      },\n    })\n\n    const {features, hasMore: responseHasMore, nextOffset} = await response.json()\n\n    hasMore = responseHasMore\n    offset = nextOffset\n    if (!features) continue\n\n    features.forEach((feature: GrowthbookFeature) => {\n      if (feature.archived) {\n        return undefined\n      }\n      if (tags && feature.tags && !feature.tags.some((tag) => tags.includes(tag))) {\n        return undefined\n      }\n\n      const experiments = feature.environments[environment]?.rules.filter(\n        (experiment) => experiment.type === 'experiment-ref' || experiment.type === 'experiment',\n      )\n\n      if (!experiments) {\n        return undefined\n      }\n\n      const variations: VariantType[] = []\n      const uniqueValues = new Set<string>()\n\n      experiments.forEach((experiment) => {\n        experiment?.variations.forEach((variant) => {\n          const value = convertBooleans ? getBooleanConversion(variant.value) : variant.value\n          if (!uniqueValues.has(value)) {\n            uniqueValues.add(value)\n            variations.push({\n              id: value,\n              label: value,\n            })\n          }\n        })\n      })\n      const value = {id: feature.id, label: feature.id, variants: variations}\n\n      featureExperiments.push(value)\n      return undefined\n    })\n  }\n  const sortedFeatureExperiments = featureExperiments.sort((a, b) => a.id.localeCompare(b.id))\n  return sortedFeatureExperiments\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, isObjectInputProps} from 'sanity'\n\nimport {fieldLevelExperiments as baseFieldLevelExperiments} from '../fieldExperiments'\nimport {flattenSchemaType} from '../utils/flattenSchemaType'\nimport {GROWTHBOOK_CONFIG_DEFAULT, GrowthbookProvider} from './Components/GrowthbookContext'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\nimport {getExperiments} from './utils'\n\nexport const fieldLevelExperiments = definePlugin<GrowthbookExperimentFieldPluginConfig>(\n  (config) => {\n    const pluginConfig = {...GROWTHBOOK_CONFIG_DEFAULT, ...config}\n    const {fields, environment, project, convertBooleans, baseUrl, tags} = pluginConfig\n    return {\n      name: 'sanity-growthbook-personalization-plugin-field-level-experiments',\n      plugins: [\n        baseFieldLevelExperiments({\n          fields,\n          experiments: (client) =>\n            getExperiments({client, environment, baseUrl, project, convertBooleans, tags}),\n        }),\n      ],\n\n      form: {\n        components: {\n          input: (props) => {\n            const isRootInput = props.id === 'root' && isObjectInputProps(props)\n\n            if (!isRootInput) {\n              return props.renderDefault(props)\n            }\n\n            const flatFieldTypeNames = flattenSchemaType(props.schemaType).map(\n              (field) => field.type.name,\n            )\n\n            const hasExperiment = flatFieldTypeNames.some((name) => name.startsWith('experiment'))\n\n            if (!hasExperiment) {\n              return props.renderDefault(props)\n            }\n\n            const providerProps = {\n              ...props,\n              growthbookFieldPluginConfig: {\n                ...pluginConfig,\n              },\n            }\n            return GrowthbookProvider(providerProps)\n          },\n        },\n      },\n    }\n  },\n)\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["() => {\n    if (loading) return undefined\n    if (!secrets && !loading) {\n      setSecret(undefined)\n      // oxlint-disable-next-line react/set-state-in-effect\n      return setShowSettings(true)\n    }\n    setSecret(secrets.apiKey)\n    return setShowSettings(false)\n  }","[secrets, loading, setSecret]","props.renderDefault(props)","props.renderDefault","<SettingsView\n        title={'Growthbook secret'}\n        namespace={namespace}\n        keys={pluginConfigKeys}\n        onClose={() => {\n          setShowSettings(false)\n        }}\n      />","<>\n      <SettingsView\n        title={'Growthbook secret'}\n        namespace={namespace}\n        keys={pluginConfigKeys}\n        onClose={() => {\n          setShowSettings(false)\n        }}\n      />\n      {props.renderDefault(props)}\n    </>","{...growthbookFieldPluginConfig, secret, setSecret}","useMemo(\n    () => ({...growthbookFieldPluginConfig, secret, setSecret}),\n    [growthbookFieldPluginConfig, secret, setSecret],\n  )","<Secrets {...props} />","<GrowthbookContext.Provider value={context}>\n      <Secrets {...props} />\n    </GrowthbookContext.Provider>","GrowthbookContext.Provider"],"sources":["../../src/growthbook/Components/Secrets.tsx","../../src/growthbook/Components/GrowthbookContext.tsx","../../src/growthbook/utils.ts","../../src/growthbook/index.ts"],"sourcesContent":["import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {useEffect, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport {useGrowthbookContext} from './GrowthbookContext'\n\nexport const namespace = 'growthbook'\nexport const apiKeyName = 'apiKey'\n\nconst pluginConfigKeys = [\n  {\n    key: apiKeyName,\n    title: 'Your secret API key',\n  },\n]\n\nexport const Secrets = (props: ObjectInputProps) => {\n  const {secrets, loading} = useSecrets(namespace) as {secrets: {apiKey: string}; loading: boolean}\n  const {setSecret} = useGrowthbookContext()\n  const [showSettings, setShowSettings] = useState<boolean>(false)\n\n  useEffect(() => {\n    if (loading) return undefined\n    if (!secrets && !loading) {\n      setSecret(undefined)\n      // oxlint-disable-next-line react/set-state-in-effect\n      return setShowSettings(true)\n    }\n    setSecret(secrets.apiKey)\n    return setShowSettings(false)\n  }, [secrets, loading, setSecret])\n\n  if (!showSettings) {\n    return props.renderDefault(props)\n  }\n  return (\n    <>\n      <SettingsView\n        title={'Growthbook secret'}\n        namespace={namespace}\n        keys={pluginConfigKeys}\n        onClose={() => {\n          setShowSettings(false)\n        }}\n      />\n      {props.renderDefault(props)}\n    </>\n  )\n}\n","import {createContext, useContext, useMemo, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport type {GrowthbookContextProps, GrowthbookExperimentFieldPluginConfig} from '../types'\nimport {Secrets} from './Secrets'\n\nexport const GROWTHBOOK_CONFIG_DEFAULT = {\n  baseUrl: 'https://api.growthbook.io/api/v1',\n}\n\nconst GrowthbookContext = createContext<GrowthbookContextProps>({\n  setSecret: () => undefined,\n  secret: undefined,\n})\n\nexport function useGrowthbookContext() {\n  return useContext(GrowthbookContext)\n}\n\ntype GrowthbookProps = ObjectInputProps & {\n  growthbookFieldPluginConfig: GrowthbookExperimentFieldPluginConfig\n}\n\nexport function GrowthbookProvider(props: GrowthbookProps) {\n  const {growthbookFieldPluginConfig} = props\n  const [secret, setSecret] = useState<string | undefined>()\n\n  const context = useMemo(\n    () => ({...growthbookFieldPluginConfig, secret, setSecret}),\n    [growthbookFieldPluginConfig, secret, setSecret],\n  )\n\n  return (\n    <GrowthbookContext.Provider value={context}>\n      <Secrets {...props} />\n    </GrowthbookContext.Provider>\n  )\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {ExperimentType, GrowthbookFeature, VariantType} from '../types'\nimport {apiKeyName, namespace} from './Components/Secrets'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\n\nconst getBooleanConversion = (value: string) => {\n  // control is false\n  if (value === 'true') {\n    return 'variant'\n  } else if (value === 'false') {\n    return 'control'\n  }\n  return value\n}\n\nexport const getExperiments = async ({\n  client,\n  environment,\n  baseUrl,\n  project,\n  convertBooleans,\n  tags,\n}: Omit<GrowthbookExperimentFieldPluginConfig, 'fields' | 'baseUrl'> & {\n  client: SanityClient\n  baseUrl: string\n}): Promise<ExperimentType[]> => {\n  const query = `*[_id == 'secrets.${namespace}'][0].secrets.${apiKeyName}`\n\n  const secret = await client.fetch(query) // secret is stored in the content lake using @sanity/studio-secrets\n  if (!secret) return []\n\n  const featureExperiments: ExperimentType[] = []\n  let hasMore = true\n  let offset = 0\n  const url = new URL(`${baseUrl}/features`)\n  if (project) {\n    url.searchParams.set('projectId', project)\n  }\n\n  while (hasMore) {\n    url.searchParams.set('offset', offset.toString())\n    const response = await fetch(url, {\n      headers: {\n        Authorization: `Bearer ${secret}`,\n      },\n    })\n\n    const {features, hasMore: responseHasMore, nextOffset} = await response.json()\n\n    hasMore = responseHasMore\n    offset = nextOffset\n    if (!features) continue\n\n    features.forEach((feature: GrowthbookFeature) => {\n      if (feature.archived) {\n        return undefined\n      }\n      if (tags && feature.tags && !feature.tags.some((tag) => tags.includes(tag))) {\n        return undefined\n      }\n\n      const experiments = feature.environments[environment]?.rules.filter(\n        (experiment) => experiment.type === 'experiment-ref' || experiment.type === 'experiment',\n      )\n\n      if (!experiments) {\n        return undefined\n      }\n\n      const variations: VariantType[] = []\n      const uniqueValues = new Set<string>()\n\n      experiments.forEach((experiment) => {\n        experiment?.variations.forEach((variant) => {\n          const value = convertBooleans ? getBooleanConversion(variant.value) : variant.value\n          if (!uniqueValues.has(value)) {\n            uniqueValues.add(value)\n            variations.push({\n              id: value,\n              label: value,\n            })\n          }\n        })\n      })\n      const value = {id: feature.id, label: feature.id, variants: variations}\n\n      featureExperiments.push(value)\n      return undefined\n    })\n  }\n  const sortedFeatureExperiments = featureExperiments.sort((a, b) => a.id.localeCompare(b.id))\n  return sortedFeatureExperiments\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, isObjectInputProps} from 'sanity'\n\nimport {fieldLevelExperiments as baseFieldLevelExperiments} from '../fieldExperiments'\nimport {flattenSchemaType} from '../utils/flattenSchemaType'\nimport {GROWTHBOOK_CONFIG_DEFAULT, GrowthbookProvider} from './Components/GrowthbookContext'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\nimport {getExperiments} from './utils'\n\nexport const fieldLevelExperiments = definePlugin<GrowthbookExperimentFieldPluginConfig>(\n  (config) => {\n    const pluginConfig = {...GROWTHBOOK_CONFIG_DEFAULT, ...config}\n    const {fields, environment, project, convertBooleans, baseUrl, tags} = pluginConfig\n    return {\n      name: 'sanity-growthbook-personalization-plugin-field-level-experiments',\n      plugins: [\n        baseFieldLevelExperiments({\n          fields,\n          experiments: (client) =>\n            getExperiments({client, environment, baseUrl, project, convertBooleans, tags}),\n        }),\n      ],\n\n      form: {\n        components: {\n          input: (props) => {\n            const isRootInput = props.id === 'root' && isObjectInputProps(props)\n\n            if (!isRootInput) {\n              return props.renderDefault(props)\n            }\n\n            const flatFieldTypeNames = flattenSchemaType(props.schemaType).map(\n              (field) => field.type.name,\n            )\n\n            const hasExperiment = flatFieldTypeNames.some((name) => name.startsWith('experiment'))\n\n            if (!hasExperiment) {\n              return props.renderDefault(props)\n            }\n\n            const providerProps = {\n              ...props,\n              growthbookFieldPluginConfig: {\n                ...pluginConfig,\n              },\n            }\n            return GrowthbookProvider(providerProps)\n          },\n        },\n      },\n    }\n  },\n)\n"],"mappings":"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"}
\ No newline at end of file
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["equal","createContext","useContext","useMemo","ObjectInputProps","useClient","useWorkspace","suspend","PersonalizationContextProps","PersonalizationFieldPluginConfig","CONFIG_DEFAULT","fields","apiVersion","personalizationNameOverride","segmentNameOverride","segmentId","segmentArrayName","PersonalizationContext","segments","usePersonalizationContext","PersonalizationProps","personalizationFieldPluginConfig","Required","PersonalizationProvider","props","$","_c","t0","client","workspace","t1","Array","isArray","t2","context","t3","renderDefault","t4","Button","Inline","Stack","uuid","useCallback","PersonalizationArrayInputProps","VariantType","usePersonalizationContext","ArrayInput","props","$","_c","onItemAppend","segmentName","segmentId","segments","t0","segment","item","_key","id","_type","handleClick","T0","T1","t1","t2","t3","t4","values","value","Value","usedSegments","map","segment_0","renderDefault","arrayFunctions","_temp","segment_1","label","includes","t5","t6","CloseIcon","useCallback","useMemo","IoMdPeople","defineDocumentFieldAction","DocumentFieldActionItem","DocumentFieldActionProps","FormPatch","ObjectFieldProps","PatchEvent","set","unset","clearChildrenGroups","PatchStuff","onChange","patch","inputId","useAddPersonalizationAction","props","$","_c","active","personalizationNameOverride","t0","handleAddAction","t1","t2","title","type","icon","onAction","renderAsButton","useRemovePersonalizationAction","segmentNameOverride","activeId","segments","handleClearAction","createActions","removeAction","name","useAction","addAction","Field","inputProps","value","actionProps","actions","oldActions","t3","memoizedActions","t4","propsWithClearedGroups","t5","enhancedProps","t6","renderDefault","Button","Inline","Stack","ObjectInputProps","set","useFormValue","SegmentInput","props","$","_c","t0","t1","path","personalizationPath","slice","defaultValue","t2","onChange","handleClick","t3","renderDefault","t4","t5","useEffect","useState","isImage","isReference","ObjectSchemaType","PreviewProps","ReferenceSchemaType","useClient","VariantPreviewProps","usePersonalizationContext","SegmentPreview","props","$","_c","subtitle","setSubtitle","undefined","title","setTitle","media","setMedia","segments","apiVersion","t0","client","segment","value","t1","t2","segmentItem","id","find","selectedSegment","schemaType","label","getSubtitle","doc","getDocument","_ref","type","valueField","fields","_temp","referenceField","referenceType","to","field_0","field","name","_type","selectFields","Record","previewFields","preview","select","Object","keys","forEach","key","valueKey","split","reduce","_temp2","previewContent","prepare","t3","t4","t5","previewProps","renderDefault","acc","index","ArrayOfObjectsInputProps","defineField","definePlugin","defineType","FieldDefinition","isObjectInputProps","ArrayItem","ArrayInput","CONFIG_DEFAULT","Field","PersonalizationProvider","SegmentInput","SegmentPreview","PersonalizationFieldPluginConfig","flattenSchemaType","createPersonalizationType","field","personalizationNameOverride","segmentNameOverride","segmentId","segmentArrayName","typeName","name","usedName","String","toUpperCase","slice","segmentName","type","groups","title","hidden","parent","Array","isArray","components","props","item","fields","group","initialValue","active","input","of","preview","select","base","prepare","media","image","photo","createSegmentType","readOnly","segment","value","fieldSchema","Required","Omit","map","fieldLevelPersonalization","config","pluginConfig","fieldSchemaConfig","schema","types","form","isRootInput","id","renderDefault","flatFields","schemaType","hasPersonalization","some","startsWith","providerProps","personalizationFieldPluginConfig"],"sources":["../src/components/personalization/Context.tsx","../src/components/personalization/Array.tsx","../src/components/personalization/Field.tsx","../src/components/personalization/SegmentInput.tsx","../src/components/personalization/SegmentPreview.tsx","../src/fieldPersonalization.tsx"],"sourcesContent":["import equal from 'fast-deep-equal'\nimport {createContext, useContext, useMemo} from 'react'\nimport {type ObjectInputProps, useClient, useWorkspace} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport type {PersonalizationContextProps, PersonalizationFieldPluginConfig} from '../../types'\n\n// This provider makes the plugin config available to all components in the document form\n// But with segments resolved\n\nexport const CONFIG_DEFAULT = {\n  fields: [],\n  apiVersion: '2024-11-07',\n  personalizationNameOverride: 'personalization',\n  segmentNameOverride: 'segment',\n  segmentId: 'segmentId',\n  segmentArrayName: 'segments',\n}\n\nconst PersonalizationContext = createContext<PersonalizationContextProps>({\n  ...CONFIG_DEFAULT,\n  segments: [],\n})\n\nexport function usePersonalizationContext() {\n  return useContext(PersonalizationContext)\n}\n\ntype PersonalizationProps = ObjectInputProps & {\n  personalizationFieldPluginConfig: Required<PersonalizationFieldPluginConfig>\n}\n\nexport function PersonalizationProvider(props: PersonalizationProps) {\n  const {personalizationFieldPluginConfig} = props\n\n  const client = useClient({apiVersion: personalizationFieldPluginConfig.apiVersion})\n  const workspace = useWorkspace()\n\n  // Fetch or return segments\n  const segments = Array.isArray(personalizationFieldPluginConfig.segments)\n    ? personalizationFieldPluginConfig.segments\n    : suspend(\n        async () => {\n          if (typeof personalizationFieldPluginConfig.segments === 'function') {\n            return personalizationFieldPluginConfig.segments(client)\n          }\n          return personalizationFieldPluginConfig.segments\n        },\n        [workspace, 'field-level-personalization'],\n        {equal},\n      )\n\n  const context = useMemo(\n    () => ({...personalizationFieldPluginConfig, segments}),\n    [personalizationFieldPluginConfig, segments],\n  )\n\n  return (\n    <PersonalizationContext.Provider value={context}>\n      {props.renderDefault(props)}\n    </PersonalizationContext.Provider>\n  )\n}\n","import {Button, Inline, Stack} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {useCallback} from 'react'\n\nimport type {PersonalizationArrayInputProps, VariantType} from '../../types'\nimport {usePersonalizationContext} from './Context'\n\nexport const ArrayInput = (props: PersonalizationArrayInputProps) => {\n  const {onItemAppend, segmentName, segmentId} = props\n\n  const {segments} = usePersonalizationContext()\n\n  const handleClick = useCallback(\n    async (segment: VariantType) => {\n      const item = {\n        _key: uuid(),\n        [segmentId]: segment.id,\n        _type: segmentName,\n      }\n\n      // Patch the document\n      onItemAppend(item)\n    },\n    [segmentId, segmentName, onItemAppend],\n  )\n\n  type Value = {\n    value?: unknown\n    [key: string]: unknown\n    segmentId: string\n    _key: string\n    _type: string\n  }\n\n  const values = (props.value as Value[]) || []\n\n  const usedSegments = values?.map((segment) => segment[segmentId])\n\n  return (\n    <Stack gap={3}>\n      {props.renderDefault({...props, arrayFunctions: () => null})}\n\n      <Inline gap={1}>\n        {segments.map((segment) => {\n          return (\n            <Button\n              key={segment.id}\n              text={`Add ${segment.label}`}\n              mode=\"ghost\"\n              disabled={usedSegments?.includes(segment.id)}\n              onClick={() => handleClick(segment)}\n            />\n          )\n        })}\n      </Inline>\n    </Stack>\n  )\n}\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {useCallback, useMemo} from 'react'\nimport {IoMdPeople} from 'react-icons/io'\nimport {\n  defineDocumentFieldAction,\n  type DocumentFieldActionItem,\n  type DocumentFieldActionProps,\n  type FormPatch,\n  type ObjectFieldProps,\n  type PatchEvent,\n  set,\n  unset,\n} from 'sanity'\n\nimport {clearChildrenGroups} from '../../utils/clearChildGroups'\n\ntype PatchStuff = {onChange: (patch: FormPatch | FormPatch[] | PatchEvent) => void; inputId: string}\n\nconst useAddPersonalizationAction = (\n  props: DocumentFieldActionProps &\n    PatchStuff & {personalizationNameOverride: string; active: boolean},\n): DocumentFieldActionItem => {\n  const {onChange, active, personalizationNameOverride} = props\n\n  const handleAddAction = useCallback(() => {\n    onChange([set(!active, ['active'])])\n  }, [onChange, active])\n\n  return {\n    title: `Add ${personalizationNameOverride}`,\n    type: 'action',\n    icon: IoMdPeople,\n    onAction: handleAddAction,\n    renderAsButton: true,\n  }\n}\n\nconst useRemovePersonalizationAction = (\n  props: DocumentFieldActionProps &\n    PatchStuff & {\n      personalizationNameOverride: string\n      active: boolean\n      segmentNameOverride: string\n    },\n): DocumentFieldActionItem => {\n  const {onChange, active, personalizationNameOverride, segmentNameOverride} = props\n  const handleClearAction = useCallback(() => {\n    const activeId = ['active']\n    const segments = [`${segmentNameOverride}s`]\n    onChange([set(!active, activeId), unset(segments)])\n  }, [onChange, active, segmentNameOverride])\n\n  return {\n    title: `Remove ${personalizationNameOverride}`,\n    type: 'action',\n    icon: CloseIcon,\n    onAction: handleClearAction,\n    renderAsButton: true,\n  }\n}\n\nconst createActions = ({\n  onChange,\n  inputId,\n  active,\n  personalizationNameOverride,\n  segmentNameOverride,\n}: PatchStuff & {\n  active?: boolean\n  personalizationNameOverride: string\n  segmentNameOverride: string\n}) => {\n  const removeAction = defineDocumentFieldAction({\n    name: `Remove ${personalizationNameOverride}`,\n    useAction: (props) =>\n      useRemovePersonalizationAction({\n        ...props,\n        active: true,\n        onChange,\n        inputId,\n        personalizationNameOverride,\n        segmentNameOverride,\n      }),\n  })\n  const addAction = defineDocumentFieldAction({\n    name: `Add ${personalizationNameOverride}`,\n    useAction: (props) =>\n      useAddPersonalizationAction({\n        ...props,\n        active: false,\n        onChange,\n        inputId,\n        personalizationNameOverride,\n      }),\n  })\n  return active ? removeAction : addAction\n}\n\nexport const Field = (\n  props: ObjectFieldProps & {\n    personalizationNameOverride: string\n    segmentNameOverride: string\n  },\n) => {\n  const {onChange} = props.inputProps\n  const {inputId, personalizationNameOverride, segmentNameOverride} = props\n  const active = props.value?.['active'] as boolean | undefined\n\n  const actionProps = useMemo(\n    () => ({\n      onChange,\n      inputId,\n      active,\n      personalizationNameOverride,\n      segmentNameOverride,\n    }),\n    [onChange, inputId, active, personalizationNameOverride, segmentNameOverride],\n  )\n\n  const memoizedActions = useMemo(() => {\n    const oldActions = props.actions || []\n    return [createActions(actionProps), ...oldActions]\n  }, [actionProps, props.actions])\n\n  const enhancedProps = useMemo(() => {\n    const propsWithClearedGroups = clearChildrenGroups(props)\n    return {\n      ...propsWithClearedGroups,\n      actions: memoizedActions,\n    }\n  }, [props, memoizedActions])\n\n  return props.renderDefault(enhancedProps)\n}\n","import {Button, Inline, Stack} from '@sanity/ui'\nimport {type ObjectInputProps, set, useFormValue} from 'sanity'\n\nexport const SegmentInput = (props: ObjectInputProps) => {\n  const personalizationPath = props.path.slice(0, -2)\n  const defaultValue = useFormValue([...personalizationPath, 'default'])\n  const handleClick = () => {\n    props.onChange(set(defaultValue, ['value']))\n  }\n  return (\n    <Stack gap={3}>\n      {props.renderDefault(props)}\n\n      <Inline gap={1}>\n        <Button text=\"Copy default\" mode=\"ghost\" onClick={() => handleClick()} />\n      </Inline>\n    </Stack>\n  )\n}\n","import {useEffect, useState} from 'react'\nimport {\n  isImage,\n  isReference,\n  type ObjectSchemaType,\n  type PreviewProps,\n  type ReferenceSchemaType,\n  useClient,\n} from 'sanity'\n\nimport type {VariantPreviewProps} from '../../types'\nimport {usePersonalizationContext} from './Context'\n\nexport const SegmentPreview = (props: PreviewProps) => {\n  const [subtitle, setSubtitle] = useState<string | undefined>(undefined)\n  const [title, setTitle] = useState<string | undefined>(undefined)\n  const [media, setMedia] = useState<any>(undefined)\n  const {segments, apiVersion} = usePersonalizationContext()\n  const client = useClient({apiVersion})\n\n  const {segment, value} = props as VariantPreviewProps\n\n  const selectedSegment = segments.find((segmentItem) => {\n    return segmentItem.id === segment\n  })\n\n  useEffect(() => {\n    const getSubtitle = async () => {\n      setTitle(selectedSegment?.label)\n      if (typeof value === 'string') {\n        return setSubtitle(value)\n      }\n      if (isReference(value)) {\n        const doc = await client.getDocument(value._ref)\n        const type = props.schemaType as ObjectSchemaType\n        const valueField = type.fields.find((field) => field.name === 'value') as ObjectSchemaType\n        const referenceField = valueField?.type as ReferenceSchemaType\n        const referenceType = referenceField.to.find((field) => field.type?.name === doc?._type)\n\n        const selectFields = {} as Record<string, unknown>\n        const previewFields = referenceType?.preview?.select || {}\n        Object.keys(previewFields).forEach((key) => {\n          const valueKey = referenceType?.preview?.select?.[key]\n          selectFields[key] =\n            valueKey && doc\n              ? valueKey.split('.').reduce((acc: any, index) => acc?.[index], doc)\n              : undefined\n        })\n\n        const previewContent = referenceType?.preview?.prepare?.(selectFields)\n        setMedia(previewContent?.media || selectFields['media'])\n        return setSubtitle(previewContent?.title || (selectFields['title'] as string))\n      }\n      if (isImage(value)) {\n        setMedia(value)\n      }\n      return ''\n    }\n    void getSubtitle()\n  }, [value, client, selectedSegment?.label, props.schemaType])\n\n  const previewProps = {\n    ...props,\n    title: title,\n    subtitle: subtitle,\n    media: media,\n  }\n\n  return props.renderDefault(previewProps)\n}\n","import {\n  type ArrayOfObjectsInputProps,\n  defineField,\n  definePlugin,\n  defineType,\n  type FieldDefinition,\n  isObjectInputProps,\n} from 'sanity'\n\nimport {ArrayItem} from './components/ArrayItem'\nimport {\n  ArrayInput,\n  CONFIG_DEFAULT,\n  Field,\n  PersonalizationProvider,\n  SegmentInput,\n  SegmentPreview,\n} from './components/personalization'\nimport type {PersonalizationFieldPluginConfig} from './types'\nimport {flattenSchemaType} from './utils/flattenSchemaType'\n\nconst createPersonalizationType = ({\n  field,\n  personalizationNameOverride,\n  segmentNameOverride,\n  segmentId,\n  segmentArrayName,\n}: {\n  field: string | FieldDefinition\n  personalizationNameOverride: string\n  segmentNameOverride: string\n  segmentId: string\n  segmentArrayName: string\n}) => {\n  const typeName = typeof field === `string` ? field : field.name\n  const usedName = String(typeName[0]).toUpperCase() + typeName.slice(1)\n  const segmentName = `${segmentNameOverride}${usedName}`\n\n  return defineType({\n    name: `${personalizationNameOverride}${usedName}`,\n    type: 'object',\n    groups: [\n      {\n        name: 'default',\n        title: 'Default',\n        hidden: ({parent}) => {\n          return !Array.isArray(parent)\n        },\n      },\n      {\n        name: 'personalization',\n        title: 'Personalization options',\n        hidden: ({parent}) => {\n          return !Array.isArray(parent)\n        },\n      },\n      {\n        name: 'all-fields',\n        title: 'All fields',\n        hidden: ({parent}) => {\n          return Array.isArray(parent)\n        },\n      },\n    ],\n    components: {\n      field: (props) => (\n        <Field\n          {...props}\n          personalizationNameOverride={personalizationNameOverride}\n          segmentNameOverride={segmentNameOverride}\n        />\n      ),\n      item: ArrayItem,\n    },\n    fields: [\n      typeof field === `string`\n        ? // Define a simple field if all we have is the name as a string\n          defineField({\n            name: 'default',\n            type: field,\n            group: 'default',\n          })\n        : // Pass in the configured options, but overwrite the name\n          {\n            ...field,\n            name: 'default',\n            group: 'default',\n          },\n      defineField({\n        name: 'active',\n        type: 'boolean',\n        hidden: true,\n        initialValue: false,\n      }),\n      defineField({\n        name: segmentArrayName,\n        type: 'array',\n        hidden: ({parent}) => {\n          return !parent?.active\n        },\n        group: 'personalization',\n        components: {\n          input: (props: ArrayOfObjectsInputProps) => (\n            <ArrayInput {...props} segmentName={segmentName} segmentId={segmentId} />\n          ),\n        },\n        of: [\n          defineField({\n            name: segmentName,\n            type: segmentName,\n          }),\n        ],\n      }),\n    ],\n    preview: {\n      select: {\n        base: 'default',\n      },\n      prepare: ({base}) => {\n        const title =\n          typeof base === 'string'\n            ? base\n            : base && typeof base === 'object'\n              ? base.title || base.name || ''\n              : ''\n        const media =\n          base && typeof base === 'object' ? base.image || base.photo || base.media || '' : ''\n        return {\n          title,\n          media,\n        }\n      },\n    },\n  })\n}\n\nconst createSegmentType = ({\n  field,\n  segmentNameOverride,\n  segmentId,\n}: {\n  field: string | FieldDefinition\n  segmentNameOverride: string\n  segmentId: string\n}) => {\n  const typeName = typeof field === `string` ? field : field.name\n  const usedName = String(typeName[0]).toUpperCase() + typeName.slice(1)\n  return defineType({\n    name: `${segmentNameOverride}${usedName}`,\n    title: `${segmentNameOverride} array ${usedName}`,\n    type: 'object',\n    components: {\n      preview: SegmentPreview,\n      input: SegmentInput,\n    },\n    fields: [\n      {\n        type: 'string',\n        name: segmentId,\n        readOnly: true,\n      },\n      typeof field === `string`\n        ? // Define a simple field if all we have is the name as a string\n          defineField({\n            name: 'value',\n            type: field,\n          })\n        : // Pass in the configured options, but overwrite the name\n          {\n            ...field,\n            name: 'value',\n          },\n    ],\n    preview: {\n      select: {\n        segment: segmentId,\n        value: 'value',\n      },\n    },\n  })\n}\n\nconst fieldSchema = ({\n  fields,\n  personalizationNameOverride,\n  segmentNameOverride,\n  segmentId,\n  segmentArrayName,\n}: Required<Omit<PersonalizationFieldPluginConfig, 'apiVersion' | 'segments'>>) => {\n  return [\n    ...fields.map((field) => createSegmentType({field, segmentNameOverride, segmentId})),\n    ...fields.map((field) =>\n      createPersonalizationType({\n        field,\n        personalizationNameOverride,\n        segmentNameOverride,\n        segmentId,\n        segmentArrayName,\n      }),\n    ),\n  ]\n}\n\nexport const fieldLevelPersonalization = definePlugin<PersonalizationFieldPluginConfig>(\n  (config) => {\n    const pluginConfig = {...CONFIG_DEFAULT, ...config}\n    const {fields, personalizationNameOverride, segmentNameOverride} = pluginConfig\n\n    const segmentArrayName = `${segmentNameOverride}s`\n    const segmentId = `${segmentNameOverride}Id`\n\n    const fieldSchemaConfig = fieldSchema({\n      fields,\n      personalizationNameOverride,\n      segmentNameOverride,\n      segmentId,\n      segmentArrayName,\n    })\n    return {\n      name: 'sanity-personalization-plugin-field-level-personalization',\n      schema: {\n        types: fieldSchemaConfig,\n      },\n      form: {\n        components: {\n          input: (props) => {\n            const isRootInput = props.id === 'root' && isObjectInputProps(props)\n\n            if (!isRootInput) {\n              return props.renderDefault(props)\n            }\n\n            const flatFields = flattenSchemaType(props.schemaType)\n            const hasPersonalization = flatFields.some(\n              (field) =>\n                field.type.name.startsWith(personalizationNameOverride) ||\n                field.name.startsWith(personalizationNameOverride),\n            )\n\n            if (!hasPersonalization) {\n              return props.renderDefault(props)\n            }\n\n            const providerProps = {\n              ...props,\n              personalizationFieldPluginConfig: {\n                ...pluginConfig,\n                segmentId,\n                segmentArrayName,\n              },\n            }\n            return <PersonalizationProvider {...providerProps} />\n          },\n        },\n      },\n    }\n  },\n)\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{apiVersion: personalizationFieldPluginConfig.apiVersion}","apiVersion","Array.isArray(personalizationFieldPluginConfig.segments)\n    ? personalizationFieldPluginConfig.segments\n    : suspend(\n        async () => {\n          if (typeof personalizationFieldPluginConfig.segments === 'function') {\n            return personalizationFieldPluginConfig.segments(client)\n          }\n          return personalizationFieldPluginConfig.segments\n        },\n        [workspace, 'field-level-personalization'],\n        {equal},\n      )","personalizationFieldPluginConfig.segments","{...personalizationFieldPluginConfig, segments}","useMemo(\n    () => ({...personalizationFieldPluginConfig, segments}),\n    [personalizationFieldPluginConfig, segments],\n  )","props.renderDefault(props)","props.renderDefault","<PersonalizationContext.Provider value={context}>\n      {props.renderDefault(props)}\n    </PersonalizationContext.Provider>","PersonalizationContext.Provider","async (segment: VariantType) => {\n      const item = {\n        _key: uuid(),\n        [segmentId]: segment.id,\n        _type: segmentName,\n      }\n\n      // Patch the document\n      onItemAppend(item)\n    }","useCallback(\n    async (segment: VariantType) => {\n      const item = {\n        _key: uuid(),\n        [segmentId]: segment.id,\n        _type: segmentName,\n      }\n\n      // Patch the document\n      onItemAppend(item)\n    },\n    [segmentId, segmentName, onItemAppend],\n  )","(props.value as Value[]) || []","value","Inline","Stack","1","segments.map((segment) => {\n          return (\n            <Button\n              key={segment.id}\n              text={`Add ${segment.label}`}\n              mode=\"ghost\"\n              disabled={usedSegments?.includes(segment.id)}\n              onClick={() => handleClick(segment)}\n            />\n          )\n        })","3","props.renderDefault({...props, arrayFunctions: () => null})","values?.map","segment","() => null","<Inline gap={1}>\n        {segments.map((segment) => {\n          return (\n            <Button\n              key={segment.id}\n              text={`Add ${segment.label}`}\n              mode=\"ghost\"\n              disabled={usedSegments?.includes(segment.id)}\n              onClick={() => handleClick(segment)}\n            />\n          )\n        })}\n      </Inline>","<Stack gap={3}>\n      {props.renderDefault({...props, arrayFunctions: () => null})}\n\n      <Inline gap={1}>\n        {segments.map((segment) => {\n          return (\n            <Button\n              key={segment.id}\n              text={`Add ${segment.label}`}\n              mode=\"ghost\"\n              disabled={usedSegments?.includes(segment.id)}\n              onClick={() => handleClick(segment)}\n            />\n          )\n        })}\n      </Inline>\n    </Stack>","() => {\n    onChange([set(!active, ['active'])])\n  }","useCallback(() => {\n    onChange([set(!active, ['active'])])\n  }, [onChange, active])","{\n    title: `Add ${personalizationNameOverride}`,\n    type: 'action',\n    icon: IoMdPeople,\n    onAction: handleAddAction,\n    renderAsButton: true,\n  }","`Add ${personalizationNameOverride}`","() => {\n    const activeId = ['active']\n    const segments = [`${segmentNameOverride}s`]\n    onChange([set(!active, activeId), unset(segments)])\n  }","useCallback(() => {\n    const activeId = ['active']\n    const segments = [`${segmentNameOverride}s`]\n    onChange([set(!active, activeId), unset(segments)])\n  }, [onChange, active, segmentNameOverride])","{\n    title: `Remove ${personalizationNameOverride}`,\n    type: 'action',\n    icon: CloseIcon,\n    onAction: handleClearAction,\n    renderAsButton: true,\n  }","`Remove ${personalizationNameOverride}`","'active'","{\n      onChange,\n      inputId,\n      active,\n      personalizationNameOverride,\n      segmentNameOverride,\n    }","useMemo(\n    () => ({\n      onChange,\n      inputId,\n      active,\n      personalizationNameOverride,\n      segmentNameOverride,\n    }),\n    [onChange, inputId, active, personalizationNameOverride, segmentNameOverride],\n  )","props.actions || []","actions","createActions(actionProps)","[createActions(actionProps), ...oldActions]","useMemo(() => {\n    const oldActions = props.actions || []\n    return [createActions(actionProps), ...oldActions]\n  }, [actionProps, props.actions])","clearChildrenGroups(props)","{\n      ...propsWithClearedGroups,\n      actions: memoizedActions,\n    }","useMemo(() => {\n    const propsWithClearedGroups = clearChildrenGroups(props)\n    return {\n      ...propsWithClearedGroups,\n      actions: memoizedActions,\n    }\n  }, [props, memoizedActions])","props.renderDefault(enhancedProps)","renderDefault","useFormValue","[...personalizationPath, 'default']","path","() => {\n    props.onChange(set(defaultValue, ['value']))\n  }","props.renderDefault(props)","props.renderDefault","<Inline gap={1}>\n        <Button text=\"Copy default\" mode=\"ghost\" onClick={() => handleClick()} />\n      </Inline>","<Stack gap={3}>\n      {props.renderDefault(props)}\n\n      <Inline gap={1}>\n        <Button text=\"Copy default\" mode=\"ghost\" onClick={() => handleClick()} />\n      </Inline>\n    </Stack>","{apiVersion}","segments.find((segmentItem) => {\n    return segmentItem.id === segment\n  })","(segmentItem) => {\n    return segmentItem.id === segment\n  }","() => {\n    const getSubtitle = async () => {\n      setTitle(selectedSegment?.label)\n      if (typeof value === 'string') {\n        return setSubtitle(value)\n      }\n      if (isReference(value)) {\n        const doc = await client.getDocument(value._ref)\n        const type = props.schemaType as ObjectSchemaType\n        const valueField = type.fields.find((field) => field.name === 'value') as ObjectSchemaType\n        const referenceField = valueField?.type as ReferenceSchemaType\n        const referenceType = referenceField.to.find((field) => field.type?.name === doc?._type)\n\n        const selectFields = {} as Record<string, unknown>\n        const previewFields = referenceType?.preview?.select || {}\n        Object.keys(previewFields).forEach((key) => {\n          const valueKey = referenceType?.preview?.select?.[key]\n          selectFields[key] =\n            valueKey && doc\n              ? valueKey.split('.').reduce((acc: any, index) => acc?.[index], doc)\n              : undefined\n        })\n\n        const previewContent = referenceType?.preview?.prepare?.(selectFields)\n        setMedia(previewContent?.media || selectFields['media'])\n        return setSubtitle(previewContent?.title || (selectFields['title'] as string))\n      }\n      if (isImage(value)) {\n        setMedia(value)\n      }\n      return ''\n    }\n    void getSubtitle()\n  }","schemaType","label","(field) => field.name === 'value'","field","(acc: any, index) => acc?.[index]","'media'","'title'","[value, client, selectedSegment?.label, props.schemaType]","selectedSegment?.label","props.renderDefault(previewProps)"],"sources":["../src/components/personalization/Context.tsx","../src/components/personalization/Array.tsx","../src/components/personalization/Field.tsx","../src/components/personalization/SegmentInput.tsx","../src/components/personalization/SegmentPreview.tsx","../src/fieldPersonalization.tsx"],"sourcesContent":["import equal from 'fast-deep-equal'\nimport {createContext, useContext, useMemo} from 'react'\nimport {type ObjectInputProps, useClient, useWorkspace} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport type {PersonalizationContextProps, PersonalizationFieldPluginConfig} from '../../types'\n\n// This provider makes the plugin config available to all components in the document form\n// But with segments resolved\n\nexport const CONFIG_DEFAULT = {\n  fields: [],\n  apiVersion: '2024-11-07',\n  personalizationNameOverride: 'personalization',\n  segmentNameOverride: 'segment',\n  segmentId: 'segmentId',\n  segmentArrayName: 'segments',\n}\n\nconst PersonalizationContext = createContext<PersonalizationContextProps>({\n  ...CONFIG_DEFAULT,\n  segments: [],\n})\n\nexport function usePersonalizationContext() {\n  return useContext(PersonalizationContext)\n}\n\ntype PersonalizationProps = ObjectInputProps & {\n  personalizationFieldPluginConfig: Required<PersonalizationFieldPluginConfig>\n}\n\nexport function PersonalizationProvider(props: PersonalizationProps) {\n  const {personalizationFieldPluginConfig} = props\n\n  const client = useClient({apiVersion: personalizationFieldPluginConfig.apiVersion})\n  const workspace = useWorkspace()\n\n  // Fetch or return segments\n  const segments = Array.isArray(personalizationFieldPluginConfig.segments)\n    ? personalizationFieldPluginConfig.segments\n    : suspend(\n        async () => {\n          if (typeof personalizationFieldPluginConfig.segments === 'function') {\n            return personalizationFieldPluginConfig.segments(client)\n          }\n          return personalizationFieldPluginConfig.segments\n        },\n        [workspace, 'field-level-personalization'],\n        {equal},\n      )\n\n  const context = useMemo(\n    () => ({...personalizationFieldPluginConfig, segments}),\n    [personalizationFieldPluginConfig, segments],\n  )\n\n  return (\n    <PersonalizationContext.Provider value={context}>\n      {props.renderDefault(props)}\n    </PersonalizationContext.Provider>\n  )\n}\n","import {Button, Inline, Stack} from '@sanity/ui'\nimport {uuid} from '@sanity/uuid'\nimport {useCallback} from 'react'\n\nimport type {PersonalizationArrayInputProps, VariantType} from '../../types'\nimport {usePersonalizationContext} from './Context'\n\nexport const ArrayInput = (props: PersonalizationArrayInputProps) => {\n  const {onItemAppend, segmentName, segmentId} = props\n\n  const {segments} = usePersonalizationContext()\n\n  const handleClick = useCallback(\n    async (segment: VariantType) => {\n      const item = {\n        _key: uuid(),\n        [segmentId]: segment.id,\n        _type: segmentName,\n      }\n\n      // Patch the document\n      onItemAppend(item)\n    },\n    [segmentId, segmentName, onItemAppend],\n  )\n\n  type Value = {\n    value?: unknown\n    [key: string]: unknown\n    segmentId: string\n    _key: string\n    _type: string\n  }\n\n  const values = (props.value as Value[]) || []\n\n  const usedSegments = values?.map((segment) => segment[segmentId])\n\n  return (\n    <Stack gap={3}>\n      {props.renderDefault({...props, arrayFunctions: () => null})}\n\n      <Inline gap={1}>\n        {segments.map((segment) => {\n          return (\n            <Button\n              key={segment.id}\n              text={`Add ${segment.label}`}\n              mode=\"ghost\"\n              disabled={usedSegments?.includes(segment.id)}\n              onClick={() => handleClick(segment)}\n            />\n          )\n        })}\n      </Inline>\n    </Stack>\n  )\n}\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {useCallback, useMemo} from 'react'\nimport {IoMdPeople} from 'react-icons/io'\nimport {\n  defineDocumentFieldAction,\n  type DocumentFieldActionItem,\n  type DocumentFieldActionProps,\n  type FormPatch,\n  type ObjectFieldProps,\n  type PatchEvent,\n  set,\n  unset,\n} from 'sanity'\n\nimport {clearChildrenGroups} from '../../utils/clearChildGroups'\n\ntype PatchStuff = {onChange: (patch: FormPatch | FormPatch[] | PatchEvent) => void; inputId: string}\n\nconst useAddPersonalizationAction = (\n  props: DocumentFieldActionProps &\n    PatchStuff & {personalizationNameOverride: string; active: boolean},\n): DocumentFieldActionItem => {\n  const {onChange, active, personalizationNameOverride} = props\n\n  const handleAddAction = useCallback(() => {\n    onChange([set(!active, ['active'])])\n  }, [onChange, active])\n\n  return {\n    title: `Add ${personalizationNameOverride}`,\n    type: 'action',\n    icon: IoMdPeople,\n    onAction: handleAddAction,\n    renderAsButton: true,\n  }\n}\n\nconst useRemovePersonalizationAction = (\n  props: DocumentFieldActionProps &\n    PatchStuff & {\n      personalizationNameOverride: string\n      active: boolean\n      segmentNameOverride: string\n    },\n): DocumentFieldActionItem => {\n  const {onChange, active, personalizationNameOverride, segmentNameOverride} = props\n  const handleClearAction = useCallback(() => {\n    const activeId = ['active']\n    const segments = [`${segmentNameOverride}s`]\n    onChange([set(!active, activeId), unset(segments)])\n  }, [onChange, active, segmentNameOverride])\n\n  return {\n    title: `Remove ${personalizationNameOverride}`,\n    type: 'action',\n    icon: CloseIcon,\n    onAction: handleClearAction,\n    renderAsButton: true,\n  }\n}\n\nconst createActions = ({\n  onChange,\n  inputId,\n  active,\n  personalizationNameOverride,\n  segmentNameOverride,\n}: PatchStuff & {\n  active?: boolean\n  personalizationNameOverride: string\n  segmentNameOverride: string\n}) => {\n  const removeAction = defineDocumentFieldAction({\n    name: `Remove ${personalizationNameOverride}`,\n    useAction: (props) =>\n      useRemovePersonalizationAction({\n        ...props,\n        active: true,\n        onChange,\n        inputId,\n        personalizationNameOverride,\n        segmentNameOverride,\n      }),\n  })\n  const addAction = defineDocumentFieldAction({\n    name: `Add ${personalizationNameOverride}`,\n    useAction: (props) =>\n      useAddPersonalizationAction({\n        ...props,\n        active: false,\n        onChange,\n        inputId,\n        personalizationNameOverride,\n      }),\n  })\n  return active ? removeAction : addAction\n}\n\nexport const Field = (\n  props: ObjectFieldProps & {\n    personalizationNameOverride: string\n    segmentNameOverride: string\n  },\n) => {\n  const {onChange} = props.inputProps\n  const {inputId, personalizationNameOverride, segmentNameOverride} = props\n  const active = props.value?.['active'] as boolean | undefined\n\n  const actionProps = useMemo(\n    () => ({\n      onChange,\n      inputId,\n      active,\n      personalizationNameOverride,\n      segmentNameOverride,\n    }),\n    [onChange, inputId, active, personalizationNameOverride, segmentNameOverride],\n  )\n\n  const memoizedActions = useMemo(() => {\n    const oldActions = props.actions || []\n    return [createActions(actionProps), ...oldActions]\n  }, [actionProps, props.actions])\n\n  const enhancedProps = useMemo(() => {\n    const propsWithClearedGroups = clearChildrenGroups(props)\n    return {\n      ...propsWithClearedGroups,\n      actions: memoizedActions,\n    }\n  }, [props, memoizedActions])\n\n  return props.renderDefault(enhancedProps)\n}\n","import {Button, Inline, Stack} from '@sanity/ui'\nimport {type ObjectInputProps, set, useFormValue} from 'sanity'\n\nexport const SegmentInput = (props: ObjectInputProps) => {\n  const personalizationPath = props.path.slice(0, -2)\n  const defaultValue = useFormValue([...personalizationPath, 'default'])\n  const handleClick = () => {\n    props.onChange(set(defaultValue, ['value']))\n  }\n  return (\n    <Stack gap={3}>\n      {props.renderDefault(props)}\n\n      <Inline gap={1}>\n        <Button text=\"Copy default\" mode=\"ghost\" onClick={() => handleClick()} />\n      </Inline>\n    </Stack>\n  )\n}\n","import {useEffect, useState} from 'react'\nimport {\n  isImage,\n  isReference,\n  type ObjectSchemaType,\n  type PreviewProps,\n  type ReferenceSchemaType,\n  useClient,\n} from 'sanity'\n\nimport type {VariantPreviewProps} from '../../types'\nimport {usePersonalizationContext} from './Context'\n\nexport const SegmentPreview = (props: PreviewProps) => {\n  const [subtitle, setSubtitle] = useState<string | undefined>(undefined)\n  const [title, setTitle] = useState<string | undefined>(undefined)\n  const [media, setMedia] = useState<any>(undefined)\n  const {segments, apiVersion} = usePersonalizationContext()\n  const client = useClient({apiVersion})\n\n  const {segment, value} = props as VariantPreviewProps\n\n  const selectedSegment = segments.find((segmentItem) => {\n    return segmentItem.id === segment\n  })\n\n  useEffect(() => {\n    const getSubtitle = async () => {\n      setTitle(selectedSegment?.label)\n      if (typeof value === 'string') {\n        return setSubtitle(value)\n      }\n      if (isReference(value)) {\n        const doc = await client.getDocument(value._ref)\n        const type = props.schemaType as ObjectSchemaType\n        const valueField = type.fields.find((field) => field.name === 'value') as ObjectSchemaType\n        const referenceField = valueField?.type as ReferenceSchemaType\n        const referenceType = referenceField.to.find((field) => field.type?.name === doc?._type)\n\n        const selectFields = {} as Record<string, unknown>\n        const previewFields = referenceType?.preview?.select || {}\n        Object.keys(previewFields).forEach((key) => {\n          const valueKey = referenceType?.preview?.select?.[key]\n          selectFields[key] =\n            valueKey && doc\n              ? valueKey.split('.').reduce((acc: any, index) => acc?.[index], doc)\n              : undefined\n        })\n\n        const previewContent = referenceType?.preview?.prepare?.(selectFields)\n        setMedia(previewContent?.media || selectFields['media'])\n        return setSubtitle(previewContent?.title || (selectFields['title'] as string))\n      }\n      if (isImage(value)) {\n        setMedia(value)\n      }\n      return ''\n    }\n    void getSubtitle()\n  }, [value, client, selectedSegment?.label, props.schemaType])\n\n  const previewProps = {\n    ...props,\n    title: title,\n    subtitle: subtitle,\n    media: media,\n  }\n\n  return props.renderDefault(previewProps)\n}\n","import {\n  type ArrayOfObjectsInputProps,\n  defineField,\n  definePlugin,\n  defineType,\n  type FieldDefinition,\n  isObjectInputProps,\n} from 'sanity'\n\nimport {ArrayItem} from './components/ArrayItem'\nimport {\n  ArrayInput,\n  CONFIG_DEFAULT,\n  Field,\n  PersonalizationProvider,\n  SegmentInput,\n  SegmentPreview,\n} from './components/personalization'\nimport type {PersonalizationFieldPluginConfig} from './types'\nimport {flattenSchemaType} from './utils/flattenSchemaType'\n\nconst createPersonalizationType = ({\n  field,\n  personalizationNameOverride,\n  segmentNameOverride,\n  segmentId,\n  segmentArrayName,\n}: {\n  field: string | FieldDefinition\n  personalizationNameOverride: string\n  segmentNameOverride: string\n  segmentId: string\n  segmentArrayName: string\n}) => {\n  const typeName = typeof field === `string` ? field : field.name\n  const usedName = String(typeName[0]).toUpperCase() + typeName.slice(1)\n  const segmentName = `${segmentNameOverride}${usedName}`\n\n  return defineType({\n    name: `${personalizationNameOverride}${usedName}`,\n    type: 'object',\n    groups: [\n      {\n        name: 'default',\n        title: 'Default',\n        hidden: ({parent}) => {\n          return !Array.isArray(parent)\n        },\n      },\n      {\n        name: 'personalization',\n        title: 'Personalization options',\n        hidden: ({parent}) => {\n          return !Array.isArray(parent)\n        },\n      },\n      {\n        name: 'all-fields',\n        title: 'All fields',\n        hidden: ({parent}) => {\n          return Array.isArray(parent)\n        },\n      },\n    ],\n    components: {\n      field: (props) => (\n        <Field\n          {...props}\n          personalizationNameOverride={personalizationNameOverride}\n          segmentNameOverride={segmentNameOverride}\n        />\n      ),\n      item: ArrayItem,\n    },\n    fields: [\n      typeof field === `string`\n        ? // Define a simple field if all we have is the name as a string\n          defineField({\n            name: 'default',\n            type: field,\n            group: 'default',\n          })\n        : // Pass in the configured options, but overwrite the name\n          {\n            ...field,\n            name: 'default',\n            group: 'default',\n          },\n      defineField({\n        name: 'active',\n        type: 'boolean',\n        hidden: true,\n        initialValue: false,\n      }),\n      defineField({\n        name: segmentArrayName,\n        type: 'array',\n        hidden: ({parent}) => {\n          return !parent?.active\n        },\n        group: 'personalization',\n        components: {\n          input: (props: ArrayOfObjectsInputProps) => (\n            <ArrayInput {...props} segmentName={segmentName} segmentId={segmentId} />\n          ),\n        },\n        of: [\n          defineField({\n            name: segmentName,\n            type: segmentName,\n          }),\n        ],\n      }),\n    ],\n    preview: {\n      select: {\n        base: 'default',\n      },\n      prepare: ({base}) => {\n        const title =\n          typeof base === 'string'\n            ? base\n            : base && typeof base === 'object'\n              ? base.title || base.name || ''\n              : ''\n        const media =\n          base && typeof base === 'object' ? base.image || base.photo || base.media || '' : ''\n        return {\n          title,\n          media,\n        }\n      },\n    },\n  })\n}\n\nconst createSegmentType = ({\n  field,\n  segmentNameOverride,\n  segmentId,\n}: {\n  field: string | FieldDefinition\n  segmentNameOverride: string\n  segmentId: string\n}) => {\n  const typeName = typeof field === `string` ? field : field.name\n  const usedName = String(typeName[0]).toUpperCase() + typeName.slice(1)\n  return defineType({\n    name: `${segmentNameOverride}${usedName}`,\n    title: `${segmentNameOverride} array ${usedName}`,\n    type: 'object',\n    components: {\n      preview: SegmentPreview,\n      input: SegmentInput,\n    },\n    fields: [\n      {\n        type: 'string',\n        name: segmentId,\n        readOnly: true,\n      },\n      typeof field === `string`\n        ? // Define a simple field if all we have is the name as a string\n          defineField({\n            name: 'value',\n            type: field,\n          })\n        : // Pass in the configured options, but overwrite the name\n          {\n            ...field,\n            name: 'value',\n          },\n    ],\n    preview: {\n      select: {\n        segment: segmentId,\n        value: 'value',\n      },\n    },\n  })\n}\n\nconst fieldSchema = ({\n  fields,\n  personalizationNameOverride,\n  segmentNameOverride,\n  segmentId,\n  segmentArrayName,\n}: Required<Omit<PersonalizationFieldPluginConfig, 'apiVersion' | 'segments'>>) => {\n  return [\n    ...fields.map((field) => createSegmentType({field, segmentNameOverride, segmentId})),\n    ...fields.map((field) =>\n      createPersonalizationType({\n        field,\n        personalizationNameOverride,\n        segmentNameOverride,\n        segmentId,\n        segmentArrayName,\n      }),\n    ),\n  ]\n}\n\nexport const fieldLevelPersonalization = definePlugin<PersonalizationFieldPluginConfig>(\n  (config) => {\n    const pluginConfig = {...CONFIG_DEFAULT, ...config}\n    const {fields, personalizationNameOverride, segmentNameOverride} = pluginConfig\n\n    const segmentArrayName = `${segmentNameOverride}s`\n    const segmentId = `${segmentNameOverride}Id`\n\n    const fieldSchemaConfig = fieldSchema({\n      fields,\n      personalizationNameOverride,\n      segmentNameOverride,\n      segmentId,\n      segmentArrayName,\n    })\n    return {\n      name: 'sanity-personalization-plugin-field-level-personalization',\n      schema: {\n        types: fieldSchemaConfig,\n      },\n      form: {\n        components: {\n          input: (props) => {\n            const isRootInput = props.id === 'root' && isObjectInputProps(props)\n\n            if (!isRootInput) {\n              return props.renderDefault(props)\n            }\n\n            const flatFields = flattenSchemaType(props.schemaType)\n            const hasPersonalization = flatFields.some(\n              (field) =>\n                field.type.name.startsWith(personalizationNameOverride) ||\n                field.name.startsWith(personalizationNameOverride),\n            )\n\n            if (!hasPersonalization) {\n              return props.renderDefault(props)\n            }\n\n            const providerProps = {\n              ...props,\n              personalizationFieldPluginConfig: {\n                ...pluginConfig,\n                segmentId,\n                segmentArrayName,\n              },\n            }\n            return <PersonalizationProvider {...providerProps} />\n          },\n        },\n      },\n    }\n  },\n)\n"],"mappings":"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"}
\ No newline at end of file
Index: package/dist/launchDarkly/index.js.map
===================================================================
--- package/dist/launchDarkly/index.js.map
+++ package/dist/launchDarkly/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["SettingsView","useSecrets","useEffect","useState","ObjectInputProps","useLaunchDarklyContext","namespace","pluginConfigKeys","key","title","Secrets","props","$","_c","secrets","loading","apiKey","setSecret","showSettings","setShowSettings","t0","t1","undefined","t2","renderDefault","Symbol","for","t3","t4","createContext","useContext","useMemo","useState","ObjectInputProps","LaunchDarklyContextProps","LaunchDarklyFieldLevelConfig","Secrets","LAUNCHDARKLY_CONFIG_DEFAULT","LaunchDarklyContext","setSecret","undefined","secret","useLaunchDarklyContext","LaunchDarklyProps","launchDarklyFieldPluginConfig","LaunchDarklyProvider","props","$","_c","t0","context","t1","t2","SanityClient","ExperimentType","LaunchDarklyFieldLevelConfig","LaunchDarklyFlagItem","getExperiments","client","projectKey","tags","Omit","Promise","query","secret","fetch","url","URL","searchParams","set","join","featureExperiments","hasMore","offset","limit","toString","responseFlags","headers","Authorization","items","json","experiments","map","flag","id","key","label","name","variants","variations","variation","value","push","length","definePlugin","isObjectInputProps","fieldLevelExperiments","baseFieldLevelExperiments","flattenSchemaType","LAUNCHDARKLY_CONFIG_DEFAULT","LaunchDarklyProvider","LaunchDarklyFieldLevelConfig","getExperiments","config","pluginConfig","fields","projectKey","tags","name","plugins","experiments","client","experimentNameOverride","form","components","input","props","isRootInput","id","renderDefault","flatFieldTypeNames","schemaType","map","field","type","hasExperiment","some","startsWith","providerProps","launchDarklyFieldPluginConfig"],"sources":["../../src/launchDarkly/components/Secrets.tsx","../../src/launchDarkly/components/LaunchDarklyContext.tsx","../../src/launchDarkly/utils.ts","../../src/launchDarkly/index.ts"],"sourcesContent":["import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {useEffect, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport {useLaunchDarklyContext} from './LaunchDarklyContext'\n\nconst namespace = 'launchdarkly'\nconst pluginConfigKeys = [\n  {\n    key: 'apiKey',\n    title: 'Your secret API key',\n  },\n]\n\nexport const Secrets = (props: ObjectInputProps) => {\n  const {secrets, loading} = useSecrets(namespace) as {secrets: {apiKey: string}; loading: boolean}\n  const {setSecret} = useLaunchDarklyContext()\n  const [showSettings, setShowSettings] = useState<boolean>(false)\n\n  useEffect(() => {\n    if (loading) return undefined\n    if (!secrets && !loading) {\n      setSecret(undefined)\n      // oxlint-disable-next-line react/set-state-in-effect\n      return setShowSettings(true)\n    }\n    setSecret(secrets.apiKey)\n    return setShowSettings(false)\n  }, [secrets, loading, setSecret])\n\n  if (!showSettings) {\n    return props.renderDefault(props)\n  }\n  return (\n    <>\n      <SettingsView\n        title={`${namespace} api key`}\n        namespace={namespace}\n        keys={pluginConfigKeys}\n        onClose={() => {\n          setShowSettings(false)\n        }}\n      />\n      {props.renderDefault(props)}\n    </>\n  )\n}\n","import {createContext, useContext, useMemo, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport type {LaunchDarklyContextProps, LaunchDarklyFieldLevelConfig} from '../types'\nimport {Secrets} from './Secrets'\n\nexport const LAUNCHDARKLY_CONFIG_DEFAULT = {}\n\nconst LaunchDarklyContext = createContext<LaunchDarklyContextProps>({\n  setSecret: () => undefined,\n  secret: undefined,\n})\n\nexport function useLaunchDarklyContext() {\n  return useContext(LaunchDarklyContext)\n}\n\ntype LaunchDarklyProps = ObjectInputProps & {\n  launchDarklyFieldPluginConfig: LaunchDarklyFieldLevelConfig\n}\n\nexport function LaunchDarklyProvider(props: LaunchDarklyProps) {\n  const {launchDarklyFieldPluginConfig} = props\n  const [secret, setSecret] = useState<string | undefined>()\n\n  const context = useMemo(\n    () => ({...launchDarklyFieldPluginConfig, secret, setSecret}),\n    [launchDarklyFieldPluginConfig, secret, setSecret],\n  )\n\n  return (\n    <LaunchDarklyContext.Provider value={context}>\n      <Secrets {...props} />\n    </LaunchDarklyContext.Provider>\n  )\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {ExperimentType} from '../types'\nimport type {LaunchDarklyFieldLevelConfig, LaunchDarklyFlagItem} from './types'\n\nexport const getExperiments = async ({\n  client,\n  projectKey,\n  tags,\n}: Omit<LaunchDarklyFieldLevelConfig, 'fields'> & {client: SanityClient}): Promise<\n  ExperimentType[]\n> => {\n  const query = `*[_id == 'secrets.launchdarkly'][0].secrets.apiKey`\n\n  const secret = await client.fetch(query) // secret is stored in the content lake using @sanity/studio-secrets\n  if (!secret) return []\n\n  const url = new URL(`https://app.launchdarkly.com/api/v2/flags/${projectKey}`)\n\n  if (tags) {\n    url.searchParams.set('filter', `tags:${tags.join('+')}`)\n  }\n\n  const featureExperiments: ExperimentType[] = []\n  let hasMore = true\n  let offset = 0\n  const limit = 10\n\n  while (hasMore) {\n    url.searchParams.set('offset', offset.toString())\n    url.searchParams.set('limit', limit.toString())\n    const responseFlags = await fetch(url, {\n      headers: {\n        Authorization: secret,\n      },\n    })\n\n    const {items} = await responseFlags.json()\n    const experiments = items.map((flag: LaunchDarklyFlagItem) => ({\n      id: flag.key,\n      label: flag.name,\n      variants: flag.variations.map((variation) => ({\n        id: variation.value.toString(),\n        label: variation.name ?? variation.value.toString(),\n      })),\n    }))\n    featureExperiments.push(...experiments)\n    if (items.length === limit) {\n      offset += limit\n    } else {\n      hasMore = false\n    }\n  }\n\n  return featureExperiments\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, isObjectInputProps} from 'sanity'\n\nimport {fieldLevelExperiments as baseFieldLevelExperiments} from '../fieldExperiments'\nimport {flattenSchemaType} from '../utils/flattenSchemaType'\nimport {LAUNCHDARKLY_CONFIG_DEFAULT, LaunchDarklyProvider} from './components/LaunchDarklyContext'\nimport type {LaunchDarklyFieldLevelConfig} from './types'\nimport {getExperiments} from './utils'\n\nexport const fieldLevelExperiments = definePlugin<LaunchDarklyFieldLevelConfig>((config) => {\n  const pluginConfig = {...LAUNCHDARKLY_CONFIG_DEFAULT, ...config}\n  const {fields, projectKey, tags} = pluginConfig\n  return {\n    name: 'sanity-launchdarkly-personalization-plugin-field-level-experiments',\n    plugins: [\n      baseFieldLevelExperiments({\n        fields,\n        experiments: (client) => getExperiments({client, projectKey, tags}),\n        experimentNameOverride: 'flag',\n      }),\n    ],\n\n    form: {\n      components: {\n        input: (props) => {\n          const isRootInput = props.id === 'root' && isObjectInputProps(props)\n\n          if (!isRootInput) {\n            return props.renderDefault(props)\n          }\n\n          const flatFieldTypeNames = flattenSchemaType(props.schemaType).map(\n            (field) => field.type.name,\n          )\n\n          const hasExperiment = flatFieldTypeNames.some((name) => name.startsWith('flag'))\n\n          if (!hasExperiment) {\n            return props.renderDefault(props)\n          }\n\n          const providerProps = {\n            ...props,\n            launchDarklyFieldPluginConfig: {\n              ...pluginConfig,\n            },\n          }\n          return LaunchDarklyProvider(providerProps)\n        },\n      },\n    },\n  }\n})\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["() => {\n    if (loading) return undefined\n    if (!secrets && !loading) {\n      setSecret(undefined)\n      // oxlint-disable-next-line react/set-state-in-effect\n      return setShowSettings(true)\n    }\n    setSecret(secrets.apiKey)\n    return setShowSettings(false)\n  }","[secrets, loading, setSecret]","props.renderDefault(props)","props.renderDefault","<SettingsView\n        title={`${namespace} api key`}\n        namespace={namespace}\n        keys={pluginConfigKeys}\n        onClose={() => {\n          setShowSettings(false)\n        }}\n      />","<>\n      <SettingsView\n        title={`${namespace} api key`}\n        namespace={namespace}\n        keys={pluginConfigKeys}\n        onClose={() => {\n          setShowSettings(false)\n        }}\n      />\n      {props.renderDefault(props)}\n    </>","{...launchDarklyFieldPluginConfig, secret, setSecret}","useMemo(\n    () => ({...launchDarklyFieldPluginConfig, secret, setSecret}),\n    [launchDarklyFieldPluginConfig, secret, setSecret],\n  )","<Secrets {...props} />","<LaunchDarklyContext.Provider value={context}>\n      <Secrets {...props} />\n    </LaunchDarklyContext.Provider>","LaunchDarklyContext.Provider"],"sources":["../../src/launchDarkly/components/Secrets.tsx","../../src/launchDarkly/components/LaunchDarklyContext.tsx","../../src/launchDarkly/utils.ts","../../src/launchDarkly/index.ts"],"sourcesContent":["import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {useEffect, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport {useLaunchDarklyContext} from './LaunchDarklyContext'\n\nconst namespace = 'launchdarkly'\nconst pluginConfigKeys = [\n  {\n    key: 'apiKey',\n    title: 'Your secret API key',\n  },\n]\n\nexport const Secrets = (props: ObjectInputProps) => {\n  const {secrets, loading} = useSecrets(namespace) as {secrets: {apiKey: string}; loading: boolean}\n  const {setSecret} = useLaunchDarklyContext()\n  const [showSettings, setShowSettings] = useState<boolean>(false)\n\n  useEffect(() => {\n    if (loading) return undefined\n    if (!secrets && !loading) {\n      setSecret(undefined)\n      // oxlint-disable-next-line react/set-state-in-effect\n      return setShowSettings(true)\n    }\n    setSecret(secrets.apiKey)\n    return setShowSettings(false)\n  }, [secrets, loading, setSecret])\n\n  if (!showSettings) {\n    return props.renderDefault(props)\n  }\n  return (\n    <>\n      <SettingsView\n        title={`${namespace} api key`}\n        namespace={namespace}\n        keys={pluginConfigKeys}\n        onClose={() => {\n          setShowSettings(false)\n        }}\n      />\n      {props.renderDefault(props)}\n    </>\n  )\n}\n","import {createContext, useContext, useMemo, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport type {LaunchDarklyContextProps, LaunchDarklyFieldLevelConfig} from '../types'\nimport {Secrets} from './Secrets'\n\nexport const LAUNCHDARKLY_CONFIG_DEFAULT = {}\n\nconst LaunchDarklyContext = createContext<LaunchDarklyContextProps>({\n  setSecret: () => undefined,\n  secret: undefined,\n})\n\nexport function useLaunchDarklyContext() {\n  return useContext(LaunchDarklyContext)\n}\n\ntype LaunchDarklyProps = ObjectInputProps & {\n  launchDarklyFieldPluginConfig: LaunchDarklyFieldLevelConfig\n}\n\nexport function LaunchDarklyProvider(props: LaunchDarklyProps) {\n  const {launchDarklyFieldPluginConfig} = props\n  const [secret, setSecret] = useState<string | undefined>()\n\n  const context = useMemo(\n    () => ({...launchDarklyFieldPluginConfig, secret, setSecret}),\n    [launchDarklyFieldPluginConfig, secret, setSecret],\n  )\n\n  return (\n    <LaunchDarklyContext.Provider value={context}>\n      <Secrets {...props} />\n    </LaunchDarklyContext.Provider>\n  )\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {ExperimentType} from '../types'\nimport type {LaunchDarklyFieldLevelConfig, LaunchDarklyFlagItem} from './types'\n\nexport const getExperiments = async ({\n  client,\n  projectKey,\n  tags,\n}: Omit<LaunchDarklyFieldLevelConfig, 'fields'> & {client: SanityClient}): Promise<\n  ExperimentType[]\n> => {\n  const query = `*[_id == 'secrets.launchdarkly'][0].secrets.apiKey`\n\n  const secret = await client.fetch(query) // secret is stored in the content lake using @sanity/studio-secrets\n  if (!secret) return []\n\n  const url = new URL(`https://app.launchdarkly.com/api/v2/flags/${projectKey}`)\n\n  if (tags) {\n    url.searchParams.set('filter', `tags:${tags.join('+')}`)\n  }\n\n  const featureExperiments: ExperimentType[] = []\n  let hasMore = true\n  let offset = 0\n  const limit = 10\n\n  while (hasMore) {\n    url.searchParams.set('offset', offset.toString())\n    url.searchParams.set('limit', limit.toString())\n    const responseFlags = await fetch(url, {\n      headers: {\n        Authorization: secret,\n      },\n    })\n\n    const {items} = await responseFlags.json()\n    const experiments = items.map((flag: LaunchDarklyFlagItem) => ({\n      id: flag.key,\n      label: flag.name,\n      variants: flag.variations.map((variation) => ({\n        id: variation.value.toString(),\n        label: variation.name ?? variation.value.toString(),\n      })),\n    }))\n    featureExperiments.push(...experiments)\n    if (items.length === limit) {\n      offset += limit\n    } else {\n      hasMore = false\n    }\n  }\n\n  return featureExperiments\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, isObjectInputProps} from 'sanity'\n\nimport {fieldLevelExperiments as baseFieldLevelExperiments} from '../fieldExperiments'\nimport {flattenSchemaType} from '../utils/flattenSchemaType'\nimport {LAUNCHDARKLY_CONFIG_DEFAULT, LaunchDarklyProvider} from './components/LaunchDarklyContext'\nimport type {LaunchDarklyFieldLevelConfig} from './types'\nimport {getExperiments} from './utils'\n\nexport const fieldLevelExperiments = definePlugin<LaunchDarklyFieldLevelConfig>((config) => {\n  const pluginConfig = {...LAUNCHDARKLY_CONFIG_DEFAULT, ...config}\n  const {fields, projectKey, tags} = pluginConfig\n  return {\n    name: 'sanity-launchdarkly-personalization-plugin-field-level-experiments',\n    plugins: [\n      baseFieldLevelExperiments({\n        fields,\n        experiments: (client) => getExperiments({client, projectKey, tags}),\n        experimentNameOverride: 'flag',\n      }),\n    ],\n\n    form: {\n      components: {\n        input: (props) => {\n          const isRootInput = props.id === 'root' && isObjectInputProps(props)\n\n          if (!isRootInput) {\n            return props.renderDefault(props)\n          }\n\n          const flatFieldTypeNames = flattenSchemaType(props.schemaType).map(\n            (field) => field.type.name,\n          )\n\n          const hasExperiment = flatFieldTypeNames.some((name) => name.startsWith('flag'))\n\n          if (!hasExperiment) {\n            return props.renderDefault(props)\n          }\n\n          const providerProps = {\n            ...props,\n            launchDarklyFieldPluginConfig: {\n              ...pluginConfig,\n            },\n          }\n          return LaunchDarklyProvider(providerProps)\n        },\n      },\n    },\n  }\n})\n"],"mappings":"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"}
\ No newline at end of file