@growthbook/proxy-eval 1.0.8 → 1.1.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/dist/index.js CHANGED
@@ -52,21 +52,46 @@ function evaluateFeatures(_a) {
52
52
  }
53
53
  const gbFeatures = gb.getFeatures();
54
54
  for (const key in gbFeatures) {
55
- const result = gb.evalFeature(key);
56
- if (result.on || result.experiment) {
55
+ const featureResult = gb.evalFeature(key);
56
+ // Check if we have any deferred tracking calls (including prerequisite experiments)
57
+ const deferredCalls = gb.getDeferredTrackingCalls();
58
+ const hasDeferredCalls = deferredCalls && deferredCalls.length > 0;
59
+ const hasValue = featureResult.value !== undefined;
60
+ // legacy check (if deferred calls are missing)
61
+ const hasExperiment = featureResult.source === "experiment" && featureResult.experimentResult !== undefined;
62
+ if (hasValue || hasDeferredCalls) {
57
63
  // reduced feature definition
58
64
  evaluatedFeatures[key] = {
59
- defaultValue: result.value,
65
+ defaultValue: featureResult.value,
60
66
  };
61
- if (result.source === "experiment") {
62
- // reduced experiment definition for tracking
63
- const scrubbedResultExperiment = ((_b = result === null || result === void 0 ? void 0 : result.experimentResult) === null || _b === void 0 ? void 0 : _b.variationId) !== undefined
64
- ? scrubExperiment(result.experiment, result.experimentResult.variationId)
65
- : result.experiment;
67
+ if (hasDeferredCalls) {
68
+ // Process all experiment exposures (including prerequisites)
69
+ const tracks = deferredCalls
70
+ .filter(call => call.experiment && call.result) // Defensive: ensure call has required properties
71
+ .map(call => ({
72
+ experiment: scrubExperiment(call.experiment, call.result.variationId),
73
+ result: call.result,
74
+ }));
66
75
  evaluatedFeatures[key].rules = [
67
76
  {
68
- force: result.value,
69
- tracks: [{ experiment: scrubbedResultExperiment, result }],
77
+ force: featureResult.value,
78
+ tracks,
79
+ },
80
+ ];
81
+ gb.setDeferredTrackingCalls([]);
82
+ }
83
+ else if (hasExperiment) {
84
+ // Fallback for direct experiments when no deferred calls
85
+ const scrubbedResultExperiment = ((_b = featureResult === null || featureResult === void 0 ? void 0 : featureResult.experimentResult) === null || _b === void 0 ? void 0 : _b.variationId) !== undefined
86
+ ? scrubExperiment(featureResult.experiment, featureResult.experimentResult.variationId)
87
+ : featureResult.experiment;
88
+ evaluatedFeatures[key].rules = [
89
+ {
90
+ force: featureResult.value,
91
+ tracks: [{
92
+ experiment: scrubbedResultExperiment,
93
+ result: featureResult.experimentResult,
94
+ }],
70
95
  },
71
96
  ];
72
97
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@growthbook/proxy-eval",
3
3
  "description": "Remote evaluation service for proxies, edge workers, or backend APIs",
4
- "version": "1.0.8",
4
+ "version": "1.1.0",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",
7
7
  "repository": {
package/src/index.ts CHANGED
@@ -3,6 +3,9 @@ import {
3
3
  GrowthBook,
4
4
  Context as GBContext,
5
5
  StickyBucketService,
6
+ FeatureDefinition,
7
+ FeatureRule,
8
+ AutoExperiment,
6
9
  } from "@growthbook/growthbook";
7
10
 
8
11
  export async function evaluateFeatures({
@@ -27,8 +30,8 @@ export async function evaluateFeatures({
27
30
  | null;
28
31
  ctx?: any;
29
32
  }) {
30
- const evaluatedFeatures: Record<string, any> = {};
31
- const evaluatedExperiments: any[] = [];
33
+ const evaluatedFeatures: Record<string, FeatureDefinition> = {};
34
+ const evaluatedExperiments: AutoExperiment[] = [];
32
35
 
33
36
  const features = payload?.features;
34
37
  const experiments = payload?.experiments;
@@ -67,25 +70,56 @@ export async function evaluateFeatures({
67
70
 
68
71
  const gbFeatures = gb.getFeatures();
69
72
  for (const key in gbFeatures) {
70
- const result = gb.evalFeature(key);
71
- if (result.on || result.experiment) {
73
+ const featureResult = gb.evalFeature(key);
74
+
75
+ // Check if we have any deferred tracking calls (including prerequisite experiments)
76
+ const deferredCalls = gb.getDeferredTrackingCalls();
77
+ const hasDeferredCalls = deferredCalls && deferredCalls.length > 0;
78
+ const hasValue = featureResult.value !== undefined;
79
+
80
+ // legacy check (if deferred calls are missing)
81
+ const hasExperiment = featureResult.source === "experiment" && featureResult.experimentResult !== undefined;
82
+
83
+ if (hasValue || hasDeferredCalls) {
72
84
  // reduced feature definition
73
85
  evaluatedFeatures[key] = {
74
- defaultValue: result.value,
86
+ defaultValue: featureResult.value,
75
87
  };
76
- if (result.source === "experiment") {
77
- // reduced experiment definition for tracking
88
+
89
+ if (hasDeferredCalls) {
90
+ // Process all experiment exposures (including prerequisites)
91
+ const tracks: FeatureRule['tracks'] = deferredCalls
92
+ .filter(call => call.experiment && call.result) // Defensive: ensure call has required properties
93
+ .map(call => ({
94
+ experiment: scrubExperiment(call.experiment, call.result.variationId),
95
+ result: call.result,
96
+ }));
97
+
98
+ evaluatedFeatures[key].rules = [
99
+ {
100
+ force: featureResult.value,
101
+ tracks,
102
+ },
103
+ ];
104
+ gb.setDeferredTrackingCalls([]);
105
+
106
+ } else if (hasExperiment) {
107
+ // Fallback for direct experiments when no deferred calls
78
108
  const scrubbedResultExperiment =
79
- result?.experimentResult?.variationId !== undefined
109
+ featureResult?.experimentResult?.variationId !== undefined
80
110
  ? scrubExperiment(
81
- result.experiment,
82
- result.experimentResult.variationId,
111
+ featureResult.experiment,
112
+ featureResult.experimentResult.variationId,
83
113
  )
84
- : result.experiment;
114
+ : featureResult.experiment;
115
+
85
116
  evaluatedFeatures[key].rules = [
86
117
  {
87
- force: result.value,
88
- tracks: [{ experiment: scrubbedResultExperiment, result }],
118
+ force: featureResult.value,
119
+ tracks: [{
120
+ experiment: scrubbedResultExperiment,
121
+ result: featureResult.experimentResult!,
122
+ }],
89
123
  },
90
124
  ];
91
125
  }