@sanity/personalization-plugin 2.2.0-growthbook.1 → 2.2.0
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 +0 -2
- package/dist/index.d.mts +1 -205
- package/dist/index.d.ts +1 -205
- package/dist/index.js +42 -133
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +45 -137
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -3
- package/src/components/ExperimentContext.tsx +5 -8
- package/src/components/ExperimentField.tsx +32 -56
- package/src/components/ExperimentInput.tsx +14 -4
- package/src/fieldExperiments.tsx +5 -2
- package/src/index.ts +0 -1
- package/src/types.ts +1 -182
- package/src/components/Secrets.tsx +0 -47
- package/src/growthbookFieldExperiments.tsx +0 -51
- package/src/utils/growthbook.ts +0 -78
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
|
-
async () => typeof experimentFieldPluginConfig.experiments == "function" ? experimentFieldPluginConfig.experiments(client
|
|
30
|
-
[workspace
|
|
26
|
+
async () => typeof experimentFieldPluginConfig.experiments == "function" ? experimentFieldPluginConfig.experiments(client) : experimentFieldPluginConfig.experiments,
|
|
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,
|
|
6412
|
-
onChange([sanity.set(!
|
|
6413
|
-
}
|
|
6408
|
+
const { onChange, experimentNameOverride } = props, handleAddAction = () => {
|
|
6409
|
+
onChange([sanity.set(!0, ["active"])]);
|
|
6410
|
+
};
|
|
6414
6411
|
return {
|
|
6415
6412
|
title: `Add ${experimentNameOverride}`,
|
|
6416
6413
|
type: "action",
|
|
@@ -6419,10 +6416,13 @@ const useAddExperimentAction = (props) => {
|
|
|
6419
6416
|
renderAsButton: !0
|
|
6420
6417
|
};
|
|
6421
6418
|
}, useRemoveExperimentAction = (props) => {
|
|
6422
|
-
const { onChange,
|
|
6423
|
-
const
|
|
6424
|
-
|
|
6425
|
-
},
|
|
6419
|
+
const { onChange, experimentId, experimentNameOverride } = props, patchActiveFalseEvent = () => sanity.set(!1, ["active"]), patchClearEvent = () => {
|
|
6420
|
+
const experiment = [experimentId], variants = [experimentNameOverride];
|
|
6421
|
+
return [sanity.unset(experiment), sanity.unset(variants)];
|
|
6422
|
+
}, handleClearAction = () => {
|
|
6423
|
+
const clearEvents = patchClearEvent(), activeEvent = patchActiveFalseEvent();
|
|
6424
|
+
onChange([activeEvent, ...clearEvents]);
|
|
6425
|
+
};
|
|
6426
6426
|
return {
|
|
6427
6427
|
title: `Remove ${experimentNameOverride}`,
|
|
6428
6428
|
type: "action",
|
|
@@ -6430,53 +6430,36 @@ const useAddExperimentAction = (props) => {
|
|
|
6430
6430
|
onAction: handleClearAction,
|
|
6431
6431
|
renderAsButton: !0
|
|
6432
6432
|
};
|
|
6433
|
-
},
|
|
6433
|
+
}, newActions = ({
|
|
6434
6434
|
onChange,
|
|
6435
6435
|
inputId,
|
|
6436
6436
|
active,
|
|
6437
6437
|
experimentNameOverride,
|
|
6438
|
-
experimentId
|
|
6439
|
-
variantNameOverride
|
|
6438
|
+
experimentId
|
|
6440
6439
|
}) => {
|
|
6441
6440
|
const removeAction = sanity.defineDocumentFieldAction({
|
|
6442
6441
|
name: `Remove ${experimentNameOverride}`,
|
|
6443
6442
|
useAction: (props) => useRemoveExperimentAction({
|
|
6444
|
-
active: !0,
|
|
6445
6443
|
onChange,
|
|
6446
6444
|
experimentNameOverride,
|
|
6447
|
-
experimentId
|
|
6448
|
-
variantNameOverride
|
|
6445
|
+
experimentId
|
|
6449
6446
|
})
|
|
6450
6447
|
}), addAction = sanity.defineDocumentFieldAction({
|
|
6451
6448
|
name: `Add ${experimentNameOverride}`,
|
|
6452
6449
|
useAction: (props) => useAddExperimentAction({
|
|
6453
|
-
active: !1,
|
|
6454
6450
|
onChange,
|
|
6455
6451
|
experimentNameOverride
|
|
6456
6452
|
})
|
|
6457
6453
|
});
|
|
6458
6454
|
return active ? removeAction : addAction;
|
|
6459
6455
|
}, ExperimentField = (props) => {
|
|
6460
|
-
const { onChange } = props.inputProps, { inputId, experimentNameOverride, experimentId
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
inputId,
|
|
6464
|
-
|
|
6465
|
-
|
|
6466
|
-
|
|
6467
|
-
variantNameOverride
|
|
6468
|
-
}),
|
|
6469
|
-
[onChange, inputId, active, experimentNameOverride, experimentId, variantNameOverride]
|
|
6470
|
-
), memoizedActions = react.useMemo(() => {
|
|
6471
|
-
const oldActions = props.actions || [];
|
|
6472
|
-
return [createActions(actionProps), ...oldActions];
|
|
6473
|
-
}, [actionProps, props.actions]), withActionProps = react.useMemo(
|
|
6474
|
-
() => ({
|
|
6475
|
-
...props,
|
|
6476
|
-
actions: memoizedActions
|
|
6477
|
-
}),
|
|
6478
|
-
[props, memoizedActions]
|
|
6479
|
-
);
|
|
6456
|
+
const { onChange } = props.inputProps, { inputId, experimentNameOverride, experimentId } = props, active = props.value?.active, oldActions = props.actions || [], withActionProps = {
|
|
6457
|
+
...props,
|
|
6458
|
+
actions: [
|
|
6459
|
+
newActions({ onChange, inputId, active, experimentNameOverride, experimentId }),
|
|
6460
|
+
...oldActions
|
|
6461
|
+
]
|
|
6462
|
+
};
|
|
6480
6463
|
return props.renderDefault(withActionProps);
|
|
6481
6464
|
}, Select = (props) => {
|
|
6482
6465
|
const {
|
|
@@ -6508,7 +6491,7 @@ const useAddExperimentAction = (props) => {
|
|
|
6508
6491
|
value: experiment.id
|
|
6509
6492
|
})), ExperimentInput = (props) => {
|
|
6510
6493
|
const { experiments } = useExperimentContext(), id = sanity.useFormValue(["_id"]), aditionalChangePath = react.useMemo(
|
|
6511
|
-
() => [...props.path.slice(0, -1),
|
|
6494
|
+
() => [...props.path.slice(0, -1), props.variantNameOverride],
|
|
6512
6495
|
[props.variantNameOverride, props.path]
|
|
6513
6496
|
), subValues = sanity.useFormValue(aditionalChangePath), { patch } = sanity.useDocumentOperation(id.replace("drafts.", ""), props.schemaType.name), handleChange = react.useCallback(
|
|
6514
6497
|
(event, onChange) => {
|
|
@@ -6522,7 +6505,11 @@ const useAddExperimentAction = (props) => {
|
|
|
6522
6505
|
},
|
|
6523
6506
|
[patch, subValues, aditionalChangePath]
|
|
6524
6507
|
);
|
|
6525
|
-
return experiments.length ? /* @__PURE__ */ jsxRuntime.jsx(Select, { ...props, listOptions: formatlistOptions(experiments), handleChange }) : /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.
|
|
6508
|
+
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: [
|
|
6509
|
+
"There are no defined ",
|
|
6510
|
+
props.experimentNameOverride,
|
|
6511
|
+
"s"
|
|
6512
|
+
] }) });
|
|
6526
6513
|
}, VariantInput = (props) => {
|
|
6527
6514
|
const defaultValue = sanity.useFormValue([props.path[0], "default"]), handleClick = () => {
|
|
6528
6515
|
props.onChange(sanity.set(defaultValue, ["value"]));
|
|
@@ -6596,8 +6583,7 @@ const createExperimentType = ({
|
|
|
6596
6583
|
{
|
|
6597
6584
|
...props,
|
|
6598
6585
|
experimentId,
|
|
6599
|
-
experimentNameOverride
|
|
6600
|
-
variantNameOverride
|
|
6586
|
+
experimentNameOverride
|
|
6601
6587
|
}
|
|
6602
6588
|
)
|
|
6603
6589
|
},
|
|
@@ -6624,7 +6610,14 @@ const createExperimentType = ({
|
|
|
6624
6610
|
name: experimentId,
|
|
6625
6611
|
type: "string",
|
|
6626
6612
|
components: {
|
|
6627
|
-
input: (props) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
6613
|
+
input: (props) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
6614
|
+
ExperimentInput,
|
|
6615
|
+
{
|
|
6616
|
+
...props,
|
|
6617
|
+
experimentNameOverride,
|
|
6618
|
+
variantNameOverride
|
|
6619
|
+
}
|
|
6620
|
+
)
|
|
6628
6621
|
},
|
|
6629
6622
|
hidden: ({ parent }) => !parent?.active
|
|
6630
6623
|
}),
|
|
@@ -6760,91 +6753,7 @@ const createExperimentType = ({
|
|
|
6760
6753
|
}
|
|
6761
6754
|
}
|
|
6762
6755
|
};
|
|
6763
|
-
}), namespace = "growthbook", pluginConfigKeys = [
|
|
6764
|
-
{
|
|
6765
|
-
key: "apiKey",
|
|
6766
|
-
title: "Your secret API key"
|
|
6767
|
-
}
|
|
6768
|
-
], Secrets = (props) => {
|
|
6769
|
-
const { secrets, loading } = studioSecrets.useSecrets(namespace), { setSecret } = useExperimentContext(), [showSettings, setShowSettings] = react.useState(!1);
|
|
6770
|
-
return react.useEffect(() => {
|
|
6771
|
-
if (!loading)
|
|
6772
|
-
return !secrets && !loading ? (setSecret(void 0), setShowSettings(!0)) : (setSecret(secrets.apiKey), setShowSettings(!1));
|
|
6773
|
-
}, [secrets, loading, setSecret]), showSettings ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
6774
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6775
|
-
studioSecrets.SettingsView,
|
|
6776
|
-
{
|
|
6777
|
-
title: "Growthbook secret",
|
|
6778
|
-
namespace,
|
|
6779
|
-
keys: pluginConfigKeys,
|
|
6780
|
-
onClose: () => {
|
|
6781
|
-
setShowSettings(!1);
|
|
6782
|
-
}
|
|
6783
|
-
}
|
|
6784
|
-
),
|
|
6785
|
-
props.renderDefault(props)
|
|
6786
|
-
] }) : props.renderDefault(props);
|
|
6787
|
-
}, getBooleanConversion = (value) => value === "true" ? "variant" : value === "false" ? "control" : value, getExperiments = async ({
|
|
6788
|
-
client,
|
|
6789
|
-
environment,
|
|
6790
|
-
baseUrl,
|
|
6791
|
-
project,
|
|
6792
|
-
convertBooleans
|
|
6793
|
-
}) => {
|
|
6794
|
-
const secret = await client.fetch("*[_id == 'secrets.growthbook'][0].secrets.apiKey");
|
|
6795
|
-
if (!secret) return [];
|
|
6796
|
-
const featureExperiments = [];
|
|
6797
|
-
let hasMore = !0, offset = 0;
|
|
6798
|
-
const url = new URL(baseUrl ?? "https://api.growthbook.io/api/v1/features");
|
|
6799
|
-
for (project && url.searchParams.set("projectId", project); hasMore; ) {
|
|
6800
|
-
url.searchParams.set("offset", offset.toString());
|
|
6801
|
-
const response = await fetch(url, {
|
|
6802
|
-
headers: {
|
|
6803
|
-
Authorization: `Bearer ${secret}`
|
|
6804
|
-
}
|
|
6805
|
-
}), { features, hasMore: responseHasMore, nextOffset } = await response.json();
|
|
6806
|
-
hasMore = responseHasMore, offset = nextOffset, features && features.forEach((feature) => {
|
|
6807
|
-
if (feature.archived)
|
|
6808
|
-
return;
|
|
6809
|
-
const experiments = feature.environments[environment]?.rules.filter(
|
|
6810
|
-
(experiment) => experiment.type === "experiment-ref" || experiment.type === "experiment"
|
|
6811
|
-
);
|
|
6812
|
-
if (!experiments)
|
|
6813
|
-
return;
|
|
6814
|
-
const variations = /* @__PURE__ */ new Set();
|
|
6815
|
-
experiments.forEach((experiment) => {
|
|
6816
|
-
experiment?.variations.forEach((variant) => {
|
|
6817
|
-
variations.add({
|
|
6818
|
-
id: convertBooleans ? getBooleanConversion(variant.value) : variant.value,
|
|
6819
|
-
label: convertBooleans ? getBooleanConversion(variant.value) : variant.value
|
|
6820
|
-
});
|
|
6821
|
-
});
|
|
6822
|
-
});
|
|
6823
|
-
const value = { id: feature.id, label: feature.id, variants: [...variations] };
|
|
6824
|
-
featureExperiments.push(value);
|
|
6825
|
-
});
|
|
6826
|
-
}
|
|
6827
|
-
return featureExperiments;
|
|
6828
|
-
}, growthbookFieldLevel = sanity.definePlugin((config) => {
|
|
6829
|
-
const { fields, environment, project, convertBooleans, baseUrl } = config;
|
|
6830
|
-
return {
|
|
6831
|
-
name: "sanity-growthbook-personalistaion-plugin-field-level-experiments",
|
|
6832
|
-
plugins: [
|
|
6833
|
-
fieldLevelExperiments({
|
|
6834
|
-
fields,
|
|
6835
|
-
experiments: (client) => getExperiments({ client, environment, baseUrl, project, convertBooleans })
|
|
6836
|
-
})
|
|
6837
|
-
],
|
|
6838
|
-
form: {
|
|
6839
|
-
components: {
|
|
6840
|
-
input: (props) => !(props.id === "root" && sanity.isObjectInputProps(props)) || !flattenSchemaType(props.schemaType).map(
|
|
6841
|
-
(field) => field.type.name
|
|
6842
|
-
).some((name) => name.startsWith("experiment")) ? props.renderDefault(props) : Secrets(props)
|
|
6843
|
-
}
|
|
6844
|
-
}
|
|
6845
|
-
};
|
|
6846
6756
|
});
|
|
6847
6757
|
exports.fieldLevelExperiments = fieldLevelExperiments;
|
|
6848
6758
|
exports.flattenSchemaType = flattenSchemaType;
|
|
6849
|
-
exports.growthbookFieldLevel = growthbookFieldLevel;
|
|
6850
6759
|
//# sourceMappingURL=index.js.map
|