@featbit/react-client-sdk 3.1.2 → 4.2.4
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/asyncWithFbProvider.js +4 -8
- package/dist/asyncWithFbProvider.js.map +1 -1
- package/dist/getFlagsProxy.d.ts +2 -2
- package/dist/getFlagsProxy.js +37 -22
- package/dist/getFlagsProxy.js.map +1 -1
- package/dist/provider.d.ts +3 -2
- package/dist/provider.js +22 -20
- package/dist/provider.js.map +1 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/src/asyncWithFbProvider.tsx +3 -9
- package/src/getFlagsProxy.ts +38 -28
- package/src/provider.tsx +19 -12
- package/src/types.ts +0 -7
|
@@ -88,7 +88,7 @@ import { fetchFlags } from "./utils";
|
|
|
88
88
|
*/
|
|
89
89
|
export default function asyncWithFbProvider(config) {
|
|
90
90
|
return __awaiter(this, void 0, void 0, function () {
|
|
91
|
-
var options, userReactOptions, platform, reactOptions, error, fetchedFlags, fbClient, e_1,
|
|
91
|
+
var options, userReactOptions, platform, reactOptions, error, fetchedFlags, fbClient, e_1, FbProvider;
|
|
92
92
|
return __generator(this, function (_a) {
|
|
93
93
|
switch (_a.label) {
|
|
94
94
|
case 0:
|
|
@@ -113,13 +113,9 @@ export default function asyncWithFbProvider(config) {
|
|
|
113
113
|
error = e_1;
|
|
114
114
|
return [3 /*break*/, 5];
|
|
115
115
|
case 5:
|
|
116
|
-
bootstrapFlags = ((options === null || options === void 0 ? void 0 : options.bootstrap) || []).reduce(function (acc, flag) {
|
|
117
|
-
acc[flag.id] = flag.variation;
|
|
118
|
-
return acc;
|
|
119
|
-
}, {});
|
|
120
116
|
FbProvider = function (_a) {
|
|
121
117
|
var children = _a.children;
|
|
122
|
-
var _b = useState(function () { return (__assign(__assign({ unproxiedFlags: fetchedFlags }, getFlagsProxy(
|
|
118
|
+
var _b = useState(function () { return (__assign(__assign({ unproxiedFlags: fetchedFlags }, getFlagsProxy(fetchedFlags, undefined, fbClient, reactOptions)), { fbClient: fbClient, error: error })); }), state = _b[0], setState = _b[1];
|
|
123
119
|
useEffect(function () {
|
|
124
120
|
function onReady() {
|
|
125
121
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -129,7 +125,7 @@ export default function asyncWithFbProvider(config) {
|
|
|
129
125
|
case 0: return [4 /*yield*/, fetchFlags(fbClient)];
|
|
130
126
|
case 1:
|
|
131
127
|
unproxiedFlags = _a.sent();
|
|
132
|
-
setState(function (prevState) { return (__assign(__assign(__assign({}, prevState), { unproxiedFlags: unproxiedFlags }), getFlagsProxy(
|
|
128
|
+
setState(function (prevState) { return (__assign(__assign(__assign({}, prevState), { unproxiedFlags: unproxiedFlags }), getFlagsProxy(unproxiedFlags, undefined, fbClient, reactOptions))); });
|
|
133
129
|
return [2 /*return*/];
|
|
134
130
|
}
|
|
135
131
|
});
|
|
@@ -146,7 +142,7 @@ export default function asyncWithFbProvider(config) {
|
|
|
146
142
|
if (Object.keys(updates).length > 0) {
|
|
147
143
|
setState(function (prevState) {
|
|
148
144
|
var updatedUnproxiedFlags = __assign(__assign({}, prevState.unproxiedFlags), updates);
|
|
149
|
-
return __assign(__assign(__assign({}, prevState), { unproxiedFlags: updatedUnproxiedFlags }), getFlagsProxy(
|
|
145
|
+
return __assign(__assign(__assign({}, prevState), { unproxiedFlags: updatedUnproxiedFlags }), getFlagsProxy(updatedUnproxiedFlags, undefined, fbClient, reactOptions));
|
|
150
146
|
});
|
|
151
147
|
}
|
|
152
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asyncWithFbProvider.js","sourceRoot":"../src/","sources":["asyncWithFbProvider.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAkB,mBAAmB,EAAY,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"asyncWithFbProvider.js","sourceRoot":"../src/","sources":["asyncWithFbProvider.tsx"],"names":[],"mappings":"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"}
|
package/dist/getFlagsProxy.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FbReactOptions, FlagKeyMap, IFlagSet } from "./types";
|
|
2
|
-
import { IFbClient } from "@featbit/js-client-sdk";
|
|
3
|
-
export default function getFlagsProxy(
|
|
2
|
+
import { IFbClient, IFlagBase } from "@featbit/js-client-sdk";
|
|
3
|
+
export default function getFlagsProxy(fetchedFlags: IFlagSet, bootstrapFlags?: IFlagBase[], fbClient?: IFbClient, reactOptions?: FbReactOptions): {
|
|
4
4
|
flags: IFlagSet;
|
|
5
5
|
flagKeyMap: FlagKeyMap;
|
|
6
6
|
};
|
package/dist/getFlagsProxy.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { defaultReactOptions } from "./types";
|
|
2
|
+
import { ValueConverters, VariationDataType } from "@featbit/js-client-sdk";
|
|
2
3
|
import camelCase from "lodash.camelcase";
|
|
3
|
-
export default function getFlagsProxy(
|
|
4
|
+
export default function getFlagsProxy(fetchedFlags, bootstrapFlags, fbClient, reactOptions) {
|
|
4
5
|
if (reactOptions === void 0) { reactOptions = defaultReactOptions; }
|
|
5
|
-
var _a = reactOptions.useCamelCaseFlagKeys, useCamelCaseFlagKeys = _a === void 0 ? false : _a
|
|
6
|
-
var
|
|
6
|
+
var _a = reactOptions.useCamelCaseFlagKeys, useCamelCaseFlagKeys = _a === void 0 ? false : _a;
|
|
7
|
+
var _b = useCamelCaseFlagKeys ? getCamelizedKeysAndFlagMap(fetchedFlags) : [fetchedFlags], flags = _b[0], _c = _b[1], flagKeyMap = _c === void 0 ? {} : _c;
|
|
7
8
|
return {
|
|
8
|
-
flags: toFlagsProxy(
|
|
9
|
+
flags: toFlagsProxy(flags, flagKeyMap, fetchedFlags, useCamelCaseFlagKeys, bootstrapFlags, fbClient),
|
|
9
10
|
flagKeyMap: flagKeyMap,
|
|
10
11
|
};
|
|
11
12
|
}
|
|
@@ -23,33 +24,47 @@ function getCamelizedKeysAndFlagMap(rawFlags) {
|
|
|
23
24
|
}
|
|
24
25
|
return [flags, flagKeyMap];
|
|
25
26
|
}
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
function toFlagsProxy(flags, flagKeyMap, flagsWithRawFlagKeys, useCamelCaseFlagKeys, bootstrapFlags, fbClient) {
|
|
28
|
+
var bootstrapFlagDict = (bootstrapFlags || []).reduce(function (acc, flag) {
|
|
29
|
+
acc[flag.id] = flag;
|
|
30
|
+
return acc;
|
|
31
|
+
}, {});
|
|
30
32
|
return new Proxy(flags, {
|
|
31
33
|
get: function (target, prop, receiver) {
|
|
34
|
+
var _a, _b, _c;
|
|
32
35
|
var currentValue = Reflect.get(target, prop, receiver) || flagsWithRawFlagKeys[prop];
|
|
33
|
-
// check if flag key exists as camelCase or original case
|
|
34
|
-
var validFlagKey = hasFlag(flagKeyMap, prop) || hasFlag(target, prop) || hasFlag(flagsWithRawFlagKeys, prop);
|
|
35
|
-
if (!validFlagKey && hasFlag(bootstrapFlags, prop)) {
|
|
36
|
-
return bootstrapFlags[prop];
|
|
37
|
-
}
|
|
38
36
|
// only process flag keys and ignore symbols and native Object functions
|
|
39
|
-
if (typeof prop === 'symbol'
|
|
40
|
-
return
|
|
37
|
+
if (typeof prop === 'symbol') {
|
|
38
|
+
return undefined;
|
|
41
39
|
}
|
|
42
|
-
if (useCamelCaseFlagKeys && prop !== camelCase(prop)) {
|
|
43
|
-
|
|
40
|
+
if (fbClient && useCamelCaseFlagKeys && prop !== camelCase(prop)) {
|
|
41
|
+
(_a = fbClient.logger) === null || _a === void 0 ? void 0 : _a.warn("You're attempting to access a flag with its original keyId: ".concat(prop, ", even though useCamelCaseFlagKeys is set to true."));
|
|
44
42
|
}
|
|
45
|
-
|
|
43
|
+
var pristineFlagKey = useCamelCaseFlagKeys ? (flagKeyMap[prop] || prop) : prop;
|
|
44
|
+
if (fbClient) {
|
|
45
|
+
return fbClient.variation(pristineFlagKey, currentValue);
|
|
46
|
+
}
|
|
47
|
+
if (!currentValue) {
|
|
46
48
|
return undefined;
|
|
47
49
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
var converter;
|
|
51
|
+
switch ((_b = bootstrapFlagDict[pristineFlagKey]) === null || _b === void 0 ? void 0 : _b.variationType) {
|
|
52
|
+
case VariationDataType.boolean:
|
|
53
|
+
converter = ValueConverters.bool;
|
|
54
|
+
break;
|
|
55
|
+
case VariationDataType.number:
|
|
56
|
+
converter = ValueConverters.number;
|
|
57
|
+
break;
|
|
58
|
+
case VariationDataType.json:
|
|
59
|
+
converter = ValueConverters.json;
|
|
60
|
+
break;
|
|
61
|
+
case VariationDataType.string:
|
|
62
|
+
converter = ValueConverters.string;
|
|
63
|
+
break;
|
|
64
|
+
default:
|
|
65
|
+
converter = ValueConverters.string;
|
|
50
66
|
}
|
|
51
|
-
|
|
52
|
-
return fbClient.variation(pristineFlagKey, currentValue);
|
|
67
|
+
return (_c = converter(currentValue)) === null || _c === void 0 ? void 0 : _c.value;
|
|
53
68
|
},
|
|
54
69
|
});
|
|
55
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFlagsProxy.js","sourceRoot":"../src/","sources":["getFlagsProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAwC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"getFlagsProxy.js","sourceRoot":"../src/","sources":["getFlagsProxy.ts"],"names":[],"mappings":"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"}
|
package/dist/provider.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React, { Component, PropsWithChildren } from "react";
|
|
2
|
-
import { EnhancedComponent, ProviderConfig
|
|
2
|
+
import { EnhancedComponent, ProviderConfig } from './types';
|
|
3
3
|
import { IFbClient } from '@featbit/js-client-sdk';
|
|
4
4
|
import { ProviderState } from "./providerState";
|
|
5
|
+
import { IFlagBase } from "@featbit/js-client-sdk/dist/esm/evaluation";
|
|
5
6
|
/**
|
|
6
7
|
* The `FbProvider` is a component which accepts a config object which is used to
|
|
7
8
|
* initialize `@featbit/js-client-sdk`.
|
|
@@ -21,7 +22,7 @@ import { ProviderState } from "./providerState";
|
|
|
21
22
|
*/
|
|
22
23
|
declare class FbProvider extends Component<PropsWithChildren<ProviderConfig>, ProviderState> implements EnhancedComponent {
|
|
23
24
|
readonly state: Readonly<ProviderState>;
|
|
24
|
-
bootstrapFlags
|
|
25
|
+
bootstrapFlags?: IFlagBase[];
|
|
25
26
|
constructor(props: ProviderConfig);
|
|
26
27
|
getReactOptions: () => {
|
|
27
28
|
useCamelCaseFlagKeys: boolean;
|
package/dist/provider.js
CHANGED
|
@@ -96,7 +96,7 @@ var FbProvider = /** @class */ (function (_super) {
|
|
|
96
96
|
}, {});
|
|
97
97
|
var unproxiedFlags = __assign(__assign({}, _this.state.unproxiedFlags), updates);
|
|
98
98
|
if (Object.keys(updates).length > 0) {
|
|
99
|
-
_this.setState(function (prevState) { return (__assign(__assign(__assign({}, prevState), { unproxiedFlags: unproxiedFlags }), getFlagsProxy(
|
|
99
|
+
_this.setState(function (prevState) { return (__assign(__assign(__assign({}, prevState), { unproxiedFlags: unproxiedFlags }), getFlagsProxy(unproxiedFlags, _this.bootstrapFlags, fbClient, _this.getReactOptions()))); });
|
|
100
100
|
}
|
|
101
101
|
});
|
|
102
102
|
};
|
|
@@ -111,7 +111,7 @@ var FbProvider = /** @class */ (function (_super) {
|
|
|
111
111
|
case 0: return [4 /*yield*/, fetchFlags(fbClient)];
|
|
112
112
|
case 1:
|
|
113
113
|
unproxiedFlags = _a.sent();
|
|
114
|
-
this.setState(function (prevState) { return (__assign(__assign(__assign({}, prevState), { unproxiedFlags: unproxiedFlags }), getFlagsProxy(
|
|
114
|
+
this.setState(function (prevState) { return (__assign(__assign(__assign({}, prevState), { unproxiedFlags: unproxiedFlags }), getFlagsProxy(unproxiedFlags, _this.bootstrapFlags, fbClient, reactOptions))); });
|
|
115
115
|
return [2 /*return*/];
|
|
116
116
|
}
|
|
117
117
|
});
|
|
@@ -130,23 +130,26 @@ var FbProvider = /** @class */ (function (_super) {
|
|
|
130
130
|
return [4 /*yield*/, fetchFlags(client)];
|
|
131
131
|
case 1:
|
|
132
132
|
unproxiedFlags = _b.sent();
|
|
133
|
-
return [3 /*break*/,
|
|
133
|
+
return [3 /*break*/, 8];
|
|
134
134
|
case 2:
|
|
135
135
|
client = new FbClientBuilder(__assign({}, options))
|
|
136
136
|
.platform(platform)
|
|
137
137
|
.build();
|
|
138
138
|
_b.label = 3;
|
|
139
139
|
case 3:
|
|
140
|
-
_b.trys.push([3, 6, ,
|
|
140
|
+
_b.trys.push([3, 6, , 8]);
|
|
141
141
|
return [4 /*yield*/, client.waitForInitialization()];
|
|
142
142
|
case 4:
|
|
143
143
|
_b.sent();
|
|
144
144
|
return [4 /*yield*/, fetchFlags(client)];
|
|
145
145
|
case 5:
|
|
146
146
|
unproxiedFlags = _b.sent();
|
|
147
|
-
return [3 /*break*/,
|
|
147
|
+
return [3 /*break*/, 8];
|
|
148
148
|
case 6:
|
|
149
149
|
e_1 = _b.sent();
|
|
150
|
+
return [4 /*yield*/, fetchFlags(client)];
|
|
151
|
+
case 7:
|
|
152
|
+
unproxiedFlags = _b.sent();
|
|
150
153
|
error = e_1;
|
|
151
154
|
if (error === null || error === void 0 ? void 0 : error.name.toLowerCase().includes('timeout')) {
|
|
152
155
|
client.on('failed', this.onFailed);
|
|
@@ -154,19 +157,15 @@ var FbProvider = /** @class */ (function (_super) {
|
|
|
154
157
|
_this.onReady(client, reactOptions);
|
|
155
158
|
});
|
|
156
159
|
}
|
|
157
|
-
return [3 /*break*/,
|
|
158
|
-
case
|
|
159
|
-
this.setState(function (previousState) { return (__assign(__assign(__assign(__assign({}, previousState), { unproxiedFlags: unproxiedFlags }), getFlagsProxy(
|
|
160
|
+
return [3 /*break*/, 8];
|
|
161
|
+
case 8:
|
|
162
|
+
this.setState(function (previousState) { return (__assign(__assign(__assign(__assign({}, previousState), { unproxiedFlags: unproxiedFlags }), getFlagsProxy(unproxiedFlags, _this.bootstrapFlags, client, reactOptions)), { fbClient: client, error: error })); });
|
|
160
163
|
this.subscribeToChanges(client);
|
|
161
164
|
return [2 /*return*/];
|
|
162
165
|
}
|
|
163
166
|
});
|
|
164
167
|
}); };
|
|
165
168
|
var options = props.options;
|
|
166
|
-
_this.bootstrapFlags = ((options === null || options === void 0 ? void 0 : options.bootstrap) || []).reduce(function (acc, flag) {
|
|
167
|
-
acc[flag.id] = flag.variation;
|
|
168
|
-
return acc;
|
|
169
|
-
}, {});
|
|
170
169
|
_this.state = {
|
|
171
170
|
flags: {},
|
|
172
171
|
unproxiedFlags: {},
|
|
@@ -174,14 +173,17 @@ var FbProvider = /** @class */ (function (_super) {
|
|
|
174
173
|
fbClient: undefined,
|
|
175
174
|
};
|
|
176
175
|
if ((options === null || options === void 0 ? void 0 : options.bootstrap) && (options === null || options === void 0 ? void 0 : options.bootstrap.length) > 0) {
|
|
177
|
-
var
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
176
|
+
var reactOptions = _this.getReactOptions();
|
|
177
|
+
_this.bootstrapFlags = options.bootstrap;
|
|
178
|
+
var bootstrapFlagKeyValues = ((options === null || options === void 0 ? void 0 : options.bootstrap) || []).reduce(function (acc, flag) {
|
|
179
|
+
acc[flag.id] = flag.variation;
|
|
180
|
+
return acc;
|
|
181
|
+
}, {});
|
|
182
|
+
var flags = reactOptions.useCamelCaseFlagKeys ? camelCaseKeys(bootstrapFlagKeyValues) : bootstrapFlagKeyValues;
|
|
183
|
+
_this.state = __assign(__assign({ unproxiedFlags: flags }, getFlagsProxy(bootstrapFlagKeyValues, _this.bootstrapFlags, undefined, reactOptions)), {
|
|
184
|
+
//flags,
|
|
185
|
+
//flagKeyMap: {},
|
|
186
|
+
fbClient: undefined });
|
|
185
187
|
}
|
|
186
188
|
return _this;
|
|
187
189
|
}
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"../src/","sources":["provider.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAqB,MAAO,OAAO,CAAC;AAC7D,OAAO,EAAqC,mBAAmB,EAAY,MAAM,SAAS,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,eAAe,EAAa,MAAM,wBAAwB,CAAC;AACpE,OAAO,aAAa,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"../src/","sources":["provider.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAqB,MAAO,OAAO,CAAC;AAC7D,OAAO,EAAqC,mBAAmB,EAAY,MAAM,SAAS,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,eAAe,EAAa,MAAM,wBAAwB,CAAC;AACpE,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAK5C;;;;;;;;;;;;;;;;GAgBG;AACH;IAAyB,8BAA2D;IAIlF,oBAAY,KAAqB;QAAjC,YACE,kBAAM,KAAK,CAAC,SA8Bb;QAED,qBAAe,GAAG,cAAM,OAAA,uBAAK,mBAAmB,GAAK,KAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EAAtD,CAAsD,CAAC;QAE/E,wBAAkB,GAAG,UAAC,QAAmB;YACvC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAC,WAAqB;gBAC1C,IAAM,OAAO,GAAa,WAAW,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,GAAG;oBACpD,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACvC,OAAO,GAAG,CAAC;gBACb,CAAC,EAAE,EAAc,CAAC,CAAC;gBAEnB,IAAM,cAAc,yBACf,KAAI,CAAC,KAAK,CAAC,cAAc,GACzB,OAAO,CACX,CAAC;gBAEF,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;oBACnC,KAAI,CAAC,QAAQ,CAAC,UAAC,SAAS,IAAI,OAAA,gCACvB,SAAS,KACZ,cAAc,gBAAA,KACX,aAAa,CAAC,cAAc,EAAE,KAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAI,CAAC,eAAe,EAAE,CAAC,EACvF,EAJ0B,CAI1B,CAAC,CAAA;iBACJ;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,cAAQ,GAAG,UAAC,QAAmB,EAAE,CAAQ;YACvC,KAAI,CAAC,QAAQ,CAAC,UAAC,SAAS,IAAK,OAAA,uBAAM,SAAS,KAAE,KAAK,EAAE,CAAC,IAAG,EAA5B,CAA4B,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,aAAO,GAAG,UAAO,QAAmB,EAAE,YAAiB;;;;;4BAC9B,qBAAM,UAAU,CAAC,QAAQ,CAAC,EAAA;;wBAA3C,cAAc,GAAG,SAA0B;wBACjD,IAAI,CAAC,QAAQ,CAAC,UAAC,SAAS,IAAK,OAAA,gCACxB,SAAS,KACZ,cAAc,gBAAA,KACX,aAAa,CAAC,cAAc,EAAE,KAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,EAHpD,CAGoD,CAAC,CAAC;;;;aACpF,CAAC;QAEF,qBAAe,GAAG;;;;;;wBACV,KAAsB,IAAI,CAAC,KAAK,EAA/B,OAAO,aAAA,EAAE,QAAQ,cAAA,CAAe;wBACnC,MAAM,GAAc,IAAI,CAAC,KAAK,CAAC,QAAS,CAAC;wBACvC,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;wBACxC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;6BAG3C,MAAM,EAAN,wBAAM;wBACS,qBAAM,UAAU,CAAC,MAAM,CAAC,EAAA;;wBAAzC,cAAc,GAAG,SAAwB,CAAC;;;wBAE1C,MAAM,GAAG,IAAI,eAAe,cAAK,OAAO,EAAE;6BACvC,QAAQ,CAAC,QAAQ,CAAC;6BAClB,KAAK,EAAE,CAAC;;;;wBAGT,qBAAM,MAAM,CAAC,qBAAqB,EAAE,EAAA;;wBAApC,SAAoC,CAAC;wBACpB,qBAAM,UAAU,CAAC,MAAM,CAAC,EAAA;;wBAAzC,cAAc,GAAG,SAAwB,CAAC;;;;wBAEzB,qBAAM,UAAU,CAAC,MAAM,CAAC,EAAA;;wBAAzC,cAAc,GAAG,SAAwB,CAAC;wBAC1C,KAAK,GAAG,GAAU,CAAC;wBAEnB,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE;4BACjD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;4BACnC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE;gCACjB,KAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;4BACrC,CAAC,CAAC,CAAC;yBACJ;;;wBAIL,IAAI,CAAC,QAAQ,CAAC,UAAC,aAAa,IAAK,OAAA,yCAC5B,aAAa,KAChB,cAAc,gBAAA,KACX,aAAa,CAAC,cAAc,EAAE,KAAI,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,KAC3E,QAAQ,EAAE,MAAM,EAChB,KAAK,OAAA,IACL,EAN+B,CAM/B,CAAC,CAAC;wBAEJ,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;;;;aACjC,CAAC;QAzGO,IAAA,OAAO,GAAI,KAAK,QAAT,CAAU;QAGxB,KAAI,CAAC,KAAK,GAAG;YACX,KAAK,EAAE,EAAE;YACT,cAAc,EAAE,EAAE;YAClB,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,SAAS;SACpB,CAAC;QAEF,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,KAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,CAAC,MAAM,IAAG,CAAC,EAAE;YACvD,IAAM,YAAY,GAAG,KAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,KAAI,CAAC,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;YAExC,IAAM,sBAAsB,GAAG,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,KAAI,EAAE,CAAC,CAAC,MAAM,CAAC,UAAC,GAA4B,EAAE,IAAS;gBACvG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC9B,OAAO,GAAG,CAAC;YACb,CAAC,EAAE,EAA6B,CAAC,CAAC;YAElC,IAAM,KAAK,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC;YACjH,KAAI,CAAC,KAAK,uBACR,cAAc,EAAE,KAAK,IAClB,aAAa,CAAC,sBAAsB,EAAE,KAAI,CAAC,cAAc,EAAE,SAAS,EAAE,YAAY,CAAC;gBACtF,QAAQ;gBACR,iBAAiB;gBACjB,QAAQ,EAAE,SAAS,GACpB,CAAC;SACH;;IACH,CAAC;IA+EK,sCAAiB,GAAvB;;;;;;wBACQ,KAAiC,IAAI,CAAC,KAAK,EAA1C,OAAO,aAAA,EAAE,mBAAmB,yBAAA,CAAe;wBAClD,IAAI,mBAAmB,IAAI,CAAC,OAAO,EAAE;4BACnC,sBAAO;yBACR;wBAED,qBAAM,IAAI,CAAC,eAAe,EAAE,EAAA;;wBAA5B,SAA4B,CAAC;;;;;KAC9B;IAEK,uCAAkB,GAAxB,UAAyB,SAAyB;;;;;;;wBAC1C,KAAiC,IAAI,CAAC,KAAK,EAA1C,OAAO,aAAA,EAAE,mBAAmB,yBAAA,CAAe;wBAC5C,cAAc,GAAG,CAAC,CAAA,MAAA,SAAS,CAAC,OAAO,0CAAE,IAAI,CAAA,KAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAA,CAAC;6BAC7D,CAAA,mBAAmB,IAAI,cAAc,CAAA,EAArC,wBAAqC;wBACvC,qBAAM,IAAI,CAAC,eAAe,EAAE,EAAA;;wBAA5B,SAA4B,CAAC;;;;;;KAEhC;IAED,2BAAM,GAAN;QACQ,IAAA,KAAuC,IAAI,CAAC,KAAK,EAAhD,KAAK,WAAA,EAAE,UAAU,gBAAA,EAAE,QAAQ,cAAA,EAAE,KAAK,WAAc,CAAC;QAExD,OAAO,oBAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,KAAK,OAAA,EAAE,UAAU,YAAA,EAAE,QAAQ,UAAA,EAAE,KAAK,OAAA,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAa,CAAC;IACrG,CAAC;IACH,iBAAC;AAAD,CAAC,AAxID,CAAyB,SAAS,GAwIjC;AAED,eAAe,UAAU,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -18,12 +18,6 @@ export interface FbReactOptions {
|
|
|
18
18
|
* This is false by default, if set to true, keys will automatically be converted to camel-case.
|
|
19
19
|
*/
|
|
20
20
|
useCamelCaseFlagKeys?: boolean;
|
|
21
|
-
/**
|
|
22
|
-
* Whether to send flag evaluation events when a flag is read from the `flags` object
|
|
23
|
-
* returned by the `useFlags` hook. This is true by default, meaning flag evaluation
|
|
24
|
-
* events will be sent by default.
|
|
25
|
-
*/
|
|
26
|
-
sendEventsOnFlagRead?: boolean;
|
|
27
21
|
}
|
|
28
22
|
/**
|
|
29
23
|
* Contains default values for the `reactOptions` object.
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"../src/","sources":["types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"../src/","sources":["types.ts"],"names":[],"mappings":"AAuBA;;GAEG;AACH,MAAM,CAAC,IAAM,mBAAmB,GAAG,EAAC,oBAAoB,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAC,CAAC;AAuE7F,cAAc,wBAAwB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@featbit/react-client-sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.2.4",
|
|
4
4
|
"description": "FeatBit client SDK for React",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"FeatBit",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"typescript": "^4.5.3"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@featbit/js-client-sdk": "
|
|
50
|
+
"@featbit/js-client-sdk": "4.2.4",
|
|
51
51
|
"hoist-non-react-statics": "^3.3.2",
|
|
52
52
|
"lodash.camelcase": "^4.3.0"
|
|
53
53
|
},
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React, { useState, useEffect, ReactNode } from 'react';
|
|
2
2
|
import { ProviderConfig, defaultReactOptions, IFlagSet } from './types';
|
|
3
3
|
import { Provider } from './context';
|
|
4
|
-
import { initClient } from './initClient';
|
|
5
4
|
import getFlagsProxy from "./getFlagsProxy";
|
|
6
5
|
import { FbClientBuilder } from "@featbit/js-client-sdk";
|
|
7
6
|
import { fetchFlags } from "./utils";
|
|
@@ -47,15 +46,10 @@ export default async function asyncWithFbProvider(config: ProviderConfig) {
|
|
|
47
46
|
error = e as Error;
|
|
48
47
|
}
|
|
49
48
|
|
|
50
|
-
const bootstrapFlags = (options?.bootstrap || []).reduce((acc: {[key: string]: string}, flag: any) => {
|
|
51
|
-
acc[flag.id] = flag.variation;
|
|
52
|
-
return acc;
|
|
53
|
-
}, {} as {[key: string]: string});
|
|
54
|
-
|
|
55
49
|
const FbProvider = ({children}: { children: ReactNode }) => {
|
|
56
50
|
const [state, setState] = useState(() => ({
|
|
57
51
|
unproxiedFlags: fetchedFlags,
|
|
58
|
-
...getFlagsProxy(
|
|
52
|
+
...getFlagsProxy(fetchedFlags, undefined, fbClient, reactOptions),
|
|
59
53
|
fbClient,
|
|
60
54
|
error,
|
|
61
55
|
}));
|
|
@@ -66,7 +60,7 @@ export default async function asyncWithFbProvider(config: ProviderConfig) {
|
|
|
66
60
|
setState((prevState) => ({
|
|
67
61
|
...prevState,
|
|
68
62
|
unproxiedFlags,
|
|
69
|
-
...getFlagsProxy(
|
|
63
|
+
...getFlagsProxy(unproxiedFlags, undefined, fbClient, reactOptions)}));
|
|
70
64
|
}
|
|
71
65
|
|
|
72
66
|
function onFailed(e: Error) {
|
|
@@ -86,7 +80,7 @@ export default async function asyncWithFbProvider(config: ProviderConfig) {
|
|
|
86
80
|
return {
|
|
87
81
|
...prevState,
|
|
88
82
|
unproxiedFlags: updatedUnproxiedFlags,
|
|
89
|
-
...getFlagsProxy(
|
|
83
|
+
...getFlagsProxy(updatedUnproxiedFlags, undefined, fbClient, reactOptions),
|
|
90
84
|
};
|
|
91
85
|
});
|
|
92
86
|
}
|
package/src/getFlagsProxy.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { defaultReactOptions, FbReactOptions, FlagKeyMap, IFlagSet } from "./types";
|
|
2
|
-
import { IFbClient } from "@featbit/js-client-sdk";
|
|
2
|
+
import { IConvertResult, IFbClient, IFlagBase, ValueConverters, VariationDataType } from "@featbit/js-client-sdk";
|
|
3
3
|
import camelCase from "lodash.camelcase";
|
|
4
4
|
|
|
5
5
|
export default function getFlagsProxy(
|
|
6
|
-
fbClient: IFbClient,
|
|
7
|
-
bootstrapFlags: IFlagSet,
|
|
8
6
|
fetchedFlags: IFlagSet,
|
|
7
|
+
bootstrapFlags?: IFlagBase[],
|
|
8
|
+
fbClient?: IFbClient,
|
|
9
9
|
reactOptions: FbReactOptions = defaultReactOptions
|
|
10
10
|
): { flags: IFlagSet; flagKeyMap: FlagKeyMap } {
|
|
11
|
-
const { useCamelCaseFlagKeys = false
|
|
11
|
+
const { useCamelCaseFlagKeys = false } = reactOptions;
|
|
12
12
|
const [flags, flagKeyMap = {}] = useCamelCaseFlagKeys ? getCamelizedKeysAndFlagMap(fetchedFlags) : [fetchedFlags];
|
|
13
13
|
|
|
14
14
|
return {
|
|
15
|
-
flags: toFlagsProxy(
|
|
15
|
+
flags: toFlagsProxy(flags, flagKeyMap, fetchedFlags, useCamelCaseFlagKeys, bootstrapFlags, fbClient),
|
|
16
16
|
flagKeyMap,
|
|
17
17
|
};
|
|
18
18
|
}
|
|
@@ -33,50 +33,60 @@ function getCamelizedKeysAndFlagMap(rawFlags: IFlagSet) {
|
|
|
33
33
|
return [flags, flagKeyMap];
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
function hasFlag(flags: IFlagSet, flagKey: string) {
|
|
37
|
-
return Object.prototype.hasOwnProperty.call(flags, flagKey);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
36
|
function toFlagsProxy(
|
|
41
|
-
fbClient: IFbClient,
|
|
42
|
-
bootstrapFlags: IFlagSet,
|
|
43
37
|
flags: IFlagSet,
|
|
44
38
|
flagKeyMap: FlagKeyMap,
|
|
45
39
|
flagsWithRawFlagKeys: IFlagSet,
|
|
46
40
|
useCamelCaseFlagKeys: boolean,
|
|
47
|
-
|
|
41
|
+
bootstrapFlags?: IFlagBase[],
|
|
42
|
+
fbClient?: IFbClient,
|
|
48
43
|
): IFlagSet {
|
|
44
|
+
const bootstrapFlagDict = (bootstrapFlags || []).reduce((acc: {[key: string]: IFlagBase}, flag: any) => {
|
|
45
|
+
acc[flag.id] = flag;
|
|
46
|
+
return acc;
|
|
47
|
+
}, {} as {[key: string]: IFlagBase});
|
|
48
|
+
|
|
49
49
|
return new Proxy(flags, {
|
|
50
50
|
get: (target, prop, receiver) => {
|
|
51
51
|
const currentValue = Reflect.get(target, prop, receiver) || flagsWithRawFlagKeys[prop as string]
|
|
52
52
|
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (!validFlagKey && hasFlag(bootstrapFlags, prop as string)) {
|
|
58
|
-
return bootstrapFlags[prop as string];
|
|
53
|
+
// only process flag keys and ignore symbols and native Object functions
|
|
54
|
+
if (typeof prop === 'symbol') {
|
|
55
|
+
return undefined;
|
|
59
56
|
}
|
|
60
57
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return currentValue;
|
|
58
|
+
if (fbClient && useCamelCaseFlagKeys && prop !== camelCase(prop as string)) {
|
|
59
|
+
fbClient.logger?.warn(`You're attempting to access a flag with its original keyId: ${prop as string}, even though useCamelCaseFlagKeys is set to true.`);
|
|
64
60
|
}
|
|
65
61
|
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
const pristineFlagKey = useCamelCaseFlagKeys ? (flagKeyMap[prop] || prop) : prop;
|
|
63
|
+
if (fbClient) {
|
|
64
|
+
return fbClient.variation(pristineFlagKey, currentValue);
|
|
68
65
|
}
|
|
69
66
|
|
|
70
|
-
if (currentValue
|
|
67
|
+
if (!currentValue) {
|
|
71
68
|
return undefined;
|
|
72
69
|
}
|
|
73
70
|
|
|
74
|
-
|
|
75
|
-
|
|
71
|
+
let converter: (value: string) => IConvertResult<any>;
|
|
72
|
+
switch (bootstrapFlagDict[pristineFlagKey]?.variationType) {
|
|
73
|
+
case VariationDataType.boolean:
|
|
74
|
+
converter = ValueConverters.bool;
|
|
75
|
+
break;
|
|
76
|
+
case VariationDataType.number:
|
|
77
|
+
converter = ValueConverters.number;
|
|
78
|
+
break;
|
|
79
|
+
case VariationDataType.json:
|
|
80
|
+
converter = ValueConverters.json;
|
|
81
|
+
break;
|
|
82
|
+
case VariationDataType.string:
|
|
83
|
+
converter = ValueConverters.string;
|
|
84
|
+
break;
|
|
85
|
+
default:
|
|
86
|
+
converter = ValueConverters.string;
|
|
76
87
|
}
|
|
77
88
|
|
|
78
|
-
|
|
79
|
-
return fbClient.variation(pristineFlagKey, currentValue);
|
|
89
|
+
return converter(currentValue)?.value;
|
|
80
90
|
},
|
|
81
91
|
});
|
|
82
92
|
}
|
package/src/provider.tsx
CHANGED
|
@@ -5,6 +5,7 @@ import { camelCaseKeys, fetchFlags } from "./utils";
|
|
|
5
5
|
import { FbClientBuilder, IFbClient } from '@featbit/js-client-sdk';
|
|
6
6
|
import getFlagsProxy from "./getFlagsProxy";
|
|
7
7
|
import { ProviderState } from "./providerState";
|
|
8
|
+
import { IFlagBase } from "@featbit/js-client-sdk/dist/esm/evaluation";
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
/**
|
|
@@ -26,16 +27,13 @@ import { ProviderState } from "./providerState";
|
|
|
26
27
|
*/
|
|
27
28
|
class FbProvider extends Component<PropsWithChildren<ProviderConfig>, ProviderState> implements EnhancedComponent {
|
|
28
29
|
readonly state: Readonly<ProviderState>;
|
|
29
|
-
bootstrapFlags
|
|
30
|
+
bootstrapFlags?: IFlagBase[];
|
|
30
31
|
|
|
31
32
|
constructor(props: ProviderConfig) {
|
|
32
33
|
super(props);
|
|
33
34
|
|
|
34
35
|
const {options} = props;
|
|
35
|
-
|
|
36
|
-
acc[flag.id] = flag.variation;
|
|
37
|
-
return acc;
|
|
38
|
-
}, {} as {[key: string]: string});
|
|
36
|
+
|
|
39
37
|
|
|
40
38
|
this.state = {
|
|
41
39
|
flags: {},
|
|
@@ -45,12 +43,20 @@ class FbProvider extends Component<PropsWithChildren<ProviderConfig>, ProviderSt
|
|
|
45
43
|
};
|
|
46
44
|
|
|
47
45
|
if (options?.bootstrap && options?.bootstrap.length > 0) {
|
|
48
|
-
const
|
|
49
|
-
|
|
46
|
+
const reactOptions = this.getReactOptions();
|
|
47
|
+
this.bootstrapFlags = options.bootstrap;
|
|
48
|
+
|
|
49
|
+
const bootstrapFlagKeyValues = (options?.bootstrap || []).reduce((acc: {[key: string]: string}, flag: any) => {
|
|
50
|
+
acc[flag.id] = flag.variation;
|
|
51
|
+
return acc;
|
|
52
|
+
}, {} as {[key: string]: string});
|
|
53
|
+
|
|
54
|
+
const flags = reactOptions.useCamelCaseFlagKeys ? camelCaseKeys(bootstrapFlagKeyValues) : bootstrapFlagKeyValues;
|
|
50
55
|
this.state = {
|
|
51
|
-
flags,
|
|
52
56
|
unproxiedFlags: flags,
|
|
53
|
-
|
|
57
|
+
...getFlagsProxy(bootstrapFlagKeyValues, this.bootstrapFlags, undefined, reactOptions),
|
|
58
|
+
//flags,
|
|
59
|
+
//flagKeyMap: {},
|
|
54
60
|
fbClient: undefined,
|
|
55
61
|
};
|
|
56
62
|
}
|
|
@@ -74,7 +80,7 @@ class FbProvider extends Component<PropsWithChildren<ProviderConfig>, ProviderSt
|
|
|
74
80
|
this.setState((prevState) =>({
|
|
75
81
|
...prevState,
|
|
76
82
|
unproxiedFlags,
|
|
77
|
-
...getFlagsProxy(
|
|
83
|
+
...getFlagsProxy(unproxiedFlags, this.bootstrapFlags, fbClient, this.getReactOptions())
|
|
78
84
|
}))
|
|
79
85
|
}
|
|
80
86
|
});
|
|
@@ -89,7 +95,7 @@ class FbProvider extends Component<PropsWithChildren<ProviderConfig>, ProviderSt
|
|
|
89
95
|
this.setState((prevState) => ({
|
|
90
96
|
...prevState,
|
|
91
97
|
unproxiedFlags,
|
|
92
|
-
...getFlagsProxy(
|
|
98
|
+
...getFlagsProxy(unproxiedFlags, this.bootstrapFlags, fbClient, reactOptions)}));
|
|
93
99
|
};
|
|
94
100
|
|
|
95
101
|
prepareFbClient = async () => {
|
|
@@ -110,6 +116,7 @@ class FbProvider extends Component<PropsWithChildren<ProviderConfig>, ProviderSt
|
|
|
110
116
|
await client.waitForInitialization();
|
|
111
117
|
unproxiedFlags = await fetchFlags(client);
|
|
112
118
|
} catch (e) {
|
|
119
|
+
unproxiedFlags = await fetchFlags(client);
|
|
113
120
|
error = e as Error;
|
|
114
121
|
|
|
115
122
|
if (error?.name.toLowerCase().includes('timeout')) {
|
|
@@ -124,7 +131,7 @@ class FbProvider extends Component<PropsWithChildren<ProviderConfig>, ProviderSt
|
|
|
124
131
|
this.setState((previousState) => ({
|
|
125
132
|
...previousState,
|
|
126
133
|
unproxiedFlags,
|
|
127
|
-
...getFlagsProxy(
|
|
134
|
+
...getFlagsProxy(unproxiedFlags, this.bootstrapFlags, client, reactOptions),
|
|
128
135
|
fbClient: client,
|
|
129
136
|
error,
|
|
130
137
|
}));
|
package/src/types.ts
CHANGED
|
@@ -19,13 +19,6 @@ export interface FbReactOptions {
|
|
|
19
19
|
* This is false by default, if set to true, keys will automatically be converted to camel-case.
|
|
20
20
|
*/
|
|
21
21
|
useCamelCaseFlagKeys?: boolean;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Whether to send flag evaluation events when a flag is read from the `flags` object
|
|
25
|
-
* returned by the `useFlags` hook. This is true by default, meaning flag evaluation
|
|
26
|
-
* events will be sent by default.
|
|
27
|
-
*/
|
|
28
|
-
sendEventsOnFlagRead?: boolean;
|
|
29
22
|
}
|
|
30
23
|
|
|
31
24
|
/**
|