@featurevisor/sdk 0.8.0 → 0.9.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/CHANGELOG.md +11 -0
- package/dist/index.js +1 -1
- package/dist/index.js.gz +0 -0
- package/dist/index.js.map +1 -1
- package/lib/client.d.ts +3 -0
- package/lib/client.js +22 -8
- package/lib/client.js.map +1 -1
- package/lib/createInstance.d.ts +2 -0
- package/lib/createInstance.js +5 -1
- package/lib/createInstance.js.map +1 -1
- package/lib/feature.d.ts +4 -3
- package/lib/feature.js +67 -5
- package/lib/feature.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/logger.d.ts +25 -0
- package/lib/logger.js +57 -0
- package/lib/logger.js.map +1 -0
- package/package.json +3 -3
- package/src/client.ts +37 -8
- package/src/createInstance.ts +7 -1
- package/src/feature.ts +80 -0
- package/src/index.ts +1 -0
- package/src/logger.ts +86 -0
package/lib/client.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DatafileReader } from "./datafileReader";
|
|
2
2
|
import { getBucketedVariation, getBucketedVariableValue, getForcedVariation, getForcedVariableValue, } from "./feature";
|
|
3
3
|
import { getBucketedNumber } from "./bucket";
|
|
4
|
+
import { createLogger } from "./logger";
|
|
4
5
|
export function getValueByType(value, fieldType) {
|
|
5
6
|
if (value === undefined) {
|
|
6
7
|
return undefined;
|
|
@@ -33,6 +34,7 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
33
34
|
if (options.configureBucketValue) {
|
|
34
35
|
this.configureBucketValue = options.configureBucketValue;
|
|
35
36
|
}
|
|
37
|
+
this.logger = options.logger || createLogger();
|
|
36
38
|
this.setDatafile(options.datafile);
|
|
37
39
|
}
|
|
38
40
|
FeaturevisorSDK.prototype.setDatafile = function (datafile) {
|
|
@@ -40,8 +42,7 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
40
42
|
this.datafileReader = new DatafileReader(typeof datafile === "string" ? JSON.parse(datafile) : datafile);
|
|
41
43
|
}
|
|
42
44
|
catch (e) {
|
|
43
|
-
|
|
44
|
-
console.error(e);
|
|
45
|
+
this.logger.error("could not parse datafile", { error: e });
|
|
45
46
|
}
|
|
46
47
|
};
|
|
47
48
|
FeaturevisorSDK.prototype.getFeature = function (featureKey) {
|
|
@@ -73,21 +74,31 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
73
74
|
try {
|
|
74
75
|
var feature = this.getFeature(featureKey);
|
|
75
76
|
if (!feature) {
|
|
77
|
+
this.logger.warn("feature not found in datafile", { featureKey: featureKey });
|
|
76
78
|
return undefined;
|
|
77
79
|
}
|
|
78
80
|
var forcedVariation = getForcedVariation(feature, attributes, this.datafileReader);
|
|
79
81
|
if (forcedVariation) {
|
|
82
|
+
this.logger.debug("forced variation found", {
|
|
83
|
+
featureKey: featureKey,
|
|
84
|
+
variation: forcedVariation.value,
|
|
85
|
+
});
|
|
80
86
|
return forcedVariation.value;
|
|
81
87
|
}
|
|
82
88
|
var bucketValue = this.getBucketValue(feature, attributes);
|
|
83
|
-
var variation = getBucketedVariation(feature, attributes, bucketValue, this.datafileReader);
|
|
89
|
+
var variation = getBucketedVariation(feature, attributes, bucketValue, this.datafileReader, this.logger);
|
|
84
90
|
if (!variation) {
|
|
91
|
+
this.logger.debug("using default variation", {
|
|
92
|
+
featureKey: featureKey,
|
|
93
|
+
bucketValue: bucketValue,
|
|
94
|
+
variation: feature.defaultVariation,
|
|
95
|
+
});
|
|
85
96
|
return feature.defaultVariation;
|
|
86
97
|
}
|
|
87
98
|
return variation.value;
|
|
88
99
|
}
|
|
89
100
|
catch (e) {
|
|
90
|
-
|
|
101
|
+
this.logger.error("getVariation", { featureKey: featureKey, error: e });
|
|
91
102
|
return undefined;
|
|
92
103
|
}
|
|
93
104
|
};
|
|
@@ -118,7 +129,7 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
118
129
|
if (attributes === void 0) { attributes = {}; }
|
|
119
130
|
try {
|
|
120
131
|
var variationValue = this.getVariation(featureKey, attributes);
|
|
121
|
-
if (
|
|
132
|
+
if (typeof variationValue === "undefined") {
|
|
122
133
|
return undefined;
|
|
123
134
|
}
|
|
124
135
|
if (this.onActivation) {
|
|
@@ -136,7 +147,7 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
136
147
|
return variationValue;
|
|
137
148
|
}
|
|
138
149
|
catch (e) {
|
|
139
|
-
|
|
150
|
+
this.logger.error("activate", { featureKey: featureKey, error: e });
|
|
140
151
|
return undefined;
|
|
141
152
|
}
|
|
142
153
|
};
|
|
@@ -168,23 +179,26 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
168
179
|
try {
|
|
169
180
|
var feature = this.getFeature(featureKey);
|
|
170
181
|
if (!feature) {
|
|
182
|
+
this.logger.warn("feature not found in datafile", { featureKey: featureKey, variableKey: variableKey });
|
|
171
183
|
return undefined;
|
|
172
184
|
}
|
|
173
185
|
var variableSchema = Array.isArray(feature.variablesSchema)
|
|
174
186
|
? feature.variablesSchema.find(function (v) { return v.key === variableKey; })
|
|
175
187
|
: undefined;
|
|
176
188
|
if (!variableSchema) {
|
|
189
|
+
this.logger.warn("variable schema not found", { featureKey: featureKey, variableKey: variableKey });
|
|
177
190
|
return undefined;
|
|
178
191
|
}
|
|
179
192
|
var forcedVariableValue = getForcedVariableValue(feature, variableSchema, attributes, this.datafileReader);
|
|
180
193
|
if (typeof forcedVariableValue !== "undefined") {
|
|
194
|
+
this.logger.debug("forced variable value found", { featureKey: featureKey, variableKey: variableKey });
|
|
181
195
|
return forcedVariableValue;
|
|
182
196
|
}
|
|
183
197
|
var bucketValue = this.getBucketValue(feature, attributes);
|
|
184
|
-
return getBucketedVariableValue(feature, variableSchema, attributes, bucketValue, this.datafileReader);
|
|
198
|
+
return getBucketedVariableValue(feature, variableSchema, attributes, bucketValue, this.datafileReader, this.logger);
|
|
185
199
|
}
|
|
186
200
|
catch (e) {
|
|
187
|
-
|
|
201
|
+
this.logger.error("getVariable", { featureKey: featureKey, variableKey: variableKey, error: e });
|
|
188
202
|
return undefined;
|
|
189
203
|
}
|
|
190
204
|
};
|
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/lib/createInstance.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DatafileContent } from "@featurevisor/types";
|
|
2
2
|
import { FeaturevisorSDK, ConfigureBucketValue, ActivationCallback } from "./client";
|
|
3
|
+
import { Logger } from "./logger";
|
|
3
4
|
export type ReadyCallback = () => void;
|
|
4
5
|
export interface InstanceOptions {
|
|
5
6
|
datafile?: DatafileContent | string;
|
|
@@ -8,6 +9,7 @@ export interface InstanceOptions {
|
|
|
8
9
|
datafileUrl?: string;
|
|
9
10
|
onReady?: ReadyCallback;
|
|
10
11
|
handleDatafileFetch?: (datafileUrl: string) => Promise<DatafileContent>;
|
|
12
|
+
logger?: Logger;
|
|
11
13
|
}
|
|
12
14
|
export interface FeaturevisorInstance {
|
|
13
15
|
/**
|
package/lib/createInstance.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { FeaturevisorSDK } from "./client";
|
|
2
|
+
import { createLogger } from "./logger";
|
|
2
3
|
function getInstanceFromSdk(sdk, options) {
|
|
3
4
|
return {
|
|
4
5
|
// variation
|
|
@@ -43,14 +44,16 @@ function fetchDatafileContent(datafileUrl, options) {
|
|
|
43
44
|
}
|
|
44
45
|
export function createInstance(options) {
|
|
45
46
|
if (!options.datafile && !options.datafileUrl) {
|
|
46
|
-
throw new Error("Featurevisor SDK instance cannot be created without `datafile`
|
|
47
|
+
throw new Error("Featurevisor SDK instance cannot be created without both `datafile` and `datafileUrl` options");
|
|
47
48
|
}
|
|
49
|
+
var logger = options.logger || createLogger();
|
|
48
50
|
// datafile content is already provided
|
|
49
51
|
if (options.datafile) {
|
|
50
52
|
var sdk_1 = new FeaturevisorSDK({
|
|
51
53
|
datafile: options.datafile,
|
|
52
54
|
onActivation: options.onActivation,
|
|
53
55
|
configureBucketValue: options.configureBucketValue,
|
|
56
|
+
logger: logger,
|
|
54
57
|
});
|
|
55
58
|
if (typeof options.onReady === "function") {
|
|
56
59
|
var onReady_1 = options.onReady;
|
|
@@ -65,6 +68,7 @@ export function createInstance(options) {
|
|
|
65
68
|
datafile: emptyDatafile,
|
|
66
69
|
onActivation: options.onActivation,
|
|
67
70
|
configureBucketValue: options.configureBucketValue,
|
|
71
|
+
logger: logger,
|
|
68
72
|
});
|
|
69
73
|
if (options.datafileUrl) {
|
|
70
74
|
fetchDatafileContent(options.datafileUrl, options)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createInstance.js","sourceRoot":"","sources":["../src/createInstance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAA4C,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"createInstance.js","sourceRoot":"","sources":["../src/createInstance.ts"],"names":[],"mappings":"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"}
|
package/lib/feature.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Allocation, Attributes, Traffic, Feature, Variation, VariableValue } from "@featurevisor/types";
|
|
2
2
|
import { DatafileReader } from "./datafileReader";
|
|
3
3
|
import { VariableSchema } from "@featurevisor/types/src";
|
|
4
|
-
|
|
4
|
+
import { Logger } from "./logger";
|
|
5
|
+
export declare function getMatchedTraffic(traffic: Traffic[], attributes: Attributes, bucketValue: number, datafileReader: DatafileReader, logger: Logger): Traffic | undefined;
|
|
5
6
|
export declare function getMatchedAllocation(matchedTraffic: Traffic, bucketValue: number): Allocation | undefined;
|
|
6
7
|
export declare function getForcedVariation(feature: Feature, attributes: Attributes, datafileReader: DatafileReader): Variation | undefined;
|
|
7
|
-
export declare function getBucketedVariation(feature: Feature, attributes: Attributes, bucketValue: number, datafileReader: DatafileReader): Variation | undefined;
|
|
8
|
+
export declare function getBucketedVariation(feature: Feature, attributes: Attributes, bucketValue: number, datafileReader: DatafileReader, logger: Logger): Variation | undefined;
|
|
8
9
|
export declare function getForcedVariableValue(feature: Feature, variableSchema: VariableSchema, attributes: Attributes, datafileReader: DatafileReader): VariableValue | undefined;
|
|
9
|
-
export declare function getBucketedVariableValue(feature: Feature, variableSchema: VariableSchema, attributes: Attributes, bucketValue: number, datafileReader: DatafileReader): VariableValue | undefined;
|
|
10
|
+
export declare function getBucketedVariableValue(feature: Feature, variableSchema: VariableSchema, attributes: Attributes, bucketValue: number, datafileReader: DatafileReader, logger: Logger): VariableValue | undefined;
|
package/lib/feature.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { allGroupSegmentsAreMatched } from "./segments";
|
|
2
2
|
import { allConditionsAreMatched } from "./conditions";
|
|
3
|
-
export function getMatchedTraffic(traffic, attributes, bucketValue, datafileReader) {
|
|
3
|
+
export function getMatchedTraffic(traffic, attributes, bucketValue, datafileReader, logger) {
|
|
4
4
|
return traffic.find(function (traffic) {
|
|
5
5
|
if (bucketValue > traffic.percentage) {
|
|
6
6
|
// out of bucket range
|
|
@@ -11,6 +11,9 @@ export function getMatchedTraffic(traffic, attributes, bucketValue, datafileRead
|
|
|
11
11
|
: traffic.segments, attributes, datafileReader)) {
|
|
12
12
|
return false;
|
|
13
13
|
}
|
|
14
|
+
logger.debug("matched rule", {
|
|
15
|
+
ruleKey: traffic.key,
|
|
16
|
+
});
|
|
14
17
|
return true;
|
|
15
18
|
});
|
|
16
19
|
}
|
|
@@ -47,13 +50,21 @@ export function getForcedVariation(feature, attributes, datafileReader) {
|
|
|
47
50
|
}
|
|
48
51
|
return feature.variations.find(function (v) { return v.value === force.variation; });
|
|
49
52
|
}
|
|
50
|
-
export function getBucketedVariation(feature, attributes, bucketValue, datafileReader) {
|
|
51
|
-
var matchedTraffic = getMatchedTraffic(feature.traffic, attributes, bucketValue, datafileReader);
|
|
53
|
+
export function getBucketedVariation(feature, attributes, bucketValue, datafileReader, logger) {
|
|
54
|
+
var matchedTraffic = getMatchedTraffic(feature.traffic, attributes, bucketValue, datafileReader, logger);
|
|
52
55
|
if (!matchedTraffic) {
|
|
56
|
+
logger.debug("no matched rule found", {
|
|
57
|
+
featureKey: feature.key,
|
|
58
|
+
bucketValue: bucketValue,
|
|
59
|
+
});
|
|
53
60
|
return undefined;
|
|
54
61
|
}
|
|
55
62
|
var allocation = getMatchedAllocation(matchedTraffic, bucketValue);
|
|
56
63
|
if (!allocation) {
|
|
64
|
+
logger.debug("no matched allocation found", {
|
|
65
|
+
featureKey: feature.key,
|
|
66
|
+
bucketValue: bucketValue,
|
|
67
|
+
});
|
|
57
68
|
return undefined;
|
|
58
69
|
}
|
|
59
70
|
var variationValue = allocation.variation;
|
|
@@ -61,8 +72,19 @@ export function getBucketedVariation(feature, attributes, bucketValue, datafileR
|
|
|
61
72
|
return v.value === variationValue;
|
|
62
73
|
});
|
|
63
74
|
if (!variation) {
|
|
75
|
+
// this should never happen
|
|
76
|
+
logger.debug("no matched variation found", {
|
|
77
|
+
featureKey: feature.key,
|
|
78
|
+
variation: variationValue,
|
|
79
|
+
bucketValue: bucketValue,
|
|
80
|
+
});
|
|
64
81
|
return undefined;
|
|
65
82
|
}
|
|
83
|
+
logger.debug("matched variation", {
|
|
84
|
+
featureKey: feature.key,
|
|
85
|
+
variation: variation.value,
|
|
86
|
+
bucketValue: bucketValue,
|
|
87
|
+
});
|
|
66
88
|
return variation;
|
|
67
89
|
}
|
|
68
90
|
export function getForcedVariableValue(feature, variableSchema, attributes, datafileReader) {
|
|
@@ -76,20 +98,35 @@ export function getForcedVariableValue(feature, variableSchema, attributes, data
|
|
|
76
98
|
}
|
|
77
99
|
return value;
|
|
78
100
|
}
|
|
79
|
-
export function getBucketedVariableValue(feature, variableSchema, attributes, bucketValue, datafileReader) {
|
|
101
|
+
export function getBucketedVariableValue(feature, variableSchema, attributes, bucketValue, datafileReader, logger) {
|
|
80
102
|
var _a;
|
|
81
103
|
// get traffic
|
|
82
|
-
var matchedTraffic = getMatchedTraffic(feature.traffic, attributes, bucketValue, datafileReader);
|
|
104
|
+
var matchedTraffic = getMatchedTraffic(feature.traffic, attributes, bucketValue, datafileReader, logger);
|
|
83
105
|
if (!matchedTraffic) {
|
|
106
|
+
logger.debug("no matched rule found", {
|
|
107
|
+
featureKey: feature.key,
|
|
108
|
+
variableKey: variableSchema.key,
|
|
109
|
+
bucketValue: bucketValue,
|
|
110
|
+
});
|
|
84
111
|
return undefined;
|
|
85
112
|
}
|
|
86
113
|
var variableKey = variableSchema.key;
|
|
87
114
|
// see if variable is set at traffic/rule level
|
|
88
115
|
if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== "undefined") {
|
|
116
|
+
logger.debug("using variable from rule", {
|
|
117
|
+
featureKey: feature.key,
|
|
118
|
+
variableKey: variableKey,
|
|
119
|
+
bucketValue: bucketValue,
|
|
120
|
+
});
|
|
89
121
|
return matchedTraffic.variables[variableKey];
|
|
90
122
|
}
|
|
91
123
|
var allocation = getMatchedAllocation(matchedTraffic, bucketValue);
|
|
92
124
|
if (!allocation) {
|
|
125
|
+
logger.debug("no matched allocation found", {
|
|
126
|
+
featureKey: feature.key,
|
|
127
|
+
variableKey: variableKey,
|
|
128
|
+
bucketValue: bucketValue,
|
|
129
|
+
});
|
|
93
130
|
return undefined;
|
|
94
131
|
}
|
|
95
132
|
var variationValue = allocation.variation;
|
|
@@ -97,12 +134,25 @@ export function getBucketedVariableValue(feature, variableSchema, attributes, bu
|
|
|
97
134
|
return v.value === variationValue;
|
|
98
135
|
});
|
|
99
136
|
if (!variation) {
|
|
137
|
+
// this should never happen
|
|
138
|
+
logger.debug("no matched variation found", {
|
|
139
|
+
feature: feature.key,
|
|
140
|
+
variableKey: variableKey,
|
|
141
|
+
variation: variationValue,
|
|
142
|
+
bucketValue: bucketValue,
|
|
143
|
+
});
|
|
100
144
|
return undefined;
|
|
101
145
|
}
|
|
102
146
|
var variableFromVariation = (_a = variation.variables) === null || _a === void 0 ? void 0 : _a.find(function (v) {
|
|
103
147
|
return v.key === variableKey;
|
|
104
148
|
});
|
|
105
149
|
if (!variableFromVariation) {
|
|
150
|
+
logger.debug("using default value as variation has no variable", {
|
|
151
|
+
featureKey: feature.key,
|
|
152
|
+
variableKey: variableKey,
|
|
153
|
+
variation: variationValue,
|
|
154
|
+
bucketValue: bucketValue,
|
|
155
|
+
});
|
|
106
156
|
if (variableSchema.type === "json") {
|
|
107
157
|
return JSON.parse(variableSchema.defaultValue);
|
|
108
158
|
}
|
|
@@ -121,12 +171,24 @@ export function getBucketedVariableValue(feature, variableSchema, attributes, bu
|
|
|
121
171
|
return false;
|
|
122
172
|
});
|
|
123
173
|
if (override) {
|
|
174
|
+
logger.debug("using override value from variation", {
|
|
175
|
+
feature: feature.key,
|
|
176
|
+
variableKey: variableKey,
|
|
177
|
+
variation: variationValue,
|
|
178
|
+
bucketValue: bucketValue,
|
|
179
|
+
});
|
|
124
180
|
if (variableSchema.type === "json") {
|
|
125
181
|
return JSON.parse(override.value);
|
|
126
182
|
}
|
|
127
183
|
return override.value;
|
|
128
184
|
}
|
|
129
185
|
}
|
|
186
|
+
logger.debug("using value from variation", {
|
|
187
|
+
feature: feature.key,
|
|
188
|
+
variableKey: variableKey,
|
|
189
|
+
variation: variationValue,
|
|
190
|
+
bucketValue: bucketValue,
|
|
191
|
+
});
|
|
130
192
|
if (variableSchema.type === "json") {
|
|
131
193
|
return JSON.parse(variableFromVariation.value);
|
|
132
194
|
}
|
package/lib/feature.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.js","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"feature.js","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC"}
|
package/lib/logger.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
2
|
+
export type LogMessage = string;
|
|
3
|
+
export interface LogDetails {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
}
|
|
6
|
+
export type LogHandler = (level: LogLevel, message: LogMessage, details?: LogDetails) => void;
|
|
7
|
+
export interface CreateLoggerOptions {
|
|
8
|
+
levels?: LogLevel[];
|
|
9
|
+
handler?: LogHandler;
|
|
10
|
+
}
|
|
11
|
+
export declare const loggerPrefix = "[Featurevisor]";
|
|
12
|
+
export declare const defaultLogLevels: LogLevel[];
|
|
13
|
+
export declare const defaultLogHandler: LogHandler;
|
|
14
|
+
export declare class Logger {
|
|
15
|
+
private levels;
|
|
16
|
+
private handle;
|
|
17
|
+
constructor(options: CreateLoggerOptions);
|
|
18
|
+
setLevels(levels: LogLevel[]): void;
|
|
19
|
+
log(level: LogLevel, message: LogMessage, details?: LogDetails): void;
|
|
20
|
+
debug(message: LogMessage, details?: LogDetails): void;
|
|
21
|
+
info(message: LogMessage, details?: LogDetails): void;
|
|
22
|
+
warn(message: LogMessage, details?: LogDetails): void;
|
|
23
|
+
error(message: LogMessage, details?: LogDetails): void;
|
|
24
|
+
}
|
|
25
|
+
export declare function createLogger(options?: CreateLoggerOptions): Logger;
|
package/lib/logger.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export var loggerPrefix = "[Featurevisor]";
|
|
2
|
+
export var defaultLogLevels = [
|
|
3
|
+
// supported, but not enabled by default
|
|
4
|
+
// "debug",
|
|
5
|
+
// "info",
|
|
6
|
+
// enabled by default
|
|
7
|
+
"warn",
|
|
8
|
+
"error",
|
|
9
|
+
];
|
|
10
|
+
export var defaultLogHandler = function defaultLogHandler(level, message, details) {
|
|
11
|
+
if (details === void 0) { details = {}; }
|
|
12
|
+
switch (level) {
|
|
13
|
+
case "debug":
|
|
14
|
+
console.log(loggerPrefix, message, details);
|
|
15
|
+
case "info":
|
|
16
|
+
console.info(loggerPrefix, message, details);
|
|
17
|
+
case "warn":
|
|
18
|
+
console.warn(loggerPrefix, message, details);
|
|
19
|
+
case "error":
|
|
20
|
+
console.error(loggerPrefix, message, details);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
var Logger = /** @class */ (function () {
|
|
24
|
+
function Logger(options) {
|
|
25
|
+
this.levels = options.levels;
|
|
26
|
+
this.handle = options.handler;
|
|
27
|
+
}
|
|
28
|
+
Logger.prototype.setLevels = function (levels) {
|
|
29
|
+
this.levels = levels;
|
|
30
|
+
};
|
|
31
|
+
Logger.prototype.log = function (level, message, details) {
|
|
32
|
+
if (this.levels.indexOf(level) !== -1) {
|
|
33
|
+
this.handle(level, message, details);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
Logger.prototype.debug = function (message, details) {
|
|
37
|
+
this.log("debug", message, details);
|
|
38
|
+
};
|
|
39
|
+
Logger.prototype.info = function (message, details) {
|
|
40
|
+
this.log("info", message, details);
|
|
41
|
+
};
|
|
42
|
+
Logger.prototype.warn = function (message, details) {
|
|
43
|
+
this.log("warn", message, details);
|
|
44
|
+
};
|
|
45
|
+
Logger.prototype.error = function (message, details) {
|
|
46
|
+
this.log("error", message, details);
|
|
47
|
+
};
|
|
48
|
+
return Logger;
|
|
49
|
+
}());
|
|
50
|
+
export { Logger };
|
|
51
|
+
export function createLogger(options) {
|
|
52
|
+
if (options === void 0) { options = {}; }
|
|
53
|
+
var levels = options.levels || defaultLogLevels;
|
|
54
|
+
var logHandler = options.handler || defaultLogHandler;
|
|
55
|
+
return new Logger({ levels: levels, handler: logHandler });
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,IAAM,YAAY,GAAG,gBAAgB,CAAC;AAE7C,MAAM,CAAC,IAAM,gBAAgB,GAAe;IAC1C,wCAAwC;IACxC,WAAW;IACX,UAAU;IAEV,qBAAqB;IACrB,MAAM;IACN,OAAO;CACR,CAAC;AAEF,MAAM,CAAC,IAAM,iBAAiB,GAAe,SAAS,iBAAiB,CACrE,KAAK,EACL,OAAO,EACP,OAAY;IAAZ,wBAAA,EAAA,YAAY;IAEZ,QAAQ,KAAK,EAAE;QACb,KAAK,OAAO;YACV,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,KAAK,MAAM;YACT,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,KAAK,MAAM;YACT,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,KAAK,OAAO;YACV,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;KACjD;AACH,CAAC,CAAC;AAEF;IAIE,gBAAY,OAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAoB,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,OAAqB,CAAC;IAC9C,CAAC;IAED,0BAAS,GAAT,UAAU,MAAkB;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,oBAAG,GAAH,UAAI,KAAe,EAAE,OAAmB,EAAE,OAAoB;QAC5D,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SACtC;IACH,CAAC;IAED,sBAAK,GAAL,UAAM,OAAmB,EAAE,OAAoB;QAC7C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,qBAAI,GAAJ,UAAK,OAAmB,EAAE,OAAoB;QAC5C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,qBAAI,GAAJ,UAAK,OAAmB,EAAE,OAAoB;QAC5C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,sBAAK,GAAL,UAAM,OAAmB,EAAE,OAAoB;QAC7C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACH,aAAC;AAAD,CAAC,AAlCD,IAkCC;;AAED,MAAM,UAAU,YAAY,CAAC,OAAiC;IAAjC,wBAAA,EAAA,YAAiC;IAC5D,IAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,CAAC;IAClD,IAAM,UAAU,GAAG,OAAO,CAAC,OAAO,IAAI,iBAAiB,CAAC;IAExD,OAAO,IAAI,MAAM,CAAC,EAAE,MAAM,QAAA,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;AACrD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@featurevisor/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Featurevisor SDK for Node.js and the browser",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "lib/index.js",
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
},
|
|
43
43
|
"license": "MIT",
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@featurevisor/types": "^0.
|
|
45
|
+
"@featurevisor/types": "^0.9.0",
|
|
46
46
|
"murmurhash": "^2.0.1",
|
|
47
47
|
"semver": "^7.3.8"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "e0341e52a5d9e7e2e59a75621dd6cbf5c0740612"
|
|
50
50
|
}
|