@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/README.md +2 -0
- package/dist/growthbook/index.d.mts +15 -0
- package/dist/growthbook/index.d.ts +15 -0
- package/dist/growthbook/index.js +118 -0
- package/dist/growthbook/index.js.map +1 -0
- package/dist/growthbook/index.mjs +122 -0
- package/dist/growthbook/index.mjs.map +1 -0
- package/dist/index.d.mts +174 -178
- package/dist/index.d.ts +174 -178
- package/dist/index.js +56 -105
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +59 -109
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -3
- package/src/components/ExperimentContext.tsx +4 -7
- package/src/components/ExperimentField.tsx +56 -32
- package/src/components/ExperimentInput.tsx +14 -4
- package/src/fieldExperiments.tsx +6 -1
- package/src/growthbook/Components/GrowthbookContext.tsx +38 -0
- package/src/{components → growthbook/Components}/Secrets.tsx +7 -5
- package/src/growthbook/index.ts +52 -0
- package/src/growthbook/types.ts +15 -0
- package/src/growthbook/utils.ts +94 -0
- package/src/index.ts +0 -1
- package/src/types.ts +163 -170
- package/src/launchDarklyExperiments.tsx +0 -48
- package/src/utils/launchDarkly.ts +0 -54
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:
|
|
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
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
-
|
|
250
|
-
|
|
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")
|
|
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,
|
|
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
|
|
27
|
+
[workspace],
|
|
31
28
|
{ equal: equal__default.default }
|
|
32
29
|
), context = react.useMemo(
|
|
33
|
-
() => ({ ...experimentFieldPluginConfig, experiments
|
|
34
|
-
[experimentFieldPluginConfig, experiments
|
|
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(!
|
|
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,
|
|
6423
|
-
const experiment = [experimentId], variants = [
|
|
6424
|
-
|
|
6425
|
-
},
|
|
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
|
-
},
|
|
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,
|
|
6460
|
-
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
|
|
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.
|
|
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(
|
|
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
|