@sanity/personalization-plugin 2.2.0-launch-darkly.1 → 2.3.0-growthbook.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import {ArrayOfObjectsInputProps} from 'sanity'
2
- import {Dispatch} from 'react'
3
2
  import {FieldDefinition} from 'sanity'
4
3
  import {ObjectField} from 'sanity'
5
4
  import {Path} from 'sanity'
@@ -7,7 +6,6 @@ import {Plugin as Plugin_2} from 'sanity'
7
6
  import {PreviewProps} from 'sanity'
8
7
  import {SanityClient} from 'sanity'
9
8
  import {SchemaType} from 'sanity'
10
- import {SetStateAction} from 'react'
11
9
 
12
10
  export declare type ArrayInputProps = ArrayOfObjectsInputProps & {
13
11
  variantName: string
@@ -17,8 +15,6 @@ export declare type ArrayInputProps = ArrayOfObjectsInputProps & {
17
15
 
18
16
  export declare type ExperimentContextProps = Required<FieldPluginConfig> & {
19
17
  experiments: ExperimentType[]
20
- setSecret: Dispatch<SetStateAction<string | undefined>>
21
- secret: string | undefined
22
18
  }
23
19
 
24
20
  export declare type ExperimentGeneric<T> = {
@@ -46,7 +42,9 @@ export declare const fieldLevelExperiments: Plugin_2<FieldPluginConfig>
46
42
 
47
43
  export declare type FieldPluginConfig = {
48
44
  fields: (string | FieldDefinition)[]
49
- experiments: ExperimentType[] | ((client: SanityClient) => Promise<ExperimentType[]>)
45
+ experiments:
46
+ | ExperimentType[]
47
+ | ((client: SanityClient, secret?: string) => Promise<ExperimentType[]>)
50
48
  apiVersion?: string
51
49
  experimentNameOverride?: string
52
50
  variantNameOverride?: string
@@ -60,194 +58,192 @@ export declare type FieldPluginConfig = {
60
58
  */
61
59
  export declare function flattenSchemaType(schemaType: SchemaType): ObjectFieldWithPath[]
62
60
 
63
- export declare const launchDarklyFieldLevel: Plugin_2<LaunchDarklyFieldLevelConfig>
64
-
65
- export declare type LaunchDarklyFieldLevelConfig = {
66
- fields: (string | FieldDefinition)[]
67
- projectKey: string
68
- tags?: string[]
69
- }
70
-
71
- export declare type LaunchDarklyFlagItem = {
61
+ export declare type GrowthbookExperiment = {
62
+ id: string
63
+ dateCreated: string
64
+ dateUpdated: string
72
65
  name: string
73
- kind: string
74
- key: string
75
- _version: number
76
- creationDate: number
77
- variations: Array<{
78
- value: boolean
79
- _id: string
80
- name: string
81
- }>
82
- temporary: boolean
83
- tags: string[]
84
- _links: {
85
- parent: {
86
- href: string
87
- type: string
88
- }
89
- self: {
90
- href: string
91
- type: string
92
- }
93
- }
94
- experiments: {
95
- baselineIdx: number
96
- items: Array<{
97
- metricKey: string
98
- _metric: {
99
- _id: string
100
- _versionId: string
101
- key: string
102
- name: string
103
- kind: string
104
- _links: {
105
- parent: {
106
- href: string
107
- type: string
108
- }
109
- self: {
110
- href: string
111
- type: string
112
- }
66
+ project: string
67
+ hypothesis: string
68
+ description: string
69
+ tags: [string]
70
+ owner: string
71
+ archived: boolean
72
+ status: string
73
+ autoRefresh: boolean
74
+ hashAttribute: string
75
+ fallbackAttribute: string
76
+ hashVersion: number
77
+ disableStickyBucketing: boolean
78
+ bucketVersion: number
79
+ minBucketVersion: number
80
+ variations: [
81
+ {
82
+ variationId: string
83
+ key: string
84
+ name: string
85
+ description: string
86
+ screenshots: [string]
87
+ },
88
+ ]
89
+ phases: [
90
+ {
91
+ name: string
92
+ dateStarted: string
93
+ dateEnded: string
94
+ reasonForStopping: string
95
+ seed: string
96
+ coverage: 0
97
+ trafficSplit: [
98
+ {
99
+ variationId: string
100
+ weight: 0
101
+ },
102
+ ]
103
+ namespace: {
104
+ namespaceId: string
105
+ range: []
106
+ }
107
+ targetingCondition: string
108
+ savedGroupTargeting: [
109
+ {
110
+ matchType: string
111
+ savedGroups: [string]
112
+ },
113
+ ]
114
+ },
115
+ ]
116
+ settings: {
117
+ datasourceId: string
118
+ assignmentQueryId: string
119
+ experimentId: string
120
+ segmentId: string
121
+ queryFilter: string
122
+ inProgressConversions: string
123
+ attributionModel: string
124
+ statsEngine: string
125
+ regressionAdjustmentEnabled: boolean
126
+ goals: [
127
+ {
128
+ metricId: string
129
+ overrides: {
130
+ delayHours: 0
131
+ windowHours: 0
132
+ window: string
133
+ winRiskThreshold: 0
134
+ loseRiskThreshold: 0
113
135
  }
114
- tags: string[]
115
- _creationDate: number
116
- experimentCount: number
117
- metricGroupCount: number
118
- _attachedFlagCount: number
119
- maintainerId: string
120
- _maintainer: {
121
- _links: {
122
- self: {
123
- href: string
124
- type: string
125
- }
126
- }
127
- _id: string
128
- role: string
129
- email: string
130
- firstName: string
131
- lastName: string
136
+ },
137
+ ]
138
+ secondaryMetrics: [
139
+ {
140
+ metricId: string
141
+ overrides: {
142
+ delayHours: 0
143
+ windowHours: 0
144
+ window: string
145
+ winRiskThreshold: 0
146
+ loseRiskThreshold: 0
132
147
  }
133
- category: string
134
- isNumeric: boolean
135
- percentileValue: number
148
+ },
149
+ ]
150
+ guardrails: [
151
+ {
152
+ metricId: string
153
+ overrides: {
154
+ delayHours: 0
155
+ windowHours: 0
156
+ window: string
157
+ winRiskThreshold: 0
158
+ loseRiskThreshold: 0
159
+ }
160
+ },
161
+ ]
162
+ activationMetric: {
163
+ metricId: string
164
+ overrides: {
165
+ delayHours: 0
166
+ windowHours: 0
167
+ window: string
168
+ winRiskThreshold: 0
169
+ loseRiskThreshold: 0
136
170
  }
137
- }>
138
- }
139
- customProperties: {
140
- key: {
141
- name: string
142
- value: string[]
143
171
  }
144
172
  }
173
+ resultSummary: {
174
+ status: string
175
+ winner: string
176
+ conclusions: string
177
+ releasedVariationId: string
178
+ excludeFromPayload: boolean
179
+ }
180
+ }
181
+
182
+ export declare type GrowthbookFeature = {
183
+ id: string
184
+ dateCreated: string
185
+ dateUpdated: string
145
186
  archived: boolean
146
187
  description: string
147
- maintainerId: string
148
- _maintainer: {
149
- _links: {
150
- self: {
151
- href: string
152
- type: string
153
- }
154
- }
155
- _id: string
156
- role: string
157
- email: string
158
- firstName: string
159
- lastName: string
160
- }
161
- maintainerTeamKey: string
162
- _maintainerTeam: {
163
- key: string
164
- name: string
165
- _links: {
166
- parent: {
167
- href: string
168
- type: string
169
- }
170
- roles: {
171
- href: string
172
- type: string
173
- }
174
- self: {
175
- href: string
176
- type: string
177
- }
178
- }
179
- }
180
- archivedDate: number
181
- deprecated: boolean
182
- deprecatedDate: number
183
- defaults: {
184
- onVariation: number
185
- offVariation: number
186
- }
187
- _purpose: string
188
- migrationSettings: {
189
- contextKind: string
190
- stageCount: number
191
- }
188
+ owner: string
189
+ project: string
190
+ valueType: string
191
+ defaultValue: string
192
+ tags: string[]
192
193
  environments: {
193
194
  [key: string]: {
194
- on: boolean
195
- archived: boolean
196
- salt: string
197
- sel: string
198
- lastModified: number
199
- version: number
200
- _site: {
201
- href: string
195
+ enabled: boolean
196
+ defaultValue: string
197
+ rules: {
198
+ description: string
199
+ condition: string
200
+ savedGroupTargeting: {
201
+ matchType: string
202
+ savedGroups: string[]
203
+ }[]
204
+ id: string
205
+ enabled: boolean
202
206
  type: string
203
- }
204
- _environmentName: string
205
- trackEvents: boolean
206
- trackEventsFallthrough: boolean
207
- targets: Array<{
208
- values: string[]
209
- variation: number
210
- contextKind: string
211
- }>
212
- contextTargets: Array<{
213
- values: string[]
214
- variation: number
215
- contextKind: string
216
- }>
217
- rules: Array<{
218
- clauses: Array<{
219
- attribute: string
220
- op: string
221
- values: unknown[]
222
- negate: boolean
223
- }>
224
- trackEvents: boolean
225
- }>
226
- fallthrough: {
227
- variation: number
228
- }
229
- offVariation: number
230
- prerequisites: Array<{
231
- key: string
232
- variation: number
233
- }>
234
- _summary: {
207
+ value: string
235
208
  variations: {
236
- [key: string]: {
237
- rules: number
238
- nullRules: number
239
- targets: number
240
- contextTargets: number
241
- isFallthrough?: boolean
242
- isOff?: boolean
243
- }
244
- }
245
- prerequisites: number
209
+ value: string
210
+ variationId: string
211
+ }[]
212
+ }[]
213
+ definition: string
214
+ draft: {
215
+ enabled: boolean
216
+ defaultValue: string
217
+ rules: {
218
+ description: string
219
+ condition: string
220
+ savedGroupTargeting: {
221
+ matchType: string
222
+ savedGroups: string[]
223
+ }[]
224
+ id: string
225
+ enabled: boolean
226
+ type: string
227
+ value: string
228
+ variations: {
229
+ value: string
230
+ variationId: string
231
+ }[]
232
+ }[]
233
+ definition: string
246
234
  }
247
235
  }
248
236
  }
249
- includeInSnippet: boolean
250
- goalIds: string[]
237
+ prerequisites: {
238
+ parentId: string
239
+ parentCondition: string
240
+ }[]
241
+ revision: {
242
+ version: number
243
+ comment: string
244
+ date: string
245
+ publishedBy: string
246
+ }
251
247
  }
252
248
 
253
249
  export declare type ObjectFieldWithPath = ObjectField<SchemaType> & {
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var jsxRuntime = require("react/jsx-runtime"), sanity = require("sanity"), ui = require("@sanity/ui"), uuid = require("@sanity/uuid"), react = require("react"), equal = require("fast-deep-equal"), suspendReact = require("suspend-react"), gi = require("react-icons/gi"), studioSecrets = require("@sanity/studio-secrets");
3
+ var jsxRuntime = require("react/jsx-runtime"), sanity = require("sanity"), ui = require("@sanity/ui"), uuid = require("@sanity/uuid"), react = require("react"), equal = require("fast-deep-equal"), suspendReact = require("suspend-react"), gi = require("react-icons/gi");
4
4
  function _interopDefaultCompat(e) {
5
5
  return e && typeof e == "object" && "default" in e ? e : { default: e };
6
6
  }
@@ -15,23 +15,20 @@ const CONFIG_DEFAULT = {
15
15
  experimentId: "experimentId"
16
16
  }, ExperimentContext = react.createContext({
17
17
  ...CONFIG_DEFAULT,
18
- experiments: [],
19
- setSecret: () => {
20
- },
21
- secret: void 0
18
+ experiments: []
22
19
  });
23
20
  function useExperimentContext() {
24
21
  return react.useContext(ExperimentContext);
25
22
  }
26
23
  function ExperimentProvider(props) {
27
- const { experimentFieldPluginConfig } = props, [secret, setSecret] = react.useState(), client = sanity.useClient({ apiVersion: experimentFieldPluginConfig.apiVersion }), workspace = sanity.useWorkspace(), experiments = Array.isArray(experimentFieldPluginConfig.experiments) ? experimentFieldPluginConfig.experiments : suspendReact.suspend(
24
+ const { experimentFieldPluginConfig } = props, client = sanity.useClient({ apiVersion: experimentFieldPluginConfig.apiVersion }), workspace = sanity.useWorkspace(), experiments = Array.isArray(experimentFieldPluginConfig.experiments) ? experimentFieldPluginConfig.experiments : suspendReact.suspend(
28
25
  // eslint-disable-next-line require-await
29
26
  async () => typeof experimentFieldPluginConfig.experiments == "function" ? experimentFieldPluginConfig.experiments(client) : experimentFieldPluginConfig.experiments,
30
- [workspace, secret],
27
+ [workspace],
31
28
  { equal: equal__default.default }
32
29
  ), context = react.useMemo(
33
- () => ({ ...experimentFieldPluginConfig, experiments, secret, setSecret }),
34
- [experimentFieldPluginConfig, experiments, secret, setSecret]
30
+ () => ({ ...experimentFieldPluginConfig, experiments }),
31
+ [experimentFieldPluginConfig, experiments]
35
32
  );
36
33
  return /* @__PURE__ */ jsxRuntime.jsx(ExperimentContext.Provider, { value: context, children: props.renderDefault(props) });
37
34
  }
@@ -6408,9 +6405,9 @@ const icons = {
6408
6405
  });
6409
6406
  Icon.displayName = "ForwardRef(Icon)";
6410
6407
  const useAddExperimentAction = (props) => {
6411
- const { onChange, experimentNameOverride } = props, handleAddAction = () => {
6412
- onChange([sanity.set(!0, ["active"])]);
6413
- };
6408
+ const { onChange, active, experimentNameOverride } = props, handleAddAction = react.useCallback(() => {
6409
+ onChange([sanity.set(!active, ["active"])]);
6410
+ }, [onChange, active]);
6414
6411
  return {
6415
6412
  title: `Add ${experimentNameOverride}`,
6416
6413
  type: "action",
@@ -6419,13 +6416,10 @@ const useAddExperimentAction = (props) => {
6419
6416
  renderAsButton: !0
6420
6417
  };
6421
6418
  }, useRemoveExperimentAction = (props) => {
6422
- const { onChange, experimentId, experimentNameOverride } = props, patchActiveFalseEvent = () => sanity.set(!1, ["active"]), patchClearEvent = () => {
6423
- const experiment = [experimentId], variants = [experimentNameOverride];
6424
- return [sanity.unset(experiment), sanity.unset(variants)];
6425
- }, handleClearAction = () => {
6426
- const clearEvents = patchClearEvent(), activeEvent = patchActiveFalseEvent();
6427
- onChange([activeEvent, ...clearEvents]);
6428
- };
6419
+ const { onChange, active, experimentId, experimentNameOverride, variantNameOverride } = props, handleClearAction = react.useCallback(() => {
6420
+ const activeId = ["active"], experiment = [experimentId], variants = [`${variantNameOverride}s`];
6421
+ onChange([sanity.set(!active, activeId), sanity.unset(experiment), sanity.unset(variants)]);
6422
+ }, [onChange, active, experimentId, variantNameOverride]);
6429
6423
  return {
6430
6424
  title: `Remove ${experimentNameOverride}`,
6431
6425
  type: "action",
@@ -6433,36 +6427,53 @@ const useAddExperimentAction = (props) => {
6433
6427
  onAction: handleClearAction,
6434
6428
  renderAsButton: !0
6435
6429
  };
6436
- }, newActions = ({
6430
+ }, createActions = ({
6437
6431
  onChange,
6438
6432
  inputId,
6439
6433
  active,
6440
6434
  experimentNameOverride,
6441
- experimentId
6435
+ experimentId,
6436
+ variantNameOverride
6442
6437
  }) => {
6443
6438
  const removeAction = sanity.defineDocumentFieldAction({
6444
6439
  name: `Remove ${experimentNameOverride}`,
6445
6440
  useAction: (props) => useRemoveExperimentAction({
6441
+ active: !0,
6446
6442
  onChange,
6447
6443
  experimentNameOverride,
6448
- experimentId
6444
+ experimentId,
6445
+ variantNameOverride
6449
6446
  })
6450
6447
  }), addAction = sanity.defineDocumentFieldAction({
6451
6448
  name: `Add ${experimentNameOverride}`,
6452
6449
  useAction: (props) => useAddExperimentAction({
6450
+ active: !1,
6453
6451
  onChange,
6454
6452
  experimentNameOverride
6455
6453
  })
6456
6454
  });
6457
6455
  return active ? removeAction : addAction;
6458
6456
  }, ExperimentField = (props) => {
6459
- const { onChange } = props.inputProps, { inputId, experimentNameOverride, experimentId } = props, active = props.value?.active, oldActions = props.actions || [], withActionProps = {
6460
- ...props,
6461
- actions: [
6462
- newActions({ onChange, inputId, active, experimentNameOverride, experimentId }),
6463
- ...oldActions
6464
- ]
6465
- };
6457
+ const { onChange } = props.inputProps, { inputId, experimentNameOverride, experimentId, variantNameOverride } = props, active = props.value?.active, actionProps = react.useMemo(
6458
+ () => ({
6459
+ onChange,
6460
+ inputId,
6461
+ active,
6462
+ experimentNameOverride,
6463
+ experimentId,
6464
+ variantNameOverride
6465
+ }),
6466
+ [onChange, inputId, active, experimentNameOverride, experimentId, variantNameOverride]
6467
+ ), memoizedActions = react.useMemo(() => {
6468
+ const oldActions = props.actions || [];
6469
+ return [createActions(actionProps), ...oldActions];
6470
+ }, [actionProps, props.actions]), withActionProps = react.useMemo(
6471
+ () => ({
6472
+ ...props,
6473
+ actions: memoizedActions
6474
+ }),
6475
+ [props, memoizedActions]
6476
+ );
6466
6477
  return props.renderDefault(withActionProps);
6467
6478
  }, Select = (props) => {
6468
6479
  const {
@@ -6494,7 +6505,7 @@ const useAddExperimentAction = (props) => {
6494
6505
  value: experiment.id
6495
6506
  })), ExperimentInput = (props) => {
6496
6507
  const { experiments } = useExperimentContext(), id = sanity.useFormValue(["_id"]), aditionalChangePath = react.useMemo(
6497
- () => [...props.path.slice(0, -1), props.variantNameOverride],
6508
+ () => [...props.path.slice(0, -1), `${props.variantNameOverride}s`],
6498
6509
  [props.variantNameOverride, props.path]
6499
6510
  ), subValues = sanity.useFormValue(aditionalChangePath), { patch } = sanity.useDocumentOperation(id.replace("drafts.", ""), props.schemaType.name), handleChange = react.useCallback(
6500
6511
  (event, onChange) => {
@@ -6508,7 +6519,11 @@ const useAddExperimentAction = (props) => {
6508
6519
  },
6509
6520
  [patch, subValues, aditionalChangePath]
6510
6521
  );
6511
- return experiments.length ? /* @__PURE__ */ jsxRuntime.jsx(Select, { ...props, listOptions: formatlistOptions(experiments), handleChange }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
6522
+ return experiments.length ? /* @__PURE__ */ jsxRuntime.jsx(Select, { ...props, listOptions: formatlistOptions(experiments), handleChange }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Card, { padding: [3, 3, 4], radius: 2, shadow: 1, tone: "caution", children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { align: "center", size: [2, 2, 3], children: [
6523
+ "There are no defined ",
6524
+ props.experimentNameOverride,
6525
+ "s"
6526
+ ] }) });
6512
6527
  }, VariantInput = (props) => {
6513
6528
  const defaultValue = sanity.useFormValue([props.path[0], "default"]), handleClick = () => {
6514
6529
  props.onChange(sanity.set(defaultValue, ["value"]));
@@ -6582,7 +6597,8 @@ const createExperimentType = ({
6582
6597
  {
6583
6598
  ...props,
6584
6599
  experimentId,
6585
- experimentNameOverride
6600
+ experimentNameOverride,
6601
+ variantNameOverride
6586
6602
  }
6587
6603
  )
6588
6604
  },
@@ -6609,7 +6625,14 @@ const createExperimentType = ({
6609
6625
  name: experimentId,
6610
6626
  type: "string",
6611
6627
  components: {
6612
- input: (props) => /* @__PURE__ */ jsxRuntime.jsx(ExperimentInput, { ...props, variantNameOverride })
6628
+ input: (props) => /* @__PURE__ */ jsxRuntime.jsx(
6629
+ ExperimentInput,
6630
+ {
6631
+ ...props,
6632
+ experimentNameOverride,
6633
+ variantNameOverride
6634
+ }
6635
+ )
6613
6636
  },
6614
6637
  hidden: ({ parent }) => !parent?.active
6615
6638
  }),
@@ -6745,79 +6768,7 @@ const createExperimentType = ({
6745
6768
  }
6746
6769
  }
6747
6770
  };
6748
- }), pluginConfigKeys = [
6749
- {
6750
- key: "apiKey",
6751
- title: "Your secret API key"
6752
- }
6753
- ], Secrets = (props, namespace) => {
6754
- const { secrets, loading } = studioSecrets.useSecrets(namespace), { setSecret } = useExperimentContext(), [showSettings, setShowSettings] = react.useState(!1);
6755
- return react.useEffect(() => {
6756
- if (!loading)
6757
- return !secrets && !loading ? (setSecret(void 0), setShowSettings(!0)) : (setSecret(secrets.apiKey), setShowSettings(!1));
6758
- }, [secrets, loading, setSecret]), showSettings ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6759
- /* @__PURE__ */ jsxRuntime.jsx(
6760
- studioSecrets.SettingsView,
6761
- {
6762
- title: `${namespace} api key`,
6763
- namespace,
6764
- keys: pluginConfigKeys,
6765
- onClose: () => {
6766
- setShowSettings(!1);
6767
- }
6768
- }
6769
- ),
6770
- props.renderDefault(props)
6771
- ] }) : props.renderDefault(props);
6772
- }, getExperiments = async ({
6773
- client,
6774
- projectKey,
6775
- tags
6776
- }) => {
6777
- const secret = await client.fetch("*[_id == 'secrets.launchdarkly'][0].secrets.apiKey");
6778
- if (!secret) return [];
6779
- const url = new URL(`https://app.launchdarkly.com/api/v2/flags/${projectKey}`);
6780
- tags && url.searchParams.set("filter", `tags:${tags.join("+")}`);
6781
- const featureExperiments = [];
6782
- let hasMore = !0;
6783
- const offset = 0, limit = 10;
6784
- for (; hasMore; ) {
6785
- url.searchParams.set("offset", offset.toString()), url.searchParams.set("limit", limit.toString());
6786
- const responseFlags = await fetch(url, {
6787
- headers: {
6788
- Authorization: secret
6789
- }
6790
- }), { items } = await responseFlags.json(), experiments = items.map((flag) => ({
6791
- id: flag.key,
6792
- label: flag.name,
6793
- variants: flag.variations.map((variation) => ({
6794
- id: variation.value,
6795
- label: variation.name
6796
- }))
6797
- }));
6798
- featureExperiments.push(...experiments), items.length !== limit && (hasMore = !1);
6799
- }
6800
- return featureExperiments;
6801
- }, launchDarklyFieldLevel = sanity.definePlugin((config) => {
6802
- const { fields, projectKey, tags } = config;
6803
- return {
6804
- name: "sanity-growthbook-personalistaion-plugin-field-level-experiments",
6805
- plugins: [
6806
- fieldLevelExperiments({
6807
- fields,
6808
- experiments: (client) => getExperiments({ client, projectKey, tags })
6809
- })
6810
- ],
6811
- form: {
6812
- components: {
6813
- input: (props) => !(props.id === "root" && sanity.isObjectInputProps(props)) || !flattenSchemaType(props.schemaType).map(
6814
- (field) => field.type.name
6815
- ).some((name) => name.startsWith("experiment")) ? props.renderDefault(props) : Secrets(props, "launchdarkly")
6816
- }
6817
- }
6818
- };
6819
6771
  });
6820
6772
  exports.fieldLevelExperiments = fieldLevelExperiments;
6821
6773
  exports.flattenSchemaType = flattenSchemaType;
6822
- exports.launchDarklyFieldLevel = launchDarklyFieldLevel;
6823
6774
  //# sourceMappingURL=index.js.map