@sanity/personalization-plugin
3.1.03.1.1
dist/launchDarkly/index.js.map~
dist/launchDarkly/index.js.mapModified+1−1
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/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={`${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 {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":["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/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={`${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