@sanity/personalization-plugin

3.1.63.1.7
dist/growthbook/index.js.map
~dist/growthbook/index.js.mapModified
+1−1
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":["() => {\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
+{"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    </>","_c","_Fragment","{...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","_c","baseFieldLevelExperiments"],"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