@sanity/personalization-plugin
3.1.03.1.1
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":["SettingsView","useSecrets","useEffect","useState","ObjectInputProps","useGrowthbookContext","namespace","apiKeyName","pluginConfigKeys","key","title","Secrets","props","$","_c","secrets","loading","apiKey","setSecret","showSettings","setShowSettings","t0","t1","undefined","t2","renderDefault","Symbol","for","t3","t4","createContext","useContext","useMemo","useState","ObjectInputProps","GrowthbookContextProps","GrowthbookExperimentFieldPluginConfig","Secrets","GROWTHBOOK_CONFIG_DEFAULT","baseUrl","GrowthbookContext","setSecret","undefined","secret","useGrowthbookContext","GrowthbookProps","growthbookFieldPluginConfig","GrowthbookProvider","props","$","_c","t0","context","t1","t2","SanityClient","ExperimentType","GrowthbookFeature","VariantType","apiKeyName","namespace","GrowthbookExperimentFieldPluginConfig","getBooleanConversion","value","getExperiments","client","environment","baseUrl","project","convertBooleans","tags","Omit","Promise","query","secret","fetch","featureExperiments","hasMore","offset","url","URL","searchParams","set","toString","response","headers","Authorization","features","responseHasMore","nextOffset","json","forEach","feature","archived","undefined","some","tag","includes","experiments","environments","rules","filter","experiment","type","variations","uniqueValues","Set","variant","has","add","push","id","label","variants","sortedFeatureExperiments","sort","a","b","localeCompare","definePlugin","isObjectInputProps","fieldLevelExperiments","baseFieldLevelExperiments","flattenSchemaType","GROWTHBOOK_CONFIG_DEFAULT","GrowthbookProvider","GrowthbookExperimentFieldPluginConfig","getExperiments","config","pluginConfig","fields","environment","project","convertBooleans","baseUrl","tags","name","plugins","experiments","client","form","components","input","props","isRootInput","id","renderDefault","flatFieldTypeNames","schemaType","map","field","type","hasExperiment","some","startsWith","providerProps","growthbookFieldPluginConfig"],"sources":["../../src/growthbook/Components/Secrets.tsx","../../src/growthbook/Components/GrowthbookContext.tsx","../../src/growthbook/utils.ts","../../src/growthbook/index.ts"],"sourcesContent":["import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {useEffect, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport {useGrowthbookContext} from './GrowthbookContext'\n\nexport const namespace = 'growthbook'\nexport const apiKeyName = 'apiKey'\n\nconst pluginConfigKeys = [\n {\n key: apiKeyName,\n title: 'Your secret API key',\n },\n]\n\nexport const Secrets = (props: ObjectInputProps) => {\n const {secrets, loading} = useSecrets(namespace) as {secrets: {apiKey: string}; loading: boolean}\n const {setSecret} = useGrowthbookContext()\n const [showSettings, setShowSettings] = useState<boolean>(false)\n\n useEffect(() => {\n if (loading) return undefined\n if (!secrets && !loading) {\n setSecret(undefined)\n // oxlint-disable-next-line react/react-compiler\n return setShowSettings(true)\n }\n setSecret(secrets.apiKey)\n return setShowSettings(false)\n }, [secrets, loading, setSecret])\n\n if (!showSettings) {\n return props.renderDefault(props)\n }\n return (\n <>\n <SettingsView\n title={'Growthbook secret'}\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setShowSettings(false)\n }}\n />\n {props.renderDefault(props)}\n </>\n )\n}\n","import {createContext, useContext, useMemo, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport type {GrowthbookContextProps, GrowthbookExperimentFieldPluginConfig} from '../types'\nimport {Secrets} from './Secrets'\n\nexport const GROWTHBOOK_CONFIG_DEFAULT = {\n baseUrl: 'https://api.growthbook.io/api/v1',\n}\n\nconst GrowthbookContext = createContext<GrowthbookContextProps>({\n setSecret: () => undefined,\n secret: undefined,\n})\n\nexport function useGrowthbookContext() {\n return useContext(GrowthbookContext)\n}\n\ntype GrowthbookProps = ObjectInputProps & {\n growthbookFieldPluginConfig: GrowthbookExperimentFieldPluginConfig\n}\n\nexport function GrowthbookProvider(props: GrowthbookProps) {\n const {growthbookFieldPluginConfig} = props\n const [secret, setSecret] = useState<string | undefined>()\n\n const context = useMemo(\n () => ({...growthbookFieldPluginConfig, secret, setSecret}),\n [growthbookFieldPluginConfig, secret, setSecret],\n )\n\n return (\n <GrowthbookContext.Provider value={context}>\n <Secrets {...props} />\n </GrowthbookContext.Provider>\n )\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {ExperimentType, GrowthbookFeature, VariantType} from '../types'\nimport {apiKeyName, namespace} from './Components/Secrets'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\n\nconst getBooleanConversion = (value: string) => {\n // control is false\n if (value === 'true') {\n return 'variant'\n } else if (value === 'false') {\n return 'control'\n }\n return value\n}\n\nexport const getExperiments = async ({\n client,\n environment,\n baseUrl,\n project,\n convertBooleans,\n tags,\n}: Omit<GrowthbookExperimentFieldPluginConfig, 'fields' | 'baseUrl'> & {\n client: SanityClient\n baseUrl: string\n}): Promise<ExperimentType[]> => {\n const query = `*[_id == 'secrets.${namespace}'][0].secrets.${apiKeyName}`\n\n const secret = await client.fetch(query) // secret is stored in the content lake using @sanity/studio-secrets\n if (!secret) return []\n\n const featureExperiments: ExperimentType[] = []\n let hasMore = true\n let offset = 0\n const url = new URL(`${baseUrl}/features`)\n if (project) {\n url.searchParams.set('projectId', project)\n }\n\n while (hasMore) {\n url.searchParams.set('offset', offset.toString())\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${secret}`,\n },\n })\n\n const {features, hasMore: responseHasMore, nextOffset} = await response.json()\n\n hasMore = responseHasMore\n offset = nextOffset\n if (!features) continue\n\n features.forEach((feature: GrowthbookFeature) => {\n if (feature.archived) {\n return undefined\n }\n if (tags && feature.tags && !feature.tags.some((tag) => tags.includes(tag))) {\n return undefined\n }\n\n const experiments = feature.environments[environment]?.rules.filter(\n (experiment) => experiment.type === 'experiment-ref' || experiment.type === 'experiment',\n )\n\n if (!experiments) {\n return undefined\n }\n\n const variations: VariantType[] = []\n const uniqueValues = new Set<string>()\n\n experiments.forEach((experiment) => {\n experiment?.variations.forEach((variant) => {\n const value = convertBooleans ? getBooleanConversion(variant.value) : variant.value\n if (!uniqueValues.has(value)) {\n uniqueValues.add(value)\n variations.push({\n id: value,\n label: value,\n })\n }\n })\n })\n const value = {id: feature.id, label: feature.id, variants: variations}\n\n featureExperiments.push(value)\n return undefined\n })\n }\n const sortedFeatureExperiments = featureExperiments.sort((a, b) => a.id.localeCompare(b.id))\n return sortedFeatureExperiments\n}\n","import {definePlugin, isObjectInputProps} from 'sanity'\n\nimport {fieldLevelExperiments as baseFieldLevelExperiments} from '../fieldExperiments'\nimport {flattenSchemaType} from '../utils/flattenSchemaType'\nimport {GROWTHBOOK_CONFIG_DEFAULT, GrowthbookProvider} from './Components/GrowthbookContext'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\nimport {getExperiments} from './utils'\n\nexport const fieldLevelExperiments = definePlugin<GrowthbookExperimentFieldPluginConfig>(\n (config) => {\n const pluginConfig = {...GROWTHBOOK_CONFIG_DEFAULT, ...config}\n const {fields, environment, project, convertBooleans, baseUrl, tags} = pluginConfig\n return {\n name: 'sanity-growthbook-personalization-plugin-field-level-experiments',\n plugins: [\n baseFieldLevelExperiments({\n fields,\n experiments: (client) =>\n getExperiments({client, environment, baseUrl, project, convertBooleans, tags}),\n }),\n ],\n\n form: {\n components: {\n input: (props) => {\n const isRootInput = props.id === 'root' && isObjectInputProps(props)\n\n if (!isRootInput) {\n return props.renderDefault(props)\n }\n\n const flatFieldTypeNames = flattenSchemaType(props.schemaType).map(\n (field) => field.type.name,\n )\n\n const hasExperiment = flatFieldTypeNames.some((name) => name.startsWith('experiment'))\n\n if (!hasExperiment) {\n return props.renderDefault(props)\n }\n\n const providerProps = {\n ...props,\n growthbookFieldPluginConfig: {\n ...pluginConfig,\n },\n }\n return GrowthbookProvider(providerProps)\n },\n },\n },\n }\n },\n)\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["SettingsView","useSecrets","useEffect","useState","ObjectInputProps","useGrowthbookContext","namespace","apiKeyName","pluginConfigKeys","key","title","Secrets","props","$","_c","secrets","loading","apiKey","setSecret","showSettings","setShowSettings","t0","t1","undefined","t2","renderDefault","Symbol","for","t3","t4","createContext","useContext","useMemo","useState","ObjectInputProps","GrowthbookContextProps","GrowthbookExperimentFieldPluginConfig","Secrets","GROWTHBOOK_CONFIG_DEFAULT","baseUrl","GrowthbookContext","setSecret","undefined","secret","useGrowthbookContext","GrowthbookProps","growthbookFieldPluginConfig","GrowthbookProvider","props","$","_c","t0","context","t1","t2","SanityClient","ExperimentType","GrowthbookFeature","VariantType","apiKeyName","namespace","GrowthbookExperimentFieldPluginConfig","getBooleanConversion","value","getExperiments","client","environment","baseUrl","project","convertBooleans","tags","Omit","Promise","query","secret","fetch","featureExperiments","hasMore","offset","url","URL","searchParams","set","toString","response","headers","Authorization","features","responseHasMore","nextOffset","json","forEach","feature","archived","undefined","some","tag","includes","experiments","environments","rules","filter","experiment","type","variations","uniqueValues","Set","variant","has","add","push","id","label","variants","sortedFeatureExperiments","sort","a","b","localeCompare","definePlugin","isObjectInputProps","fieldLevelExperiments","baseFieldLevelExperiments","flattenSchemaType","GROWTHBOOK_CONFIG_DEFAULT","GrowthbookProvider","GrowthbookExperimentFieldPluginConfig","getExperiments","config","pluginConfig","fields","environment","project","convertBooleans","baseUrl","tags","name","plugins","experiments","client","form","components","input","props","isRootInput","id","renderDefault","flatFieldTypeNames","schemaType","map","field","type","hasExperiment","some","startsWith","providerProps","growthbookFieldPluginConfig"],"sources":["../../src/growthbook/Components/Secrets.tsx","../../src/growthbook/Components/GrowthbookContext.tsx","../../src/growthbook/utils.ts","../../src/growthbook/index.ts"],"sourcesContent":["import {SettingsView, useSecrets} from '@sanity/studio-secrets'\nimport {useEffect, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport {useGrowthbookContext} from './GrowthbookContext'\n\nexport const namespace = 'growthbook'\nexport const apiKeyName = 'apiKey'\n\nconst pluginConfigKeys = [\n {\n key: apiKeyName,\n title: 'Your secret API key',\n },\n]\n\nexport const Secrets = (props: ObjectInputProps) => {\n const {secrets, loading} = useSecrets(namespace) as {secrets: {apiKey: string}; loading: boolean}\n const {setSecret} = useGrowthbookContext()\n const [showSettings, setShowSettings] = useState<boolean>(false)\n\n useEffect(() => {\n if (loading) return undefined\n if (!secrets && !loading) {\n setSecret(undefined)\n // oxlint-disable-next-line react/react-compiler\n return setShowSettings(true)\n }\n setSecret(secrets.apiKey)\n return setShowSettings(false)\n }, [secrets, loading, setSecret])\n\n if (!showSettings) {\n return props.renderDefault(props)\n }\n return (\n <>\n <SettingsView\n title={'Growthbook secret'}\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={() => {\n setShowSettings(false)\n }}\n />\n {props.renderDefault(props)}\n </>\n )\n}\n","import {createContext, useContext, useMemo, useState} from 'react'\nimport type {ObjectInputProps} from 'sanity'\n\nimport type {GrowthbookContextProps, GrowthbookExperimentFieldPluginConfig} from '../types'\nimport {Secrets} from './Secrets'\n\nexport const GROWTHBOOK_CONFIG_DEFAULT = {\n baseUrl: 'https://api.growthbook.io/api/v1',\n}\n\nconst GrowthbookContext = createContext<GrowthbookContextProps>({\n setSecret: () => undefined,\n secret: undefined,\n})\n\nexport function useGrowthbookContext() {\n return useContext(GrowthbookContext)\n}\n\ntype GrowthbookProps = ObjectInputProps & {\n growthbookFieldPluginConfig: GrowthbookExperimentFieldPluginConfig\n}\n\nexport function GrowthbookProvider(props: GrowthbookProps) {\n const {growthbookFieldPluginConfig} = props\n const [secret, setSecret] = useState<string | undefined>()\n\n const context = useMemo(\n () => ({...growthbookFieldPluginConfig, secret, setSecret}),\n [growthbookFieldPluginConfig, secret, setSecret],\n )\n\n return (\n <GrowthbookContext.Provider value={context}>\n <Secrets {...props} />\n </GrowthbookContext.Provider>\n )\n}\n","import type {SanityClient} from 'sanity'\n\nimport type {ExperimentType, GrowthbookFeature, VariantType} from '../types'\nimport {apiKeyName, namespace} from './Components/Secrets'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\n\nconst getBooleanConversion = (value: string) => {\n // control is false\n if (value === 'true') {\n return 'variant'\n } else if (value === 'false') {\n return 'control'\n }\n return value\n}\n\nexport const getExperiments = async ({\n client,\n environment,\n baseUrl,\n project,\n convertBooleans,\n tags,\n}: Omit<GrowthbookExperimentFieldPluginConfig, 'fields' | 'baseUrl'> & {\n client: SanityClient\n baseUrl: string\n}): Promise<ExperimentType[]> => {\n const query = `*[_id == 'secrets.${namespace}'][0].secrets.${apiKeyName}`\n\n const secret = await client.fetch(query) // secret is stored in the content lake using @sanity/studio-secrets\n if (!secret) return []\n\n const featureExperiments: ExperimentType[] = []\n let hasMore = true\n let offset = 0\n const url = new URL(`${baseUrl}/features`)\n if (project) {\n url.searchParams.set('projectId', project)\n }\n\n while (hasMore) {\n url.searchParams.set('offset', offset.toString())\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${secret}`,\n },\n })\n\n const {features, hasMore: responseHasMore, nextOffset} = await response.json()\n\n hasMore = responseHasMore\n offset = nextOffset\n if (!features) continue\n\n features.forEach((feature: GrowthbookFeature) => {\n if (feature.archived) {\n return undefined\n }\n if (tags && feature.tags && !feature.tags.some((tag) => tags.includes(tag))) {\n return undefined\n }\n\n const experiments = feature.environments[environment]?.rules.filter(\n (experiment) => experiment.type === 'experiment-ref' || experiment.type === 'experiment',\n )\n\n if (!experiments) {\n return undefined\n }\n\n const variations: VariantType[] = []\n const uniqueValues = new Set<string>()\n\n experiments.forEach((experiment) => {\n experiment?.variations.forEach((variant) => {\n const value = convertBooleans ? getBooleanConversion(variant.value) : variant.value\n if (!uniqueValues.has(value)) {\n uniqueValues.add(value)\n variations.push({\n id: value,\n label: value,\n })\n }\n })\n })\n const value = {id: feature.id, label: feature.id, variants: variations}\n\n featureExperiments.push(value)\n return undefined\n })\n }\n const sortedFeatureExperiments = featureExperiments.sort((a, b) => a.id.localeCompare(b.id))\n return sortedFeatureExperiments\n}\n","import '@sanity/ui/styles.css'\nimport {definePlugin, isObjectInputProps} from 'sanity'\n\nimport {fieldLevelExperiments as baseFieldLevelExperiments} from '../fieldExperiments'\nimport {flattenSchemaType} from '../utils/flattenSchemaType'\nimport {GROWTHBOOK_CONFIG_DEFAULT, GrowthbookProvider} from './Components/GrowthbookContext'\nimport type {GrowthbookExperimentFieldPluginConfig} from './types'\nimport {getExperiments} from './utils'\n\nexport const fieldLevelExperiments = definePlugin<GrowthbookExperimentFieldPluginConfig>(\n (config) => {\n const pluginConfig = {...GROWTHBOOK_CONFIG_DEFAULT, ...config}\n const {fields, environment, project, convertBooleans, baseUrl, tags} = pluginConfig\n return {\n name: 'sanity-growthbook-personalization-plugin-field-level-experiments',\n plugins: [\n baseFieldLevelExperiments({\n fields,\n experiments: (client) =>\n getExperiments({client, environment, baseUrl, project, convertBooleans, tags}),\n }),\n ],\n\n form: {\n components: {\n input: (props) => {\n const isRootInput = props.id === 'root' && isObjectInputProps(props)\n\n if (!isRootInput) {\n return props.renderDefault(props)\n }\n\n const flatFieldTypeNames = flattenSchemaType(props.schemaType).map(\n (field) => field.type.name,\n )\n\n const hasExperiment = flatFieldTypeNames.some((name) => name.startsWith('experiment'))\n\n if (!hasExperiment) {\n return props.renderDefault(props)\n }\n\n const providerProps = {\n ...props,\n growthbookFieldPluginConfig: {\n ...pluginConfig,\n },\n }\n return GrowthbookProvider(providerProps)\n },\n },\n },\n }\n },\n)\n"],"mappings":"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"}
\ No newline at end of file