@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