@hackler/react-sdk 2.2.3 → 3.0.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/lib/Context.d.ts +11 -11
- package/lib/Experiment.d.ts +8 -8
- package/lib/Feature.d.ts +9 -9
- package/lib/Provider.d.ts +11 -11
- package/lib/Variation.d.ts +9 -9
- package/lib/Variation.d.ts.map +1 -1
- package/lib/client.d.ts +19 -20
- package/lib/client.d.ts.map +1 -1
- package/lib/config.d.ts +2 -2
- package/lib/hooks.d.ts +15 -16
- package/lib/hooks.d.ts.map +1 -1
- package/lib/index.cjs.d.ts +2 -0
- package/lib/index.cjs.d.ts.map +1 -0
- package/lib/index.d.ts +7 -7
- package/lib/index.d.ts.map +1 -1
- package/lib/index.es.js +279 -0
- package/lib/index.js +322 -8
- package/lib/index.umd.js +1 -0
- package/package.json +15 -5
- package/lib/Context.js +0 -8
- package/lib/Context.js.map +0 -1
- package/lib/Experiment.js +0 -26
- package/lib/Experiment.js.map +0 -1
- package/lib/Feature.js +0 -8
- package/lib/Feature.js.map +0 -1
- package/lib/Provider.js +0 -20
- package/lib/Provider.js.map +0 -1
- package/lib/Variation.js +0 -7
- package/lib/Variation.js.map +0 -1
- package/lib/client.js +0 -35
- package/lib/client.js.map +0 -1
- package/lib/config.js +0 -3
- package/lib/config.js.map +0 -1
- package/lib/hooks.js +0 -151
- package/lib/hooks.js.map +0 -1
- package/lib/index.js.map +0 -1
package/lib/index.js
CHANGED
|
@@ -1,8 +1,322 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var Hackle = require('@hackler/js-client-sdk');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var sdkCore = require('@hackler/sdk-core');
|
|
8
|
+
|
|
9
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
10
|
+
|
|
11
|
+
function _interopNamespace(e) {
|
|
12
|
+
if (e && e.__esModule) return e;
|
|
13
|
+
var n = Object.create(null);
|
|
14
|
+
if (e) {
|
|
15
|
+
Object.keys(e).forEach(function (k) {
|
|
16
|
+
if (k !== 'default') {
|
|
17
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
18
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () { return e[k]; }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
n["default"] = e;
|
|
26
|
+
return Object.freeze(n);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var Hackle__namespace = /*#__PURE__*/_interopNamespace(Hackle);
|
|
30
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
31
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
32
|
+
|
|
33
|
+
/*! *****************************************************************************
|
|
34
|
+
Copyright (c) Microsoft Corporation.
|
|
35
|
+
|
|
36
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
37
|
+
purpose with or without fee is hereby granted.
|
|
38
|
+
|
|
39
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
40
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
41
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
42
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
43
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
44
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
45
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
46
|
+
***************************************************************************** */
|
|
47
|
+
|
|
48
|
+
var __assign = function() {
|
|
49
|
+
__assign = Object.assign || function __assign(t) {
|
|
50
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
51
|
+
s = arguments[i];
|
|
52
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
53
|
+
}
|
|
54
|
+
return t;
|
|
55
|
+
};
|
|
56
|
+
return __assign.apply(this, arguments);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
function __read(o, n) {
|
|
60
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
61
|
+
if (!m) return o;
|
|
62
|
+
var i = m.call(o), r, ar = [], e;
|
|
63
|
+
try {
|
|
64
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
65
|
+
}
|
|
66
|
+
catch (error) { e = { error: error }; }
|
|
67
|
+
finally {
|
|
68
|
+
try {
|
|
69
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
70
|
+
}
|
|
71
|
+
finally { if (e) throw e.error; }
|
|
72
|
+
}
|
|
73
|
+
return ar;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
var SDK_NAME_HEADER = "react-sdk";
|
|
77
|
+
var SDK_VERSION_HEADER = "3.0.0";
|
|
78
|
+
|
|
79
|
+
var HackleReactSDKClient = /** @class */ (function () {
|
|
80
|
+
function HackleReactSDKClient(sdkKey, config) {
|
|
81
|
+
this.client = Hackle__namespace.createInstance(sdkKey, __assign(__assign({}, config), { SDK_NAME_HEADER: SDK_NAME_HEADER, SDK_VERSION_HEADER: SDK_VERSION_HEADER }));
|
|
82
|
+
}
|
|
83
|
+
HackleReactSDKClient.prototype.variation = function (experimentKey, user, defaultVariation) {
|
|
84
|
+
return this.client.variation(experimentKey, user, defaultVariation);
|
|
85
|
+
};
|
|
86
|
+
HackleReactSDKClient.prototype.variationDetail = function (experimentKey, user, defaultVariation) {
|
|
87
|
+
return this.client.variationDetail(experimentKey, user, defaultVariation);
|
|
88
|
+
};
|
|
89
|
+
HackleReactSDKClient.prototype.isFeatureOn = function (featureKey, user) {
|
|
90
|
+
return this.client.isFeatureOn(featureKey, user);
|
|
91
|
+
};
|
|
92
|
+
HackleReactSDKClient.prototype.featureFlagDetail = function (featureKey, user) {
|
|
93
|
+
return this.client.featureFlagDetail(featureKey, user);
|
|
94
|
+
};
|
|
95
|
+
HackleReactSDKClient.prototype.track = function (event, user) {
|
|
96
|
+
this.client.track(event, user);
|
|
97
|
+
};
|
|
98
|
+
HackleReactSDKClient.prototype.trackPageView = function (option) {
|
|
99
|
+
this.client.trackPageView(option);
|
|
100
|
+
};
|
|
101
|
+
HackleReactSDKClient.prototype.onReady = function (cb, timeout) {
|
|
102
|
+
this.client.onReady(cb, timeout);
|
|
103
|
+
};
|
|
104
|
+
return HackleReactSDKClient;
|
|
105
|
+
}());
|
|
106
|
+
function createInstance(sdkKey, config) {
|
|
107
|
+
return new HackleReactSDKClient(sdkKey, config);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
var HackleContext = React.createContext({
|
|
111
|
+
hackle: undefined,
|
|
112
|
+
user: undefined,
|
|
113
|
+
});
|
|
114
|
+
var HackleContextConsumer = HackleContext.Consumer;
|
|
115
|
+
var HackleContextProvider = HackleContext.Provider;
|
|
116
|
+
|
|
117
|
+
function HackleProvider(_a) {
|
|
118
|
+
var hackleClient = _a.hackleClient, user = _a.user, _b = _a.timeout, timeout = _b === void 0 ? 3000 : _b, children = _a.children;
|
|
119
|
+
var state = {
|
|
120
|
+
hackle: hackleClient,
|
|
121
|
+
user: user,
|
|
122
|
+
};
|
|
123
|
+
var _c = __read(React.useState(false), 2), ready = _c[0], setReady = _c[1];
|
|
124
|
+
var _d = __read(React.useState(state), 2), value = _d[0], setValue = _d[1];
|
|
125
|
+
React.useEffect(function () {
|
|
126
|
+
setValue(function (prevState) {
|
|
127
|
+
return __assign(__assign({}, prevState), { user: user });
|
|
128
|
+
});
|
|
129
|
+
}, [user]);
|
|
130
|
+
hackleClient.onReady(function () { return setReady(true); }, timeout);
|
|
131
|
+
return ready ? React__default["default"].createElement(HackleContextProvider, { value: value }, children) : null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
var log = sdkCore.Logger.log;
|
|
135
|
+
function useVariation(experimentKey, defaultVariation) {
|
|
136
|
+
if (defaultVariation === void 0) { defaultVariation = "A"; }
|
|
137
|
+
var _a = React.useContext(HackleContext), hackle = _a.hackle, user = _a.user;
|
|
138
|
+
var getVariation = React.useCallback(function () {
|
|
139
|
+
return (hackle === null || hackle === void 0 ? void 0 : hackle.variation(experimentKey, user)) || defaultVariation;
|
|
140
|
+
}, [defaultVariation, experimentKey, user, hackle]);
|
|
141
|
+
var _b = __read(React.useState(function () {
|
|
142
|
+
if (notExistClient(hackle)) {
|
|
143
|
+
if ((typeof window) !== "undefined") {
|
|
144
|
+
log.error("HackleClient is not existed");
|
|
145
|
+
}
|
|
146
|
+
return defaultVariation;
|
|
147
|
+
}
|
|
148
|
+
return getVariation();
|
|
149
|
+
}), 2), variation = _b[0], setVariation = _b[1];
|
|
150
|
+
var currentInput = {
|
|
151
|
+
key: experimentKey,
|
|
152
|
+
user: user
|
|
153
|
+
};
|
|
154
|
+
var _c = __read(React.useState(currentInput), 2), prevInput = _c[0], setPrevInput = _c[1];
|
|
155
|
+
if (!isInputEqual(prevInput, currentInput)) {
|
|
156
|
+
setPrevInput(currentInput);
|
|
157
|
+
setVariation(getVariation());
|
|
158
|
+
}
|
|
159
|
+
return variation;
|
|
160
|
+
}
|
|
161
|
+
function useVariationDetail(experimentKey, defaultVariation) {
|
|
162
|
+
if (defaultVariation === void 0) { defaultVariation = "A"; }
|
|
163
|
+
var _a = React.useContext(HackleContext), hackle = _a.hackle, user = _a.user;
|
|
164
|
+
var getVariationDetail = React.useCallback(function () {
|
|
165
|
+
return (hackle === null || hackle === void 0 ? void 0 : hackle.variationDetail(experimentKey, user)) || sdkCore.Decision.of(defaultVariation, sdkCore.DecisionReason.EXCEPTION);
|
|
166
|
+
}, [defaultVariation, experimentKey, user, hackle]);
|
|
167
|
+
var _b = __read(React.useState(function () {
|
|
168
|
+
if (notExistClient(hackle)) {
|
|
169
|
+
if ((typeof window) !== "undefined") {
|
|
170
|
+
log.error("HackleClient is not existed");
|
|
171
|
+
}
|
|
172
|
+
return sdkCore.Decision.of(defaultVariation, sdkCore.DecisionReason.EXCEPTION);
|
|
173
|
+
}
|
|
174
|
+
return getVariationDetail();
|
|
175
|
+
}), 2), variationDetail = _b[0], setVariationDetail = _b[1];
|
|
176
|
+
var currentInput = {
|
|
177
|
+
key: experimentKey,
|
|
178
|
+
user: user
|
|
179
|
+
};
|
|
180
|
+
var _c = __read(React.useState(currentInput), 2), prevInput = _c[0], setPrevInput = _c[1];
|
|
181
|
+
if (!isInputEqual(prevInput, currentInput)) {
|
|
182
|
+
setPrevInput(currentInput);
|
|
183
|
+
setVariationDetail(getVariationDetail());
|
|
184
|
+
}
|
|
185
|
+
return variationDetail;
|
|
186
|
+
}
|
|
187
|
+
function useFeature(featureKey) {
|
|
188
|
+
var _a = React.useContext(HackleContext), hackle = _a.hackle, user = _a.user;
|
|
189
|
+
var getIsOn = React.useCallback(function () {
|
|
190
|
+
return (hackle === null || hackle === void 0 ? void 0 : hackle.isFeatureOn(featureKey, user)) || false;
|
|
191
|
+
}, [featureKey, user, hackle]);
|
|
192
|
+
var _b = __read(React.useState(function () {
|
|
193
|
+
if (notExistClient(hackle)) {
|
|
194
|
+
if ((typeof window) !== "undefined") {
|
|
195
|
+
log.error("HackleClient is not existed");
|
|
196
|
+
}
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return getIsOn();
|
|
200
|
+
}), 2), isOn = _b[0], setIsOn = _b[1];
|
|
201
|
+
var currentInput = {
|
|
202
|
+
key: featureKey,
|
|
203
|
+
user: user,
|
|
204
|
+
};
|
|
205
|
+
var _c = __read(React.useState(currentInput), 2), prevInput = _c[0], setPrevInput = _c[1];
|
|
206
|
+
if (!isInputEqual(prevInput, currentInput)) {
|
|
207
|
+
setPrevInput(currentInput);
|
|
208
|
+
setIsOn(getIsOn());
|
|
209
|
+
}
|
|
210
|
+
return isOn;
|
|
211
|
+
}
|
|
212
|
+
function useFeatureFlagDetail(featureKey) {
|
|
213
|
+
var _a = React.useContext(HackleContext), hackle = _a.hackle, user = _a.user;
|
|
214
|
+
var getFeatureDetail = React.useCallback(function () {
|
|
215
|
+
return (hackle === null || hackle === void 0 ? void 0 : hackle.featureFlagDetail(featureKey, user)) || sdkCore.FeatureFlagDecision.off(sdkCore.DecisionReason.EXCEPTION);
|
|
216
|
+
}, [featureKey, user, hackle]);
|
|
217
|
+
var _b = __read(React.useState(function () {
|
|
218
|
+
if (notExistClient(hackle)) {
|
|
219
|
+
if ((typeof window) !== "undefined") {
|
|
220
|
+
log.error("HackleClient is not existed");
|
|
221
|
+
}
|
|
222
|
+
return sdkCore.FeatureFlagDecision.off(sdkCore.DecisionReason.EXCEPTION);
|
|
223
|
+
}
|
|
224
|
+
return getFeatureDetail();
|
|
225
|
+
}), 2), featureDetail = _b[0], setFeatureDetail = _b[1];
|
|
226
|
+
var currentInput = {
|
|
227
|
+
key: featureKey,
|
|
228
|
+
user: user,
|
|
229
|
+
};
|
|
230
|
+
var _c = __read(React.useState(currentInput), 2), prevInput = _c[0], setPrevInput = _c[1];
|
|
231
|
+
if (!isInputEqual(prevInput, currentInput)) {
|
|
232
|
+
setPrevInput(currentInput);
|
|
233
|
+
setFeatureDetail(getFeatureDetail());
|
|
234
|
+
}
|
|
235
|
+
return featureDetail;
|
|
236
|
+
}
|
|
237
|
+
function useTrack() {
|
|
238
|
+
var _a = React.useContext(HackleContext), hackle = _a.hackle, user = _a.user;
|
|
239
|
+
if (notExistClient(hackle)) {
|
|
240
|
+
if ((typeof window) !== "undefined") {
|
|
241
|
+
log.error("HackleClient is not existed");
|
|
242
|
+
}
|
|
243
|
+
return function () { };
|
|
244
|
+
}
|
|
245
|
+
return function (event) { return hackle === null || hackle === void 0 ? void 0 : hackle.track(event, user); };
|
|
246
|
+
}
|
|
247
|
+
function notExistClient(hackle) {
|
|
248
|
+
return !hackle;
|
|
249
|
+
}
|
|
250
|
+
function isInputEqual(prev, current) {
|
|
251
|
+
var _a, _b, _c, _d;
|
|
252
|
+
return (prev.key === current.key &&
|
|
253
|
+
((_a = prev.user) === null || _a === void 0 ? void 0 : _a.id) === ((_b = current.user) === null || _b === void 0 ? void 0 : _b.id) &&
|
|
254
|
+
arePropertiesEqual((_c = prev.user) === null || _c === void 0 ? void 0 : _c.properties, (_d = current.user) === null || _d === void 0 ? void 0 : _d.properties));
|
|
255
|
+
}
|
|
256
|
+
function arePropertiesEqual(prevProps, currentProps) {
|
|
257
|
+
var prev = coerceUnknownToProperties(prevProps);
|
|
258
|
+
var current = coerceUnknownToProperties(currentProps);
|
|
259
|
+
var prevKeys = Object.keys(prev);
|
|
260
|
+
var currentKeys = Object.keys(current);
|
|
261
|
+
if (prevKeys.length !== currentKeys.length) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
return prevKeys.every(function (it) {
|
|
265
|
+
return it in current && prev[it] === current[it];
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
function coerceUnknownToProperties(props) {
|
|
269
|
+
if (typeof props === "object" && props !== null) {
|
|
270
|
+
return props;
|
|
271
|
+
}
|
|
272
|
+
return {};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function Experiment(_a) {
|
|
276
|
+
var experimentKey = _a.experimentKey, children = _a.children;
|
|
277
|
+
var variation = useVariation(experimentKey);
|
|
278
|
+
if (!!children && typeof children === "function") {
|
|
279
|
+
return children(variation);
|
|
280
|
+
}
|
|
281
|
+
var match;
|
|
282
|
+
React__namespace.Children.forEach(children, (function (it) {
|
|
283
|
+
if (!React__namespace.isValidElement(it)) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
if (it.props.variation) {
|
|
287
|
+
if (variation === it.props.variation) {
|
|
288
|
+
match = it;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else if (it.props.default) {
|
|
292
|
+
match = it;
|
|
293
|
+
}
|
|
294
|
+
}));
|
|
295
|
+
return match ? React__namespace.cloneElement(match, { variation: variation }) : null;
|
|
296
|
+
}
|
|
297
|
+
var HackleExperiment = Experiment;
|
|
298
|
+
|
|
299
|
+
function Variation(_a) {
|
|
300
|
+
_a.variation; var children = _a.children;
|
|
301
|
+
return React__namespace.createElement(React__namespace.Fragment, null, children);
|
|
302
|
+
}
|
|
303
|
+
var HackleVariation = Variation;
|
|
304
|
+
|
|
305
|
+
exports.HackleContext = HackleContext;
|
|
306
|
+
exports.HackleContextConsumer = HackleContextConsumer;
|
|
307
|
+
exports.HackleContextProvider = HackleContextProvider;
|
|
308
|
+
exports.HackleExperiment = HackleExperiment;
|
|
309
|
+
exports.HackleProvider = HackleProvider;
|
|
310
|
+
exports.HackleVariation = HackleVariation;
|
|
311
|
+
exports.createInstance = createInstance;
|
|
312
|
+
exports.useFeature = useFeature;
|
|
313
|
+
exports.useFeatureFlagDetail = useFeatureFlagDetail;
|
|
314
|
+
exports.useTrack = useTrack;
|
|
315
|
+
exports.useVariation = useVariation;
|
|
316
|
+
exports.useVariationDetail = useVariationDetail;
|
|
317
|
+
Object.keys(Hackle).forEach(function (k) {
|
|
318
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
319
|
+
enumerable: true,
|
|
320
|
+
get: function () { return Hackle[k]; }
|
|
321
|
+
});
|
|
322
|
+
});
|